Line Follower

Name: Staicu Dan-Dominic
Group: 331CA

Introducere

Acest proiect reprezintă o implementare practică a unui robot autonom de tip line follower, construit folosind placa Arduino Portenta H7. Scopul principal a fost dezvoltarea unui sistem capabil să detecteze și să urmeze o linie cu precizie, folosind un algoritm de control PID reglabil în timp real.

Ideea a pornit din dorința de a învăța cum să combin senzorică de precizie, control al motoarelor și interfețe moderne, într-un sistem embedded performant. Am ales Portenta H7 pentru a explora capabilitățile dual-core ale acesteia și pentru a pregăti o bază solidă pentru aplicații embedded mai complexe.

Consider că acest proiect este valoros atât pentru dezvoltarea mea personală în domeniul roboticii și automatizării, cât și ca prim pas spre participarea în competiții de tip Line Follower. Este o platformă extensibilă pe care pot continua să o îmbunătățesc și să o adaptez pentru trasee mai complexe și cerințe mai stricte.

Descriere generală

Sistemul este compus din următoarele module:

  • Senzori de linie – 16 senzori conectați printr-un multiplexer analogic.
  • Microcontroller – Arduino Portenta H7, folosește core-ul M7 pentru control și M4 pentru interfața web.
  • Motor Driver – HR8833, controlează doua motoare cu gearbox.
  • Algoritm PID – implementat în firmware pentru corectarea traiectoriei robotului.
  • Interfață Web – permite reglarea în timp real a parametrilor PID.
  • Power Supply – baterie Li-Po de 7.4V.
  • 5V, 3.4A STEP-DOWN VOLTAGE REGULATOR - pentru a face o singura linie de 5V pentru microcontroller si senzor.

Interacțiunea între module:

Portenta H7 citește valorile de la senzori, calculează eroarea și aplică corecția PID asupra motoarelor prin driverul HR8833. Interfața web permite modificarea în timp real a valorilor KP, KI, KD și vitezei de referință.

Hardware Design

Stadiul actual al implementării hardware

La acest moment, partea hardware a fost finalizată și asamblată complet. Toate modulele au fost testate individual (senzori, motoare, impeller, sursă alimentare), iar integrarea a fost validată pe platforma Portenta H7.

Lista de piese:

Descriere detaliată a funcționalității hardware

1. Microcontroller (Portenta H7)

Rol: creierul sistemului, citește date de la senzori, calculează corecția PID, generează semnale PWM pentru controlul motoarelor. Interfețe folosite: GPIO pentru selectarea canalelor multiplexorului (S0-S3) Analog input pentru semnalul de la senzori (SIG → A6) PWM output pentru controlul motoarelor (D5, D6) GPIO output pentru direcție (D4, D7) D8 pentru receptor IR

2. Senzori de linie (16 IR cu multiplexor analogic)

Modulul conține 16 senzori IR, multiplexați pe un singur canal analogic. Conexiuni: S0–S3: pinii digitali D0–D3 pentru selectarea canalului activ SIG: pinul analogic A6 Permite citirea rapidă a fiecărui senzor fără a aglomera pinii analogici ai Portenta.

3. Motor Driver HR8833

Controlează două motoare DC independent, pe bază de PWM și semnal de direcție. Pini utilizați: Motor 1: DIR (D4), PWM (D5) Motor 2: DIR (D7), PWM (D6) Asigură atât modurile „coast” cât și „brake”, pentru frânare rapidă.

4. Motoare Pololu + Roti aderente

Asigură tracțiune pe suprafață cu frecare redusă. Alimentate direct din driver, controlate fin via PWM.

5. Impeller

Efect de „downforce” pentru stabilitate crescută la viteze mari. Alimentat separat, are switch on/off pentru testare independentă.

6. Baterie LiPo 7.4V și Step-down 5V

Bateria furnizează energia principală pentru motoare și control. Regulatorul step-down convertește la 5V pentru Portenta, senzori și logica de control. Consumul estimat în sarcină maximă: ~1A pentru motoare, ~100-200mA pentru control/senzori.

Componentă Pin Portenta H7 Mod/Tip Motiv/Utilizare
————— ————— ———— ————————————
Multiplexor S0 D0 OUTPUT Selectare canal IR
Multiplexor S1 D1 OUTPUT Selectare canal IR
Multiplexor S2 D2 OUTPUT Selectare canal IR
Multiplexor S3 D3 OUTPUT Selectare canal IR
Multiplexor SIG A6 ANALOG INPUT Citire valoare IR
Motor 1 DIR D4 OUTPUT Direcție motor stânga
Motor 1 PWM D5 PWM OUTPUT Viteză motor stânga
Motor 2 PWM D6 PWM OUTPUT Viteză motor dreapta
Motor 2 DIR D7 OUTPUT Direcție motor dreapta
IR Receiver D8 INPUT Primire comandă pornire/oprire robot

Senzorul de linie
are un multiplexor in care trebuie scris digital adresa fiecărui modul IR pentru a scoate analogic valoarea citită de acesta.

Impeller-ul
are un switch separat pentru a putea folosi robotul si fără a avea impeller-ul pornit.

Software Design

Stadiul implementării software

Firmware-ul a fost dezvoltat în PlatformIO (cu suport Arduino), folosind C++ modular. Toate modulele principale (citirea senzorilor, controlul motoarelor, algoritmul PID, comunicarea cu interfața web) sunt implementate și testate pe hardware real.

Biblioteci folosite și motivare

  • Arduino.h: standard, pentru acces la funcțiile de bază și portabilitate între IDE-uri.
  • IRremote: pentru decodare rapidă a comenzilor de la telecomandă IR (start/stop robot).
  • WiFi: pentru expunerea unui web server de reglaj în timp real al PID-ului
  • LF_SData (custom): modul propriu de gestiune și calibrare a celor 16 senzori.
  • MotorDriver & Motor (custom): control granular și robust pentru motoarele conectate la HR8833, permite și brake/coast.

Am evitat biblioteci „grele” sau generice pentru PID sau multiplexare, tocmai pentru a optimiza resursele pe Portenta H7 și a avea control complet asupra funcționalității.

Element de noutate / originalitate

  • Control în timp real al parametrilor PID prin interfață web (reglaj live, fără reîncărcare firmware).
  • Modul avansat de calibrare automată și salvare persistentă a datelor de calibrare folosind kvstore_global_api (EEPROM/flash).
  • Algoritm de filtrare/„smoothing” pentru eroarea liniei, reducând semnificativ zgomotul senzorilor.
  • Rutină specială pentru accelerarea lină și anti-backtracking în primele secunde ale cursei.

Structura și arhitectura software

Organizare modulară:

  • main.cpp – orchestrare, logica principală, rutine de inițializare, loop de control.
  • LF_SData.h – gestiunea senzorilor de linie, multiplexare, normalizare, calibrare și calcul poziție linie.
  • Motor.h & MotorDriver.h – low-level control pentru fiecare motor (direcție, PWM, frânare, coast).
  • arduino_secrets.h – date sensibile (WiFi etc), exclus din repo public.
  • kvstore_global_api.h – interfață pentru persistența datelor (calibrare senzori).

Fluxul principal:

  • Inițializare hardware (motoare, senzori, IR).
  • Calibrare senzori (manuală la prima rulare sau încărcare date existente).
  • Citirea periodică a poziției liniei.
  • Calculul erorii și filtrarea acesteia (smoothing).
  • Aplicare PID pentru determinarea corecției.
  • Controlul diferențiat al motoarelor în funcție de PID și starea robotului.
  • Opțional, interfață web pentru reglaj parametri.
  • Comunicare între module: se face strict prin API-ul public al fiecărei clase – codul este ușor de întreținut/extins.

Validarea funcționalității

  • Fiecare modul a fost testat independent (de ex. citire senzori + serial debug, test individual PWM, funcții IR).
  • Rulări pe trasee drepte, curbe și cu obstacole pentru tuning PID și filtrare erori.
  • Test cu pornire/oprire din telecomandă.
  • Validare interfață web: modificare KP/KI/KD live și observare răspuns instant robot.

Calibrarea senzorilor

  • Se pornește robotul cu CALIBRATION_FLAG activat. În 5 secunde, toate valorile min/max sunt citite pentru fiecare senzor, apoi salvate în memorie.
  • La pornire normală, valorile de calibrare sunt încărcate automat.
  • Permite recalibrare ușoară pe orice traseu nou.

Optimizări și best-practices

  • Toate calculele PID și filtrarea erorii folosesc variabile double pentru precizie crescută, dar fără delay-uri costisitoare.
  • Controlul accelerării la pornire pentru a evita derapaje/bruscări mecanice.
  • Folosirea funcției map() și normalizarea valorilor senzorilor pentru robustețe la variațiile ambientale.
  • Debouncing pe comenzile IR.
  • Interfața web permite tuning rapid, fără recompilare/reflash.

Demo video și repo

https://youtube.com/shorts/tS6IaLmMsx4

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

Github Repo

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj2025:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dan-Dominic Staicu, 331CA → :pm:prj2025:cc:dan_dominic.staicu.

Jurnal

  • Documentatie initiala + schema bloc
  • Design hardware - piese
  • Design software

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Resurse Hardware

DFROBOT HR8833 Docs

Arduino Portenta H7 Datasheet

ST STM32H747XI Processor Datasheet

16 Sensors Bar

Resurse Software

DFROBOT HR8833 Docs

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2025/eradu/dan_dominic.staicu.txt · Last modified: 2025/05/30 09:32 by dan_dominic.staicu
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