jueves, 21 de mayo de 2020

Carro Robot v2

Arduino Pro Mini

1. Necesita un Programador USB to TTL
2. Para programarlo en el arduino se configura
                      Tools ---> Board ---> Arduino Pro or Pro Mini
                      Tools ---> Processor ---> ATMega328P (5V, 16Mhz)
                      Tools ---> Programmer ---> AVR ISP
3. Cuando ingrese la USB to TTL en el puerto del PC se debe configurar y asignar en el Programa del arduino el COM asi:
                      Tools ---> Port ---> Com4

4. Cuando se le de subir programa al arduino se debe tener presionado el botón de reset del arduino pro mini y luego cuando en el software termine de decir compilando y pase a decir subiendo se debe soltar el botón de reset del arduino.

5. Las conexiones se muestran en el siguiente diagrama del Carro funcionando por comandos de enviados por bluetooth del celular con una aplicación (APP) llamada Serial Bluetooth.





6. Cuando el programa ya esta cargado en el arduino pro mini se debe desconectar el programador USB to TTL para probar su funcionamiento, al menos desconectar VCC del programador. 



7. Cuando ya se vaya a probar el funcionamiento se presiona el interruptor que esta al lado de la bateria, luego en el celular se vincula el bluetooth HC-05, la contraseña que pide es 1234, luego se abre en el celular la App Serial Bluetooth y se vincula nuevamente del HC-05, y luego de conectado se le envia los comandos dados en programación. 

8. En el codigo se programaron los siguientes comandos. 

letra "f" --->  acciona el carro para que ande de frente, hacia delante
letra "a" --->  acciona el carro para que ande hacia atrás
letra "s" --->  detiene el carro
letra "d" --->  acciona el carro para que gire a la derecha
letra "i" --->  acciona el carro para que gire a la izquierda

9. Se agregaron ademas funciones en el codigo para realizar estas tareas

move (forward,180) --> indica que el carro va de frente y con una velocidad de rpm de 180
move (backward,180) --> indica que el carro va hacia atras y con una velocidad de rpm de 180
turn (derecha,50) --> indica que el carro gira a la derecha y con una velocidad de rpm de 50
turn (izquierda,50) --> indica que el carro gira a la izquierda y con una velocidad de rpm de 50
fullstop(); ---->    detiene los 2 motores
stopMotor(pinMotorA); -----> detiene solo el motor A

Esta programación es la secuencia del codigo en el lazo (LOOP), los demas son las subfunciones para que trabajen estos comandos anteriores. 


10. En el codigo, al inicio se deben configurar los pines que se utilizan para el driver (puente H) TB6612FNG. 

11. Codigo utilizado 

const int pinPWMA = 3;
const int pinAIN2 = 4;
const int pinAIN1 = 5;
const int pinBIN1 = 7;
const int pinBIN2 = 8;
const int pinPWMB = 9;
const int pinSTBY = 6;
char data =0;  
const int waitTime = 100;   //espera entre fases
const int speed = 200;      //velocidad de giro
const int pinMotorA[3] = { pinPWMA, pinAIN1, pinAIN2 };
const int pinMotorB[3] = { pinPWMB, pinBIN1, pinBIN2 };

enum moveDirection {
   forward,
   backward
};

enum turnDirection {
   derecha,
   izquierda
};

void setup()
{
   pinMode(pinAIN2, OUTPUT);
   pinMode(pinAIN1, OUTPUT);
   pinMode(pinPWMA, OUTPUT);
   pinMode(pinBIN1, OUTPUT);
   pinMode(pinBIN2, OUTPUT);
   pinMode(pinPWMB, OUTPUT);
   pinMode(13, OUTPUT);
   pinMode(2, OUTPUT);
   Serial.begin(9600);
   fullStop();
   digitalWrite(2, HIGH);
   delay(50);
}

void loop()
{
  if(Serial.available()>0){        // lee el bluetooth y almacena en estado
    data = Serial.read();

    switch (data) {
    case 'f':   
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(500);                    // wait for a second
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    delay(500); 
    enableMotors();
    move(forward, 90);
    delay(waitTime);
    break;
    case 'a':  
    enableMotors();
    move(backward, 90);
    delay(waitTime);
    break;
    case 's': 
    fullStop();
    delay(waitTime);
    break; 
    case 'd': 
    enableMotors();
    turn(derecha, 50);
    delay(waitTime);
    break; 
    case 'i': 
    enableMotors();
    turn(izquierda, 50);
    delay(waitTime);
    break; 
    default: break;
  }
    Serial.println(data);
  }


}


//Funciones que controlan el vehiculo
void move(int direction, int speed)
{
   if (direction == forward)   {
      moveMotorForward(pinMotorA, speed);
      moveMotorForward(pinMotorB, speed);   }
   else{
      moveMotorBackward(pinMotorA, speed);
      moveMotorBackward(pinMotorB, speed);}
}

void turn(int direction, int speed)
{
   if (direction == izquierda){
      moveMotorForward(pinMotorA, speed);
      stopMotor(pinMotorB);   }
   else {
      stopMotor(pinMotorA);
      moveMotorForward(pinMotorB, speed);   }
}

void fullStop()
{
   disableMotors();
   stopMotor(pinMotorA);
   stopMotor(pinMotorB);
}

//Funciones que controlan los motores
void moveMotorForward(const int pinMotor[3], int speed)
{
   digitalWrite(pinMotor[1], HIGH);
   digitalWrite(pinMotor[2], LOW);
   analogWrite(pinMotor[0], speed);
}

void moveMotorBackward(const int pinMotor[3], int speed)
{
   digitalWrite(pinMotor[1], LOW);
   digitalWrite(pinMotor[2], HIGH);
   analogWrite(pinMotor[0], speed);
}

void stopMotor(const int pinMotor[3])
{
   digitalWrite(pinMotor[1], LOW);
   digitalWrite(pinMotor[2], LOW);
   analogWrite(pinMotor[0], 0);
}

void enableMotors() {digitalWrite(pinSTBY, HIGH);}
void disableMotors(){digitalWrite(pinSTBY, LOW);}

11. Se utilizo el pin 2 para darle energia al bluetooth, es decir que es la fuente VCC para que el arduino le de vida al bluetooth HS -05, no se requiere la resistencia del divisor del Tx. 

12. En algunos momentos se presentaron problemas con la comunicacion del bluetooth, pero fue por la velocidad en el setup del serial, se debe colocar los 9600 y establecer bien el arduino que se vaya a programar, en este caso es de 16Mhz. 

13. Otro Problema que sucedió fue que en el codigo de leer la informacion que envia el puerto serial del bluetooth 
f(Serial.available()>0){        // lee el bluetooth y almacena en estado
    data = Serial.read();

todo el codigo  para que trabaje el carro debe estar dentro de este corchete de IF(serial.available()>0

14.  Mejora el codigo de la version 1. 

Espero les sirva.




No hay comentarios:

Publicar un comentario