Autor: Slabu Nicusor-Daniel
Tema proiectului este construirea unei masini inteligente care sa evite obstacolele cu ajutorul unui senzor ultrasonic.
Masina va folosi un senzor ultrasonic montat astfel incat sa poata detecta obiecte in fata cat si in partile laterale folosind rotatii la anumite unghiuri (cu ajutorul unui servomotor) si un motor driver L298N folosit pentru a pune in miscare cele 4 roti ale masinii. Masina se va deplasa inainte pana cand senzorul va detecta un obiect. In momentul detectarii masina se va opri la o distanta fixa fata de acel obiect si se va redirectiona.
Designul este foarte similar cu cel din schema de sus, cu exceptia ca eu am folosit 4 baterii AA + o baterie de 9V in schimbul a 2 baterii Li-On 18650, iar tipul de intrerupator este diferit fata de cel reprezentat in schema. Modul in care sunt conectate firele este de asemenea un pic diferit.
Arduino Uno R3
Arduino Uno R3 este o platforma de procesare open-source, bazata pe software si hardware flexibil si usor de folosit. Am ales acest tip de placă Arduino din mai multe considerente. Un prim motiv ar fi numărul foarte mare de proiecte realizate cât și resursele foarte bine documentate pentru acest tip de placă. Acest lucru m-a ajutat să duc proiectul la bun sfârșit fără să întâmpin prea multe impedimente pe parcurs. Un alt avantaj la Arduino Uno este reprezentat de dimensiunile acesteia care sunt foarte mici, astfel că nu am avut probleme cu spațiul disponibil pentru celelalte componente folosite (driverul, suportul de baterii, senzorul ultrasonic etc). Placa folosită de mine nu este însă un Arduino Uno R3 original, motiv pentru care a trebui să instalez un driver special folosit pentru USB to Serial Conversion Chip (o componentă care diferă de cea folosită pe Arduino-ul original și care, de altfel, este și mai ieftină) - CH340 este chipul folosit pentru placa cumpărată de mine.
Specificații
L298N Motor Driver
Aveam practic de ales între L298N și L293D. Am ales L298N din simplul motiv că acesta poate gestiona curent și tensiune mai mare deoarece inițial aș fi vrut să folosesc 2 baterii Li-On 18650 pentru alimentare. Pe lângă asta, regulatorul său este rapid și are protecție pentru scurt-circuit, și un radiator pentru a menține L298N la o temperatură normală de funcționare.
Specificatii:
4 Motoare DC 5V cu Reductor + 4 roți compatibile
Am observat că acest tip de motoare este cel mai des utilizat în genul acesta de proiecte. Un motor este alimentat la 5v. Cuplul maxim este de 800gf/cm (la 3V). Demultiplicare 1:48 (fără sarcină la 3V).
Senzor cu ultrasunete HC-SR04
Senzorul HC–SR04 folosește unde sonice pentru a determina distanța până la un anumit obiect (similar cu ecolocația). Am ales modulul acesta deoarece oferă o acuratețe bună și are o distanță de funcționare mai mult decât suficientă pentru ce aveam eu nevoie (de la 2 până la 500cm).
Specificații
Servo Motor 9G Micro
Modelul acesta de servomotor este unul de dimensiuni mici pentru controlul căruia se utilizează un semnal PWM standard. Este ideal pentru foarte multe proiecte ce folosesc Arduino și au nevoie de un mecanism de mișcare a senzorilor.
Cabluri DuPont tată-tată, tată-mamă
Folosite pentru legarea componentelor la Arduino, Motor Driver etc..
Baterie de 9V alcalină + 4 baterii AA
Bateria de 9V este conectată la DC Power Jack de la Arduino, cele 4 baterii sunt conectate la un DC Power Switch (întrerupător) și cu GND-ul la GND-ul de la Motor Driver.
2 Plăci Acrilice
Folosite pentru așezarea componentelor
Activity Diagram
Biblioteci utilizate
Biblioteca Servo.h permite plăcilor Arduino să controleze o varietate mare de servomotoare. Se utilizeaza cu mare atenție timerele, biblioteca poate controla până la 12 servo-uri folosind un singur timer. Servourile standard permit, prin intermediul functiilor din bibliotecă, poziționarea axului la mai multe unghiuri, între 0 și 180 de grade. Poziționarea la un anumit unghi se realizează cu ajutorul funcției write cu parametrul reprezentând unghiul la care dorim să fie poziționat servo-ul.
În cadrul proiectului, servomotorul este folosit pentru mișcarea senzorului ultrasonic în stânga sau în dreapta, pentru a detecta direcția în care să se redirecționeze mașina la momentul detectării unui obstacol în față. Senzorul ultrasonic este fixat pe elicea de la servo pentru a se mișca odată cu aceasta.
Este o bibliotecă ce facilitează lucrul cu senzori ultrasonici prin punerea la dispoziție a mai multe funcții ușor de folosit în orice proiect ce implică folosirea acestor senzori. Principala funcție folosită în proiect este ping_cm() care citește distanța până la cel mai apropiat obiect din fața senzorului ultrasonic și returnează valoarea acesteia în centimetri.
Explicații Cod
În primă fază se declară toate variabilele necesare pentru ca programul să funcționeze, și anume: pinii de control pentru L298N, pinii folosiți de senzor (A1 și A2), 2 obiecte de tip NewPing(pentru citirea distanțelor) și Servo (pentru servomotor).
În partea de setup() se configurează pinii de output (cei corespunzători motoarelor), se atașează variabila de tip Servo pinului 10 iar apoi se poziționează axul servo-ului la un unghi care să permită senzorului să citească distanțe în fața mașinii, pe direcția și sensul de mers ale acesteia.
În loop() comportamentul implicit al mașinii este să meargă cu fața până se va citi o distanță mai mică de 30cm față de obiectul din față, moment în care se va apela funcția moveStop(), ce oprește mașina, se va apela apoi moveBackward() ce va face mașina să meargă cu spatele și apoi din nou moveStop(). Se vor folosi apoi funcțiile lookRight() și lookLeft() pentru a citi distanțe față de posibilele obstacole din stânga și din dreapta mașinii. Mașina se va redirecționa apoi spre direcția în de care s-a detectat o distanță mai mare față de obiect și va repeta procesul descris mai sus.
lookRight() și lookLeft() → scriu valorile 30, respectiv 150 pe servo, citesc distanța iar apoi repoziționează servomotorul la un unghi de 95 grade (cel implicit, pentru direcția înainte).
turnRight(), turnLeft(), moveStop(), moveBackward(), moveForward() → setează pinii motoarelor pe HIGH/LOW în funcție de acțiunea dorită, de exemplu pentru turnRight() motoarele din stânga față și dreapta spate sunt puse pe HIGH, iar celelalte pe LOW.
readDistance() - citește distanța în cm față de obiectul din fața senzorului ultrasonic.