This shows you the differences between two versions of the page.
pm:prj2025:mdinica:dragos.coticeru [2025/05/30 02:53] dragos.coticeru [Descriere generală] |
pm:prj2025:mdinica:dragos.coticeru [2025/05/30 04:04] (current) dragos.coticeru [Software Design] |
||
---|---|---|---|
Line 13: | Line 13: | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | <note tip> | + | <note tip> Mașinuța este controlată exclusiv prin **Bluetooth**, folosind un **Arduino Uno** și un **shield L293D** pentru controlul a 4 motoare DC. Utilizatorul transmite comenzi dintr-o aplicație mobilă către un modul **HC-05**, conectat la Arduino prin **UART (USART)**. |
- | Arduino Uno este unitatea de control care citește datele de la senzorul ultrasonic. | + | Comenzile primite sunt interpretate direct și transformate în semnale logice către pinii de control ai motoarelor. |
- | În funcție de distanța față de obstacol, Arduino comandă motoarele să se oprească sau să vireze. | + | Pentru feedback, sistemul include: |
- | Dacă se apropie de un obstacol, se activează un buzzer și un LED. | + | un LED care se aprinde în timpul mișcărilor laterale și înapoi |
- | * LED-ul se aprinde când mașina schimbă direcția. | + | |
- | * Buzzer-ul variază frecvența sunetului în funcție de distanță. | + | |
- | În **modul automat**, mașina navighează singură, evitând obstacolele cu ajutorul senzorului de distanță. | + | un buzzer activ care se aprinde sincron cu LED-ul în mers înapoi |
- | În **modul Bluetooth**, utilizatorul controlează manual mașina printr-o aplicație de pe telefon, trimițând comenzi către Arduino printr-un modul de comunicație serială. | + | Controlul direcției și al vitezei motoarelor este realizat cu semnale digitale și PWM, iar gestionarea LED-ului și buzzerului se face cu acces direct la registre și un timer hardware pentru clipire asincronă. |
- | {{ schema.png?400x400 | Schema bloc }} | + | Interacțiunea modulelor este următoarea: |
+ | Modul Bluetooth (HC-05): transmite comenzile către Arduino prin UART | ||
- | </note> | + | Arduino Uno: interpretează comenzile și controlează motoarele, LED-ul și buzzerul |
- | ===== Hardware Design ===== | + | Shield L293D: primește semnalele de direcție și PWM pentru fiecare motor |
- | <note tip> * listă de componente * schema electrică (realizată digital, desenată sau simulată) * descrierea rolului fiecărei componente, cu detalii despre conexiunile către Arduino </note> | + | Motoare DC (x4): execută mișcarea (față, spate, stânga, dreapta, diagonale) |
- | **Componente utilizate și rolul acestora:** | + | LED + Buzzer: oferă feedback vizual și sonor în funcție de direcție |
- | - **Platformă acrilică** – suport mecanic pentru toate componentele, asigură stabilitate și montare ușoară. | + | Toate modulele comunică prin semnale digitale directe sau prin registre, fără delay-uri software, pentru un răspuns imediat la comenzi. |
- | - **Arduino Uno** – unitatea centrală de control; citește senzorii și controlează motoarele, LED-ul și buzzerul. | + | {{ schema.png?400x400 | Schema bloc cu modulele hardware și fluxul de comenzi }} |
+ | </note> | ||
- | - **Shield motoare L293D** – permite controlul a până la 4 motoare DC prin semnale digitale de la Arduino. | ||
- | - Pini utilizați: | + | ===== Hardware Design ===== |
- | - D2, D3, D4, D5 – direcția motoarelor (IN1–IN4) | + | |
- | - D10, D11 – controlul vitezei motoarelor prin PWM (ENA/ENB) | + | |
- | - **4x Motoare DC 3-6V + 4 roți** – asigură deplasarea vehiculului înainte/înapoi și viraje. | + | <note tip> Aici sunt prezentate toate elementele hardware utilizate în proiect: lista de componente, schema electrică, descrierea conexiunilor. </note> |
+ | ==== Listă de componente ==== | ||
- | - **Senzor ultrasonic HC-SR04** – măsoară distanța față de obstacole pentru navigare autonomă. | + | ^ Componentă ^ Rol în sistem ^ Conectare la Arduino (prin Shield) ^ |
+ | | Arduino Uno | Controler principal | — | | ||
+ | | Shield motoare L293D | Controlează 4 motoare DC | Se montează direct peste placa Arduino Uno | | ||
+ | | 4x Motoare DC + roți | Permite deplasarea vehiculului | Conectate la porturile M1–M4 de pe shield | | ||
+ | | LED (roșu) | Semnalizare vizuală a mișcării | A1 (PC1) | | ||
+ | | Buzzer activ (5V) | Avertizare sonoră în timpul mișcării | A0 (PC0) | | ||
+ | | Breadboard + jumperi | Conexiuni simple și fără lipire | — | | ||
+ | | 2x baterii 18650 (3.7V) | Alimentare portabilă pentru logică și motoare | Conectate la portul VIN de pe shield | | ||
+ | | Suport baterii 2x18650 | Fixare fizică a bateriilor | — | | ||
- | - Pini utilizați: | + | ==== Schema electrică ==== |
- | - Trig – D6 | + | |
- | - Echo – D7 | + | |
- | - **LED** – semnalizează vizual când mașina virează (dreapta pentru evitare obstacol). | + | LED-ul este conectat la pinul A1 (PC1) cu rezistor de 220Ω în serie |
- | - Pin utilizat: | + | Buzzer-ul este conectat la pinul A0 (PC0) |
- | - D8 | + | |
- | - **Buzzer activ** – oferă semnal sonor, frecvența variază în funcție de distanța față de obstacol. | + | Motoarele sunt conectate la M1, M2, M3 și M4 direct pe shield |
- | - Pin utilizat: | + | ==== Descriere functionarea Led/Buzzer ==== |
- | - D9 | + | |
- | - **Bluetooth (modul HC-05)** – permite control manual al mașinii prin aplicație de pe telefon. | + | LED-ul clipește la 0.5 secunde (folosind Timer1 în modul CTC) când mașina merge înapoi |
- | - Pini utilizați: | + | Buzzer-ul este activ în toate direcțiile de mers (semnal logic HIGH) |
- | - RX – D0 (cu divizor de tensiune) | + | |
- | - TX – D1 | + | |
- | - **Breadboard + cabluri jumper** – facilitarea conexiunilor între Arduino, senzori, buzzer, LED și Bluetooth. | + | {{ poza_completa.jpg?400x400 | Vedere de sus a mașinii asamblate }} |
- | - **4x baterii 3.7V 2500mAh Samsung 18650 (2 de rezervă)** – oferă alimentare portabilă pentru motor și logică. | + | {{ diagrama.png?400x400 | Schema completă a conexiunilor în Tinkercad }} |
+ | ==== Software Design ==== | ||
- | - **Suport baterii, șuruburi, piulițe** – fixare sigură a componentelor pe platformă. | + | <note tip> **Mediu de dezvoltare**: Arduino IDE\\ **Microcontroler**: ATmega328P (Arduino Uno)\\ **Tehnici**: acces direct la registre, întreruperi hardware, PWM, UART, control motoare </note> |
+ | === Structură generală === | ||
- | {{ Poza_de_sus.jpg?400x400 | Vedere de sus a mașinii asamblate }} | + | Limbaj: C++ |
- | {{ Tinkercad_Diagram_complete.png?400x400 | Schema completă a conexiunilor în Tinkercad }} | + | IDE: Arduino IDE |
- | ===== Software Design ===== | + | Tip fișier principal: .cpp |
- | <note tip> * mediu de dezvoltare * acces direct la registre și întreruperi * control PWM, UART, senzor obstacol * algoritmi: FSM, ISR, filtrare, interpretare comenzi </note> | + | Împărțire logică pe secțiuni: |
- | Mediu de dezvoltare și structură generală: | + | |
- | Limbaj: C | + | Inițializare porturi GPIO (registre) |
- | IDE: MPLAB X | + | Inițializare PWM pentru motoare |
- | Compilator: XC8 | + | Configurare UART pentru Bluetooth |
- | Microcontroler: PIC16F877A | + | Inițializare Timer1 pentru LED blink |
- | Programator/debugger: PICkit 3 | + | Interpretare comenzi seriale și actualizare mișcare |
- | Aplicația este împărțită în mai multe module software, fiecare responsabil pentru o funcționalitate specifică: | + | === Biblioteci și surse 3rd-party === |
- | Inițializare hardware (I/O, UART, temporizatoare) | + | AFMotor.h — pentru control motoare cu shield L293D |
- | Control motoare (direcție și viteză cu PWM) | + | avr/io.h, avr/interrupt.h — acces direct la registre și ISR |
- | Recepție comenzi Bluetooth prin UART | + | Arduino.h, util/delay.h — funcții de bază |
- | Comportament autonom: evitare obstacole | + | === Funcții implementate === |
- | Comutare mod funcționare prin întrerupere externă | + | forward(), back(), left(), right() — controlează cele 4 motoare |
- | Biblioteci și fișiere incluse: | + | stop() — oprește mișcarea și semnalizarea |
- | xc.h – acces la registrele microcontrolerului | + | startBlinkTimer() / stopBlinkTimer() — gestionează LED-ul pe Timer1 |
- | Fișiere de configurare (fuses, frecvență oscilator) | + | ISR(TIMER1_COMPA_vect) — LED-ul clipeste automat în mers înapoi |
- | Toate funcțiile pentru UART, PWM și logica de control sunt scrise manual, folosind acces direct la registre. | + | ISR(USART_RX_vect) — citire caractere UART de la HC-05 (activare directă mișcare) |
- | Utilizarea întreruperilor: | + | === Comenzi Bluetooth === |
- | INT0 – comutare între mod Bluetooth și mod autonom (prin apăsarea unui buton) | + | Recepționate prin UART, în format ASCII: |
- | USART Receive Interrupt – primește și interpretează comenzi Bluetooth (fără polling) | + | 'F' – înainte |
- | Controlul motoarelor și PWM: | + | 'B' – înapoi |
- | Direcție: controlată prin semnale digitale către driverul L298N (IN1–IN4) | + | 'L' – stânga |
- | Viteză: ajustată cu PWM, folosind registrul TMR1 | + | 'R' – dreapta |
- | CCPR1L – controlează factorul de umplere | + | 'I', 'J', 'K', 'M' – mișcări diagonale |
- | TMR1 și PR1 – configurează frecvența PWM | + | 'T' – stop |
- | Mod Bluetooth (control manual): | + | === Tehnici hardware și registre === |
- | Comenzile sunt primite de la telefon via Bluetooth (HC-05), sub formă de caractere ASCII: | + | LED-ul (A1) și buzzerul (A0) controlați direct cu: |
+ | DDRC |= (1 << PCx)\ | ||
+ | PORTC |= (1 << PCx) / PORTC &= ~(1 << PCx) | ||
- | 'F' – înainte | + | UART: Serial.begin(9600) + citire cu Serial.available() sau ISR |
- | 'B' – înapoi | + | Timer1 configurat manual cu TCCR1B, OCR1A, TIMSK1 pentru LED blink asincron |
- | 'L' – stânga | + | Motoarele: controlate cu AF_DCMotor + PWM (setSpeed()) |
- | 'R' – dreapta | + | === Algoritmi utilizați === |
- | 'S' – stop | + | Parser UART — interpretează caracterele primite de la telefon |
- | Comanda este procesată imediat în ISR-ul UART și direcția motoarelor este actualizată | + | Control PWM — setează viteza fiecărui motor |
- | Mod autonom (ocolire obstacole): | + | Blink asincron — LED care semnalizează mersul înapoi fără delay |
- | Senzori de obstacol frontal (ex: IR sau ultrasonic) trimit semnale digitale către Arduino | + | Mapare mișcări diagonale — combină direcții cu viteze diferite (e.g. I = stânga-față) |
- | Mașinuța evaluează starea senzorilor în bucla principală: | + | === Considerații tehnice === |
- | Dacă un obstacol este detectat: oprire și evitare laterală | + | Se evită delay() în loop(), pentru răspuns rapid la comenzi |
- | Dacă drumul este liber: continuă deplasarea înainte | + | LED-ul și buzzerul sunt sincronizate cu mișcarea |
- | Logica este implementată cu FSM (Finite State Machine) cu stările: | + | Codul e modular și poate fi extins cu ușurință pentru alți senzori |
- | MERGE_INAINTE | + | === Testare și integrare === |
- | EVITA_STANGA | + | Testarea a fost incrementală: |
- | EVITA_DREAPTA | + | Test LED/buzzer separat |
- | OPRIT | + | Test comenzi de mișcare simple |
- | Algoritmi implementați: | + | Test UART cu aplicație Android |
- | FSM – pentru decizii logice în modul autonom | + | Test Timer1 LED blink |
- | ISR (Interrupt Service Routines) – pentru UART și comutare mod | + | Integrare completă Bluetooth + semnalizare + motoare |
- | Debouncing software – pentru stabilizarea butonului de mod | ||
- | PWM control – ajustarea vitezei motoarelor | + | ===== Concluzii ===== |
- | Parser comenzi seriale – interpretarea rapidă a comenzilor Bluetooth | + | Proiectul este functional si poate fi folosit in diverse domenii, atat in scop de divertisment, cat si scopuri mai practice, cum ar fi transportul de obiecte. |
+ | ===== Cod sursa ===== | ||
- | Alte considerente: | + | https://github.com/Dragos-Coticeru/Arduino-Car |
- | Variabilele partajate cu ISR-uri sunt declarate volatile | ||
- | Se evită delay-uri lungi în bucla principală pentru a nu bloca răspunsul la întreruperi | + | ===== Impedimente ===== |
- | Codul este scris modular, permițând testarea și depanarea pe componente | + | In decursul crearii acestui proiect am intampinat nenumarate impedimente, pe care le voi prezenta mai jos. |
- | Testarea aplicației s-a realizat incremental: s-au verificat individual comanda motoarelor, recepția UART, funcționarea PWM și senzorii, urmate de integrarea completă în sistemul dual | + | 1. Arderea modului Bluetooth |
- | ===== Rezultate Obținute ===== | + | |
+ | La inceput, am observat ca motoarele se misca foarte repede, si in dorinta de a le incetini, am pus mai putina putere la motoare, fapt care insa nu a fost prea fericit. Am simtit miros de ars si am oprit alimentarea, constatand ca o parte din modulul Bluetooth s-a ars. | ||
- | ===== Concluzii ===== | + | 2. Functionarea Buzzerului |
+ | Buzzerul fiind pasiv, acesta functioneaza prin pulsatie. In momentul in care i se ofera input de tip HIGH, acesta scoate un sunet slab. Am schimbat logica, folosind pulsatie tone(), iar buzzerul funtiona cum trebuie. In schimb, fara absolut nicio aparenta directa legatura, 2 dintre motoare nu mai functionau cand faceam aceasta modificare in cod. | ||
- | ===== Cod sursa ===== | + | 3. Arderea ledului |
+ | |||
+ | Initial cand am cuplat ledul, am folosit o rezistenta mult prea mare, fapt care a facut ledul sa nu se mai aprinda. Crezand ca ledul este stricat, am deconectat rezistenta si am conectat ledul direct, fapt care evident a produs arderea ledului. Nu ledul ar fi problema, dar tinand cont de numarul mare de componente care au suferit degradari, performanta proiectului devine usor imprevizibila. | ||
+ | |||
+ | 4. Conectarea ecranului LCD | ||
+ | |||
+ | Am dorit sa conectez un ecran LCD pentru a afisa mesaje precum "inainte" in momentul in care masina se deplasa in directia inainte. In schimb, am observat ca pinii de pe Shield ce ar fi trebuit conectati la SDA si SCL nu functioneaza (probabil tot din cauza unor arderi precedente). Ecranul se aprindea in schimb, dar din dorinta de a pastra puterea acumulatorilor (neavand altii de schimb), am renuntat la ideea ecranului. | ||
+ | |||
+ | 5. Arderea placutei Arduino | ||
- | https://github.com/Dragos-Coticeru/Arduino-Bluetooth-Car | + | Din neatentie la montarea shieldului, am produs un scurt ce a ars condensatorul de pe placuta arduino, cum este prezentat mai jos. |
- | Codul va avea modificari, inca nu este complet | + | {{ condensator_ars.jpg?400x400 | Condensator Ars }} |