This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:235141 [2026/05/10 17:03] rares_ioan.neagu |
pm:prj2026:ciprian.popescu0411:235141 [2026/05/27 05:01] (current) rares_ioan.neagu |
||
|---|---|---|---|
| Line 15: | Line 15: | ||
| \\ | \\ | ||
| - | {{ :pm:prj2026:ciprian.popescu0411:schema_bloc_rneagu.png?600 |}} | + | {{ :pm:prj2026:ciprian.popescu0411:schema_bloc_rneagu.png |}} |
| \\ | \\ | ||
| Line 25: | Line 25: | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | Listă de componente: | + | === Listă de componente === |
| * 1 × Microcontroller ATMega328P Xmini Xplained | * 1 × Microcontroller ATMega328P Xmini Xplained | ||
| * 1 × Kit șasiu 4WD (plăci bază + 4 motoare DC cu reductoare + 4 roți) | * 1 × Kit șasiu 4WD (plăci bază + 4 motoare DC cu reductoare + 4 roți) | ||
| Line 31: | Line 31: | ||
| * 1 × Modul Bluetooth HC-05 | * 1 × Modul Bluetooth HC-05 | ||
| * 1 × Senzor ultrasonic HC-SR04 | * 1 × Senzor ultrasonic HC-SR04 | ||
| - | * 4 × baterii AA / 2 x Acumulatori Li-Ion 18650 (în funcție de nevoia de putere, încă nu sunt sigur până nu asamblez proiectul) | + | * 6 × baterii AA |
| * 1 × Mini-breadboard | * 1 × Mini-breadboard | ||
| * n × Jumpere | * n × Jumpere | ||
| - | <note tip> | + | === Schema electrică === |
| - | Aici puneţi tot ce ţine de hardware design: | + | {{:pm:prj2026:ciprian.popescu0411:hai_cu_poza.png?800 }} |
| - | * listă de piese | + | |
| - | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | === Pinout === |
| - | * diagrame de semnal | + | |
| - | * rezultatele simulării | + | ^ Periferic Conectat ^ Pin ATmega328P ^ Pin Periferic ^ Direcție Semnal ^ |
| - | </note> | + | | Modul Bluetooth HC-05 | PD0 (RX) | TXD | Intrare | |
| + | | ::: | PD1 (TX) | RXD | Ieșire | | ||
| + | | Senzor HC-SR04 | PD2 | Trig | Ieșire | | ||
| + | | ::: | PD3 | Echo | Intrare | | ||
| + | | Driver L298N | PD5 | IN1 | Ieșire | | ||
| + | | ::: | PD6 | IN2 | Ieșire | | ||
| + | | ::: | PB1 | IN3 | Ieșire | | ||
| + | | ::: | PB2 | IN4 | Ieșire | | ||
| + | |||
| + | |||
| + | Schema electrică arată cum sunt legate toate componentele în jurul microcontrollerului ATmega328P. | ||
| + | |||
| + | Pentru alimentare, am folosit 4 baterii AA (6V) conectate direct la pinul de 12V al driverului L298N, de unde își iau curent motoarele. Regulatorul intern de pe driver reduce această tensiune la 5V pentru a alimenta microcontrollerul, modulul Bluetooth și senzorul ultrasonic. Toate componentele din circuit împart aceeași masă comună (GND). | ||
| + | |||
| + | Pe partea de date, legăturile respectă exact tabelul de pinout. Modulul Bluetooth comunică serial prin pinii PD0 și PD1 (conectați la TXD/RXD). Senzorul de distanță folosește pinii PD2 (Trig) și PD3 (Echo) pentru a trimite și primi semnalele folosite la evitarea obstacolelor. Driverul L298N primește comenzile de direcție prin pinii IN1-IN4 (legați la pini de pe plăcuță ce permit folosirea PWM, pentru a controla manual viteza), iar ieșirile lui (OUT1-OUT4) controlează cele 4 motoare ale șasiului, fiind legate în paralel câte două pentru fiecare lateral al mașinii. | ||
| + | |||
| + | Mașina asamblată arată ca în imaginile de mai jos. Un demo în care se poate observa că funcționează toate componentele se poate găsi [[https://www.youtube.com/watch?v=tOKGBJQhR9A|aici]]. | ||
| + | |||
| + | | {{:pm:prj2026:ciprian.popescu0411:demo1.jpeg?300|}} | {{:pm:prj2026:ciprian.popescu0411:demo2.jpeg?300|}} | {{:pm:prj2026:ciprian.popescu0411:demo3.jpeg?300|}} | | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | === Mediu de dezvoltare și biblioteci === | ||
| - | <note tip> | + | Codul a fost scris în C++ folosind extensia PlatformIO din Visual Studio Code. Singura bibliotecă third-party folosită este **Arduino.h**, care oferă funcțiile de bază pentru interacțiunea cu pinii microcontrollerului (digitalWrite, analogWrite, pinMode, millis etc.), cât și pentru comunicarea cu modulul HC-05 prin portul UART hardware al ATmega328P. |
| - | Descrierea codului aplicaţiei (firmware): | + | |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | |
| - | ===== Rezultate Obţinute ===== | + | === Structura codului === |
| - | <note tip> | + | Codul este organizat în jurul unui automat de stări simplu, bazat pe variabila ''currentCommand'', care reține ultima comandă validă primită prin Bluetooth. În fiecare iterație a ''loop()'', microcontrollerul procesează orice comandă nouă sosită, citește distanța față de obstacole și execută acțiunea corespunzătoare sau declanșează evitarea autonomă dacă e cazul. |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | Funcțiile principale sunt: |
| + | |||
| + | * ''setForwardSpeed()'', ''setBackwardSpeed()'', ''turnLeft()'', ''turnRight()'', ''stopCar()'' — controlează direcția și viteza motoarelor prin semnale PWM și GPIO către driverul L298N | ||
| + | * ''readDistance()'' — trimite un puls pe TRIG și măsoară durata echo-ului pe ECHO_PIN folosind ''pulseIn()'', convertind rezultatul în centimetri | ||
| + | * ''readDistanceStable()'' — apelează ''readDistance()'' de 3 ori și returnează media citirilor valide, ignorând citirile eronate | ||
| + | * ''handleAcceleration()'' — incrementează ''currentSpeed'' progresiv la fiecare iterație folosind ''millis()'', fără a bloca execuția cu ''delay()'' | ||
| + | * ''autonomousEvasion()'' — oprește mașina, merge înapoi până când distanța față de obstacol depășește ''SAFE_DISTANCE'' sau se atinge un timeout de siguranță, după care apelează ''scanAndAlign()'' | ||
| + | * ''scanAndAlign()'' — rotește mașina spre stânga, măsoară distanța, apoi spre dreapta, măsoară din nou, și se orientează spre direcția cu mai mult spațiu disponibil | ||
| + | * ''serialEvent()'' — funcție apelată automat de framework după fiecare iterație a ''loop()'' când au sosit date pe UART, validează comanda primită și o pune într-un buffer volatil | ||
| + | |||
| + | === Element de noutate === | ||
| + | |||
| + | Elementul care diferențiază acest proiect de o mașină RC simplă este mecanismul de evitare autonomă a obstacolelor. Când mașina detectează un obstacol la mai puțin de 15cm în față în timp ce primește comanda de mers înainte, preia controlul autonom: se oprește, merge înapoi până ajunge la o distanță sigură, scanează stânga și dreapta și se orientează spre direcția cu mai mult spațiu. După finalizarea manevrei, returnează controlul utilizatorului. Un alt element notabil este accelerarea progresivă la pornire, care simulează comportamentul unei mașini reale. | ||
| + | |||
| + | === Funcționalități din laborator === | ||
| + | |||
| + | * **Lab 1 — UART**: comunicarea cu modulul Bluetooth HC-05 se face prin portul UART hardware al ATmega328P (PD0/PD1), la 9600 bauds | ||
| + | * **Lab 2 — Întreruperi**: recepția comenzilor Bluetooth este gestionată prin ''serialEvent()'', care este apelată automat de framework pe baza întreruperii hardware USART_RX, imediat după fiecare iterație a ''loop()''; comenzile sunt validate și puse într-un buffer volatil, decuplând recepția de execuția propriu-zisă | ||
| + | * **Lab 3 — Timere/PWM**: ''analogWrite()'' este folosit pe pinii PD5, PD6, PB1, PB2 pentru a controla viteza motoarelor; ''millis()'' este folosit în ''handleAcceleration()'' pentru a incrementa viteza non-blocant | ||
| + | |||
| + | === Calibrarea senzorului === | ||
| + | |||
| + | Pragurile de distanță au fost determinate experimental. Threshold-ul de oprire a fost setat la 15cm — suficient de aproape ca mașina să nu se oprească prea devreme, dar suficient de departe ca motoarele să aibă timp să se oprească înainte de impact. Distanța de siguranță pentru terminarea manevrei de evitare a fost setată la 30cm, oferind suficient spațiu după ce mașina a ieșit din zona de pericol. Citirea distanței se face ca medie a 3 măsurători consecutive pentru a elimina ecourile false ale senzorului HC-SR04. | ||
| + | |||
| + | === Optimizări === | ||
| + | |||
| + | * Citirea distanței este plasată după procesarea comenzii Bluetooth în ''loop()'', astfel încât comenzile să fie preluate imediat, fără să aștepte finalizarea celor 3 citiri ale senzorului. | ||
| + | * Accelerarea este implementată non-blocant cu ''millis()'' în loc de ''delay()'', astfel încât senzorul și UART-ul să fie în continuare procesate în timp ce viteza crește. | ||
| + | * Comenzile primite în timpul manevrei autonome sunt ignorate — buffer-ul este golit la finalul manevrei, pentru a evita executarea unor comenzi acumulate în timp ce mașina era în control autonom. | ||
| + | * Comenzile Bluetooth sunt validate în ''serialEvent()'' înainte de a fi acceptate — doar caracterele din setul ''FBLRS'' sunt procesate, ignorând zgomotul de pe linie. | ||
| + | |||
| + | === Demo === | ||
| + | |||
| + | Un demo video al proiectului poate fi găsit [[https://youtube.com/shorts/jJCe7olzHS4|aici]]. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | |||
| + | * Proiectul și-a atins obiectivul principal: o mașină 4WD funcțională, controlabilă de la distanță prin Bluetooth, cu detecție și evitare autonomă a obstacolelor. | ||
| + | * Mecanismul de evitare autonomă funcționează fiabil, oprind mașina și alegând automat direcția cu mai mult spațiu disponibil. | ||
| + | * Accelerarea progresivă adaugă un comportament mai natural la pornire, apropiind mașina de comportamentul unui vehicul real. | ||
| + | * Proiectul poate servi ca punct de plecare pentru oricine vrea să înceapă cu microcontrollere, combinând mai multe concepte (UART, PWM, întreruperi, senzoristica) într-un rezultat concret și distractiv. | ||
| + | |||
| ===== Download ===== | ===== Download ===== | ||
| - | <note warning> | + | Pentru testare, codul proiectului poate fi gasit în acest [[https://github.com/rneag/touring-car|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:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | ===== Bibliografie/Resurse ===== |
| - | </note> | + | |
| - | ===== Jurnal ===== | + | === Resurse Software === |
| - | <note tip> | + | * [[https://www.youtube.com/watch?v=Pqs-3GgWW3s|Tutorial YouTube — Arduino 4WD Robot Car]] — punct de plecare pentru structura proiectului |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | * [[https://play.google.com/store/apps/details?id=com.broxcode.arduinobluetoothfree|Arduino Bluetooth Control]] — aplicația Android folosită pentru controlul mașinii |
| - | </note> | + | * [[https://platformio.org/|PlatformIO]] — mediu de dezvoltare |
| + | * [[https://www.arduino.cc/reference/en/|Arduino Reference]] — documentație funcții Arduino | ||
| - | ===== Bibliografie/Resurse ===== | + | === Resurse Hardware === |
| - | <note> | + | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]] — Microchip |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * [[https://www.handsontec.com/dataspecs/L298N%20Motor%20Driver.pdf|L298N Motor Driver Datasheet]] |
| - | </note> | + | * [[https://cdn.datasheetspdf.com/pdf-down/H/C/-/HC-SR04-ETC.pdf|HC-SR04 Ultrasonic Sensor Datasheet]] |
| + | * [[https://components101.com/sites/default/files/component_datasheet/HC-05%20Datasheet.pdf|HC-05 Bluetooth Module Datasheet]] | ||
| <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||