4WD Car Kit Arduino Santiapps Series

Arduino Honduras Santiapps Marcio Valenzuela

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:

Arduino (IoT): Video Serie Smart Car 4WD Kit Auto-dirigido by Santiapps Marcio Valenzuela
Arduino (IoT): Video Serie Smart Car 4WD Kit Auto-dirigido

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:

Leave a Reply