Roomba - LED IR

Me preguntaba si era posible crear una pared virtual de bricolaje para el iRobot roomba. ¿Alguien puede explicar cómo haría para averiguar cómo funciona esto?

Respuestas (2)

Lo hice hace años simplemente capturando la señal original del Rumba Wall con mi osciloscopio digital (pero se puede hacer de forma gratuita con la tarjeta de audio de la PC) y escribiendo un programa PIC realmente simple para reproducir la misma señal con una portadora de 38Khz. utilizando NOP y algunos ciclos.

Luego construí en una placa prototipo un circuito simple con un PIC12F675, un transistor, un LED IR de haz estrecho y 4 celdas AA NiMh.

30 minutos de trabajo y una victoria impecable :-)

Todavía tengo el código, pero me da mucha vergüenza mostrarlo, realmente fue un horror de codificación: D

EDITAR: Lo pediste, lo tienes. Y USTED PROMETIÓ: Sin comentarios... simplemente funciona. ;-)

list    p=12F629
    radix   dec
    include "p12f629.inc"
    __CONFIG    _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT  ;Internal osc.
d1      equ     20h 
d2      equ     21h
d3      equ     22h
d4      equ     23h
d5      equ     24h
d6      equ 25h
fileA       equ 26h ;delay fileA
fileB       equ 27h ;delay fileB
filec       equ 28h ;delay fileC
pin7        equ 0   ;GP0  
pin6        equ 1   ;GP1
pin5        equ 2   ;GP2
pin4        equ 3   ;GP3 
pin3        equ 4   ;GP4 
pin2        equ 5   ;GP5 

Start   org 0x0000
    nop
    nop
    nop
    nop         
    nop
    nop
SetUp   bsf STATUS, RP0     ;Bank 1
    movlw   b'10000110' 
    movwf   OPTION_REG
    movlw   b'00000000' 
    movwf   TRISIO
    call    0x3ff       
    movwf   OSCCAL  
    bcf STATUS, RP0 ;bank 0
    clrf    GPIO        
    goto    Main        
delay_1s
    movlw    0x07
    movwf    d1
    movlw    0x2F   
    movwf    d2
    movlw    0x01
    movwf    d3
Delay_0
    decfsz   d1, f
    goto     $+2
    decfsz   d2, f
    goto     $+2
    decfsz   d3, f
    goto    Delay_0
    goto    $+1
    goto    $+1
    goto    $+1
    return
do_pulse
    movlw   b'11111111' 
    movwf   GPIO
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    movlw   b'00000000' 
    movwf   GPIO
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    return
do_not_pulse
    movlw   b'00000000' 
    movwf   GPIO
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    movlw   b'00000000' 
    movwf   GPIO
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    nop 
    return
Do_1
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    call do_pulse
    return
Do_0
    call do_not_pulse
    call do_not_pulse   
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    call do_not_pulse
    return
Main
    call Do_1
    call Do_1   
    call Do_1
    call Do_0
    call Do_1
    call Do_0
    call Do_0
    call Do_0

    call Do_1
    call Do_1   
    call Do_1
    call Do_0
    call Do_1
    call Do_0
    call Do_0
    call Do_0

    call Do_1
    call Do_0
    call Do_0
    call Do_0

    call Do_1
    call Do_0
    call Do_0
    call Do_0

    call Do_1
    call Do_1   
    call Do_1
    call Do_0
    call Do_1
    call Do_0
    call Do_0
    call Do_0

    call delay_1s

    goto Main

    end@
Esto suena idea. ¿Serías capaz de compartir el código o los datos de la señal que descubriste?
Creo que todavía tengo en alguna parte la captura de pantalla del alcance, esta noche la buscaré y publicaré eso y/o el código. ¡Pero no quiero leer NADA sobre los horrores en ese programa! :-)
Axeman, eso sería muy apreciado.
Aquí es. No puedo encontrar la captura de pantalla original, pero puedo hacer una nueva mañana si la necesitas.
OH GEEZ EL HORROR (tal vez).
@NombreFalso Grrrrrr.... :-)
Siendo realistas, en realidad creo que es fundamentalmente imposible distinguir un mal ensamblador de un buen ensamblador. Como tal, no creo que nadie aquí esté particularmente molesto.
Casi estoy de acuerdo contigo, pero hay algunos listados de montaje que no tienen excusas. como el de arriba... :-)

Eso debería ser factible. La pared virtual es solo una baliza que utiliza un emisor de infrarrojos. Estamos hablando de esto:

ingrese la descripción de la imagen aquí

Entonces, ¿es solo un LED IR, una resistencia en serie y una batería? Lo más probable es que no, por desgracia. La baliza probablemente utilizará una señal codificada, por lo que Roomba puede diferenciarla de otras fuentes de infrarrojos. Tendría que saber qué longitud de onda IR usa, aunque 950nm es una buena suposición. Luego, necesita un Virtual Wall existente para registrar su señal con un fotodiodo IR y un microcontrolador. Una vez que tenga la señal, ese mismo microcontrolador puede enviarla a través de un LED IR.
Ese es el peor de los casos. Si eligieran una señal más simple, probablemente sería un tren de pulso constante, como sugiere Fake Name . En ese caso, puede usar un osciloscopio o el microcontrolador para medir la frecuencia y el ciclo de trabajo. También en ese caso, el microcontrolador es la forma más sencilla de regenerar la señal.

No todos están convencidos de esto. Sin embargo, el microcontrolador no necesita un solo componente externo y el programa requerido se puede escribir en minutos, aproximadamente el tiempo que necesita para calcular los componentes para un 555 AMV. Precisión: 1%. (El condensador cerámico al 1 % para un AMV 555 cuesta casi tanto como el microcontrolador). Y el 555 no puede realizar ciclos de trabajo inferiores al 50 % sin otro componente más. El microcontrolador puede hacer cualquier ciclo de trabajo. Bienvenido al siglo XXI.

Necesitarás algunos conocimientos de programación de microcontroladores. El resto son solo un par de componentes optoelectrónicos, como el LED y el fotodiodo. Y, por supuesto, tendrás que pedir prestado un Virtual Wall comercial.

Dudo que hagan alguna modulación real, apostaría a que es solo un portador simple. Si tiene una pared virtual minorista real, use un fotodiodo para detectar la señal (o desmóntela y pruebe las partes internas directamente) con un osciloscopio.
@ElectroNoob: ¿Roomba puede diferenciar las diferentes paredes o todas se comportan de la misma manera? ¿Hay una "dirección de pared" o algo así?
Also in that case the microcontroller is the simplest way to regenerate the signal. ¿Qué ? La forma más fácil de generar una señal de frecuencia fija es un oscilador astable de hardware, como el 555 común. Una MCU es MUY exagerada y arrastraría paquetes de complejidad de software. Básicamente, se necesita algo que tomaría 20 minutos para soldar en una placa perforada y lo convierte en una tarea de varias horas.
@Fake: al usar un microcontrolador , se necesita exactamente 1 (un) componente, y tiene una onda rectangular con una precisión del 1% en cualquier ciclo de trabajo que desee.
@Fake: crear una señal como esta es solo configurar un registro de temporizador. Para alguien que esté familiarizado con el microcontrolador, eso es menos de 10 minutos, tal vez 5, no horas. Y absolutamente no "paquetes de complejidad de software". Estamos en 2012, no en 1912, cuando la gente pensaba que el 555 era la solución a todos los problemas del mundo.
@stevenvh Como dijiste: For someone who's acquainted with the microcontroller. De lo contrario, son horas y horas de profundizar en las peculiaridades de la plataforma, buscar erratas, etc. Por supuesto, está el circuito de soporte necesario y un programador. Un temporizador simple tiene un voltaje de entrada amplio, mientras que un microcontrolador generalmente requerirá una entrada de 5 V o 3,3 V, lo que en sí trae más complejidad, como un regulador de voltaje, etc.
@AndrejaKo - ¿Es un suministro de 5V diferente de un suministro de 15V? Tengo verrugas de pared aquí 5V/2A que probablemente sean más baratas que el transformador que usaría para una fuente de alimentación de 15V. Si también usa una verruga de pared, entonces estamos hablando de lo mismo, por lo que no es un argumento.
@stevenvh Estaba pensando principalmente en verrugas de pared y baterías cuando mencioné el poder.
@FakeName, tiene un punto, ¿por qué no escribir una respuesta que muestre cómo hacer un oscilador analógico para esa señal y, aún mejor, muestre cómo agregar un fotodiodo para que se sincronice con el roomba? Suena como 2 excelentes respuestas a esta pregunta en lugar de 2. Admito que un arduino es una forma bastante ridícula de hacer esto, tiene un comando para encender el PWM y es quizás 1 (2?) Línea(s?) de código que escribiría.
@AndrejaKo: las baterías son mejores para 3.3V que para 12V o 15V, y el circuito no necesitaría un regulador de voltaje (la frecuencia 555 no cambia con el voltaje. No lo sé). Si estamos hablando de una verruga de pared (las baterías pueden no durar mucho debido al LED), su argumento no cuenta.
Sh, solo por diversión, los microcontroladores estaban disponibles ~ 2 décadas antes del siglo XXI [Uno puede discutir sobre la definición exacta del término]. 555 puede hacer casi cualquier ciclo de trabajo que uno quiera "con un poco de cuidado" y quizás unos pocos centavos de partes adhesivas. Todo el mundo tiene razón (o no) aquí. FWIW: Comenzaría con un CD40106 [inversor Schmitt hexadecimal] y progresaría a un procesador si fuera necesario. Los 555 son demasiado limitantes :-).
Estuve midiendo uno de mis muros virtuales hace un tiempo y definitivamente envía cuadros con datos. La mayoría de los marcos parecen idénticos, algunos son diferentes. No sé si envía una identificación única o similar, pero no es una simple onda cuadrada. Nunca pude ver en detalle el flujo de bits, pero está en mi lista de deseos.
Por cierto: Roomba puede diferenciar entre una pared virtual y su estación de acoplamiento, lo que implica que hay algún tipo de datos contenidos en el tren de pulsos.
El microcontrolador suena bien. Me gustaría probar y hacer un prototipo de esto usando un arduino. No estoy seguro de cómo puedo aplicar ingeniería inversa a las señales IR sin algún equipo costoso (osciloscopio elegante). Gracias a todos por los consejos hasta ahora.