Autor: Blejan Radu-Stefan 333CC
⊗ Un robot compus din 4 roti ce urmareste un obiect plasat in fata lui la o anumita distanta. ⊗ Am pornit de la ideea de a face o masina cu 4 roti care sa se deplaseze singura si a urmat sa ma decid fata de ce obiect din jur sa depinda miscarea masinii. ⊗ Poate fi util pentru a asista o alta masina aflata in miscare sau pentru analiza diversor lucruri ce se deplaseaza pe pamant.
Masina este formata din 4 motoare pentru fiecare roata, fiecare pereche de roti fiind controlata de cate o punte H. Pe sasiu am adaugat si Arduino-ul si un breadboard pentru a realiza conexiunea dintre piese si Arduino. Ulterior am pus si un servomotor pe care am lipit un senzor ultrasonic pentru a detecta distanta fata de obiectul din fata.
- Arduino UNO R3 - 4 motoare DC - 2 punti H - 2 baterii de 9V - 1 servomotor - 1 senzor ultrasonic - fire jumper + mama-tata - breadboard - 4 roti
Am folosit structura ”#define <nume_componenta> <pin>” pentru a avea control asupra fiecarei roti a masinii, asupra servomotorului si a senzorului ultrasonic.
Pentru tipurile de deplasare(stanga, dreapta, fata, spate) am implementat cate o functie pentru fiecare. De exemplu, functia pentru mers inainte:
void forward() {
analogWrite(enA, 150); analogWrite(enB, 150); digitalWrite(in1_stanga_spate,LOW); digitalWrite(in2_stanga_spate, HIGH); digitalWrite(in3_stanga_fata,LOW); digitalWrite(in4_stanga_fata, HIGH); analogWrite(enA_2, 150); analogWrite(enB_2, 150); digitalWrite(in1_dreapta_fata,LOW); digitalWrite(in2_dreapta_fata, HIGH); digitalWrite(in3_dreapta_spate,LOW); digitalWrite(in4_dreapta_spate, HIGH);
}
Astfel am setat directia curentului prin fiecare roata si am dat directia masinii.
Apoi am implementat o functie ce calculeaza distanta determinata de senzorul ultrasonic. Se trimite un impuls de la senzor. Apoi sunt folosite viteza sunetului și timpul revenirii impulsului pentru a calcula distanța.
int setDistance() {
digitalWrite(Trig, LOW); delayMicroseconds(2); digitalWrite(Trig, HIGH); delayMicroseconds(20); digitalWrite(Trig, LOW); float distance = pulseIn(Echo, HIGH); distance= distance / 58; return (int)distance;
}
In final, in cadrul functiei loop() determin constant distantele din stanga si dreapta sevomotorului pentru a putea deplasa masina dupa un obiect care se misca si in functie de aceste valori, apelez functiile de deplasare a masinii pentru a respecta traiectoria.
void loop() {
myservo.write(120); delay(200); rightDistance = setDistance();
myservo.write(60); delay(200); leftDistance = setDistance();
if((rightDistance > 50)&&(leftDistance > 50)){ stop(); }else if((rightDistance >= 20) && (leftDistance >= 20)) { forward(); }else if((rightDistance <= 5) && (leftDistance <= 5)) { back(); delay(100); }else if(rightDistance - 3 > leftDistance) { left(); delay(100); }else if(rightDistance + 3 < leftDistance) { right(); delay(100); }else{ stop(); }
}
Proiectul a fost unul din care am invatat foarte multe. Am intampinat destul de multe dificultati, deoarece a fost nevoie de o atentie mare la conectarea componentelor, fiind nevoit sa folosesc si pinii analogici de pe placuta Arduino(A0, A1,… A5). Adevarata provocare dupa crearea masinii si obtinerea controlului asupra fiecarei roti a fost tratarea corecta a cazurilor pentru distantele senzorului ultrasonic, deoarece a trebuit sa le adaptez si la dimensiunea obiectului pe care trebuia sa il urmeze. Ca si concluzie, a fost o alegere buna, iar realizarea proiectului char mi-a oferit satisfactie si posibil noi idei pentru proiecte cu Arduino.
https://www.youtube.com/watch?v=8Ea_jUQPVrE
https://randomnerdtutorials.com/complete-guide-for-ultrasonic-sensor-hc-sr04/
Link pagina ocw: https://ocw.cs.pub.ro/courses/pm/prj2021/abirlica/object_following_robot
Pdf: https://ocw.cs.pub.ro/courses/pm/prj2021/abirlica/object_following_robot?do=export_pdf