Spark - robotul ocolitor de obstacolele

Spark este un robot automat controlat printr-un Arduino.
Robotul este programat să se ferească de obstacole și să ne arate dacă un obstacol este sau nu în fața lui.
El folosește două motoare, unul pe partea dreaptă, altul pe partea stangă.Merge pe  principiul tancului pentru a-și schimba direcția.

Pasul 1: Comandarea componentelor

Spark - robotul ocolitor de obstacolele - Comandarea componentelor

Piesele folosite: Arduino Leonardo, dual driver L298, senzor ultrasunete HC-SR04, 2 motoare 9V, 2 LED-uri ( rosu, verde).

Pasul 2: Programarea Arduino-ului

Pentru a programa robotul am folosit urmatorul cod: 

#include <NewPing.h>                   //adauga libraria "NewPing" ( libraria senzorului ) in program ;
#define trig 12                        // defineste PIN-ul 12 sub denumriea de "trig"; 
#define echo 11                        // defineste PIN-ul 11 sub denumriea de "echo";
#define maxd 250                       // defineste distanta maxima ce va fi detectata de senzor;
int uS;                                // initializeaza variabila "uS";
float i=uS;
/* motorul A */
int enA = 9;                           // motor A; initializeaza "enA" ca fiind PIN-ul 9;
int in1 = 5;                           // initializeaza "in1" ca fiind PIN-ul 5;
int in2 = 4;                           // initializeaza "in2" ca fiind PIN-ul 4;
/* motorul B */
int enB = 6;                           // motor B; initializeaza "enB" ca fiind PIN-ul 6;
int in3 = 3;                           // initializeaza "in3" ca fiind PIN-ul 3;
int in4 = 2;                           // initializeaza "in4" ca fiind PIN-ul 2;
int ledverde = 13;                     // initializeaza "ledverde" ca fiind PIN-ul 13;
int ledrosu = 10;                       // initializeaza "ledrosu" ca fiind PIN-ul 7;
NewPing sonar(trig, echo, maxd);       // defineste PIN-urile conectate la senzor;



void setup(){                          // seteaza toate PIN-urile motorului ca iesire (OUTPUT);
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(115200);}               // selecteaza canalul 115200 pentru " Serial Monitor" ;



void loop(){                            // tot ce este in interiorul "loop()" se va repeta la infinit;
  delay(50);                           // intarzie repetarea programului;
  unsigned int uS = sonar.ping_cm();   // initializeaza uS ca "sonar.ping_cm()" , "ping_cm()" transforma din inchi in centimetri;
  Serial.print("Distanta: ");          // afiseaza in Serial Monitor " Distanta: " ;                            /*  
  Serial.print(uS );                   // afiseaza valoarea lui "uS" ;                                                  In Serial Monitor se va afisa " Distanta: x cm" 
  Serial.println("cm");                // afiseaza in Serial Monitor "cm" ;                                                                                                  */ 
 
      if(uS>40)                              // daca ( "if" ) distanta dintre senzor si obstacol e mai mica de 50 ;
       {digitalWrite(in1, LOW);              // motorul A va merge in fata;
        digitalWrite(in2, HIGH);                         
        analogWrite(enA,100);               // seteaza viteza 100 din raza posibila 0~255;
        digitalWrite(in3, LOW);             // motorul B va merge in fata;
        digitalWrite(in4, HIGH);
        analogWrite(enB, 100);}              // seteaza viteza 100 din raza posibila 0~255;
        
        else{                                // altfel;  Asta va face ca robotul sa isi schimbe directia de mers;                        
                                             // motorul A va merge in fata;
          digitalWrite(in1, HIGH);                                                                                 
          digitalWrite(in2, LOW);                                                   
          analogWrite(enA, 100);             // seteaza viteza 100 din raza posibila 0~255;                             
                                             
          digitalWrite(in3, LOW);                                                                                          
          digitalWrite(in4, HIGH);           
          analogWrite(enB, 100);}            // seteaza viteza 100 din raza posibila 0~255;                                                                                     
          
      
      if(uS>40){                            // daca ("if") distanta dintre senzor si obstacol este mai mare de 50;
        digitalWrite(ledverde,HIGH);        // ledul verde se va aprinde;
        digitalWrite(ledrosu,LOW);}         // ledul rosu va sta stins;
                  
        else{                               // in caz contrar:
          digitalWrite(ledrosu,HIGH);       // ledul rosu va fi stins;
          digitalWrite(ledverde,LOW);}      // ledul verde va fi aprins; 
}


Pasul 3: Asamblarea robotului

Pentru asamblare am folosit: pistol de lipit, pistol cu silicon, cablu AWG, suruburi si piulite M3, imprimanta 3D si plastic pentru aeromodele.

Pasul 4: Testarea robotului

In urma testelor am reglat distanta optima de sesizare a obstacolelor si viteza potrivita a motoarelor.

Pasul 5: Prezentarea robotului

Spark - robotul ocolitor de obstacolele - Prezentarea robotului

Robotul calibrat a fost prezentat la Festivalul Stiintei tinut de Liceul Teoretic "Onisifor Ghibu" Sibiu. Spark a luat locul I la categoria " Tehnologie".


Despre autor

Trimite-i un email


Faci ceva interesant?

Adaugă proiectul tău acum!