Publicidad

sábado, 17 de junio de 2017

Coche RC Laser

Coche radiocontrol con Servo-Láser


En este proyecto vamos a añadir a nuestro coche de control remoto un láser apuntado por dos servos.
Uno de los servos mueve el láser en el eje X, el otro en el eje Y, de esa forma apuntamos el láser dónde queramos.

Y para añadir más complejidad al proyecto, en este coche los motores serán paso a paso. A cambio ganamos en precisión de movimientos.

El láser tiene una construcción modular, por lo que se puede instalar en cualquier tipo de vehículo que se os ocurra. Es un láser de 5mW, pero con uno de potencia suficiente podríamos quemar objetivos.

El coche está construido totalmente a mano, partiendo de una lámina de metacrilato a modo de chasis y el soporte de los motores es un perfil en U sacado de una canaleta para cables como las empleadas por los electricistas.

Detalle de los servos.




Esquema
El shield para motores de Adafruit es perfecto para ese proyecto, ya que permite controlar dos servos y dos motores paso a paso en la misma tarjeta.

Conectamos el receptor de infrarrojos en el pin D2 ya que es el único que no se usa. Y para que el diodo láser no esté permanentemente encendido, en lugar de conectarlo a 5V directamente, lo vamos a conectar al pin A0 y lo encenderemos a voluntad con el mando a distancia.

Los pines analógicos de arduino también se pueden utilizar como entradas/salidas digitales con tan solo configurarlo así en el setup.





Sketch

#include <AccelStepper.h>
#include <AFMotor.h>
#include <IRremote.h>
#include <Servo.h>

// two stepper motors one on each port
AF_Stepper motor1(64, 1);
AF_Stepper motor2(64, 2);

int receiverpin = 2; 
IRrecv irrecv(receiverpin); 
decode_results results;

Servo servoH;  // create servoH object to control a servo 
Servo servoV;  // create servoV object to control a servo                
 
int posH=80;
int posV=80;
boolean laser=0;

// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
// wrappers for the first motor!
void forwardstep1() {  
  motor1.onestep(FORWARD, DOUBLE);
}
void backwardstep1() {  
  motor1.onestep(BACKWARD, DOUBLE);
}
// wrappers for the second motor!
void forwardstep2() {  
  motor2.onestep(FORWARD, DOUBLE);
}
void backwardstep2() {  
  motor2.onestep(BACKWARD, DOUBLE);
}

// Motor shield has two motor ports, now we'll wrap them in an AccelStepper object
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);

//Funciones para los motores

void goForward()
{
  stepper1.move(4000);
  stepper2.move(-4000);  
}

void goBackward()
{
  stepper1.move(-4000);
  stepper2.move(4000);    
}
void turnRight()
{
  stepper1.move(-1100);
  stepper2.move(-1100);    
}
void turnLeft()
{
  stepper1.move(1100);
  stepper2.move(1100);    
}
void turnRight45()
{
  stepper1.move(-550);
  stepper2.move(-550);    
}
void turnLeft45()
{
  stepper1.move(550);
  stepper2.move(550);    
}


void setup()
{  
  Serial.begin(9600); 
  irrecv.enableIRIn();
  
  stepper1.setMaxSpeed(600);
  stepper1.setAcceleration(300);
  stepper2.setMaxSpeed(600);
  stepper2.setAcceleration(300);
  
  servoH.attach(10); 
  servoV.attach(9); 
  
  pinMode(A0, OUTPUT);
}

//Funciones para los servos 
//Funcion 1
void servoH_dcha()
{
  if (posH >= 15)
  {
    posH--;
    servoH.write(posH);
    delay(500);
  }
  if (posH < 15)
  {
    posH=posH+5;
    servoH.write(posH);
    delay(500);
  }
}
//Funcion 2
void servoH_izqda()
{
  if (posH <= 165)
  {
    posH++;
    servoH.write(posH);
    delay(500);
  }
  if (posH > 165)
  {
    posH=posH-5;
    servoH.write(posH);
    delay(500);
  }
}
//Funcion 3
void servoV_arriba()
{
  if (posV <= 165)
  {
    posV++;
    servoV.write(posV);
    delay(500);
  }
  if (posV > 165)
  {
    posV=posV-5;
    servoV.write(posV);
    delay(500);
  }
}
//Funcion 4
void servoV_abajo()
{
  if (posV >= 15)
  {
    posV--;
    servoV.write(posV);
    delay(500);
  }
  if (posV < 15)
  {
    posV=posV+5;
    servoV.write(posV);
    delay(500);
  }
}
//Funcion 5 Home
void Home()
{
  servoH.write(80);
  servoV.write(80);
  delay(500);
}

//Funcion LaserONOFF

void laserONOFF()
{
  if (laser==0){
    digitalWrite(A0, HIGH);
  }
  if (laser==1){
    digitalWrite(A0, LOW);
  }
  laser=!laser;
  delay(500);
}


void translateIR()
{
  switch(results.value)
  
  {
    case 0xD05: laserONOFF(); break;  // Laser ON/OFF 
    case 0x505: laserONOFF(); break;  // Laser ON/OFF 
        
    case 0xD02: goForward(); break;  // Go Forward 
    case 0x502: goForward(); break;  // Go Forward 
        
    case 0xD08: goBackward(); break; // Go Backward 
    case 0x508: goBackward(); break; // Go Backward 
        
    case 0xD06: turnRight(); break;  // turn Right 90º
    case 0x506: turnRight(); break;  // turn Right 90º
        
    case 0xD09: turnRight45(); break;  // turn Right 45º
    case 0x509: turnRight45(); break;  // turn Right 45º
        
    case 0xD04: turnLeft(); break;   // turn Left 90º
    case 0x504: turnLeft(); break;   // turn Left 90º    
    
    case 0xD07: turnLeft45(); break;   // turn Left 45º
    case 0x507: turnLeft45(); break;   // turn Left 45º
        
    case 0xD35: servoH_dcha(); break;  //PLAY
    case 0x535: servoH_dcha(); break;  //PLAY    
    
    case 0xD36: servoH_izqda(); break; //STOP
    case 0x536: servoH_izqda(); break; //STOP

    case 0xD00: servoV_arriba(); break;  //CERO
    case 0x500: servoV_arriba(); break;  //CERO    
    
    case 0xD30: servoV_abajo(); break;   //PAUSE
    case 0x530: servoV_abajo(); break;   //PAUSE    
    
    case 0xD1C: Home(); break; //RANDOM
    case 0x51C: Home(); break; //RANDOM
    
    
  }
}


void loop()
{
   if (irrecv.decode(&results))
  {
    translateIR();
    irrecv.resume(); // receive the next value
    //Serial.println(results.value, HEX); 
    //Serial.println(laser);  
  }
 
  stepper1.run();
  stepper2.run();
}

No hay comentarios.:

Publicar un comentario

Publicidad