This is an old revision of the document!
Proiectul Flipper One reprezintă o mini-replică educațională, realizată pe Arduino UNO, inspirată conceptual de dispozitivul de tip multi-tool folosit pentru pen-testing-ul comunicațiilor simple RF, RFID/NFC și WiFi.
Proiectul este construit în jurul unei plăci Arduino UNO R3 / ATmega328P și integrează un ecran OLED, butoane prin expander I2C, LED RGB, module RF 433 MHz, modul PN532 pentru RFID/NFC, modul ESP-01 pentru scanare WiFi și modul MicroSD pentru stocare.
Produsul final a fost împărțit în două firmware-uri separate:
Această împărțire a fost necesară din cauza limitărilor severe de memorie ale microcontrollerului ATmega328P. Încercarea de a include simultan RFID, WiFi, SD, OLED, RF cu RCSwitch într-un singur firmware depășea limita de Flash. Prin urmare, am modularizat proiectul în două coduri care folosesc aceeași platformă hardware, dar sunt încărcate separat în funcție de functia dorită.
Funcționalități principale implementate:
Din punct de vedere al rezultatului final, modulul RFID detectează cardurile și salvează UID-urile pe SD, modulul WiFi realizează scanări, salvează rezultatele și afișează o mini-analiza a rețelelor. Partea RF are cateva imperfectiuni: captura raw este foarte sensibilă la zgomotul receptorului, iar varianta cu RCSwitch este mai curată din punct de vedere software, dar depinde puternic de protocolul telecomenzii și de calitatea semnalului primit.
Sistemul este organizat în jurul plăcii Arduino UNO R3, bazată pe microcontrollerul ATmega328P. Arduino coordonează toate modulele externe, citește butoanele, actualizează afișajul OLED și execută funcțiile alese din meniu.
Interacțiunea cu utilizatorul se face prin:
Din cauza numarului de pini necesarui pentru conectarea tuturor modulelor am optat spre a fololsi un expander I2C PCF8574 la care am legat cele 4 butoane. Astfel, cele 4 butoane folosesc aceeași magistrală I2C ca modulul PN532.
Partea de RF este realizată cu două module de 433 MHz:
În firmware-ul principal, semnalul RF este tratat raw: programul memorează duratele dintre tranzițiile de nivel logic detectate pe D2 și încearcă să le retransmită pe D8. Această abordare, pe Arduino UNO, este limitată de memorie și este foarte sensibilă la zgomot, dar apropiată conceptual de un sistem de captură raw,. În firmware-ul RF separat, semnalul este tratat cu biblioteca RCSwitch, care încearcă să decodeze protocoale RF simple de tip fixed-code. În loc să salveze sute de tranziții, firmware-ul salvează doar valoarea decodată, numărul de biți, protocolul și lungimea pulsului. Această metodă este mult mai eficientă ca memorie, dar funcționează doar pentru protocoalele suportate de RCSwitch și pentru telecomenzi compatibile.
Modulul PN532 RFID/NFC este conectat pe I2C și este folosit pentru citirea UID-urilor cardurilor. Pentru a reduce consumul de memorie, în firmware-ul principal am folosit o implementare minimală pentru comenzile PN532 necesare: inițializare, configurare SAM și citire UID.
Modulul ESP-01 / ESP8266 este conectat prin SoftwareSerial. Arduino îi trimite comenzi AT, iar ESP-ul răspunde cu lista rețelelor WiFi detectate. Datele sunt salvate pe cardul MicroSD în fișierul `WIFIDB.TXT`, apoi sunt citite și analizate din fișier, nu păstrate integral în RAM din cauza constraint-urilor de memorie.
Modulul MicroSD este conectat pe SPI și este folosit pentru stocarea persistentă a datelor:
Logica generală a dispozitivului este bazată pe o mașină de stări:
Ambele variante de firmware folosesc aceeași placă Arduino UNO și aceleași conexiuni fizice. Diferența este la nivel software: firmware-ul încărcat pe Arduino decide ce module sunt folosite efectiv.
Montajul este realizat pe breadboard și include următoarele module:
Alimentarea este împărțită astfel:
PN532 și PCF8574 sunt pe aceeași magistrală I2C, iar OLED-ul și MicroSD-ul împart magistrala SPI. Pentru a evita conflictele pe SPI, fiecare dispozitiv are pinul său de chip select: OLED pe D10 și SD pe A3.
| Componentă | Rol în proiect | Interfață / observații |
|---|---|---|
| Arduino UNO R3 / ATmega328P | Unitatea centrală a sistemului | GPIO, PWM, SPI, I2C, SoftwareSerial |
| Breadboard SYB-120 | Suport pentru prototipare și distribuție alimentare | 5V, 3.3V, GND |
| OLED 1.3'' SH1106 128×64 | Afișarea meniurilor și a rezultatelor | SPI hardware, U8x8 fără framebuffer |
| SRX887 433 MHz | Recepție RF | DATA pe D2 / INT0, CS la GND în modul activ |
| STX882 433 MHz | Transmisie RF | DATA pe D8 |
| LED RGB KY-016 | Feedback vizual | PWM pe D3, D5, D6 |
| PCF8574 | Extinderea pinilor pentru butoane | I2C pe A4/A5 |
| 4 butoane tactile | Navigare în meniu | P0-P3 pe PCF8574 |
| PN532 RFID/NFC | Citire UID carduri/tag-uri | I2C, reset pe A1 |
| ESP-01 / ESP8266 | Scanare rețele WiFi | SoftwareSerial D4/D7, alimentare 3.3V |
| AMS1117 3.3V | Regulator pentru ESP-01 | VIN 5V, VOUT 3.3V |
| Modul MicroSD | Stocare persistentă | SPI, CS pe A3 |
| Pin Arduino | Conectat la | Justificare |
|---|---|---|
| 5V | OLED, PN532, PCF8574, RF, MicroSD, AMS1117 VIN | Alimentare module compatibile 5V |
| GND | Toate modulele | Referință comună |
| D2 | DATA receptor SRX887 | Pin cu întrerupere externă INT0 |
| D3 | LED RGB - R | PWM |
| D4 | ESP-01 TX către Arduino | SoftwareSerial RX |
| D5 | LED RGB - G | PWM |
| D6 | LED RGB - B | PWM |
| D7 | ESP-01 RX de la Arduino | SoftwareSerial TX |
| D8 | DATA emițător STX882 | Ieșire digitală pentru transmisie RF |
| D9 | RST OLED | Reset display |
| D10 | CS OLED | Chip select SPI OLED |
| D11 | MOSI SPI | Date către OLED și MicroSD |
| D12 | MISO SPI | Date de la MicroSD |
| D13 | SCK SPI | Clock SPI |
| A0 | DC OLED | Selectare comandă/date OLED |
| A1 | RESET PN532 | Reset hardware PN532 |
| A2 | IRQ PN532 | Pin rezervat pentru IRQ PN532 |
| A3 | CS MicroSD | Chip select SD |
| A4 | SDA PCF8574 + PN532 | Magistrală I2C |
| A5 | SCL PCF8574 + PN532 | Magistrală I2C |
| Pin OLED | Arduino |
|---|---|
| GND | GND |
| VCC | 5V |
| SCK | D13 |
| SDA / MOSI | D11 |
| RES | D9 |
| DC | A0 |
| CS | D10 |
| Pin MicroSD | Arduino |
|---|---|
| VCC | 5V |
| GND | GND |
| SCK | D13 |
| MOSI | D11 |
| MISO | D12 |
| CS | A3 |
| Pin PN532 | Arduino |
|---|---|
| VCC / 5V | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
| RST | A1 |
| IRQ | A2 |
| Pin PCF8574 | Conexiune |
|---|---|
| VCC | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
| P0 | Buton UP |
| P1 | Buton DOWN |
| P2 | Buton SELECT |
| P3 | Buton BACK |
| Modul | Pin | Arduino / conexiune |
|---|---|---|
| SRX887 | VCC | 5V |
| SRX887 | GND | GND |
| SRX887 | CS | GND pentru activare |
| SRX887 | DATA | D2 / INT0 |
| SRX887 | ANT | Antenă 433 MHz |
| STX882 | VCC | 5V |
| STX882 | GND | GND |
| STX882 | DATA | D8 |
| STX882 | ANT | Antenă 433 MHz |
| Pin ESP-01 | Conectat la | Observații |
|---|---|---|
| VCC | 3.3V AMS1117 | ESP-ul nu se alimentează direct din 5V |
| GND | GND comun | Masă comună |
| TX | D4 Arduino | Arduino primește prin SoftwareSerial |
| RX | D7 Arduino | Arduino trimite comenzi AT |
| CH_PD / EN | 3.3V | Activare modul |
Proiectul a fost dezvoltat în Visual Studio Code folosind PlatformIO și toolchain-ul AVR-GCC pentru Arduino UNO. Framework-ul folosit este Arduino, deoarece proiectul integrează mai multe biblioteci și periferice externe.
Biblioteci folosite:
Pentru a evita depășirea memoriei Flash, proiectul este împărțit în două environment-uri PlatformIO:
[env:main_demo] ; Flipper One Main: RFID + WiFi + SD + raw RF [env:rf_demo] ; Flipper One RF: RF RCSwitch + SD
Microcontrollerul ATmega328P are doar 32 KB Flash și 2 KB SRAM. În timpul dezvoltării, încercarea de a include toate funcțiile într-un singur firmware a dus la depășirea limitei de Flash sau la instabilitate runtime, mai ales când erau folosite simultan:
Soluția finală a fost separarea proiectului în două coduri:
Firmware-ul principal si cel mai “product ready” din cele 2:
În modul raw, receptorul RF este conectat la D2, iar codul folosește întreruperea externă INT0 pentru a măsura timpul dintre tranzițiile semnalului. Fiecare durată este salvată într-un buffer de tip `uint16_t`.
Avantajul acestei abordări este că nu presupune cunoașterea protocolului. În teorie, poate captura orice secvență de impulsuri OOK/ASK suficient de simplă.
Dezavantajul major este sensibilitatea la zgomot. Receptorul SRX887 poate genera tranziții chiar și în lipsa unui semnal real, din cauza AGC-ului și a zgomotului RF din mediu. Astfel, bufferul se poate umple cu zgomot înainte ca utilizatorul să apese telecomanda. Din acest motiv, captura RF este cea mai instabilă parte a proiectului.
Modulul PN532 este controlat prin I2C. Pentru economie de memorie, nu este folosită biblioteca completă Adafruit PN532, ci un driver minimal care implementează doar comenzile necesare:
După detectarea unui card, UID-ul este afișat pe OLED și poate fi salvat pe SD într-un fișier `.UID`. Numele fișierului este generat automat, iar indexul fișierelor salvate este păstrat în `UIDIDX.TXT`.
Exemplu format fișier RFID:
LEN=4 UID=04A1B2C3
Pentru scanarea WiFi este folosit un modul ESP-01 / ESP8266 cu firmware AT. Arduino comunică prin SoftwareSerial și trimite comanda:
AT+CWLAP
Răspunsurile de forma `+CWLAP:(…)` sunt salvate automat pe cardul MicroSD în fișierul `WIFIDB.TXT`. Aceasta decizie de implementare Pentru a economisi RAM, rețelele nu sunt păstrate într-un vector mare, ci sunt scrise direct pe SD și apoi citite la nevoie.
Date analizate pentru fiecare rețea:
Scanarea WiFi și analiza rezultatelor funcționează foarte bine. Aceasta a devenit una dintre cele mai reușite părți ale proiectului.
Firmware-ul principal include un browser simplu de fișiere salvate. Pentru a evita directoarele și operații costisitoare pe SD, sunt folosite fișiere index:
Browserul citește indexul linie cu linie și afișează fișierele pe OLED.
Firmware-ul RF este o variantă specializată pentru testarea RF 433 MHz. Acesta include:
Nu include PN532, ESP-01 sau analiza WiFi, tocmai pentru a păstra suficient spațiu pentru RCSwitch și pentru logica de salvare RF.
Meniul firmware-ului RF:
În acest firmware, în loc să se salveze tranzițiile brute, biblioteca RCSwitch încearcă să decodeze semnalul. Dacă reușește, firmware-ul reține:
Această reprezentare este mult mai compactă decât raw pulse capture. Un cod RF poate fi salvat în câțiva bytes, în timp ce varianta raw are nevoie de un buffer de durate.
În firmware-ul RF, codurile decodate pot fi salvate pe card MicroSD în fișiere separate, similar cu salvarea UID-urilor RFID. Există un fișier index `RFIDX.TXT`, iar fiecare cod RF este salvat într-un fișier `.RFC`.
Exemplu:
RFIDX.TXT R123456.RFC R234567.RFC
Format fișier `.RFC`:
VAL=1234567 BITS=24 PROTO=1 DELAY=350
La selectarea unui fișier din meniul Saved RF, codul este încărcat în RAM și poate fi retransmis prin Emit Last.
Deși firmware-ul RF este mai eficient și mai bine structurat decât captura raw, rezultatele practice nu au fost perfecte. Uneori receptorul produce zgomot și RCSwitch nu decodează nimic valid. Alteori semnalul telecomenzii nu este compatibil cu protocoalele suportate. Astfel, partea RF rămâne cea mai instabilă parte a proiectului.
Totuși, salvarea pe SD din firmware-ul RF funcționează, iar structura software este corectă: atunci când un cod este capturat valid, acesta poate fi salvat, încărcat și retransmis.
Proiectul folosește mai multe concepte studiate în laboratoarele de Proiectarea cu Microprocesoare:
Pentru a rula pe Arduino UNO, au fost necesare mai multe optimizări:
Această modularizare a fost probabil cea mai importantă decizie software. Fără ea, proiectul era prea mare pentru ATmega328P.
În urma implementării și testării, rezultatele au fost mixte, dar în general peste așteptări pentru un proiect realizat pe Arduino UNO cu atât de multe periferice conectate simultan.
Partea de RFID funcționează foarte bine:
Această funcționalitate este stabilă și poate fi demonstrată live fără probleme majore.
Partea de WiFi este una dintre cele mai reușite părți ale proiectului:
Pentru un Arduino UNO, faptul că analiza WiFi se face fără a păstra toate rețelele în RAM este un rezultat important.
Captura RF raw este implementată, dar este instabilă în practică. Uneori receptorul captează foarte mult zgomot, alteori semnalul util nu poate fi separat clar de zgomot. Această problemă vine atât din natura receptorului RF, cât și din limitările Arduino UNO.
Raw RF rămâne interesant ca experiment, deoarece arată cum pot fi măsurate tranzițiile folosind întreruperi, dar nu este suficient de stabil pentru o demonstrație sigură de tip „capturează telecomanda și retransmite”.
Firmware-ul RF cu RCSwitch este mai curat și mai eficient, dar nu rezolvă complet problema. Dacă telecomanda folosește un protocol suportat și semnalul este curat, codul poate fi decodat și salvat. Dacă semnalul este zgomotos sau protocolul nu este compatibil, nu apare nicio captură validă.
Totuși, modulul RF dedicat are următoarele funcționalități funcționale:
Partea de salvare pe SD din firmware-ul RF funcționează, iar structura fișierelor este clară și ușor de verificat manual pe calculator.
Cele mai mari probleme au fost:
Proiectul a ieșit mai bine decât mă așteptam, mai ales având în vedere numărul mare de module conectate la un Arduino UNO. Cele mai stabile și reușite părți sunt RFID-ul și WiFi-ul: UID-urile sunt citite și salvate corect, iar scanarea WiFi împreună cu analiza rețelelor funcționează foarte bine.
Partea RF a fost cea mai dificilă. Captura raw este foarte expusă la noise, iar varianta cu RCSwitch, deși mult mai eficientă, depinde de protocoalele suportate și de calitatea semnalului. Din acest motiv, RF-ul rămâne o funcționalitate parțială și experimentală în proiect.
Cea mai importantă lecție a fost legată de constrângerile de memorie. ATmega328P are resurse foarte limitate, iar combinația dintre OLED, SD, ESP, PN532, RF și RCSwitch a forțat optimizări serioase. În final, modularizarea în două firmware-uri separate a fost soluția corectă: firmware-ul principal pentru RFID/WiFi/SD și firmware-ul RF pentru captură/decodare/salvare RF.
Chiar dacă RF-ul nu este perfect, proiectul demonstrează integrarea unui număr mare de periferice și concepte embedded într-un singur montaj. Din punct de vedere educațional, proiectul și-a atins scopul: am lucrat cu GPIO, întreruperi, PWM, SPI, I2C, UART software, card SD, management de memorie și proiectare software modulară.