Mando Ir Roomba

Hola.

Antes de nada felicidades por esta web mediante la cual conocí a Arduino, estoy encantado con el, soy aficionado a la electrónica, no se mucho pero me gusta cacharrera hasta que lo rompo jejejeje.

El caso es que me compre una de esas aspiradoras que van solas por casa, que cuando vuelves de tomarte una cañita te la encuentra cargando y la casa limpia :slight_smile: , La cuestión es que a raíz de ver la aspiradora por casa me empezó a picar la curiosidad de los robots y mirando y mirando termine con un arduino en casa.

Después de mucho mirar cual seria mi primer proyecto decidí que fuera un mando para la Roomba (La juani para mi mujer) esa aspiradora que comente al principio, mire por la web y encontré un proyecto en la web de Zakyfiles de como hacer uno con un pic16f84 en Picbasic, mire el código que me resulto fácil ya que se un poco de Basic y lo aplique a arduino, con el cual estoy muy verde ya que yo de C no se na de na jeje.

Lo que hago es enviar pulsos por las patilla 13 de arduino ya que así no tengo que andar poniendo la resistencia al diodo.

Los tiempos están sacados y adaptados según vi en la aspiradora, a fuerza de prueba y error ya que no entendí muy bien como cojo y transforma los tiempos para el envío, el utiliza en el pic un cristal de 4MHZ y yo utilizo el de 16MHZ que trae arduino, supongo que eso tendrá algo que ver?.

Bueno después de esta paliza os pongo el código haber si me decís por que no va fino del todo el mando, ya que si que enciende la maquina pero no reconoce bien del todo cada código.

// Mando IR Roomba 5xx.

int outPin = 13;

void setup()
{
pinMode(outPin, OUTPUT); // establece el pin digital como salida

}

void envia1(){ // ENVIA 1 AL PIN 13

for (byte i=0;i<114;i++){
digitalWrite(outPin, HIGH);
delayMicroseconds(16);
digitalWrite(outPin, LOW);
delayMicroseconds(3);
}

digitalWrite(outPin, LOW);
delay(1);
}

void envia0(){ // ENVIA 0 AL PIN 13

for (byte i=0;i<38;i++){
digitalWrite(outPin, HIGH);
delayMicroseconds(16);
digitalWrite(outPin, LOW);
delayMicroseconds(3);
}

digitalWrite(outPin, LOW);
delay(3);
}

void loop(){

if (digitalRead(8) == HIGH){ // envia el comando Cleaner al activar el pulsador entrada 8

envia1();
envia0();
envia0();
envia0();
envia1();
envia0();
envia0();
envia0();

delay(32);
}

else if (digitalRead(7) == HIGH){ // envia el comando Spot al activar el pulsador entrada 7

envia1();
envia0();
envia0();
envia0();
envia0();
envia1();
envia0();
envia0();

delay(32);
}

}

Un saludo y Gracias por todo.

Hola a todos,

Clockk, yo empecé como tú, intenté hacer un mando para la roomba con un PIC y ahora me he enganchado a Arduino, mi primer proyecto con Arduino fue el del mando, pero como no me funcionaba he decidido estancarlo y seguir haciendo pruebas para más adelante continuar con el mando y de paso unas paredes virtuales.

Yo intenté hacerlo con la función tone(pin,frecuencia), le ponía tone(pin,38000) y lo encendía y lo apagaba 3 milisegundos y 1 milisegundo para mandar los comandos. ¿Sabe alguien si esto es correcto?

En cuanto tenga un rato probare tu código. Puede que no te vaya del todo fino por el calculo de los microsegundos, son especulaciones mías pero en ejecutar las instrucciones de encendido y apagado creo que también debe consumir algo de tiempo.

Saludos y gracias

Arduino es muy muy muy lento cambiando la tensión de los pines con la instrucción digitalWrite, para afinar más en los tiempos os aconsejo que le echéis un vistazo a esta página: http://www.instructables.com/id/Arduino-is-Slow-and-how-to-fix-it/

Programándolo a ojo y sin medir tiempos, ya puedes dar gracias de que te funcione el encender/apagar, jejeje. Lo ideal sería hacerlo con un osciloscopio/analizador lógico para así saber la duración real de los pulsos.

Por cierto, el led debe llevar resistencia, ya que ningún pin del Arduino lleva resistencia a la salida.

Un saludo y bienvenidos a los dos

Hola y gracias por responder.

Vic20 la roomba es genial jejejeje.

Los cálculos de tiempo están sacados del programa que zaky puso en su foro solo que con los tiempos de zaky no funcionaba del todo bien y fui subiendo y bajando, la variación es poquísima pero así funciona mejor, yo pregunto si el cristal de cuarzo no tiene nada que ver, soy neófito en todo esto y no se muy bien de que estoy hablando jejejeje.

Mi osciloscopio es comprado en china por 20? y no tiene ni para calibrar la pinza, bueno en realidad no tiene pinza si no un cable que le puse jejejeje y me marca mal los tiempos estamos pensando en pedir uno para el cumpleaños.

Voy a mirar el link que nos puso chiva y comento resultados.

Un saludo.

Para empezar si no quieres gastarte cientos de euros, mira osciloscopios analógicos de segunda mano, de marcas como por ejemplo Hameg o Tektronix, que te pueden salir por esos 20? o menos, hay gente que hasta ha regalado los suyos, mira por foros y tal.

El cristal de cuarzo tiene que ver, ya que marca el ritmo de ejecución, pero de un micro a otro no están relacionados, es decir, que 4MHz del pic a 4MHz del Arduino, probablemente no saque los mismos tiempos (igual da la casualidad de que coincide, pero es casi imposible).

Un saludo

Hola

Chiva en ebay he visto uno llamado ARM DSO Nano - Pocket-Sized Digital Oscilloscope, que parecen un MP4, ¿sabes si funcionan? o sigo contando los microsegundos a ojo. :)

Gracias

El dso nano es la peor inversión que puedes hacer en un osciloscopio, sólo acepta ondas de hasta 1MHz y con eso medirás con bastantes problemas, si tienes suerte, 1 microsegundo, por lo que imagínate para cosas un poco mas avanzadas...

Todo lo que no sea un osciloscopio como dios manda, ya sea analógico (Tektronix,Hameg,etc) o digital (Rigol,Tektronix,etc) es tirar el dinero. Lo recomendable es tener al menos un ancho de banda de 20Mhz (analógico o digital) para que te dure algo de tiempo, y si puede ser de 50MHz sería lo mejor.

Por eso te recomiendo los analógicos de segunda mano, están muy baratos, aunque las condiciones en las que pueden estar no pueden ser las mejores.

Probablemente habrás visto también los osciloscopios para PC, pero por el dinero que cuestan, por poco más (o incluso por mucho menos) te compras uno nuevo digital mucho mejor que ese.

Si sabes inglés te recomiendo que te pases por el blog de David Jones, es un ingeniero electrónico australiano y en uno de sus videos habla precisamente del DSO Nano y los osciloscopios: http://www.eevblog.com/2010/05/11/eevblog-86-buy-a-real-analog-oscilloscope-please/

Un saludo ;)

Chiva gracias por la aclaración.

Saludos.