Ayuda con mi proyecto de robot con guante

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
emiarg10
Mensajes: 4
Registrado: 10/06/2019 4:03 am

Ayuda con mi proyecto de robot con guante

#1 Mensaje por emiarg10 » 10/06/2019 4:04 am

Hola muy buenas a todos, os comento, estoy finalizando un grado superior de electrónica y tengo que presentar ya mismo el proyecto final.
Opte por realizar uno de fuente abierta que vi en Internet que era un robot de 2 ruedas capaz de mantenerse de pie por si solo, ademas de poder controlarlo desde el móvil por la app pero finalmente le realice algunos cambios ya que de programación ando muy verde y no lo conseguí.

Finalmente mi proyecto se basaba en el mismo robot pero con unos soportes en los lados para que no se pueda caer y le fabrique un guante con un sensor MPU6050, un arduino nano y un pulsador en el dedo, con el objetivo de que la persona que quiera controlar el robot se coloque el guante y a través del movimiento que realice con la mano el robot avance, gire o retroceda, y al darle al pulsador del dedo, el robot que tiene una pequeña hacha con un servomotor de un pequeño "hachazo" jajaja.

Todo eso lo he conseguido y tengo el robot funcionando aunque si coloco la programación seguro que mas de uno se echara las manos a la cabeza, ademas de que no la tengo terminada del todo :smiley-roll-blue: ahora mi único problema es que, por ejemplo yo muevo la mano hacia delante o el lado que quiera mover el robot y si dejo la mano en esa posición esta continuamente enviándole la orden y el robot va a tirones. En cambio si inclino la mano hacia delante y nuevamente la pongo recta el robot se queda avanzando sin problema hasta que le de una nueva orden.

Me gustaría poder solucionar el tema de que vaya a tirones ya que es como que se le envía la orden todo el rato y va dando tirones, y si acciono el hacha con el pulsador pasa lo mismo, se queda pegando hachazos todo el rato como pillado hasta que le de una nueva orden.

Por cierto tengo que mencionar que el guante con el robot están conectados mediante bluetooth, uno como maestro y otro como esclavo.



A continuación dejo el código del robot y del guante:

Robot:

Código: Seleccionar todo

/*
Al configurar los motores, el primer numero indicara el numero de pasos y con FORWARD indicamos la direccion hacia adelante y BACKWARD hacia atras.
Los metodos de exitacion de bobinas pueden ser:

(Single = solo se excita una bobina, tiene un par motor bajo pero consume menos.)
(Double = Excitan 2 bobinas y se tiene par motor maximo pero doble de consumo.)
(Interleave = Se excitan pares de bobinas, lo que permite doble resolucion, con un par motor y un consumo intermedios, pero al tener doble de posiciones la velocidad es la mitad.
(Microstepping: En ligar de alimentar las bobinas con todo o nada, usamos tensiones PWM con una ciertas relaciones entre la alimentación de las dos bobinas, con lo que la transición entre pasos es más suave.
*/


#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
#include <Servo.h> 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *motor1 = AFMS.getStepper(200, 1); // Configuracion del motor paso a paso 1, con 200 pasos y selecionando el puerto 1 (M1 y M2)
Adafruit_StepperMotor *motor2 = AFMS.getStepper(200, 2); // Configuracion del motor paso a paso 2, con 200 pasos y selecionando el puerto 2 (M3 y M4)
Servo servoMotor;
char inforecibida; 


void controlmotores() // podria hacer falta una funcion de interrupcion, que cuando este inclinandose demasiado corte la aceleracion
   {
     // Si se envia algun dato, se leera.
    if (Serial.available() > 0)
    {
      inforecibida = Serial.read();
      delay(20);
    }
    
    // Si se recibe un "A" desde el bluetooth, los motores avanzaran un paso.
    if (inforecibida == 'A')
    {
      motor1->step(1, BACKWARD, DOUBLE); // Se indica el numero de pasos a avanzar, la direccion y el metodo de excitacion de bobinas 
      motor2->step(1, FORWARD, DOUBLE);
    }

    // Si se recibe un "B" desde el bluetooth, los motores retrocederan un paso.
    
    if (inforecibida == 'B')
    {
      motor1->step(1, FORWARD, DOUBLE); 
      motor2->step(1, BACKWARD, DOUBLE);  
    }

    // Si se recibe un "C" desde el bluetooth, el robot girara a la derecha.
    
    if (inforecibida == 'C')
    {
      motor1->step(1, FORWARD, DOUBLE); // motor1 da un paso hacia DELANTE
      motor2->step(1, FORWARD, DOUBLE);  // motor2 da un paso hacia ATRAS
    }

    // Si se recibe un "D" desde el bluetooth, el robot girara a la izquierda.
    
    if (inforecibida == 'D')
    {
      motor1->step(1, BACKWARD, DOUBLE);  // motor1 da un paso hacia ATRAS 
      motor2->step(1, BACKWARD, DOUBLE);   // motor2 da un paso hacia DELANTE
    }

    // Si se recibe un "E" desde el bluetooth, el robot accionara el servomotor.
    if (inforecibida == 'E')
    {
      servoMotor.write(175); // Se le ordena la posicion de 175º al servomotor
      delay(300);
      servoMotor.write(75);  // El servo motor regresa a la posicion de origen.

    }
    
   }

   

void setup()

   { 
     Serial.begin(9600);
     Serial.println("En espera de ordenes!");
     AFMS.begin(); // Inicia los motores
     servoMotor.attach(10);  // Seleccionar puerto para el servomotor
     servoMotor.write(75); // Se le asigna la posicion de 75º al servomotor al iniciar el robot
     motor1->setSpeed(300); // rpm del motor 1
     motor2->setSpeed(300); // rpm del motor 2
   }


void loop()
   
   {
    
    controlmotores(); // Se carga la funcion encargada del control de los motores por bluetooth segun la informacion recibida avanzara, retrocedera o girara a un lado o otro
   

   }
Guante:

Código: Seleccionar todo

#include <MPU6050_tockn.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#define DedoIndice 7
int estadoindice;

SoftwareSerial Bluetooth(4,3); // RX, TX

MPU6050 mpu6050(Wire);

void setup() {
  pinMode(DedoIndice, INPUT);
  Bluetooth.begin(9600);
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
}

void lectura()
{
  mpu6050.update();
  delay(10);
  
}
void loop() {
    estadoindice = digitalRead(DedoIndice);
    lectura();
    Serial.print("accX : ");Serial.print(mpu6050.getAccX());
    Serial.print("\taccY : ");Serial.print(mpu6050.getAccY());
    Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());

  if (estadoindice == 0) 
  {
    Bluetooth.write('E'); // Accionar el hacha
    Serial.print("Hachazo");
    delay(300);
  }

   if (mpu6050.getAccX() >= 0.70){  
    Bluetooth.write('D');    
    Serial.print("Izquierda ");
  }
  
  else if(mpu6050.getAccX() <= -0.60){
    Bluetooth.write('C');    
    Serial.print("Derecha");
  }
  
  else if(mpu6050.getAccY() >= 0.60){  
    Bluetooth.write('B'); 
    Serial.print("Atras ");
    
  }
  else if(mpu6050.getAccY() <= -0.60){
    Bluetooth.write('A'); 
    Serial.print("Adelante ");
  }
  
  else
  {
   
  }
  

  
  
}

Espero haberme explicado bien y que me podáis ayudar, muchas gracias.

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Ayuda con mi proyecto de robot con guante

#2 Mensaje por mollok » 10/06/2019 6:40 am

Por lo que veo toda tu estructura es secuencia, es decir, vas un paso detrás de otro. Esto en ordenadores va bien pero en el mundo real pasan cosas como a tu robot. Debes hacer que las cosas pasen en paralelo (tal vez el año que viene te gustaría estudiar robótica industrial y automatismos para comprender cómo van estas cosas).

En vez de todos esos ifs que hay en la lógica del robot, además del delay que hay detrás de inforecibida deberías hacer que las cosas sean más al mismo tiempo, no sé si me entiendes. Algo así (lo voy a escribir sin tener nada delante para probarlo así que sólo es indicativo):

Código: Seleccionar todo

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
#include <Servo.h> 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *motor1 = AFMS.getStepper(200, 1);
Adafruit_StepperMotor *motor2 = AFMS.getStepper(200, 2);

Servo servoMotor;
char inforecibida; 
unsigned marcaTiempoLectura = 0;
unsigned marcaTiempoServo = 0;
bool servoActivo = false;

void setup() { 
	Serial.begin(9600);
	Serial.println("En espera de ordenes!");
	AFMS.begin();
	servoMotor.attach(10);
	servoMotor.write(75);
	motor1->setSpeed(300);
	motor2->setSpeed(300);
}

void loop() {
	int motor1Direc;
	int motor2Direc;
	if (millis() > marcaTiempoLectura + 20 && Serial.available() > 0) { 
		inforecibida = Serial.read();
		marcaTiempoLectura = millis();
		
		switch(inforecibida) {
		case 'A':
			motor1Direc = BACKWARD;
			motor2Direc = FORWARD;
			break;
		case 'B':
			motor1Direc = FORWARD;
			motor2Direc = BACKWARD;
			break;
		case 'C':
			motor1Direc = FORWARD;
			motor2Direc = FORWARD;
			break;
		case 'D':
			motor1Direc = BACKWARD;
			motor2Direc = BACKWARD;
			break;
		case 'E':
			if(!servoActivo) {
		    	servoActivo = true;
	    		marcaTiempoServo = millis();
			}
	    	break;
		default:
			motor1Direc = BREAK; // cambiar por RELEASE si no se quiere gastar energía, pero la rueda queda libre.
			motor2Direc = BREAK;
			break;
		}
	}
	
	motor1->step(1, motor1Direc, DOUBLE);
	motor1->step(2, motor2Direc, DOUBLE);
	
	accionaServo(); // Incluir toda la función aquí, en vez de una llamada a ella, quitas gasto de tiempo de CPU por deber realizar dicha llamada.
	// Aquí, si fuera necesario, sí podrías poner un sleep para esperar a que el paso de los motores se produjera, pues sí o sí necesitas esperar por ellos. Pero debe ser el mínimo imprescindible.
}

void accionarServo() {
	if(servoActivo) {
		if(millis() > marcaTiempoServo + 300) {
    			servoMotor.write(75);
    			servoActivo = false;
    		}
    		else {
    			servoMotor.write(175);
    		}
	}
}
Por la parte del guante quita el delay 300 del hachazo ya que hará que cada vez que pulses éste deje de responder durante 300ms por dicha instrucción. Si necesitaras que de esperar usa la misma técnica que con el robot.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

emiarg10
Mensajes: 4
Registrado: 10/06/2019 4:03 am

Re: Ayuda con mi proyecto de robot con guante

#3 Mensaje por emiarg10 » 11/06/2019 2:15 am

Hola, primeramente muchísimas gracias por la ayuda. He probado con el código que me has dicho y ahora efectivamente no da mas tirones, funciona perfecto, pero tengo alguna duda.

La primera es respecto al default del switch y es que el robot arranca moviéndose directamente ya que lo del motor1direc = break y tal me da error al compilar y he tenido que poner RELEASE. Habría alguna manera de hacer que el robot se quede quieto al no estar recibiendo ninguna orden de movimiento?.

La segunda es respecto a lo de poner un sleep que no lo he entendido sinceramente y me gustaría aprender mas de programación por que es un tema que me gusta pero actualmente no tengo muchos conocimientos.

Y mi ultima duda es sobre el código del guante, el tema de poner else if varias veces cuando se lo mostré a mi profesor recuerdo que no le hizo mucha gracia, se podría poner con un switch también o alguna otra forma que quede mas "bonita"?

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Ayuda con mi proyecto de robot con guante

#4 Mensaje por mollok » 11/06/2019 9:55 am

Lo del BREAK fue mirando la última librería de Adafruit, a lo mejor usas una más antigua que no lo tiene, no se.

Sobre lo del movimiento del robot al arrancar dale al, justo antes de salir de la función, que dejé los motores en RELEASE, si es que no te deja usar BREAK.

Por otra parte acabo de ver un problema en el código que te pase:
Dónde pone

Código: Seleccionar todo

motor1->step(1, motor1Direc, DOUBLE);
motor1->step(2, motor2Direc, DOUBLE);
Debería poner

Código: Seleccionar todo

motor1->step(1, motor1Direc, DOUBLE);
motor2->step(1, motor2Direc, DOUBLE);
Supongo que puedes ver a qué se debe el fallo.

En cuanto al código del guante no se puede poner un switch pues estás comparando un rango de valores reales, no valores enteros exactos.

Lo que sí al tener esa estructura de if else if else... no podrás hacer que el robot avance y gire al mismo tiempo y siempre devolverá la función de más arriba si existen ambas al mismo tiempo.

Podrías haber codificado la función mediante el uso manejo a nivel de bits y hacer el descifrado en el lado del robot en plan:
Bit0: avanzar
Bit1: retroceder
Bit2: izquierda
Bit3: derecha
Bit4: botón

Así enviando un 0 el robot quedaría quieto,
Enviando un 1 avanzaría,
Enviando un 2 retrocedería
Enviando un 4 giraría a la izquierda
Enviando un 8 giraría a la derecha
Enviando un 5 avanzaría a la izquierda,
Enviando un 9 a la derecha
Etc.

Ya que vienes de electrónica no hace falta que me explaye más. Lo único que tendrías que dar prioridad a cuando se producen dos movimientos antagonistas. Aunque puedes dar otros significados:

Bit0 movimiento en avance,
Bit1 sentido del avance.
....
Así teniendo el bit0 en activo el robot se movería hacia adelante, pero si tuviera el bit1 en activo lo haría al marcha atrás. En cualquier estado de bit1 si tuviera el bit0 desactivado no se movería en esa dirección.

Ídem para izquierda y derecha.

En cuánto a lo del Sleep al final es porque debes esperar a que los motores hagan el step y eso es básico pero si dices que se mueve bien no hará falta ponerlo.

Para hacer que el robot pare con el guante centrado haz que mande un carácter más indicando que está centrado. El robot al recibir dicho comando escribe RELEASE en ambos motores.


Si te gusta la robótica podrías ir pensando en apuntarte a la FP de grado superior de robótica industrial y automatismos, código ELE33, este año creo que se llama 'Sistemas de regulación y control automáticos', ya que vienes de electrónica te será sencillo adaptarte a ésta.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

emiarg10
Mensajes: 4
Registrado: 10/06/2019 4:03 am

Re: Ayuda con mi proyecto de robot con guante

#5 Mensaje por emiarg10 » 12/06/2019 4:00 am

Buenas, lo del pequeño error en el código que me pasaste me di cuenta, ya lo había cambiado.

En cuanto a lo del uso del bits la verdad que es una buena idea pero de momento lo dejare como esta ya que tampoco me hace falta que avance y gire al mismo tiempo, ahora mismo como esta no va nada mal jajaja.

Acabo de realizar algunos cambios y ya he conseguido que el robot se quede quieto al estar el guante centrado. He hecho lo que me has comentado de enviar un carácter al indicar que esta centrado, y el robot escriba RELEASE en los motores al recibirlo, pero de esa manera seguía funcionando así que he creado una variable entera con el numero de pasos a dar, de manera que cuando el guante este centrado, los motores aparte del RELEASE den 0 pasos, es decir, que no se muevan y ya parece que funciona perfecto.

A continuación te dejo el código para que veas lo que he cambiado, a ver que te parece.

Robot:

Código: Seleccionar todo

/*
Al configurar los motores, el primer numero indicara el numero de pasos y con FORWARD indicamos la direccion hacia adelante y BACKWARD hacia atras.
Los metodos de exitacion de bobinas pueden ser:

(Single = solo se excita una bobina, tiene un par motor bajo pero consume menos.)
(Double = Excitan 2 bobinas y se tiene par motor maximo pero doble de consumo.)
(Interleave = Se excitan pares de bobinas, lo que permite doble resolucion, con un par motor y un consumo intermedios, pero al tener doble de posiciones la velocidad es la mitad.
(Microstepping: En ligar de alimentar las bobinas con todo o nada, usamos tensiones PWM con una ciertas relaciones entre la alimentación de las dos bobinas, con lo que la transición entre pasos es más suave.
*/

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
#include <Servo.h> 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *motor1 = AFMS.getStepper(200, 1); // Configuracion del motor paso a paso 1, con 200 pasos y selecionando el puerto 1 (M1 y M2)
Adafruit_StepperMotor *motor2 = AFMS.getStepper(200, 2); // Configuracion del motor paso a paso 2, con 200 pasos y selecionando el puerto 2 (M3 y M4)

Servo servoMotor;
char inforecibida; 
unsigned marcaTiempoLectura = 0;
unsigned marcaTiempoServo = 0;
bool servoActivo = false;
int motor1Direc;
int motor2Direc;
int numeropasos;

void setup() { 
  Serial.begin(9600);
  Serial.println("En espera de ordenes!");
  AFMS.begin(); // Inicia los motores
  servoMotor.attach(10); // Seleccionar puerto para el servomotor
  servoMotor.write(75); // Se le asigna la posicion de 75º al servomotor al iniciar el robot
  motor1->setSpeed(100); // rpm del motor 1
  motor2->setSpeed(100); // rpm del motor 2
}

void loop() {

  if (millis() > marcaTiempoLectura + 20 && Serial.available() > 0) { 
    inforecibida = Serial.read();
    marcaTiempoLectura = millis();
    
    switch(inforecibida) {
      
    case 'A': // Si se recibe un "A" desde el bluetooth, los motores avanzaran.
      motor1Direc = BACKWARD; 
      motor2Direc = FORWARD;
      numeropasos = 1;
      break;
      
    case 'B': // Si se recibe un "B" desde el bluetooth, los motores retrocederan un paso.
      motor1Direc = FORWARD;
      motor2Direc = BACKWARD; 
      numeropasos = 1;
      break;
      
    case 'C': // Si se recibe un "C" desde el bluetooth, el robot girara a la derecha.
      motor1Direc = FORWARD; // motor1 da un paso hacia DELANTE
      motor2Direc = FORWARD; // motor2 da un paso hacia ATRAS
      numeropasos = 1;
      break; 
      
    case 'D': // Si se recibe un "D" desde el bluetooth, el robot girara a la izquierda.
      motor1Direc = BACKWARD; // motor1 da un paso hacia ATRAS 
      motor2Direc = BACKWARD; // motor2 da un paso hacia DELANTE 
      numeropasos = 1;
      break;
      
    case 'E': // Si se recibe un "E" desde el bluetooth, el robot accionara el servomotor.
      if(!servoActivo) {
          servoActivo = true;
          marcaTiempoServo = millis();
      }
        break;
        
    case 'F': // Si se recibe un "F" desde el bluetooth, el robot detendra los motores.
      motor1Direc = RELEASE; // motor1 se libera
      motor2Direc = RELEASE; // motor2 se libera
      numeropasos = 0;
      break;
        
    default:
      motor1Direc = RELEASE;
      motor2Direc = RELEASE;
      numeropasos = 0;
      break;
    }
  }
  
  motor1->step(numeropasos, motor1Direc, DOUBLE); // Se indica el numero de pasos a avanzar, la direccion y el metodo de excitacion de bobinas 
  motor2->step(numeropasos, motor2Direc, DOUBLE);
  
  accionarServo(); 
}

void accionarServo() {
  if(servoActivo) {
    if(millis() > marcaTiempoServo + 300) {
          servoMotor.write(75);
          servoActivo = false;
        }
        else {
          servoMotor.write(175);
        }
  }
}
Guante:

Código: Seleccionar todo

#include <MPU6050_tockn.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#define DedoIndice 7
int estadoindice;

SoftwareSerial Bluetooth(4,3); // RX, TX

MPU6050 mpu6050(Wire);

void setup() {
  pinMode(DedoIndice, INPUT);
  Bluetooth.begin(9600);
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
}

void lectura()
{
  mpu6050.update();
  delay(10);
  
}
void loop() {
    estadoindice = digitalRead(DedoIndice);
    lectura();
    Serial.print("accX : ");Serial.print(mpu6050.getAccX());
    Serial.print("\taccY : ");Serial.print(mpu6050.getAccY());
    Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());

  if (estadoindice == 0) 
  {
    Bluetooth.write('E'); // Accionar el hacha
    Serial.print("Hachazo");
  }

   if (mpu6050.getAccX() >= 0.70){  
    Bluetooth.write('D');    
    Serial.print("Izquierda ");
  }
  
   if(mpu6050.getAccX() <= -0.60){
    Bluetooth.write('C');    
    Serial.print("Derecha");
  }
  
  if(mpu6050.getAccY() >= 0.60){  
    Bluetooth.write('B'); 
    Serial.print("Atras ");
  }
  
  if(mpu6050.getAccY() <= -0.60){
    Bluetooth.write('A'); 
    Serial.print("Adelante");
  }

  if(mpu6050.getAccY() > -0.60 && mpu6050.getAccX() < 0.70)
    {
      if (mpu6050.getAccY() < 0.60 && mpu6050.getAccX() > -0.60 )
      {
        Bluetooth.write('F');
        Serial.print("Stop");
      }
    }

}

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Ayuda con mi proyecto de robot con guante

#6 Mensaje por mollok » 12/06/2019 7:14 am

Bien, pero date cuenta que hay código duplicado: en el switch, el case F y default son exactamente el mismo. Si quitas el case F funcionará exactamente igual, ya que al recibir cualquier dato que no sea los de movimiento va a parar el robot, además liberarás memoria de código en el chip que podrás emplear para futuras actualizaciones.

Cuanto más compacto y eficiente sea un código, sobre todo en uC, mucho mejor.

Eso sí, métele un comentario ilustrando está situación.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

emiarg10
Mensajes: 4
Registrado: 10/06/2019 4:03 am

Re: Ayuda con mi proyecto de robot con guante

#7 Mensaje por emiarg10 » 17/06/2019 5:59 am

Vale, tienes razón, lo acabo de quitar y he dejado solo el default. Entiendo que también puedo quitar en la parte del código del guante la condición en la que envié el dato "F" verdad?

Muchas gracias!

Edito: Al quitar la parte del guante, deja de pararse el robot y se queda todo el rato en la ultima posición que ha estado, es como que se queda enviando todo el rato el dato de la ultima posición que ha estado. He tenido que poner de nuevo la parte del guante para que se quede quieto, y no se si hay alguna forma de hacer que no envié ningún dato por bluetooth al estar en esa posición, si no tendré que dejar el caso F para que no quede tan feo jajaja

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Ayuda con mi proyecto de robot con guante

#8 Mensaje por mollok » 17/06/2019 7:18 am

La F es necesaria porqué el robot, en caso de no recibir ninguna orden, continuará con la última orden que ha recibido y por eso necesita de una que diga que debe detenerse. Por otra parte puedes limpiar el último if tan complicado haciendo:

Código: Seleccionar todo

if(estadoindice == 0) {
    Bluetooth.write('E');
    Serial.print("Hachazo");
}

else if(mpu6050.getAccX() >= 0.70) {  
    Bluetooth.write('D');    
    Serial.print("Izquierda ");
}

else if(mpu6050.getAccX() <= -0.60) {
    Bluetooth.write('C');    
    Serial.print("Derecha");
}

else if(mpu6050.getAccY() >= 0.60) {  
    Bluetooth.write('B'); 
    Serial.print("Atras ");
}

else if(mpu6050.getAccY() <= -0.60) {
    Bluetooth.write('A'); 
    Serial.print("Adelante");
}

else {
    Bluetooth.write('F'); // Detiene el robot
    Serial.print("Stop");
}
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot], Google [Bot] y 3 invitados