Differences

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

Link to this comparison view

pm:prj2024:sseverin:ana_maria.cicoare [2024/05/04 20:42]
ana_maria.cicoare
pm:prj2024:sseverin:ana_maria.cicoare [2024/05/25 18:54] (current)
ana_maria.cicoare
Line 9: Line 9:
 ===== Descriere generală ===== ===== Descriere generală =====
  
-Proiectul implică ​utilizarea unei telecomenzi pentru a controla pornirea ​unei mașinuțe care este echipată cu senzori de infraroșu și motoare. Mașinuța este apoi programată să rezolve un labirint autonom, folosindu-se de acești senzori și motoare pentru a se deplasa în labirint și a ajunge la destinație.+Proiectul implică ​controlarea ​unei mașinuțe care este echipată cu senzori de infraroșu și motoare. Mașinuța este apoi programată să rezolve un labirint autonom, folosindu-se de acești senzori și motoare pentru a se deplasa în labirint și a ajunge la destinație.
  
-{{:​pm:​prj2024:​sseverin:​maze-solver.png?500|maze-solver-block-diagram}}+{{:​pm:​prj2024:​sseverin:​pm2.png?500|PM2}}
  
 ===== Hardware Design ===== ===== Hardware Design =====
 Piese: Piese:
-  * arduino uno +  * Arduino UNO 
-  * 2 x motoare ​DC  +  * 2 x Motor DC gearmotors 
-  * 2 x roti  +  * 2 x Roata diametru 65mm 
-  * 1 x roata mobila +  * 1 x Roata mobila 
-  * 2 x senzori analogici ​cu infrarosu pentru distanta +  * 2 x Senzor analogic ​cu infrarosu pentru distanta ​SHARP 
-  * sasiu +  * 1 x Șasiu 
-  * 1 x driver ​motoare ​+  * 1 x Driver ​motoare ​L298N (punte H dublă) 
 +  * 1 x led galben 
 +  * 1 x rezistenta 220 
 + 
 + 
 +Board: 
 + 
 +{{:​pm:​prj2024:​sseverin:​board2.png?​700|}} 
 + 
 + 
 +Circuit: 
 + 
 +{{:​pm:​prj2024:​sseverin:​circuit2.png?​700|}} 
 + 
 + 
 + 
 +Design: 
 + 
 +{{:​pm:​prj2024:​sseverin:​maze-solver-photo.jpg?​700|}}
  
 ===== Software Design ===== ===== Software Design =====
Line 27: Line 45:
  
 <note tip> <note tip>
-Descrierea codului aplicaţiei (firmware): +Mediu de Dezvoltare 
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) +  * Arduino IDE 
-  * librării şi surse 3rd-party ​(e.g. Procyon AVRlib) + 
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +Librării și surse 3rd-party 
-  * (etapa 3) surse şi funcţii implementate+  * SharpIR: utilizată pentru interfațarea senzorilor de distanță Sharp IR prin ADC.
 </​note>​ </​note>​
 +
 +==== Algoritmi și structuri implementate ====
 +
 +=== Controlul motoarelor: ===
 +
 +  * Controlul direcției și vitezei motoarelor prin PWM (Pulse Width Modulation) și pini de direcție.
 +  * Funcții pentru mișcarea înainte (moveForward),​ înapoi (moveBackward) și oprirea motoarelor (stopMotors).
 +  * Măsurarea distanței: Utilizarea senzorilor Sharp IR pentru a măsura distanța față de obstacolele din față și din dreapta robotului.
 +  * Stabilirea unor praguri minime și maxime pentru distanțele detectate. Folosirea corectiilor pentru a elimina snake-like movement si a avea o traiectorie mai dreapta.
 +
 +<note tip>
 +Algoritmul de control:
 +
 +  * Proportional Control (P): Utilizat pentru ajustarea vitezei motoarelor în funcție de eroarea dintre distanța dorită și distanța măsurată.
 +  * Detecția obstacolelor:​ Dacă un obstacol este detectat în față, robotul se oprește și efectuează o serie de manevre pentru a evita obstacolul.
 +  * Menținerea distanței față de perete: Ajustarea poziției robotului pentru a menține o distanță constantă față de peretele din dreapta.
 +  * Interupere externă: Utilizarea unei întreruperi externe pentru a detecta schimbările unui pin specific (motorDirection2A) și pentru a trimite un semnal pe un alt pin (signalPin).
 +</​note>​
 +
 +
 +
 +==== Etapa 3: Surse și funcții implementate ====
 +
 +
 +Inițializarea motoarelor:
 +
 +Se seteaza pinii driverului pe output si se ataseaza intreruperea la un pin de directie (odata cu modificarea lui se va aprinde ulterior un led)
 +
 +<​code>​
 +void setup() {
 +  pinMode(motorSpeedPinA,​ OUTPUT);
 +  pinMode(motorDirection1A,​ OUTPUT);
 +  pinMode(motorDirection2A,​ OUTPUT);
 +
 +  pinMode(motorSpeedPinB,​ OUTPUT);
 +  pinMode(motorDirection1B,​ OUTPUT);
 +  pinMode(motorDirection2B,​ OUTPUT);
 +
 +  analogWrite(motorSpeedPinA,​ 0);
 +  digitalWrite(motorDirection1A,​ HIGH);
 +  digitalWrite(motorDirection2A,​ LOW);
 +
 +  analogWrite(motorSpeedPinB,​ 0);
 +  digitalWrite(motorDirection1B,​ LOW);
 +  digitalWrite(motorDirection2B,​ HIGH);
 +
 +  attachInterrupt(digitalPinToInterrupt(motorDirection2A),​ handlePinChange,​ CHANGE);
 +
 +  Serial.begin(9600);​
 +}
 +</​code>​
 +
 +
 +Controlul mișcării:
 +
 +Am facut functiile de moveForward si moveBackward,​ fara turnLeft si turnRight pentru ca abordarea cu un indice de corectie ma restrange la a avea 2 parametri, deci pentru left si right unul din parametri va fi 0.
 +
 +<​code>​
 +void moveForward(int leftSpeed, int rightSpeed) {
 +  digitalWrite(motorDirection1A,​ HIGH);
 +  digitalWrite(motorDirection2A,​ LOW);
 +  digitalWrite(motorDirection1B,​ LOW);
 +  digitalWrite(motorDirection2B,​ HIGH);
 +
 +  analogWrite(motorSpeedPinA,​ leftSpeed);
 +  analogWrite(motorSpeedPinB,​ rightSpeed);​
 +}
 +
 +void moveBackward() {
 +  digitalWrite(motorDirection1A,​ LOW);
 +  digitalWrite(motorDirection2A,​ HIGH);
 +  digitalWrite(motorDirection1B,​ HIGH);
 +  digitalWrite(motorDirection2B,​ LOW);
 +
 +  analogWrite(motorSpeedPinA,​ baseSpeed);
 +  analogWrite(motorSpeedPinB,​ baseSpeed);
 +}
 +
 +void stopMotors() {
 +  analogWrite(motorSpeedPinA,​ 0);
 +  analogWrite(motorSpeedPinB,​ 0);
 +}
 +</​code>​
 +
 +
 +Gestionarea întreruperii:​
 +
 +Functia seteaza un flag, o variabila volatile bool care se va verifica constant in functia de loop.
 +
 +<​code>​
 +void handlePinChange() {
 +  pin2Changed = true;
 +}
 +</​code>​
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
 <note tip> <note tip>
-Care au fost rezultatele obţinute în urma realizării proiectului vostru.+O masina care iese din labirint. 
 + 
 +Demo: https://​www.youtube.com/​watch?​v=fPwL9fN5p2s&​t=14s
 </​note>​ </​note>​
  
 ===== Concluzii ===== ===== Concluzii =====
 +
 +Foarte foarte mult de munca, mai ales pe baterii de 9V unde PWM sub 100 nu mergea nici cand era bateria plina. Bateriile se consuma foarte rapid, deci pentru oricine mai foloseste acest driver recomand numai baterii de 12V speciale. Am mai avut niste problemute minore, initial am uitat sa conectez GND-ul de la driver la arduino si nu intelegeam de ce nu merg motoarele :)))), dar s-au rezolvat rapid. ​
 +
 +Overall, a fost un proiect din care chiar am invatat multe chestii utile si sper ca a iesit bine.
  
 ===== Download ===== ===== Download =====
  
-<note warning>​ +Arhiva:
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurse, 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**. +{{:pm:prj2024:sseverin:proj_pm.zip|}}
-</​note>​+
  
 ===== Jurnal ===== ===== Jurnal =====
pm/prj2024/sseverin/ana_maria.cicoare.1714844564.txt.gz · Last modified: 2024/05/04 20:42 by ana_maria.cicoare
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