This shows you the differences between two versions of the page.
pm:prj2024:vstoica:alexandra.bogdan02 [2024/04/29 20:22] alexandra.bogdan02 |
pm:prj2024:vstoica:alexandra.bogdan02 [2024/05/27 06:26] (current) alexandra.bogdan02 |
||
---|---|---|---|
Line 13: | Line 13: | ||
== Schemă bloc == | == Schemă bloc == | ||
+ | {{schema1.png?700x500}} | ||
+ | == Descriere == | ||
+ | **1. Motor Control Driver with L298N:** | ||
- | <note tip> | + | *Descriere: Acesta este responsabil pentru controlul mișcării a două motoare DC conectate la roțile mașinii. Este compus din tranzistoare și diode care permit controlul direcției și vitezei motoarelor. |
- | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | + | *Interacțiune:Prin intermediul unor semnale de la Arduino Uno, determină direcția și viteza de rotație a motoarelor pentru a face mașina să meargă înainte, înapoi sau să se oprească. |
+ | |||
+ | **2. Infrared Sensors:** | ||
+ | |||
+ | *Descriere: Acești senzori de infraroșu sunt plasați pe partea stângă și dreaptă a mașinii și sunt folosiți pentru a detecta o linie neagră pe sol. Ei servesc ca "ochii" mașinii, permitându-i să urmeze linia. | ||
+ | *Interacțiune: Senzorii de infraroșu trimit semnale către Arduino Uno atunci când detectează linia neagră. Aceste semnale sunt folosite pentru a ghida mișcarea mașinii în direcția dorită. | ||
+ | |||
+ | **3. Water Sensor:** | ||
+ | |||
+ | *Descriere: Acest senzor de apă este conectat la un pin analogic al Arduino Uno și este folosit pentru a detecta prezența apei. | ||
+ | *Interacțiune: Atunci când senzorul de apă detectează apă, trimite un semnal către Arduino Uno. Acest semnal declanșează acțiunea unui servo motor. | ||
+ | |||
+ | **5. Servo Motor:** | ||
+ | |||
+ | *Descriere: Servo motorul este utilizat pentru a acționa o umbrelă. | ||
+ | *Interacțiune: La detectarea apei de către senzorul de apă, Arduino Uno trimite un semnal către servo motor pentru a iniția mișcarea de ridicare a umbrelei. | ||
+ | |||
+ | **6. Arduino Uno:** | ||
+ | |||
+ | *Descriere: Arduino Uno servește ca și "creier" al mașinii, controlând toate modulele și execuția codului programat. | ||
+ | *Interacțiune: Arduino Uno primește semnale de la senzorii de infraroșu și de apă și controlează modulul driver de comandă motor cu L298N și servo motorul în funcție de aceste semnale. | ||
+ | |||
+ | **7. LCD Module :** | ||
+ | |||
+ | *Descriere: Acest modul LCD este utilizat pentru a afișa un mesaj corespunzător atunci când este detectată prezența apei. | ||
+ | *Interacțiune: Când senzorul de apă detectează apă, Arduino Uno poate trimite un semnal către modulul LCD pentru a afișa un avertisment despre prezența apei. | ||
- | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | ||
- | </note> | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 27: | Line 53: | ||
* 2 senzori infraroșu | * 2 senzori infraroșu | ||
* Senzor nivel apă | * Senzor nivel apă | ||
- | * Modul LCD 1602 | + | * Modul LCD 1602 + modul I2C |
* Șasiu transparent mașină inteligentă | * Șasiu transparent mașină inteligentă | ||
* Modul driver de comanda motor cu L298N OKY3195 | * Modul driver de comanda motor cu L298N OKY3195 | ||
Line 33: | Line 59: | ||
* Breadboard 830 puncte MB102 | * Breadboard 830 puncte MB102 | ||
+ | |||
+ | == Schemă electrică == | ||
+ | |||
+ | {{schema_electrica2.png?700x500}} | ||
+ | |||
+ | Am început proiectarea circuitului prin împărțirea pinilor pe fiecare componentă utilizată. Împărțirea acestora este următoarea: | ||
+ | * Pinul A3 este destinat citirii valorii senzorului de apă. | ||
+ | * Pinii A4 și A5 i-am păstrat pentru comunicația I2C cu LCD-ul. | ||
+ | * Pinii 2-7 sunt destinați controlului motoarelor prin driverul L298N. | ||
+ | * Pinii 8 și 9 sunt alocați senzorilor infraroșii care detectează direcția pe care trebuie să o urmeze robotul. | ||
+ | * Pinul 10 este alocat pentru servomotor. | ||
+ | * Pinul de 5V este utilizat pentru alimentarea atât a senzorului de temperatură, cât și a modulului LCD, ambele fiind conectate pe breadboard. | ||
+ | * Pinii de GND sunt distribuiți astfel: unul este alocat pentru modulul LCD, iar celălalt pentru toate conexiunile GND de pe breadboard (senzorii infraroșii, servomotorul, controlul motoarelor prin driverul L298N și senzorul de temperatură). | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | Codul a fost scris în **Arduino IDE**. | ||
+ | |||
+ | Am utilizat bibliotecile **"Servo.h"**, **"Wire.h"** și **"LiquidCrystal_I2C.h"** pentru controlul servomotorului, comunicație I2C și afișarea pe LCD. | ||
+ | |||
+ | Am definit viteza motorului prin constanta //"MOTOR_SPEED"//. | ||
+ | |||
+ | ''#define MOTOR_SPEED 250'' | ||
+ | |||
+ | Următorul pas în dezvoltarea software a fost definirea pinilor pentru motoare (mot1, mot3, mot2, mot4), senzorii infraroșii (left, right) și pinul pentru senzorul de apă (waterSensorPin). | ||
+ | |||
+ | Am inițializat obiectul Servo pentru controlul servomotorului și am afișat un mesaj de pornire pe LCD. | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | void setup() { |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | Serial.begin(9600); |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | myservo.attach(10); |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | delay(1000); |
- | * (etapa 3) surse şi funcţii implementate | + | myservo.write(90); |
+ | delay(1000); | ||
+ | myservo.write(0); | ||
+ | |||
+ | pinMode(waterSensorPin, INPUT); | ||
+ | |||
+ | pinMode(mot1, OUTPUT); | ||
+ | pinMode(mot3, OUTPUT); | ||
+ | pinMode(mot2, OUTPUT); | ||
+ | pinMode(mot4, OUTPUT); | ||
+ | |||
+ | pinMode(left, INPUT); | ||
+ | pinMode(right, INPUT); | ||
+ | |||
+ | // Initialize the LCD and print a welcome message | ||
+ | lcd.init(); | ||
+ | lcd.backlight(); | ||
+ | lcd.setCursor(0, 0); | ||
+ | lcd.print("Hi! I'm Nelutu:)"); | ||
+ | delay(2000); | ||
+ | lcd.clear(); | ||
+ | } | ||
</note> | </note> | ||
- | ===== Rezultate Obţinute ===== | + | În bucla principală, am apelat funcția //"water()"// pentru a detecta apa și a afișa mesaje corespunzătoare pe LCD și se citesc datele de la senzorii infraroșii pentru a determina direcția de mers a robotului. |
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | void loop() { |
- | </note> | + | water(); |
- | ===== Concluzii ===== | + | Left = digitalRead(left); |
+ | Right = digitalRead(right); | ||
- | ===== Download ===== | + | delay(20); |
+ | Serial.print("Left: "); | ||
+ | Serial.print(Left); | ||
+ | delay(10); | ||
+ | Serial.print(" Right: "); | ||
+ | Serial.println(Right); | ||
- | <note warning> | + | if (Left == 0 && Right == 0) |
- | O arhivă (sau mai multe dacă este cazul) cu 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ă ;-). | + | { |
+ | Serial.println("Chose front"); | ||
+ | FRONT(); | ||
+ | } | ||
- | 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**. | + | else if (Left == 1 && Right == 1) { |
+ | Serial.println("Chose stop"); | ||
+ | STOP(); | ||
+ | } | ||
+ | |||
+ | else if (Left == 0 && Right == 1) { | ||
+ | Serial.println("Chose left"); | ||
+ | LEFT(); | ||
+ | } | ||
+ | |||
+ | else if (Right == 0 && Left == 1) { | ||
+ | Serial.println("Chose right"); | ||
+ | RIGHT(); | ||
+ | } | ||
+ | } | ||
</note> | </note> | ||
- | ===== Jurnal ===== | + | În funcția **"water()"** nu numai citesc valoarea senzorului de apă, dar și, dacă această valoare depășește un anumit prag, inițiez un set de acțiuni. Printre aceste acțiuni se numără afișarea unui mesaj pe ecranul LCD pentru a semnala începerea ploii (//"Oh, no! Rain!"//) și, de asemenea, ridicarea servomotorului care controlează umbrela, astfel încât robotul să fie protejat de ploaie. |
<note tip> | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | void water() { |
+ | int sensorValue = analogRead(waterSensorPin); | ||
+ | delay(20); | ||
+ | Serial.print("Water sensor :"); | ||
+ | Serial.println(sensorValue); | ||
+ | if (sensorValue > threshold) { | ||
+ | if (waterDetected == false) { | ||
+ | lcd.setCursor(0,0); | ||
+ | lcd.print("Oh, no! Rain!"); | ||
+ | myservo.write(90); | ||
+ | } | ||
+ | waterDetected = true; | ||
+ | } else { | ||
+ | if (waterDetected == true) { | ||
+ | lcd.clear(); | ||
+ | myservo.write(0); | ||
+ | } | ||
+ | waterDetected = false; | ||
+ | } | ||
+ | } | ||
</note> | </note> | ||
- | ===== Bibliografie/Resurse ===== | + | Funcțiile **"FRONT()"**, **"LEFT()"**, **"RIGHT()"** și **"STOP()"** sunt responsabile de controlul mișcării robotului. Ele primesc informații de la senzorii infraroșii pentru a determina dacă există obstacole în cale sau pentru a identifica direcția dorită de deplasare. În funcție de aceste informații, funcțiile controlează motoarele robotului pentru a-l face să meargă înainte, să vireze la stânga, să vireze la dreapta sau să oprească complet mișcarea. |
- | <note> | + | <note tip> |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | void FRONT() { |
+ | analogWrite(mot1, MOTOR_SPEED); | ||
+ | analogWrite(mot3, MOTOR_SPEED); | ||
+ | analogWrite(mot2, MOTOR_SPEED); | ||
+ | analogWrite(mot4, MOTOR_SPEED); | ||
+ | } | ||
+ | |||
+ | void LEFT(void) { | ||
+ | |||
+ | analogWrite(mot1, MOTOR_SPEED); | ||
+ | analogWrite(mot3, MOTOR_SPEED); | ||
+ | analogWrite(mot2, 0); | ||
+ | analogWrite(mot4, 0); | ||
+ | } | ||
+ | |||
+ | void RIGHT(void) { | ||
+ | |||
+ | analogWrite(mot1, 0); | ||
+ | analogWrite(mot3, 0); | ||
+ | analogWrite(mot2, MOTOR_SPEED); | ||
+ | analogWrite(mot4, MOTOR_SPEED); | ||
+ | |||
+ | } | ||
+ | |||
+ | void STOP(void) { | ||
+ | |||
+ | analogWrite(mot1, 0); | ||
+ | analogWrite(mot3, 0); | ||
+ | analogWrite(mot2, 0); | ||
+ | analogWrite(mot4, 0); | ||
+ | |||
+ | } | ||
</note> | </note> | ||
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | ===== Rezultate Obţinute ===== |
+ | |||
+ | La pornirea Gentleman Robo, pe ecran este afișat următorul mesaj: | ||
+ | |||
+ | {{robo_inceput.jpeg?500x700}} | ||
+ | |||
+ | La detectarea apei, umbrela se ridică și pe ecran apare următorul mesaj: | ||
+ | |||
+ | {{robo_dectare_apa.jpeg?500x700}} | ||
+ | |||
+ | |||
+ | ===== Concluzii ===== | ||
+ | |||
+ | În concluzie, a fost o adevărată plăcere să lucrez la acest proiect, unde am avut oportunitatea de a combina cunoștințele de hardware cu cele de software și de a fi creativă în găsirea soluțiilor pentru controlul robotului. Integrarea senzorilor, a motorului și a servomotorului, împreună cu logica software pentru detectarea ploii și direcționarea mișcării, a fost o experiență minunată și edificatoare. Sper să mai am oportunitatea să lucrez la astfel de proiecte în viitor! | ||
+ | |||
+ | ===== Download ===== | ||
+ | |||
+ | Arhiva conține schema electrică și codul scris în Arduino IDE. | ||
+ | |||
+ | {{:pm:prj2024:vstoica:Bogdan_Alexandra_arhiva_pm.zip|}} | ||
+ | |||
+ | |||
+ | |||
+ | ===== Bibliografie/Resurse ===== | ||
+ | |||
+ | **Link-uri utile** | ||
+ | |||
+ | [1] https://www.youtube.com/watch?v=xVC0X_PE_XE | ||
+ | |||
+ | [2] https://www.youtube.com/watch?v=I7IFsQ4tQU8 | ||
+ | |||
+ | **Resurse** | ||
+ | |||
+ | 1. **Arduino Libraries** | ||
+ | |||
+ | 2. **Servo Library Documentation** | ||
+ | |||
+ | 3. **LiquidCrystal_I2C Library Documentation** | ||
+ | |||
+ | 4. **Wire Library Documentation** | ||
+ | |||
+ | 5. **Datasheet L298N Motor Driver** | ||
+ | |||
+ | 6. **Datasheet senzor de apa** | ||
+ | |||