Obstacle Avoiding Robot

Introducere

  • Proiectul consta intr-un robot care poate evita obstacolele. Acesta este echipat cu senzori si algoritmi specializati care ii permit sa detecteze obstacolele din calea sa si sa le evite, miscandu-se in consecinta.
  • Scopul principal al proiectului nostru este de a crea un robot autonom capabil sa navigheze intr-un mediu cu obstacole fara a necesita interventia umana constanta. Acesta poate fi utilizat in diverse aplicatii practice, cum ar fi explorarea terenurilor periculoase sau necunoscute, monitorizarea mediului ambiental sau chiar in industria de transport pentru a preveni coliziunile.
  • Am plecat de la dorinta de a creea roboti, in principal roboti autonomi care sa indeplineasca un anumit scop. De asemenea, imi ofera sansa de a invata si de a imi perfectiona abilitatile in domeniul roboticii.

Descriere generală

Un robot cu 2 motoare ce se plimba intr-o incapere, care atunci cand intalneste un obstacol va lua o decizie de schimbare a directiei, va folosi un senzor ultrasonic actionat de un servo-motor ce se va roti la 180 de grade. Vor fii masurate distantele din stanga si din dreapta, iar robotul isi va schimba traiectoria, iar cand cineva/ceva se va apropia prin spatele lui, acesta isi va schimba directia spre stanga sau spre dreapta intr-un mod random pentru a evita sa se blocheze.

Schema bloc:

Hardware Design

Schema electrica:


Schema TinkerCad:

Software Design

Mediul de dezvoltare: PlatformIO

Librarii si surse 3rd-party: Am folosit libraria Servo.h pentru a controla servo-ul si Arduino.h pentru a scrie HIGH si LOW pe pinii digitali si analogici

Descrierea codului: Robotul verifica la fiecare pas daca se afla vreun obstacol in fata lui (la mai putin de 40 de cm) sau in spatele lui (la mai putin de 15 cm). Daca se afla un obstacol in fata lui, servo-ul se va roti spre stanga si spre dreapta si va calcula distantele, alegand-o pe cea cu distanta cea mai mare. In cazul care se afla un obstacol in spatele lui, acesta isi va alege o directie random(stanga sau dreapta), acest lucru a fost implementat pentru a ajuta robotul sa nu ramana blocat in diverse situatii, acesta putand fii ajutat si “artificial”. De asemenea, cu ajutorul unui led si al unui divizor de tensiune calculez tensiunea venita pe pinul analogic, iar daca tensiunea va scadea sub o marja de 6.8V, ledul se va stinge semnaland ca bateriile trebuie reincarcate sau schimbate.

Laboratoare folosite : Timere, PWM, ADC.

Rezultate Obţinute

Robotul functioneaza in parametrii normali, detecteaza majoritatea obstacolelor, insa intampina probleme cand intalneste obstacole sub nivelul de inaltime al senzorului frontal si cand intalneste obstacole care nu sunt direct pe raza de masurare a senzorului, dar sunt in raza sasiului masinii. Senzorul din spatele masinii avea initial scopul de a mari viteza motoarelor cand se apropia cineva direct de el, insa nu am reusit sa controlez aceasta viteza din cod si dintr-un scurt research problema ar fii voltajul scazut al bateriilor, fiind necesari 12V in loc de 7.5V asa ca am schimbat scopul general al acestui senzor in schimbarea directiei de miscare pentru a evita blocajele.


Concluzii

A fost prima data cand am programat si am construit un asemenea proiect. A fost o experienta placuta, am invatat foarte multe despre partea hardware, despre importanta datasheet-ului si debugging-ul low-level.

Principala problema pe care am intampinat-o a fost alimentarea componentelor. Initial am crezut ca voi putea alimenta senzorii si servo-ul de la modulul driver L298N deoarece are un pin de output de 5V insa cu 4 baterii AA nu am reusit sa scot acest voltaj asa ca am mai inseriat una. Am reusit sa obtin un voltaj apropiat in jur de 4.7 - 5 V insa a aparut alta problema si anume fluctuatia curentului care imi facea componentele sa nu functioneze cum trebuie. Inserierea inca unei baterii nu era o solutie prea buna deoarece aveam un pack de 4 baterii si urmatoarele trebuiau lipite cu fludor, iar schimbarea lor cand se vor fii terminat nu ar fii fost usoara, asa ca am decis sa alimentez componentele de la pinul de 5V de la arduino.

Prima data am alimentat arduino-ul cu o baterie de 9v insa nu era suficient sa si scot din el 5v pentru celelalte componente si din research pe internet am gasit varianta cu o baterie externa si norocul a facut sa am o baterie care avea ca output 5V/1A si totul a mers cum trebuia dupa aceasta.

Nu am reusit sa controlez viteza motoarelor din cauza voltajului ( cred ) deoarece orice valoare sub ceea actuala facea ca motoarele sa nu se miste asa ca am schimbat scopul senzorului de pe spate

Am invatat importanta multimetrului si cat de diferit este debuggingul pe un proiect hardware fata de unul software.

In concluzie, mi-a facut placere sa lucrez la acest proiect si sa-l documentez intr-o pagina de wiki si as repeta aceasta experienta in viitor !

Download

Jurnal

25.04.2024 - Stabilire tema proiect
30.04.204 - Sosire piese
03.05.2024 - Crearea documentatiei si a paginei de wiki
09.05.2024 - Creare schema bloc si inceperea asamblarii
14.05.2024 - Am mai comandat un senzor ultrasonic
15.05.2024 - Finalizare milestone hardware

18.05.2025 - Mi-am dat seama ca nu am destul voltaj si am conectat arduino la o baterie de 9V separata si am mai adaugat o baterie in serie la setul de 4 pentru a obtine 7.5v
19.05.2025 - Am actualizat schema electrica si schema bloc
20.05.2025 - Am inceput scrierea codului
21.05.2025 - Am adaugat un led care ma ajuta sa tin evidenta voltajului bateriilor folosind ADC
22.05.2025 - Am schimbat alimentarea arduino-ului, l-am legat la o baterie externa de 5V/1A si alimentez sensorii ultrasonic si servo-ul din pinul de 5V al arduino-ului deoarece curentul din L298N fluctua si nu functionau senzorii la paramatrii optimi.
26.05.2025 - Finalizare pagina OCW

Bibliografie/Resurse

pm/prj2024/tdicu/andrei.banulescu.txt · Last modified: 2024/05/27 02:50 by andrei.banulescu
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