En este proyecto veremos por fin plasmados varios de los conocimientos adquiridos hasta el momento, utilizaremos los ejemplos de proyectos anteriores para dar forma a un robot con motores paso a paso, para de esa forma tener un control más preciso de los movimientos del robot.
Como veis en el esquema, para hacer el robot he utilizado dos tarjetas Arduino.
Un Arduino UNO R3, donde se conecta el shield para los motores paso a paso y por lo tanto es la encargada del control de movimientos.
El problema que nos encontramos es que el shield utiliza todas las entradas digitales del Arduino, excepto la D2, por lo que no quedan pines libres donde poder conectar el sensor de ultrasonidos HC-SR04 encargado de escanear el ambiente a modo de sónar para descubrir posibles obstáculos.
La solución por la que he optado es conectar el sensor HC-SR04 a otro Arduino, concretamente una versión miniatura con componentes smd, es decir, un Arduino NANO V3. Y como ahora vamos sobrados de pines, he añadido dos leds azules y un zumbador piezo eléctrico para darle más colorín al robot.
Resumiendo, el Arduino NANO, es el encargado de comprobar que no hay obstáculos, si el camino está despejado la señal CRASH D4 que está conectada a D2 del Arduino UNO es HIGH.
Arduino UNO comprueba el valor de dicha señal. Si es HIGH avanza los motores, y si es LOW efectúa un giro de 90º para evitar el obstáculo y a continuación avanza los motores.
Cuando nos enfrentemos a proyectos de cierta complejidad, mi consejo es que descompongamos el proyecto en problemas sencillos. Más que un consejo es una obligación, pues a veces resulta muy complejo montar el robot y programar el código del tirón.
En este caso, primero se han conectado los motores al shield, y se ha comprobado que funcionan correctamente y que responden a las órdenes que se les dan.
A continuación se montan los motores en el chasis, junto con el Arduino y el driver, y se programan unos movimientos sencillos, como avanzar, retroceder, girar, etc y que lo repita en bucle. Se coloca el robot en el suelo y se pone en marcha para comprobar que funcionan como se espera.
Por otro lado se conecta en solitario el sensor de ultrasonidos, y mediante el monitor serial o mediante un led, comprobamos que el circuito de medida de distancia funciona bien.
Una vez comprobados ambos circuitos por separado, se monta todo junto y a funcionar.
#include <AccelStepper.h>
#include <AFMotor.h>
int crash = 0;
// two stepper motors one on each port
AF_Stepper motor1(64, 1);
AF_Stepper motor2(64, 2);
// 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);
int pos1 = 2000; // 20 cm approx
int pos2 = -2000; // 20 cm approx
int turn1 = 528; // 1/2 turn
int turn2 = 528; // 1/2 turn
//boolean turn = false;
void setup()
{
stepper1.setMaxSpeed(600);
stepper1.setAcceleration(300);
stepper2.setMaxSpeed(600);
stepper2.setAcceleration(300);
pinMode(14, INPUT);
}
void loop()
{
crash=digitalRead(2);
if ((stepper1.distanceToGo() == 0) && crash==HIGH)
{
stepper1.move(pos1);
stepper2.move(pos2);
}
if ((stepper1.distanceToGo() == 0) && crash==LOW)
{
stepper1.move(1050);
stepper2.move(1050);
}
stepper1.run();
stepper2.run();
}
Sketch para Arduino Nano
/*
Test distancia y sirena acustica y luminosa
*/
#define echoPin 6
#define trigPin 7
#define PIEZO 11 // que sea con capacidad PWM
long duration, distance, contador;
float aux;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(PIEZO, OUTPUT);
pinMode(4, OUTPUT); //led rojo indicador de distancia
pinMode(2, OUTPUT); //led azul sirena
pinMode(9, OUTPUT); //led azul sirena
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration/58.2;
if (distance > 30){
digitalWrite(4,HIGH);
}
if (distance <= 30){
digitalWrite(4,LOW);
}
digitalWrite(2,LOW);
digitalWrite(9,HIGH);
analogWrite(PIEZO, 16);
delay (200);
digitalWrite(2,HIGH);
digitalWrite(9,LOW);
analogWrite(PIEZO, 64);
delay(200);
}