Robot salva obstáculos v 1.0 (fotos y video)

Bueno pues os presento mi primer proyecto con Arduino :smiley:

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

Muchísimas gracias y un saludo!!!!

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

Un saludo

Jopapa
www.jopapa.me

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

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:

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.

Un saludo
Jopapa
www.jopapa.me

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

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

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.

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