Într-o lume în care tradițiile se estompează și stilurile de viață se schimbă rapid, am decis să aduc o picătură din nostalgia vechilor maniere în era tehnologiei avansate. Hai să fim sinceri, în ziua de azi, rareori mai vezi un băiat care își deschide umbrela pentru o fată când plouă. Așa că am hotărât să fac ceva în legătură cu asta - am creat un robot care face exact asta!
Pornind de la dorința de a aduce împreună tehnologia și rafinamentul, am dezvoltat o mașină autonomă cu un twist inedit: este echipată cu senzori infraroșu care îi conferă “vederea” necesară pentru a urmări o linie prestabilită, iar atunci când se întâlnește cu apă, se transformă într-un adevărat gentleman.
Da, ai auzit bine! Cu un senzor special de apă și un servomotor, mașina mea ridică o umbrelă într-o manieră elegantă și afișează un mesaj corespunzător pe un ecran LCD. Este un spectacol al tehnologiei și al stilului, întruchipând ideea că utilitatea poate merge mână în mână cu eleganța.
1. Motor Control Driver with L298N:
2. Infrared Sensors:
3. Water Sensor:
5. Servo Motor:
6. Arduino Uno:
7. LCD Module :
Am început proiectarea circuitului prin împărțirea pinilor pe fiecare componentă utilizată. Împărțirea acestora este următoarea:
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.
Serial.begin(9600); myservo.attach(10); delay(1000); 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();
}
Î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.
water();
Left = digitalRead(left); Right = digitalRead(right);
delay(20); Serial.print("Left: "); Serial.print(Left); delay(10); Serial.print(" Right: "); Serial.println(Right);
if (Left == 0 && Right == 0) { Serial.println("Chose front"); FRONT(); }
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(); }
}
Î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.
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; }
}
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.
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);
}
La pornirea Gentleman Robo, pe ecran este afișat următorul mesaj:
La detectarea apei, umbrela se ridică și pe ecran apare următorul mesaj:
Î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!
Arhiva conține schema electrică și codul scris în Arduino IDE.
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