Table of Contents

Gentleman Robo

Introducere

Î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.

Descriere generală

Schemă bloc

Descriere

1. Motor Control Driver with L298N:

2. Infrared Sensors:

3. Water Sensor:

5. Servo Motor:

6. Arduino Uno:

7. LCD Module :

Hardware Design

Listă de piese:
Schemă electrică

Am început proiectarea circuitului prin împărțirea pinilor pe fiecare componentă utilizată. Împărțirea acestora este următoarea:

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.

void setup() {

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.

void loop() {

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.

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;
}

}

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.

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);

}

Rezultate Obţinute

La pornirea Gentleman Robo, pe ecran este afișat următorul mesaj:

robo_inceput.jpeg

La detectarea apei, umbrela se ridică și pe ecran apare următorul mesaj:

robo_dectare_apa.jpeg

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.

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