Proiectul Flipper One reprezinta o mini-replica educationala, realizata pe Arduino UNO, inspirata conceptual de dispozitivul de tip multi-tool folosit pentru pen-testing-ul comunicatiilor simple RF, RFID/NFC si WiFi.
Proiectul este construit in jurul unei placi Arduino UNO R3 / ATmega328P si integreaza un ecran OLED, butoane prin expander I2C, LED RGB, module RF 433 MHz, modul PN532 pentru RFID/NFC, modul ESP-01 pentru scanare WiFi si modul MicroSD pentru stocare.
Produsul final a fost impartit in doua firmware-uri separate:
Aceasta impartire a fost necesara din cauza limitarilor severe de memorie ale microcontrollerului ATmega328P. Incercarea de a include simultan RFID, WiFi, SD, OLED, RF cu RCSwitch intr-un singur firmware depasea limita de Flash. Prin urmare, am modularizat proiectul in doua coduri care folosesc aceeasi platforma hardware, dar sunt incarcate separat in functie de functia dorita.
Functionalitati principale implementate:
Din punct de vedere al rezultatului final, modulul RFID detecteaza cardurile si salveaza UID-urile pe SD, modulul WiFi realizeaza scanari, salveaza rezultatele si afiseaza o mini-analiza a retelelor. Partea RF are cateva imperfectiuni: captura raw este foarte sensibila la zgomotul receptorului, iar varianta cu RCSwitch este mai curata din punct de vedere software, dar depinde puternic de protocolul telecomenzii si de calitatea semnalului primit.
Sistemul este organizat in jurul placii Arduino UNO R3, bazata pe microcontrollerul ATmega328P. Arduino coordoneaza toate modulele externe, citeste butoanele, actualizeaza afisajul OLED si executa functiile alese din meniu.
Interactiunea 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 aceeasi magistrala I2C ca modulul PN532.
Partea de RF este realizata cu doua module de 433 MHz:
In firmware-ul principal, semnalul RF este tratat raw: programul memoreaza duratele dintre tranzitiile de nivel logic detectate pe D2 si incearca sa le retransmita pe D8. Aceasta abordare, pe Arduino UNO, este limitata de memorie si este foarte sensibila la zgomot, dar apropiata conceptual de un sistem de captura raw,. In firmware-ul RF separat, semnalul este tratat cu biblioteca RCSwitch, care incearca sa decodeze protocoale RF simple de tip fixed-code. In loc sa salveze sute de tranzitii, firmware-ul salveaza doar valoarea decodata, numarul de biti, protocolul si lungimea pulsului. Aceasta metoda este mult mai eficienta ca memorie, dar functioneaza doar pentru protocoalele suportate de RCSwitch si pentru telecomenzi compatibile.
Modulul PN532 RFID/NFC este conectat pe I2C si este folosit pentru citirea UID-urilor cardurilor. Pentru a reduce consumul de memorie, in firmware-ul principal am folosit o implementare minimala pentru comenzile PN532 necesare: initializare, configurare SAM si citire UID.
Modulul ESP-01 / ESP8266 este conectat prin SoftwareSerial. Arduino ii trimite comenzi AT, iar ESP-ul raspunde cu lista retelelor WiFi detectate. Datele sunt salvate pe cardul MicroSD in fisierul `WIFIDB.TXT`, apoi sunt citite si analizate din fisier, nu pastrate integral in RAM din cauza constraint-urilor de memorie.
Modulul MicroSD este conectat pe SPI si este folosit pentru stocarea persistenta a datelor:
Logica generala a dispozitivului este bazata pe o masina de stari:
Ambele variante de firmware folosesc aceeasi placa Arduino UNO si aceleasi conexiuni fizice. Diferenta este la nivel software: firmware-ul incarcat pe Arduino decide ce module sunt folosite efectiv.
Montajul este realizat pe breadboard si include urmatoarele module:
Alimentarea este impartita astfel:
PN532 si PCF8574 sunt pe aceeasi magistrala I2C, iar OLED-ul si MicroSD-ul impart magistrala SPI. Pentru a evita conflictele pe SPI, fiecare dispozitiv are pinul sau de chip select: OLED pe D10 si SD pe A3.
| Componenta | Rol in proiect | Interfata / observatii |
|---|---|---|
| Arduino UNO R3 / ATmega328P | Unitatea centrala a sistemului | GPIO, PWM, SPI, I2C, SoftwareSerial |
| Breadboard SYB-120 | Suport pentru prototipare si distributie alimentare | 5V, 3.3V, GND |
| OLED 1.3'' SH1106 128×64 | Afisarea meniurilor si a rezultatelor | SPI hardware, U8x8 fara framebuffer |
| SRX887 433 MHz | Receptie RF | DATA pe D2 / INT0, CS la GND in 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 in meniu | P0-P3 pe PCF8574 |
| PN532 RFID/NFC | Citire UID carduri/tag-uri | I2C, reset pe A1 |
| ESP-01 / ESP8266 | Scanare retele WiFi | SoftwareSerial D4/D7, alimentare 3.3V |
| AMS1117 3.3V | Regulator pentru ESP-01 | VIN 5V, VOUT 3.3V |
| Modul MicroSD | Stocare persistenta | SPI, CS pe A3 |
| Pin Arduino | Conectat la | Justificare |
|---|---|---|
| 5V | OLED, PN532, PCF8574, RF, MicroSD, AMS1117 VIN | Alimentare module compatibile 5V |
| GND | Toate modulele | Referinta comuna |
| D2 | DATA receptor SRX887 | Pin cu intrerupere externa INT0 |
| D3 | LED RGB - R | PWM |
| D4 | ESP-01 TX catre Arduino | SoftwareSerial RX |
| D5 | LED RGB - G | PWM |
| D6 | LED RGB - B | PWM |
| D7 | ESP-01 RX de la Arduino | SoftwareSerial TX |
| D8 | DATA emitator STX882 | Iesire digitala pentru transmisie RF |
| D9 | RST OLED | Reset display |
| D10 | CS OLED | Chip select SPI OLED |
| D11 | MOSI SPI | Date catre OLED si MicroSD |
| D12 | MISO SPI | Date de la MicroSD |
| D13 | SCK SPI | Clock SPI |
| A0 | DC OLED | Selectare comanda/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 | Magistrala I2C |
| A5 | SCL PCF8574 + PN532 | Magistrala 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 | Antena 433 MHz |
| STX882 | VCC | 5V |
| STX882 | GND | GND |
| STX882 | DATA | D8 |
| STX882 | ANT | Antena 433 MHz |
| Pin ESP-01 | Conectat la | Observatii |
|---|---|---|
| VCC | 3.3V AMS1117 | ESP-ul nu se alimenteaza direct din 5V |
| GND | GND comun | Masa comuna |
| TX | D4 Arduino | Arduino primeste prin SoftwareSerial |
| RX | D7 Arduino | Arduino trimite comenzi AT |
| CH_PD / EN | 3.3V | Activare modul |
Proiectul a fost dezvoltat in Visual Studio Code folosind PlatformIO si toolchain-ul AVR-GCC pentru Arduino UNO. Framework-ul folosit este Arduino, deoarece proiectul integreaza mai multe biblioteci si periferice externe.
Biblioteci folosite:
Pentru a evita depasirea memoriei Flash, proiectul este impartit in doua 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 si 2 KB SRAM. In timpul dezvoltarii, incercarea de a include toate functiile intr-un singur firmware a dus la depasirea limitei de Flash sau la instabilitate runtime, mai ales cand erau folosite simultan:
Solutia finala a fost separarea proiectului in doua coduri:
Firmware-ul principal si cel mai “product ready” din cele 2:
In modul raw, receptorul RF este conectat la D2, iar codul foloseste intreruperea externa INT0 pentru a masura timpul dintre tranzitiile semnalului. Fiecare durata este salvata intr-un buffer de tip `uint16_t`.
Avantajul acestei abordari este ca nu presupune cunoasterea protocolului. In teorie, poate captura orice secventa de impulsuri OOK/ASK suficient de simpla.
Dezavantajul major este sensibilitatea la zgomot. Receptorul SRX887 poate genera tranzitii chiar si in lipsa unui semnal real, din cauza AGC-ului si a zgomotului RF din mediu. Astfel, bufferul se poate umple cu zgomot inainte ca utilizatorul sa apese telecomanda. Din acest motiv, captura RF este cea mai instabila parte a proiectului.
Modulul PN532 este controlat prin I2C. Pentru economie de memorie, nu este folosita biblioteca completa Adafruit PN532, ci un driver minimal care implementeaza doar comenzile necesare:
Dupa detectarea unui card, UID-ul este afisat pe OLED si poate fi salvat pe SD intr-un fisier `.UID`. Numele fisierului este generat automat, iar indexul fisierelor salvate este pastrat in `UIDIDX.TXT`.
Exemplu format fisier RFID:
LEN=4 UID=04A1B2C3
Pentru scanarea WiFi este folosit un modul ESP-01 / ESP8266 cu firmware AT. Arduino comunica prin SoftwareSerial si trimite comanda:
AT+CWLAP
Raspunsurile de forma `+CWLAP:(…)` sunt salvate automat pe cardul MicroSD in fisierul `WIFIDB.TXT`. Am luat aceasta decizie de implementare pentru a economisi RAM, retelele nefiind pastrate intr-un vector mare, ci scrise direct pe SD si apoi citite la nevoie.
Date analizate pentru fiecare retea:
Firmware-ul principal include un browser simplu de fisiere salvate. Acesta citeste indexul linie cu linie si afiseaza fisierele pe OLED. Pentru a evita directoarele si operatii costisitoare pe SD, sunt folosite fisiere index:
Firmware-ul RF este o varianta specializata pentru testarea RF 433 MHz. Acesta include:
Nu include PN532, ESP-01 sau analiza WiFi, tocmai pentru a pastra suficient spatiu pentru RCSwitch, pentru logica de salvare RF si ca devena redundant.
Meniul firmware-ului RF:
In acest firmware, in loc sa se salveze tranzitiile brute, biblioteca RCSwitch incearca sa decodeze semnalul. Daca reuseste, firmware-ul retine:
Aceasta reprezentare este mult mai compacta decat raw pulse capture. Un cod RF poate fi salvat in cativa bytes, in timp ce varianta raw are nevoie de un buffer de durate.
In firmware-ul RF, codurile decodate pot fi salvate pe card MicroSD in fisiere separate, similar cu salvarea UID-urilor RFID. Exista un fisier index `RFIDX.TXT`, iar fiecare cod RF este salvat intr-un fisier `.RFC`.
La selectarea unui fisier din meniul Saved RF, codul este incarcat in RAM si poate fi retransmis prin Emit Last.
Desi firmware-ul RF este mai eficient si mai bine structurat decat captura raw, rezultatele practice nu au fost perfecte. Uneori receptorul produce zgomot si RCSwitch nu decodeaza nimic valid. Alteori semnalul telecomenzii nu este compatibil cu protocoalele suportate. Astfel, partea RF ramane cea mai instabila parte a proiectului.
Proiectul foloseste mai multe concepte din laboratoarele de Proiectarea cu Microprocesoare. Am incercat sa le aplic practic, nu doar separat, ci intr-un sistem in care toate modulele trebuie sa functioneze impreuna:
Pe langa laboratoarele propriu-zise, am folosit si concepte de organizare software: masina de stari pentru meniuri, fisiere index pe SD, separarea proiectului in doua firmware-uri si optimizarea memoriei pentru ATmega328P.
Pentru a rula pe Arduino UNO, au fost necesare mai multe optimizari:
Fara aceste modularizari proiectul ar fi fost prea mare pentru ATmega328P. In momentul de fata, firmware-ul main atinge 99.5% din memoria flash.
In urma implementarii, asamblarii si testarii FlipperOne, s-au obtinut urmatoarele rezultate ce confirma atingerea si depasirea obiectivelor initial propuse:
Cele mai mari probleme au fost:
Proiectul a iesit mai bine decat ma asteptam, mai ales avand in vedere numarul mare de module conectate la un Arduino UNO. Cele mai stabile si reusite parti sunt RFID-ul si WiFi-ul: UID-urile sunt citite si salvate corect, iar scanarea WiFi impreuna cu analiza retelelor functioneaza foarte bine.
Partea RF a fost cea mai dificila. Captura raw este foarte expusa la noise, iar varianta cu RCSwitch, desi mult mai eficienta, depinde de protocoalele suportate si de calitatea semnalului. Din acest motiv, RF-ul ramane o functionalitate partiala si experimentala in proiect. Pe langa RF, resursele foarte limitate ale lui ATmega328P au adus mai multe constrangerile de memorie greu de rezolvat, combinatia dintre OLED, SD, ESP, PN532, RF Raw/RCSwitch a fortat optimizari serioase. In final, modularizarea in doua firmware-uri separate a fost solutia corecta: firmware-ul principal pentru RFID/WiFi/SD/RFraw si firmware-ul RF pentru captura/decodare/salvare RF.
Pentru documentarea si realizarea acestui proiect, am consultat urmatoarele resurse tehnice si bibliografii:
Resurse utilizate pentru implementarea interfetelor, perifericelor si comunicatiilor cu modulele externe:
Documentatia tehnica oficiala a componentelor si bibliotecilor utilizate: