Go Down

Topic: Robot salva obstáculos v 1.0 (fotos y video) (Read 1 time) previous topic - next topic

Jukar

Jun 28, 2013, 10:38 pm Last Edit: Jun 29, 2013, 07:43 am by Jukar Reason: 1
Bueno pues os presento mi primer proyecto con Arduino  :D

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:

Code: [Select]
// 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...

Muchísimas gracias y un saludo!!!!

Jopapa

Estupendo bricolaje.
Para optimizar el código, usa el método que inventé yo: prueba-error-prueba-error-prueba-error-prueba-error  ]:D

Un saludo

Jopapa
www.jopapa.me 

Jukar


Estupendo bricolaje.
Para optimizar el código, usa el método que inventé yo: prueba-error-prueba-error-prueba-error-prueba-error  ]:D

Un saludo

Jopapa
www.jopapa.me 


:D:D:D:D Muchas gracias Jopapa, llevo días utilizando tu método!!!!

Aquí os dejo un pequeño video del "bicho" funcionando:

http://www.youtube.com/watch?feature=player_detailpage&v=UCSv51RZ3CQ

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...

Jopapa

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.

Un saludo
Jopapa
www.jopapa.me

P.D. Como odio los vídeos verticales.  ]:)

Jukar

Muchas gracias de nuevo Jopapa!

Como no suelo grabar vídeos con el móvil me salió tumbado y tuve que girarlo para que se viera bien  XD XD XD

No sabía ni que existía el "Wheel Encoder"..... es un accesorio genial y la idea de modificarlo para darle el uso que me comentas también.

De momento antes de meterme en más "fregaos" me gustaría poder montar lo mismo pero quitando el Arduino Uno (solo tengo uno jejeje)  poniendo en su lugar el Pro Mini Atmega328 http://www.ebay.es/itm/New-Pro-Mini-atmega328-5V-16M-Replace-ATmega128-Arduino-Compatible-Nano-/130839929399?pt=LH_DefaultDomain_0&hash=item1e76aae237#ht_1641wt_1163

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í?

También tengo un ATMEGA328P (solo el micro) http://www.ebay.es/itm/NEW-ATMEGA328P-PU-DIP-28-Microcontroller-IC-/130872191672?pt=LH_DefaultDomain_0&hash=item1e78972ab8#ht_1228wt_1163 pero supongo que será más complejo de hacerlo funcionar...¿verdad?

Un saludo!!!!

nayma

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.

Jukar

Muchas gracias Nayma!!!! Echaré un vistazo.

El lunes empiezo 3 semanas de vacaciones así que voy a ver si me pongo las pilas y lo modifico  XD

Go Up