
Arduino (IoT): MPU6050 Accelerometro para Carro 4×4 Parte 7 (Control de Carro via Guante)
En un tutorial anterior vimos como crear un carro 4×4 y controlarlo via instrucciones:
- Pre-cargadas en el codigo
- Via IR
- Via Bluetooth
- Via Sensor Ultrasonico
En otro tutorial anterior vimos como usar un accelerometer MPU6050 para visualizar movimiento (aceleración) en cualquiera de los 3 ejes de las 3 dimensiones espaciales. Usamos los datos del sensor para mover una gráfica de una ‘aeroplano’ en un programa llamado Processing y así visualizar el movimiento de nuestro sensor en una pantalla:
Ahora veremos como combinar los datos de aceleración espacial para controlar un carro 4×4:

Las conexiones serian las mismas que las del ultimo carro, el 4×4, pero desconectamos el servo que gira el ultrasonido y usamos la conexión al pin 2 como la data que entrará del sensor IR.
La idea es conectar una nano (la cual debido a su tamaño puede ser montada en un guante) y adjuntarle un sensor MPU6050 y un modulo Tx de IR para enviar la aceleración del MPU6050 al receptor Rx. Del lado del Rx estara nuestra UNO con la L293D shield que teníamos en el carro 4×4 ultrasonido.
El Jumper
Este jumper cuando esta interrumpido significa que la L293D usará la potencia de la fuente externa (las 4xAA) para los motores y debemos suplir una fuente alterna para la Arduino UNO. Anteriormente solo usábamos 2 motores por lo cual no era necesario mas potencia pero ahora que usaremos 4 motores si es necesario. Es decir, los 4 motores se usaran de manera mas continua debido a que el Arduino se continuara moviendo en distintas direcciones mientras decide cual es el mejor camino para avanzar.
Una vez removido el jumper, podemos conectar ambas fuentes de poder y listo!
Analicemos el código final para el transmisor:
#include <IR.h> #include <SPI.h> #include "Wire.h" //For communicate #include "I2Cdev.h" //For communicate with MPU6050 #include "MPU6050.h" //The main library of the MPU6050 MPU6050 mpu; int data[2]; void setup() { Serial.begin(9600); mpu.initialize(); //Initialize the MPU object } void loop() { delay(2000); // Delay so DHT-22 sensor can stabalize data[0] = map(350, -17000, 17000, 300, 400 ); //Send aX axis data data[1] = map(155, -17000, 17000, 100, 200); //Send aY axis data Serial.println(data[0]); Serial.println(data[1]); }
y para el codigo receptor:
// Include dependant SPI Library #include #include //Define packet for the direction (X axis and Y axis) int data[2]; AF_DCMotor motor1(1, MOTOR12_64KHZ); // create motor #1, 64KHz pwm AF_DCMotor motor2(2, MOTOR12_64KHZ); // create motor #2, 64KHz pwm AF_DCMotor motor3(3, MOTOR12_64KHZ); // create motor #3, 64KHz pwm AF_DCMotor motor4(4, MOTOR12_64KHZ); // create motor #4, 64KHz pwm String str_out; void setup() { Serial.begin(9600); } void loop() { // Set buffer to size of expected message int receivedData[3] = {0}; uint8_t buflen = sizeof(receivedData); if (rf_driver.recv((uint8_t*)receivedData, &buflen)) { for (byte i = 0; i < 3; i++) { Serial.print(receivedData[i]); Serial.println("..."); //Serial.print('\t');} if(receivedData[0] > 380){left(); Serial.println("LEFT"); //motor back left} if(receivedData[0] < 310){ right(); Serial.println("RIGHT"); //motor back right } if(receivedData[1] > 180){ forward(); Serial.println("FORWARD"); //motor bl and br direction 1} if(receivedData[1] < 110){ backward(); Serial.println("BACKWARD"); //motor bl and br direction 2 } if(receivedData[0] > 330 && receivedData[0] < 360 && receivedData[1] > 130 && receivedData[1] < 160); //brake(); stopCar(); Serial.println("STOP"); } } } void forward(){ Serial.println("running forward"); motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); } void backward(){ Serial.println("running backward"); motor1.run(BACKWARD); motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); } void left(){ motor3.run(FORWARD); //motor3.run(BACKWARD); } void right(){ motor4.run(FORWARD); //motor3.run(FORWARD); } void brake(){ motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); } void stopCar(){ motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); }
Aquí esta el video: