Mascota AirWick – OPEN HARDWARE / SOFTWARE / MIND
Menú Close

Mascota AirWick

Como hace tiempo que mi nena me incha con el tema de tener una mascota… y como yo no le pienso cumplir el capricho… se me ocurrió aunar un poco mis conocimientos y hacerle algo para que se distraiga entre tanto.

Este artilugio basicamente hace lo siguiente:

1º No se cae de las mesas

2º Si dibuja un circulo en el suelo no sale de él (utilizando cinta aisladora negra y siendo el suelo de un color claro)

3º Si se encuentra con un objeto en frente retrocede y lo esquiva

4º Si le pasa la mano por el lomo… este se detiene…(mas que nada para mantenerlo controlado, porque he visto que la nena tiene miedo del ruido que hace y no lo toca si escucha algo)

Basado en un PINGUINO «pequeño» 18f2550 ya que me sobrava y tenia poco espacio dentro… además utilizo varios sensores infrarrojos… y no se asusten los que parecen cartuchos de dinamita son baterias de LIPO (extraídas de una bateria de portátil) poseen un rendimiento inmejorable… puede durar varias horas funcionando el bicho.

El código fuente es:

[sourcecode language=»py»]
/*
Tema: mascota para la niña
Acciones: detector de objetos y diferencias en el terreno, con sensor de apagado en el lomo.
Autor: walterleonardo
Partes: PINGUINO 18f2550, sensores infrarrojos, servo motores modificados

*/

int stopd=74;//punto quieto de servo modificado
int stopi=72;//punto quieto de servo modificado
int adelantei=250;
int adelanted=1;
int atrasi=1;
int atrasd=250;
int topirdata,frontirdata,bottonirdata,topirdatai,frontirdatai,bottonirdatai;
#define topir 15
#define bottonir 14
#define frontir 13
#define izquierdo 0
#define derecho 1

void lectura() //lectora de sensores
{
topirdata=analogRead(topir);
bottonirdata=analogRead(bottonir);
frontirdata=analogRead(frontir);

}

void caida() //accion ante posible caida o modificacion del terreno
{
//detiene marcha
servo.write(izquierdo,stopi);
servo.write(derecho,stopd);
delay(500);
//atras
servo.write(izquierdo,atrasi);
servo.write(derecho,atrasd);
delay(1000);
//gira derecha
servo.write(izquierdo,adelantei);
servo.write(derecho,atrasd);
delay(1000);
//arranca
lectura();
if (bottonirdatai<=bottonirdata-100) caida(); servo.write(izquierdo,adelantei); servo.write(derecho,adelanted); } void atras() //accion ante obstaculo { //detiene marcha servo.write(izquierdo,stopi); servo.write(derecho,stopd); delay(200); //atras servo.write(izquierdo,atrasi); servo.write(derecho,atrasd); delay(500); //gira derecha servo.write(izquierdo,adelantei); servo.write(derecho,atrasd); delay(1000); //arranca lectura(); if (frontirdatai>=frontirdata+50) atras();
servo.write(izquierdo,adelantei);
servo.write(derecho,adelanted);

}

void detiene() //accion de detenerse
{
//detiene marcha
servo.write(izquierdo,stopi);
servo.write(derecho,stopd);
delay(2000);
lectura();
if (topirdatai>=topirdata+50) detiene();
servo.write(izquierdo,adelantei);
servo.write(derecho,adelanted);

}

void setup()
{
Serial.begin(9600); //serial para debug, puede quitarse
//pero deben quitarse todo lo relacionado
servo.attach(0); //servo izquierdo
servo.attach(1); //servo derecho
//leemos los valores y los guardamos en variables iniciales
//para poder comparar y ademas tener un rendimiento optimo
//en todas las condiciones de luz.
//ya que permite medir la diferencia y no solo una medida x
lectura();
topirdatai=topirdata;
bottonirdatai=bottonirdata;
frontirdatai=frontirdata;
}

void loop()
{
//para debug imprimimos los valores en el serial
Serial.printf(«topirdata = %d «, topirdata);
Serial.printf(«bottonirdata = %d «, bottonirdata);
Serial.printf(«frontirdata = %d\r\n», frontirdata);
//verificamos que las diferencias no sean muy grandes
//para asi evitar que este cambiando de direccion con cualquier
//minima variación.
if (topirdatai>=topirdata+50) detiene(); //detiene si detecta diferencias en el sensor superior
if (frontirdatai>=frontirdata+50) atras(); //atras y cambia de sentido si detecta diferencias en el sensor frontal
if (bottonirdatai<=bottonirdata-100) caida(); //atras y cambia de sentido si detecta diferencias en el sensor de terreno
delay(100);
lectura(); //ordena leer nuevamente los sensores
}

[/sourcecode]

Related Posts

4 Comments

  1. walterleonardo

    por lo menos gano unos minutos de libertad… entreteniendo a mi imparable niña… 🙂

  2. slayer

    Grande maestro un ingenio inigualable, me gustaria saber mas de este robotito, yo estoy dando mis primeros pasos con arduino y tenia un pequeño conocimiento de pic en c mpide de microchip, me gustaria intercambiar conocimientos experiencia y amistad jejejej, tienes mas detalles de los sensores y componenetes usados gracias

  3. walterleonardo

    cuando quiera señor… podemos quedar (aunque sea por skype) y tomarnos un cafe… de donde eres?
    que necesitas saber? que tipo de sensores?

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.