Differences

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

Link to this comparison view

pm:prj2024:sseverin:ana_maria.cicoare [2024/04/29 01:21]
ana_maria.cicoare created
pm:prj2024:sseverin:ana_maria.cicoare [2024/05/25 18:54] (current)
ana_maria.cicoare
Line 1: Line 1:
-====== ​Nume proiect ​======+====== ​Maze solving car ======
 ===== Introducere ===== ===== Introducere =====
 +Proiectul constă în dezvoltarea unei mașinuțe ce poate rezolva un labirint folosind un Arduino Uno. Această mașinuță este capabilă să navigheze printr-un labirint folosind senzori și să găsească o cale către ieșire.
 +
 +Ideea proiectului a pornit de la un interviu tehnic unde am fost întrebată cum se rezolvă un labirint (ca întrebare think outside the box). Ulterior, am văzut roboței maze-solver care participau la concursuri și m-am gândit să încerc și eu să realizez unul.
 +
 +Ca utilitate, proiectul încurajează dezvoltarea creativității prin găsirea unor mijloace ingenioase de rezolvare a labirintului,​ însă poate reprezenta și o modalitate de divertisment.
  
-<note tip> 
-Prezentarea pe scurt a proiectului vostru: 
-  * ce face 
-  * care este scopul lui 
-  * care a fost ideea de la care aţi pornit 
-  * de ce credeţi că este util pentru alţii şi pentru voi 
-</​note>​ 
 ===== Descriere generală ===== ===== Descriere generală =====
  
-<note tip> +Proiectul implică controlarea unei mașinuțe care este echipată cu senzori de infraroșu șmotoare. Mașinuța este apoi programată să rezolve un labirint autonom, folosindu-se ​de acești senzori șmotoare pentru ​se deplasa ​în labirint și a ajunge la destinație.
-O schemă bloc cu toate modulele proiectului vostru, atât software cât şhardware însoţită de o descriere a acestora precum şi a modului ​în care interacţionează.+
  
-Exemplu de schemă blochttp://​www.robs-projects.com/​mp3proj/​newplayer.html +{{:pm:prj2024:​sseverin:​pm2.png?​500|PM2}}
-</​note>​+
  
 ===== Hardware Design ===== ===== Hardware Design =====
 +Piese:
 +  * Arduino UNO
 +  * 2 x Motor DC gearmotors
 +  * 2 x Roata diametru 65mm
 +  * 1 x Roata mobila
 +  * 2 x Senzor analogic cu infrarosu pentru distanta SHARP
 +  * 1 x Șasiu
 +  * 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 =====
 +
  
 <note tip> <note tip>
-Aici puneţi tot ce ţine de hardware design: +Mediu de Dezvoltare 
-  * listă de piese +  * Arduino IDE 
-  * scheme electrice (se pot lua şde pe Internet şi din datasheet-uri, e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png) + 
-  * diagrame ​de semnal  +Librării șsurse 3rd-party 
-  * rezultatele simulării+  * SharpIR: utilizată pentru interfațarea senzorilor ​de distanță Sharp IR prin ADC.
 </​note>​ </​note>​
  
-===== Software Design =====+==== 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> <note tip>
-Descrierea codului aplicaţiei (firmware)+Algoritmul de control: 
-  * mediu de dezvoltare ​(if any(e.g. AVR Studio, CodeVisionAVR) + 
-  * librării şsurse 3rd-party (e.g. Procyon AVRlib) +  * Proportional Control ​(P): Utilizat pentru ajustarea vitezei motoarelor în funcție de eroarea dintre distanța dorită și distanța măsurată
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +  * Detecția obstacolelor:​ Dacă un obstacol este detectat în față, robotul se oprește șefectuează o serie de manevre pentru a evita obstacolul
-  * (etapa 3surse şfuncţii implementate+  * 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șpentru a trimite un semnal pe un alt pin (signalPin).
 </​note>​ </​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.1714342894.txt.gz · Last modified: 2024/04/29 01:21 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