Robot solar. Programació

Primera proba de comunicació:
Mostrar un text o un altre pel monitor serial en funció de les dades rebudes
String dada;  // variable tipus cadena per desar les dades rebudes per bluetooth
 
void setup() 
{
  Serial.begin(9600);    // inici de la comunicació serial
}
 
void loop() 
{ 
  while (Serial.available())  // mentre hagi connexió serie amb algun dispositiu ...
    { 
      delay(10);
      if (Serial.available() > 0)  // quan es rebi una dada ...
      {
        char c = Serial.read();   // la dada rebuda es desa com un caracter
        dada += c; // cadena de caracters formada por la suma de les dades rebudes
      }
    }

  if(dada == "A")  // si es reb una A ...
  { Serial.println ("he rebut AAAA"); }  // text a mostrar pel monitor serial 
  if(dada == "B")  // si es reb una B ...
  { Serial.println ("he rebut BBBB"); }  // text a mostrar pel monitor serial  
  if(dada == "C")  // si es reb una C ...
  { Serial.println ("he rebut CCCC"); }  // text a mostrar pel monitor serial   
  
  dada = "";   // buidem la variable "dada" per tornar a desar els nous caracters
}

Segona proba de comunicació:
Resposta dels motors a les dades enviades des dels botons de l'aplicació Android:
A (endavant) - B (enrrere) - P (aturada)
#include <Servo.h>  // llibreria per treballar amb servos
 
Servo servoLeft;    // declaració de variable tipus Servo (roda esquerra)
Servo servoRight;   // declaració de variable tipus Servo (roda dreta)
String dada;        // variable de tipus cadena per desar les dades rebudes per bluetooth

void setup() 
{
  Serial.begin(9600);    // inici de la comunicació serial
  servoLeft.attach(11);  // assigna els senyals servo al pin 
  servoRight.attach(10);  // assigna els senyals servo al pin
}
 
void loop() 
{ 
  while (Serial.available())  // mentre hagi connexió sèrie amb algun dispositiu ...
    { 
      delay(10);
      if (Serial.available() > 0)  // quan es rebi una dada ...
      {
        char c = Serial.read();   // la dada rebuda es desa com un caracter (lletra)
        dada += c;  // cadena de caracters formada por la suma de les dades rebudes
      }
    }

  if(dada == "A")  // si es reb una A ...
  { endavant(); }  // executa la funció corresponent
  if(dada == "B")  // si es reb una B ...
  { enrrera(); }  // per separar-se de l'obstacle
  if(dada == "P")  // si es reb una P ...
  { atura(); }     // executa la funció corresponent

  dada = "";  // buidem la variable "dada" per tornar a desar els nous caracters 
}

// ..............................................................................

void endavant()
{
  servoLeft.write(0);       // gir antihorari, velocitat màxima
  servoRight.write(180);    // gir horari, velocitat màxima
  delay(10);
}

void enrrera()
{
  servoLeft.write(180);    // gir horari, velocitat màxima
  servoRight.write(0);     // gir antihorari, velocitat màxima 
  delay(10);
}

void atura()
{
  servoLeft.write(90);    // atura
  servoRight.write(90);   // atura 
  delay(10);
} 

Programa definitiu:
El que volem és que el robot reaccioni als botons de l'aplicació Android NOMÉS si no hi ha cap obstacle al davant, és a dir, si detecta un obstacle el robot s'ha d'aturar i només respondrà al botó de marxa enrrere per poder separar-se i continuar movent-se.

Després de moltes probes he arribat a la conclusió que l'ordre de condicions ha de ser:


/* Robot amb ultrasons i bluetooth */
// Accions segons dada rebuda de l'Android per bluetooth

#include <Servo.h>  // llibreria per treballar amb servos
 
Servo servoLeft;    // declaració de variable tipus Servo (roda esquerra)
Servo servoRight;   // declaració de variable tipus Servo (roda dreta)
String dada;        // variable per desar les dades rebudes

int EchoPin = 2;    // entrada eco sensor d'ultrasons
int TrigPin = 3;    // sortida trig sensor d'ultrasons
int temps;          // temps mesurat pel sensor d'ultrasons
int distancia;      // distància a l'obstacle en funció del temps mesurat
int obstacle = 20;  // distància que defineix presència d'obstacle

void setup() 
{
  Serial.begin(9600);    // inici de la comunicació serial
  servoLeft.attach(11);  // assigna els senyals servo al pin 
  servoRight.attach(10);  // assigna els senyals servo al pin
  pinMode (TrigPin,OUTPUT);  // definim el pin Trig com a sortida digital
  pinMode (EchoPin,INPUT);   // definim el pin Echo com a entrada digital
}
 
void loop() 
{  
  while (Serial.available())  // mentre hagi connexió sèrie amb algun dispositiu ...
    { 
      delay(10);
      if (Serial.available() > 0)  // quan es rebi una dada ...
      {
        char c = Serial.read();   // la dada rebuda es desa com un caracter (lletra)
        dada += c;  // cadena de caracters formada por la suma de les dades rebudes
      }
    }
    
    detecta_distancia();  // executa la funció de detecció amb ultrasons
    if (distancia < obstacle)  // si es detecta obstacle ... 
    {                          // el robot només pot fer marxa enrrere
      if (dada == "B")
      { enrrera(100); }  // temps llarg per separar-se de l'obstacle
      else
      {atura();}
    }
    else  // si no hi ha obstacle al davant ...
    {
      if (dada == "A")
      {endavant(); }
      if (dada == "B")
      { enrrera(10); }   // temps curt per agilitzar l'execució
      if (dada == "C")
      { esquerra(); }
      if (dada == "D")
      { dreta(); }
      if (dada == "P")
      { atura(); }
  }
  dada = "";  // buidem la variable "dada"
  // Serial.println (distancia);  // per depuració i comprobació
  delay(50);  // petita pausa final per deixar temps a l'ultrasons
}

// ..............................................................................

void detecta_distancia()  // detecció sensor d'ultrasons
{
  digitalWrite (TrigPin,LOW);  // generació de pols pel pin Trig 
  delayMicroseconds (2);
  digitalWrite (TrigPin,HIGH);  
  delayMicroseconds (10);
  digitalWrite (TrigPin,LOW);
  temps = pulseIn (EchoPin,HIGH);  // mesura del pols rebut pel pin Echo
  distancia = temps / 58.2;  // conversió del temps mesurat en distància (cm)
}

void endavant()
{
  servoLeft.write(0);       // gir antihorari, velocitat màxima
  servoRight.write(180);    // gir horari, velocitat màxima
  delay(10);
  //Serial.println ("endavant");
}

void enrrera(int durada)   // diferent temps segons hagi obstacle o no
{
  servoLeft.write(180);    // gir horari, velocitat màxima
  servoRight.write(0);     // gir antihorari, velocitat màxima 
  delay(durada);
  //Serial.println ("enrrera");
}

void esquerra()
{
  servoLeft.write(90);      // gir antihorari, velocitat màxima
  servoRight.write(180);    // gir horari, velocitat màxima
  delay(10);
  //Serial.println ("endavant");
}

void dreta()
{
  servoLeft.write(0);      // gir antihorari, velocitat màxima
  servoRight.write(90);    // gir horari, velocitat màxima
  delay(10);
  //Serial.println ("endavant");
}

void atura()
{
  servoLeft.write(90);    // atura
  servoRight.write(90);   // atura 
  delay(10);
  //Serial.println ("aturat");
}

Cap comentari:

Publica un comentari a l'entrada