Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:dene:linefollower [2023/05/07 21:58]
ciprian.balanica created
pm:prj2023:dene:linefollower [2023/05/30 01:47] (current)
ciprian.balanica
Line 1: Line 1:
-====== ​Nume proiect ​======+====== ​Line Follower ​====== 
 + 
 +<note tip> 
 +  * Student: **Balanica Ciprian** 
 +  * Grupa: **333CC** 
 +</​note>​
 ===== Introducere ===== ===== Introducere =====
  
Line 17: Line 22:
  
   * Arduino Uno   * Arduino Uno
-  * 2-4 senzori IR +  * senzori IR TCRT5000 
-  * L298N motor driver +  * L293D motor driver 
-  * 2-3 roti +  * 2 motoare 
-  * Baterii+  * 2 roti + roata de suport 
 +  * Baterie 9V
   * Cadru masina   * Cadru masina
   * Fire   * Fire
-  * (Breadboard)+  * Rezistente 
 +  * Switch
  
 +=== Schema Electrica ===
 +
 +{{:​pm:​prj2023:​dene:​line_follower_schematic.png?​600|}}
 +
 +(LED-urile si senzorii sunt aratati separat dar functioneaza ca o singura componenta. LED urile emit lumina IR, iar senzorii o receptioneaza)
 +
 +=== Circuit ===
 +
 +{{:​pm:​prj2023:​dene:​line_follower_circuit.jpeg?​600|}}
 ===== Software Design ===== ===== Software Design =====
  
 +Softul line followerului urmareste un algorimt clasic pentru acest tip de robot, numit PID (Proportional-Integral-Derivative).
 +Acest program implementeaza doar partea de PD, partea Integrala fiind folosita in general la roboti mai avansati pentru precizie.
  
-<note tip> +In functia ​de setup initializam toate varibilele si piniiIn loop avem doua etapecea de calibrare si cea de cursaEtapa de calibrare este rulata o singura data, dupa care se sare peste ea si se apeleaza direct partea de cursa.
-Descrierea codului aplicaţiei (firmware):​ +
-  * mediu de dezvoltare (if any) (e.g. AVR StudioCodeVisionAVR) +
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) +
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate +
-</​note>​+
  
-===== Rezultate Obţinute =====+In etapa de calibrare robotul trece cu toti cei 3 senzori peste linie si peste spatiul alb, pentru a afla valorile lor minime si maxime in mediul curent. Putem seta directia in care se va invarti robotul, asa ca il punem sa se invarte la stanga si la dreapta de mai multe ori pentru a fi siguri ca a acoperit tot terenul.
  
-<note tip+<code c
-Care au fost rezultatele obţinute în urma realizării proiectului vostru+if (!calibrated) { 
-</​note>​+  delay(1000);​ 
 +  Serial.println("​Calibrating..."​);​ 
 +  ​calibrate(0);​ 
 +  calibrate(1);​ 
 +  calibrate(0);​ 
 +  calibrate(1);​
  
-===== Concluzii =====+  calibrated ​1;
  
-===== Download =====+  Serial.println("​Calibration done!"​);​
  
-<note warning>​ +  delay(4000);  // Delay to allow the user to place the robot on the line
-O arhivă ​(sau mai multe dacă este cazulcu 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 Alin331CC -**:pm:​prj2009:​cc:​dumitru_alin**.+  Serial.println("​Race..."​);​ 
 +
 +... 
 +void calibrate(int dir) { 
 +  ms = millis(); 
 + 
 +  if (dir == 0) { 
 +    motorSpeed(-500, 500); 
 +  } else { 
 +    motorSpeed(500,​ -500); 
 +  } 
 + 
 +  while ((ms + CALIBRATION_TIME) > millis()) { 
 +    int sens_value[N_SENS];​ 
 +    for (int x = 0; x < N_SENS; x++) { 
 +      sens_value[x] = analogRead(SENS[x]);​ 
 +      sens_min[x] = (sens_value[x] < sens_min[x]) ? sens_value[x] ​sens_min[x];​ 
 +      sens_max[x] = (sens_value[x] > sens_max[x]) ​sens_value[x] ​sens_max[x];​ 
 +    } 
 +  } 
 +  motorSpeed(0,​ 0); 
 +  delay(100);​ 
 +
 +</​code>​ 
 + 
 +In partea de cursa, se verifica pozitia actuala a liniei, si impreuna cu pozitia anterioara se calculeaza corectia PD: 
 +<​code ​c
 +float get_PD_correction(float line, float last_line, float kp, float kd) { 
 +  float proportional = line; 
 +  float derivative = line - last_line;​ 
 +  float correction = (kp proportional + kd derivative);​ 
 + 
 +  return correction;​ 
 +
 +</​code>​ 
 +Linia este calculata simplu prin atribuirea unor greutati fiecarui senzor, care mai apoi sunt insumati. 
 +In functie de aceasta corectie, decidem daca masina va vira la stanga ​sau la dreapta, setand viteze motoarelor. 
 +<code c> 
 + 
 +void motorSpeed(int m1, int m2) {  // From -1000 to 1000 
 +  int pwm1 = map(abs(m1),​ 0, 1000, 0, 255); 
 +  int pwm2 = map(abs(m2),​ 0, 1000, 0, 255); 
 +  pwm1 = (m1 > 0) 255 - pwm1 pwm1; 
 +  pwm2 = (m2 >= 0) pwm2 255 - pwm2; 
 + 
 +  analogWrite(MA2, pwm1)
 +  analogWrite(MB2,​ pwm2); 
 +  digitalWrite(MA1,​ (m1 > 0) ? HIGH LOW); 
 +  digitalWrite(MB1(m2 >= 0) ? LOW HIGH); 
 +
 +</​code>​ 
 + 
 +===== Concluzii ===== 
 + 
 +<​note>​ 
 +Desi la inceput parea ca ar fi un proiect rapid de implementat,​ am realizat ca pot aparea multe probleme neasteptate. Deoarece un breadboard ar fi fost prea greoi si ar fi ocupat prea mult spatiu, am fost nevoit sa leg firele intre ele si sa le lipesc prin anumite locuri. De asemenea, alimentarea a fost o problema majora. Majoritatea bateriilor erau prea mici pentru a alimenta driverul si motoarele, dar cele de 9V erau consumate foarte repede. In cod am fost nevoit sa modific anumite valori pentru a calibra robotul. 
 +In final consider ca am avut multe de invatat din acest proiect si ca debuggingul de hardware a reprezentat o provocare interesanta,​ diferita de uzualul debugging de software.
 </​note>​ </​note>​
  
-===== Jurnal ​=====+===== Download ​=====
  
-<​note ​tip+<​note>​ 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.+{{:​pm:​prj2023:​dene:​line-follower-archive.zip|}}
 </​note>​ </​note>​
  
Line 61: Line 133:
  
 <​note>​ <​note>​
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**.+  ​laboratoare ocw 
 +  ​forum arduino (pentru probleme tehnice) 
 +  ​datasheeturi 
 +  ​https://​www.instructables.com/​Line-Follower-Robot-With-Arduino-Really-Fast-and-R/​ 
 +  ​https://​circuitdigest.com/​microcontroller-projects/​arduino-uno-line-follower-robot
 </​note>​ </​note>​
  
 <​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>​
  
pm/prj2023/dene/linefollower.1683485903.txt.gz · Last modified: 2023/05/07 21:58 by ciprian.balanica
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