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