This is an old revision of the document!
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:
Straight-through - pentru conectarea dispozitivelor aflate pe layere diferite (ex: PC – switch)
Crossover - pentru conectarea dispozitivelor de același layer (ex: PC – PC)
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:
Se vor trimite semnale, secvențial, iterând pinii sender-ului unul câte unul, cu mici pauze între transmisii,
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:
Hardware Design
Lista Componente
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
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)
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:
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
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():
void beep_not_okay():
void cable_type_first_line_lcd():
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():
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()
loop()
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
YouTube: https://www.youtube.com/shorts/1yIg8dGbAU8
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):
Are o stare initiala random (am rezolvat scriind 0 logic pe toate iesirile)
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