Bueno pues os presento mi primer proyecto con Arduino
Se trata de un pequeño robot esquiva obstáculos.
El diseño, montaje y código son muy básicos que es el nivel que yo tengo pero aún y todo me ha costado mis sudores conseguir que funcione jejeje.
Los servos están "trucados" con el sistema de la doble resistencia. Son los primeros que truco y no he debido hacerlo muy bien porque el angulo para que se paren es 47º en uno y 70º el otro... Cuando los monté en el chasis no me dí cuenta y (no hay otra forma de hacerlo :D) lo hice al contrario uno de otro , por eso para que giren en la misma dirección uno tiene el ángulo en + y otro en -
Los servos y el sensor están conectados a una Shield Motor (que todavía no entiendo demasiado) y como el único acceso al pin 13 para el sensor era soldando he optado por conectarlo al pin 14 (A0).
Unas fotos de la "máquina":
y el código que he utilizado:
// Jukar
// Robot esquiva obstaculos con 2 servos trucados
// y un sensor hc-sh04
#include <AFMotor.h>
#include <Servo.h>
#define trigPin 2
#define echoPin 14
// Declaramos los 2 servos
Servo servo1;
Servo servo2;
void setup()
{
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// activamos los servos
servo1.attach(9);
servo2.attach(10);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
}
int i;
// ciclo para que giren los servos
void loop()
{
//servo1 para en 70º y servo2 en 47º.
//para que giren a la misma velocidad
//el angulo de Servo1=67 y el de Servo2=100
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(500);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
//Si activamos las 2 siguientes lineas veremos en el Monitor Serial
//la distancia
//Serial.print(distance);
//Serial.println(" cm");
// SI LA DISTANCIA ES MAYOR QUE 15 EL ROBOT ANDA HACIA DELANTE
if (distance > 15)
{
adelante();
}
//SI NO EJECUTARA GIRAR
else
{
girar();
}
}
void adelante()
{
servo1.write(-67);
servo2.write(100);
}
void girar()
{
//detener los 2 servos
servo1.write(47);
servo2.write(70);
delay(500);
//ir hacia atrás
servo1.write(67);
servo2.write(-100);
delay(300);
//girar hacia la izquierda
servo1.write(47);
delay(500);
}
Os agradecería enormemente que me ayudaseis a optimizar el código porque seguro que he cometido alguna aberración que otra al escribirlo...
:D:D:D:D Muchas gracias Jopapa, llevo días utilizando tu método!!!!
Aquí os dejo un pequeño video del "bicho" funcionando:
Está grabado antes de modificar un poco el código que he puesto en el primer post para mejorar un poco los movimientos de giro y añadir la marcha atrás...
Si quieres "liarte" mas, yo le pondría unos detectores laterales
Así el "bicho" podría contornear una estancia, manteniendo una distancia de pocos centímetros a la pared.
Si además le pones un encoder digital http://www.ebay.es/itm/321126066559?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649 a las ruedas, puedes saber la distancia recorrida y saber el perímetro de la estancia.
Lo digo porque el robot tenga un objetivo, una función y no sea solo un movimiento caótico.
Para eso me falta buscar información para saber como pasar el sketch del Uno al Mini (ya tengo un par de tutoriales localizados) porque supongo que luego las conexiones son iguales que el en Uno... ¿no es así?
El atemega 328 es fácil de hacerlo funcionar, miraté la página de txapuzas electrónicas, creo que era el proyecto 7. Verás que es fácil de hacerlo funcionar con poquitos componentes.