This shows you the differences between two versions of the page.
pm:prj2023:vstoica:masinacughidajinteligent [2023/05/28 21:38] elena_madalina.dima [Software Design] |
pm:prj2023:vstoica:masinacughidajinteligent [2023/05/29 00:29] (current) elena_madalina.dima [Bibliografie/Resurse] |
||
---|---|---|---|
Line 82: | Line 82: | ||
</code> | </code> | ||
- | Pentru spori lizibilitatea codului și a lucra mai ușor cu pinii și constantele folosite s-au definit următoarele macro-uri: | + | Pentru a spori lizibilitatea codului și a lucra mai ușor cu pinii și constantele folosite s-au definit următoarele macro-uri: |
<code> | <code> | ||
Line 106: | Line 106: | ||
</code> | </code> | ||
- | Mesajele primite de către roboțel sunt de tip caracter, fiecare literă declanșând o anumită acțiune. Lista comenzilor disponibile este prezentată mai jos. Astfel, variabila //dataIn// reține comanda primită și inițial are valoare 'S', asociată cu oprirea motoarelor. Una dintre funcționalitățile oferite este setarea vitezei de deplasare, aceasta fiind reținută în bariabila //speed//, care inițial are valoarea maximă. Variabila //dist// reprezintă distanță până la cel mai apropiat obiect din față, în timp ce //distS// reprezintă distanță până la suprafață pe care se deplasează mașina. | + | Mesajele primite de către roboțel sunt de tip caracter, fiecare literă declanșând o anumită acțiune. Lista comenzilor disponibile este prezentată mai jos. Astfel, variabila //dataIn// reține comanda primită și inițial are valoare 'S', asociată cu oprirea motoarelor. Una dintre funcționalitățile oferite este setarea vitezei de deplasare, aceasta fiind reținută în variabila //speed//, care inițial are valoarea maximă. Variabila //dist// reprezintă distanța până la cel mai apropiat obiect din față, în timp ce //distS// reprezintă distanță până la suprafață pe care se deplasează mașina. |
<code> | <code> | ||
Line 213: | Line 213: | ||
</code> | </code> | ||
- | Pentru virajele la stânga, respectiv la dreapta, roata dinspre viraj se mișcă în spate, iar cealaltă roată se mișcă în față, în timp ce pentru deplasările pe diagonale sunt realizate prin setarea de viteze diferite pentru cele două motoare. | + | Pentru virajele la stânga, respectiv la dreapta, roata dinspre viraj se mișcă în spate, iar cealaltă roată se mișcă în față, în timp ce deplasările pe diagonale sunt realizate prin setarea de viteze diferite pentru cele două motoare. |
- | Inițializarea servomotorului cuprinde 2 etape: legarea la pinul 10 prin funcția de bibliotecă attach și setarea unghiului la 90º, unghi la care senzorul de distanță are orientarea corespunzătoare. | + | Inițializarea servomotorului cuprinde 2 etape: legarea la pinul 10 prin funcția de bibliotecă //attach// și setarea unghiului la 90º, unghi la care senzorul de distanță are orientarea corespunzătoare. |
<code> | <code> | ||
Line 368: | Line 368: | ||
* //H// → deplasare Sud - Vest | * //H// → deplasare Sud - Vest | ||
* //S// → oprire | * //S// → oprire | ||
- | * //W// → aducere servo-ului în poziția inițială (90º) | + | * //W// → aducerea servo-ului în poziția inițială (90º) |
- | * //1// → aducere servo-ului la 45º (deplasare senzor spre dreapta) | + | * //1// → aducerea servo-ului la 45º (deplasare senzor spre dreapta) |
- | * //2// → aducere servo-ului la 0º (deplasare senzor spre dreapta) | + | * //2// → aducerea servo-ului la 0º (deplasare senzor spre dreapta) |
- | * //3// → aducere servo-ului la 135º (deplasare senzor spre stânga) | + | * //3// → aducerea servo-ului la 135º (deplasare senzor spre stânga) |
- | * //4// → aducere servo-ului la 180º (deplasare senzor spre stânga) | + | * //4// → aducerea servo-ului la 180º (deplasare senzor spre stânga) |
* //5// → setarea vitezei la 150 | * //5// → setarea vitezei la 150 | ||
* //6// → setarea vitezei la 175 | * //6// → setarea vitezei la 175 | ||
Line 384: | Line 384: | ||
- | Prima dată se efectuează verificarea faptului că robotul încă se află pe o suprafață prin citirea distanței dintre senzorul de distanță S și primul obiect găsit dedesut. O distanță mai mare de 7m semnalizează faptul că în față suprafață se termină, așa că robotul se oprește, se deplasează înapoi pentru a evita căderea la ocolirea marginii și se întoarce la stânga. | + | Prima dată se efectuează verificarea faptului că robotul încă se află pe o suprafață prin citirea distanței dintre senzorul de distanță S și primul obiect găsit dedesut. O distanță mai mare de 7cm semnalizează faptul că în față suprafață se termină, așa că robotul se oprește, se deplasează înapoi pentru a evita căderea la ocolirea marginii și se întoarce spre stânga. |
- | După ce s-a validat faptul că deplasarea în față nu poate cauza căderea de pe masă se verifică dacă există obstacole în apropiere. Pentru aceasta se citește distanța până la primul obiect din față și când această distanță este mai mică de 25 cm se consideră că obiectul identificat este o aminințare și trebuie ocolit. Direcția în care se continuă deplasarea este aleasă pe baza distanței maxime. Mai precis, senzorul de distanță Obs se direcționează spre dreapta prin aducerea servomotorului la 0º, determină distanța până la cel mai apropiat obstacol și se aduce servomotorul în starea inițială(la 90º). Asemănător se determină și distanță din stânga, cu diferență că, de această dată servo-ul este adus la 180º. Calcularea acestor distașe este realizată prin funcțiile: | + | După ce s-a validat faptul că deplasarea în față nu poate cauza căderea de pe masă, se verifică dacă există obstacole în apropiere. Pentru aceasta se citește distanța până la primul obiect din față și când această distanță este mai mică de 25 cm se consideră că obiectul identificat este o aminințare și trebuie ocolit. Direcția în care se continuă deplasarea este aleasă pe baza distanței maxime. Mai precis, senzorul de distanță Obs se direcționează spre dreapta prin aducerea servomotorului la 0º, determină distanța până la cel mai apropiat obstacol și se aduce servomotorul în starea inițială(la 90º). Asemănător se determină și distanță din stânga, cu diferență că, de această dată servo-ul este adus la 180º. Calcularea acestor distațe este realizată prin funcțiile: |
<code> | <code> | ||
int getRightDist() { | int getRightDist() { | ||
Line 409: | Line 409: | ||
</code> | </code> | ||
- | Astfel, deplasarea se continuă în direcția cu obstacolul cel mai depărtat. Dacă nu s-a identificat un obstacol în apropiere și nici nu există pericolul de cădere, mașinuța se deplasează înainte. | + | Astfel, deplasarea se continuă în direcția obstacolului cel mai depărtat. Dacă nu s-a identificat un obstacol în apropiere și nici nu există pericolul de cădere, mașinuța se deplasează înainte. |
Logica completă a acestui mod de funcționare este implementată astfel: | Logica completă a acestui mod de funcționare este implementată astfel: | ||
Line 466: | Line 466: | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | **Design inițial:** |
- | </note> | + | |
- | Design inițial: | + | |
{{:pm:prj2023:vstoica:robo_ext_initial.jpg?300|}} | {{:pm:prj2023:vstoica:robo_ext_initial.jpg?300|}} | ||
{{:pm:prj2023:vstoica:robo_interior.jpg?300|}} | {{:pm:prj2023:vstoica:robo_interior.jpg?300|}} | ||
+ | |||
+ | Inițial s-a optat pentru o carcasă încăpătoare pentru a nu înghesui componentele și a se încerca o organizare a cablurilor cât mai neîncâlcită, dar, în urma testării s-a dovedit că acest design are probleme cu echilibrul, la plecarea de pe loc, datorită inerției, robotul căzând pe spate. De asemenea, această carcasă, fiind dintr-un carton destul de subțire nu oferea stabilitate și motoarele nu puteau fi fixate corespunzător, aspect ce afecta direcția de deplasare. | ||
+ | |||
+ | De aceea s-a optat pentru schimbarea carcasei cu una mai scundă și mai lată ce oferă o stabiltate mai bună, construită dintr-un carton mai tare ce permite fixarea componentelor. Deși spațiul este mai mic, nu s-a renunțat la păstrarea firelor neîncâlcite, încercându-se o organizarea cât mai ordonată a componentelor. | ||
+ | |||
+ | **Design final** | ||
+ | |||
+ | |||
+ | {{:pm:prj2023:vstoica:roboprofil.jpg?300|}} | ||
+ | {{:pm:prj2023:vstoica:roboint.jpg?300 |}} | ||
+ | |||
+ | |||
+ | ===== Testare ===== | ||
+ | ** Primul test - control manual** | ||
+ | |||
+ | |||
+ | <html> | ||
+ | <iframe width="315" height="560" src="https://www.youtube.com/embed/rOxbt2LLabQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> | ||
+ | </html> | ||
+ | |||
+ | |||
+ | ** Test 2 - cotrol automat - evitare cădere ** | ||
+ | |||
+ | |||
+ | <html> | ||
+ | <iframe width="560" height="315" src="https://www.youtube.com/embed/eCf7HtQ_wfY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> | ||
+ | </html> | ||
+ | |||
+ | |||
+ | Roboțelul evită căderea doar când marginea suprafeței este înaintea lui, pentru acoperirea celorlalte cazuri fiind nevoie de senzori de distanță pe fiecare latură care să funcționeze similar cu cel folosit în acest proiect. | ||
+ | |||
+ | ** Test 3 - control automate evitare obstacole mai scunde ca senzorul ** | ||
+ | |||
+ | |||
+ | <html> | ||
+ | <iframe width="560" height="315" src="https://www.youtube.com/embed/K5d2GHRPa-Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> | ||
+ | </html> | ||
+ | |||
+ | Acest test a scos la iveală faptul că roboțelul ignoră obstacolele care nu intră în aria lui vizuală. O versiune mai avansată ar putea folosi fie mai mulți senzori, plasați la diferite înălțimi, fie un singur senzor care să își poată modifica unghiul sub care privește. | ||
+ | |||
+ | |||
+ | ** Test 4 - control automat - evitare obstacole ** | ||
+ | |||
+ | |||
+ | <html> | ||
+ | <iframe width="560" height="315" src="https://www.youtube.com/embed/j8LSfHhxT8A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> | ||
+ | </html> | ||
+ | |||
+ | |||
+ | ** Test 5 - control automate unghi ascuțit ** | ||
+ | |||
+ | |||
+ | <html> | ||
+ | <iframe width="560" height="315" src="https://www.youtube.com/embed/l80RhuYGHPo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> | ||
+ | </html> | ||
+ | |||
+ | În cadrul acestui test se poate observa faptul că șansele ca un obstacol să fie identificat scad atunci când unghiul dintre acesta și senzorul de distanță este ascuțit. Această problemă ar putea fi rezolvată fie prin adăugarea mai multor senzori care să monitorizeze simultan mai multe direcții, fie prin mai multe verificări efectuate cu un singur senzor prin poziționarea sa în mai multe unghiuri înainte de a se lua decizia dacă există sau nu un obstacol. | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | 1. Ca în cadrul oricărei lucrări, proiectarea este una dintre etapele cele mai importante, în cazul în care este făcută cu atenție, având ca rezultat o desfășurare cu mai puține erori a proiectului, alături de evitarea unor costuri suplientare atât materiale, cât și temporale. | ||
+ | |||
+ | 2. Roboțelul este departe de o formă finală, putând fi îmbunătățit în foarte multe feluri (adăugarea mai multor senzori pentru identificarea corectă a obstacolelor și evitarea tuturor cazurilor în care poate cădea de pe suprafață, adăugarea mai multor elemente de design, leduri, buzzer pentru redarea unor sunete diferite în funcție de modul de funcționare, semnalizarea blocării) | ||
===== Download ===== | ===== Download ===== | ||
+ | Codul folosit | ||
+ | {{:pm:prj2023:vstoica:robo.zip|Arhivă cod}} | ||
- | <note warning> | ||
- | 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**. | ||
- | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 499: | Line 554: | ||
- Testat deplasare robot | - Testat deplasare robot | ||
- Schimbat șasiu și carcasă din motive de echilibru | - Schimbat șasiu și carcasă din motive de echilibru | ||
+ | * 22.05 - Testare senzor de distanță - erori | ||
+ | * 23.05 - Depanare erori senzor distanță | ||
+ | * 27.05 - Scriere cod pentru verificare suprafață și evitare obstacole | ||
+ | * 28.05 | ||
+ | - Verificare funcționalitate robot | ||
+ | - Definitivare documentație | ||
+ | |||
</note> | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | |||
- | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
- | </note> | ||
Resurse hardware: | Resurse hardware: | ||
https://lastminuteengineers.com/l293d-motor-driver-shield-arduino-tutorial/ | https://lastminuteengineers.com/l293d-motor-driver-shield-arduino-tutorial/ | ||
+ | https://howtomechatronics.com/tutorials/arduino/arduino-and-hc-05-bluetooth-module-tutorial/ | ||
+ | https://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/ | ||
+ | https://playground.arduino.cc/Code/NewPing/#Example | ||
+ | https://components101.com/sites/default/files/component_datasheet/HC-05%20Datasheet.pdf | ||
https://5.imimg.com/data5/PX/UK/MY-1833510/l293d-based-arduino-motor-shield.pdf | https://5.imimg.com/data5/PX/UK/MY-1833510/l293d-based-arduino-motor-shield.pdf | ||
+ | https://datasheetspdf.com/pdf-file/1351717/Microchip/ATmega328P/1 | ||
Tutoriale: | Tutoriale: | ||
Line 516: | Line 579: | ||
https://www.instructables.com/Make-Your-First-Arduino-Robot-the-Best-Tutorial/ | https://www.instructables.com/Make-Your-First-Arduino-Robot-the-Best-Tutorial/ | ||
https://www.instructables.com/How-to-Make-Smart-Obstacle-Avoiding-Robot-Using-Ar/ | https://www.instructables.com/How-to-Make-Smart-Obstacle-Avoiding-Robot-Using-Ar/ | ||
+ | https://www.viralsciencecreativity.com/post/arduino-simple-obstacle-avoiding-robo | ||
+ | https://srituhobby.com/how-to-make-an-obstacle-avoiding-robot-with-three-ultrasonic-sensors/ | ||
<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> | ||