This shows you the differences between two versions of the page.
pm:prj2024:vstoica:alexandra.bogdan02 [2024/05/14 16:09] alexandra.bogdan02 |
pm:prj2024:vstoica:alexandra.bogdan02 [2024/05/27 06:26] (current) alexandra.bogdan02 |
||
---|---|---|---|
Line 63: | Line 63: | ||
{{schema_electrica2.png?700x500}} | {{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** | ||
+ | |||