RJ45 Tester

Introducere

Ideea de la care am pornit

Vă amintiți primul laborator de RL?

Acolo am învățat cum să realizăm un cablu UTP pentru rețele Ethernet, Procesul poarta numele de sertizare. După realizarea cablului, acesta trebuie verificat ca functioneaza corect - adică dacă are continuitate.

Testarea se face folosind un dispozitiv dedicat.

De aici a pornit ideea proiectului meu: realizarea propriului meu tester RJ45, caruia i-am adus o serie de îmbunătățiri.

Care este scopul proiectului?

Dispozitivul proiectat permite testarea cablurilor de rețea de tip RJ45, oferind feedback vizual și auditiv privind corectitudinea conexiunilor dintre pini.

Prin simpla apăsare a unui buton, utilizatorul poate selecta tipul de cablu testat:

  1. Straight-through - pentru conectarea dispozitivelor aflate pe layere diferite (ex: PC – switch)
  2. Crossover - pentru conectarea dispozitivelor de același layer (ex: PC – PC)
  3. Rollover (numit si cablu de consola) - pentru a conecta un dispozitiv la un echipament de retea si pentru a avea acces direct la CLI

După selectare, pe ecranul principal (128×160 SPI) este afișată o imagine cu ordinea corectă a firelor pentru tipul respectiv de cablu.

Ce face?

  • Se folosesc 2 socketi: unul dedicat pentru sender, iar celălalt pentru receiver
  • Fiecare soclu RJ-45 are 8 pini
  • Fiecărui pin RJ-45 îi este asociat un LED de culoare verde care se va aprinde atunci când semnalul transmis/primit pe pinul respectiv este de 1 logic.
  • În momentul în care socket-ul de receiver recepționează 1 logic, buzzer-ul va emite un beep scurt

Testarea efectivă presupune 2 verificări:

  1. Se vor trimite semnale, secvențial, iterând pinii sender-ului unul câte unul, cu mici pauze între transmisii,
  2. urmând un test final în care se vor activa simultan toți pinii sender-ului

Testarea poate fi oprită forțat, în orice moment, prin apăsarea unui buton.

În timp ce display-ul pe SPI (de rezoluție mai mare) afișează ordinea firelor în mufa RJ-45, LCD-ul cu modul I2C va scrie pe ecran tipul de cablu straight-through\crossover\rollover și indexul pinului de pe sender de pe care se trimit semnale (ex: Testing pin 1…8), sau mesajul Testing all pins.

De ce este util?

Consider că folosirea ecranelor face diferența dintre un tester RJ-45 obișnuit și acest dispozitiv.

Practic, este un instrument „2 în 1”: tester + ghid de conectare.

Sper ca dispozitivul pe care îl proiectez (îmi propun să îi fac și un PCB compact) să ajungă în mâinile laboranților de RL/CCNA1. Acolo își va atinge adevăratul potențial.

Descriere Generala

Schema bloc:

rj45-tester-schema-bloc.jpg

Hardware Design

Lista Componente

Componenta Pret
Arduino Nano V3.0 ~40 lei
2x RJ45 Adapter Board + Breakout Board + Pin Header (de pe AliExpress 😊) ~8 lei fiecare
1x 74HC595 8-bit Shift Register (1 pin intrare, 8 pini iesire) 4 lei
1x 74HC165 8-bit Shift Register (1 pin iesire, 8 pini intrare) 8 lei
LCD 16x02 cu interfata I2C ~16 lei
Modul LCD SPI 160x128 ~44 lei
16x LED Verde 3mm cu Lentile Difuze 0,40 lei fiecare
16x Rezistente 220 Ω (pt LED-uri)
Buzzer Pasiv 1 leu
3x Buton cu Capac Rotund 2 lei fiecare
3x Rezistente (de PULL-UP) de 10 kΩ (pt butoane)
3x Condensatoare ceramice de 47nF (pt butoane) 0,50 lei fiecare
3x Breadboard 830 puncte 20 lei fiecare
Set fire Plusivo cu izolatie PVC (Fir unifilar) - 22 AWG 45 lei
Jumpere tata-tata
Jumpere mama-tata

Set fire PVC:

  • Size matters: cele de 22 AWG se conecteaza cel mai bine in breadboard
  • Calalalt tip de fire (silicon - multifilar): sunt bune de lipit, dar in niciun caz nu se pot infige intr-un breadboard

Schema electrica

rj45-schematics.jpg

Pin configurations

Arduino

Pin Arduino Corespondent
D2 Butonul albastru (BTN1)
D3 Butonul rosu (BTN2)
D4 Butonul alb (BTN3)
D5 Buzzer pasiv
D6 Data OUT 74HC595 (SER)
D7 Latch 74HC595 (RCLK)
D8 Clock 74HC595 (SRCLK)
D9 RS-Display
D10 CS-Diplsay
D11 (SPI) MOSI
D12 (SPI) MISO
D13 (SPI) SCK
D14 (etichetat A0) Data IN 74HC165
D15 (etichetat A1) PL 74HC165
D16 (etichetat A2) CLK 74HC165
A4 (I2C) SDA
A5 (I2C) SCL

160x128 Display (pe SPI)

spi_128x160_display.jpeg

Denumire pin Descriere
Vcc
GND Ground
NC Not Connected (nu se conecteaza la nimic)
CLK Clock
SDA este pinul de MOSI (foarte confuz ca au scris SDA in loc de MOSI)
RS Register Select
RST Reset
CS Chip Select

Pinul RS (Register Select) este cunoscut si sub numele de DC (Data Command).

Acest pin indica daca datele trimise pe SPI sunt:

  • comenzi (e.g.: seteaza pozitia cursorului)
  • date (e.g. afiseaza pixeli pe ecran)

Pinul are urmaoare functionalitate:

  • Daca RS/DC = 0 → comanda
  • Daca RS/DC = 1 → date

Pin Display SPI Corespondent
Vcc 5V
GND GND
NC nu se conecteaza la nimic
CLK Arduino D13 (SPI SCK)
SDA Arduino D11 (SPI MOSI)
RS Arduino D9
RST Arduino RESET
CS Arduino D10

74HC595 shift register

Shift register-ul 74HC595 are o singura intrare si 8 iesiri paralele.

Index pin 74HC595 Denumire pin 74HC595 Corespondent
15 QA LED 1 (cel mai de sus) & pin 1 socket RJ-45 sender
1 QB LED 2 (al doilea cel mai de sus) & pin 2 socket RJ-45 sender
2 QC LED 3 & pin 3 socket RJ-45 sender
3 QD LED 4 & pin 4 socket RJ-45 sender
4 QE LED 5 & pin 5 socket RJ-45 sender
5 QF LED 6 & pin 6 socket RJ-45 sender
6 QG LED 7 & pin 7 socket RJ-45 sender
7 QH LED 8 & pin 8 socket RJ-45 sender
8 GND GND
9 !QH nu este conectat
10 !SRCLR 5V
11 SRCLK Arduino D8
12 RCLK Arduino D7
13 !OE GND
14 SER Arduino D6
16 Vcc 5V

LED-ul la care fac referire aici sunt cele din partea stanga, asociata sender-ului.

74HC165 shift register

Shift register-ul 74HC165 are o singura iesire si 8 intrari paralele.

Index pin 74HC165 Denumire pin 74HC165 Corespondent
7 !QH nu este conectat
9 QH Arduino D14 (etichetat A0)
1 SH/!LD Arduino D15 (etichetat A1)
2 CLK Arduino D16 (etichetat A2)
8 GND GND
16 Vcc 5V
10 SER GND
15 CLK INH GND
11 A (out1) LED 1 (cel mai de sus) & pin 1 socket RJ-45 receiver
12 B (out1) LED 2 (al doilea cel mai de sus) & pin 2 socket RJ-45 receiver
13 C (out1) LED 3 & pin 2 socket RJ-45 receiver
14 D (out1) LED 4 & pin 3 socket RJ-45 receiver
3 E (out1) LED 5 & pin 4 socket RJ-45 receiver
4 F (out1) LED 6 & pin 5 socket RJ-45 receiver
5 G (out1) LED 7 & pin 6 socket RJ-45 receiver
6 H (out1) LED 8 & pin 7 socket RJ-45 receiver

LED-ul la care fac referire aici sunt cele din partea dreapta, asociata receiver-ului.

Debounce butoane: Filtru trece-jos

Pentru a trata debounce-ul butoanelor exclusiv din hardware, m-am gandit sa introduc in circuit un filtru trece-jos, punand cate un condensator ceramic in paralel cu fiecare buton.

Constanta de timp τ:

τ = R*C =10kΩ*47nF = 10^4 + 47*10^(-9) = 47*10^(-5) = 470us

5*τ=5*470μs≈2.35ms

Astfel, schimbarile mai rapide de 2.35 ms ale butoanelor vor fi ignorate (la nivel hardware) de aceste filtre.

Chiar si asa, eu tot am lasat in cod un mic delay (unul mult mai mare decat ce poate circuitul construit de mine sa filtreze).

Progresul fizic, pe etape

rj45-hw-stage-1.jpeg rj45-hw-stage-2.jpeg rj45-hw-stage-3.jpeg

Software Design

Biblioteci folosite:

  • Arduino.h: biblioteca default pentru placa de dezvoltare
  • LiquidCrystal_I2C.h: imi permite scrierea caracterelor pe ecranul secundar (cel pe I2C, de rezolutie 16×02)
  • Adafruit_GFX.h, Adafruit_ST7735.h: pentru interactiunea cu display-ul principal (cel pe SPI, de rezolutie 128×160)

Repo GitHub: <https://github.com/TrifanBogdan24/RJ45-tester> - codul sursa se gaseste in folderul src/.

Am asociat fiecarui buton cate o intrerupere:

  • Butonul albastru - intreruperea INT0 - schimba tipul de cablare (crossover/straigh-through/rollover)
  • Butonul rosu - intreruperea INT1 - opreste fortat rularea testului
  • Butonul alb - intreruperea PCINT20 (din PCINT2_vect) - porneste algoritmul de testare:

Descrierile functiilor:

  • ISR(INT0_vect):
    • rutina de tratare a intreruperii, generata la apasarea butonului albastru (schimba tipul de cablare)
    • Marcheaza flag-ul volatile bool pressedBTN1
  • ISR(INT1_vect):
    • rutina de tratare a intreruperii, generata la apasarea butonului rosu (oprirea fortata a algoritmului de testare)
    • Marcheaza flag-ul volatile bool pressedBTN2
  • ISR(PCINT2_vect):
    • rutina de tratare a intreruperii, generata la apasarea butonului alb (pornirea algoritmului de testare)
    • Marcheaza flag-ul volatile bool pressedBTN3
  • void beep_okay():
    • controleaza buzzer-ul sa emita bazait scurt, in semn ca totul este in regula
  • void beep_not_okay():
    • controleaza buzzer-ul sa emita un semnal sonor de eroare
  • void cable_type_first_line_lcd():
    • scrie tipul de cablare pe prima linia a LCD-ului de rezolutie 16×02
  • void cable_mode_full_lcd():
    • scrie pe textul “Mode:” pe prima linia a display-ului secundar (cel pe I2C, de 16×02),
    • iar pe a doua, tipul de cablare
  • void force_stop_handler():
    • Functia este apelata in urma apasarii butonului rosu.
    • Opreste fortat algoritmul de testare,
    • dar nu inainte de a afisa pe ecranul LCD pe I2C un mesaj sugestiv in acest sens: lcd.print(“Force stop!”);
  • void write_to_sender_socket():
    • Variabila bool pinsSenderSocket[8] retine starea pinilor din mufa RJ-45 de transmisie
    • Functia scrie valorile din bool pinsSenderSocket[8] in shift register-ul 74HC595,
    • Scrierea (chiar si pe un singur pin) al socket-ului sender presupune scrierea tuturor celor 8 valori catre shift register, in ordine inversa (intrucat acesta foloseste MSB: prima valoare primita va fi asociata ultimului pin)
  • void init_sender_pins():
    • Este apelata la pornirea micro-controler-ului
    • pentru a trata starea initiala indefinita
    • (uneori LED-uri se pot aprinde aleator, fara ca eu nici macar sa fi scris ceva in shift register)
    • a shift register-ului 74HC595, asociat socket-ului sender.
  • void fetch_receiver_socket():
    • Citeste valorile de pe shift register-ul 74HC165 (asociat socket-ului receiver)
    • si le scrie in variabila bool pinsReceiverSocket[8];
  • bool is_correct_wiring(int pin_index):
    • Apeleaza is_correct_wiring pentru a citi semnalele de pinii socket-ului receiver
    • Si verifica daca valorile corespund unei cablari corecte, in raport cu indexul pinului activat pe mufa RJ-45 de transmisie
  • int test_individual_rj45_pins():
    • Algoritmul propriu zis de testare
    • Parcurge iterativ, de la 1 la 8, toti pinii socket-ului sender si
      • Scrie pe ecranul secundar (16×02): modul de cablare, indexul pinului RJ-45 de transmisie si indexul corect pe care se asteapta sa primeasca semnal de pe pinul RJ-45 de receptie
      • Scrie “1 logic” in iesirea (shift register-ului) 74HC595 corespunzatoare pinului ales: lucru care va produce aprinderea unui LED
      • Ruleaza un mic delay() pentru a ma asigura ca semnalul are timp sa ajunga de la un capat la altul
      • Apeleaza functia is_correct_wiring pentru a afla daca semnalul ajuns unde trebuie:
        • Daca da, va scrie in “OK” in coltul dreapta-jos al display-ului secundar si va emite un bapait scurt
        • Altfel, va scrie “NOK” pe LCD si va produce un sunet de avertistment
    • Functia verifica constant daca butonul rosu a fost apasat (flag-ul pressedBTN2 a fost setat), caz in care opreste fortat algorimul de testare, apeland force_stop_handler() in cod
  • void draw_straight_through_wiring(), void draw_crossover_wiring(), void draw_rollover_wiring():
    • Aceste functii afiseaza grafic ordinea firelor pentru cele doua capete ale unui cablu de retea
    • In functie de tipul de cablare selectat (straight-through/crossover/rollover)
    • Ordinea firelor este redata conform standardelor prezentate in cursul de RL
  • setup()
    • configureza pinii de Input/Outpt
    • activeaza intreruperile
    • initiaza display-urile
    • scrie in registrii
  • loop()
    • Verifica si trateaza flag-urile pressedBTN1 si pressedBTN3
    • Reseteaza flag-urile
    • Ruleaza delay()

NOTA: flag-ul pressedBTN2 este tratat in interiorul algoritmului de testare (in functia test_individual_rj45_pins())

Repo GitHub: https://github.com/TrifanBogdan24/RJ45-tester

link YouTube:

Concluzii

  • Dat fiind faptul ca nu am avut succes la afisarea pe ecranul 160×128 a unor imagini .bmp luate de pe un card microSD, a trebuit sa renunt complet la modulul microSD
  • In alta ordine de idei, pentru a desena modul de cablare, am mers pe o idee mai programatica, EGC-style: m-am apucat si am desenat eu dreptunghiuri pe ecran, colorandu-ule corespunzator. Rezultatul final cred ca este mult mai bun decat daca as fi transformat niste screen-shoot-uri la imagini .bmp de rezolutie joasa
  • Cateva probleme pe care le-am intampinat in timpul acestui proiect au fost create de shift register-ul 74HC595 (cel cu 8 iesiri paralele):
    1. Are o stare initiala random (am rezolvat scriind 0 logic pe toate iesirile)
    2. Exista un delay (am observat ca este undeva la 200-300 ms) din momentul in care dau o valoare inspre shift register si momentul in care semnalul iese corect din acesta
pm/prj2025/ajipa/bogdan.trifan2412-rj45-tester.txt · Last modified: 2025/05/30 07:03 by bogdan.trifan2412
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0