Roomba - IR LEDs

7

Ich habe mich gefragt, ob es möglich ist, eine virtuelle DIY-Wand für den iRobot Roomba zu erstellen. Kann mir jemand erklären, wie ich herausfinden würde, wie das funktioniert?

ElectroNoob
quelle

Antworten:

2

Ich habe das vor Jahren gemacht, indem ich einfach das Originalsignal von der Rumba Wall mit meinem digitalen Oszilloskop aufgenommen habe (kann aber kostenlos mit der PC-Audiokarte gemacht werden) und ein wirklich einfaches PIC-Programm geschrieben habe, um dasselbe Signal nur mit einem 38-kHz-Träger wiederzugeben mit NOPs und einigen Zyklen.

Ich baute dann auf einer Protoboard eine einfache Schaltung mit einem PIC12F675, einem Transistor, einer Schmalstrahl-IR-LED und 4xAA-NiMh-Zellen.

30 Minuten Arbeit und ein makelloser Sieg :-)

Ich habe immer noch den Code, aber ich schäme mich wirklich, ihn zu zeigen, es war wirklich ein Codierungshorror: D.

EDIT: Du hast danach gefragt, du hast es bekommen. UND SIE VERSPRECHEN: Kein Kommentar ... es funktioniert einfach. ;-);

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@
Axeman
quelle
Das klingt nach einer Idee. Könnten Sie den Code oder die Signaldaten, die Sie entdeckt haben, weitergeben?
ElectroNoob
Ich glaube, ich habe noch irgendwo den Screenshot des Scopes. Heute Abend werde ich danach suchen und diesen und / oder den Code veröffentlichen. Aber ich möchte nichts über die Schrecken in diesem Programm lesen! :-)
Axeman
1
@ FakeName Grrrrrr .... :-)
Axeman
1
Realistisch gesehen glaube ich tatsächlich, dass es grundsätzlich unmöglich ist, einen schlechten Assembler von einem guten Assembler zu unterscheiden. Daher denke ich nicht, dass jemand hier besonders gestört wird.
Connor Wolf
1
Ich stimme Ihnen fast zu, aber es gibt einige Versammlungslisten, die keine Ausreden haben. wie oben ... :-)
Axeman
10

Das sollte machbar sein. Die virtuelle Wand ist nur ein Leuchtfeuer mit einem IR-Emitter. Wir sprechen darüber:

Geben Sie hier die Bildbeschreibung ein

Es ist also nur eine IR-LED, ein Vorwiderstand und eine Batterie? Höchstwahrscheinlich leider nicht. Das Leuchtfeuer wird wahrscheinlich ein codiertes Signal verwenden, sodass der Roomba es von anderen IR-Quellen unterscheiden kann. Sie müssten wissen, welche IR-Wellenlänge verwendet wird, obwohl 950 nm eine gute Vermutung ist. Dann benötigen Sie eine vorhandene virtuelle Wand, um das Signal mit einer IR-Fotodiode und einem Mikrocontroller aufzuzeichnen. Sobald Sie das Signal haben, kann derselbe Mikrocontroller es über eine IR-LED senden.
Das ist der schlimmste Fall. Wenn sie sich für ein einfacheres Signal entscheiden würden, wäre es wahrscheinlich eine stetige Impulsfolge, wie Fake Name vorschlägt. In diesem Fall können Sie ein Oszilloskop oder den Mikrocontroller verwenden, um Frequenz und Arbeitszyklus zu messen. Auch in diesem Fall ist der Mikrocontroller der einfachste Weg, das Signal zu regenerieren.

Davon sind nicht alle überzeugt. Der Mikrocontroller benötigt jedoch keine einzige externe Komponente, und das erforderliche Programm kann in Minuten geschrieben werden, etwa zu der Zeit, die Sie zur Berechnung der Komponenten für einen 555 AMV benötigen. Genauigkeit: 1%. (Der 1% -Keramikkondensator für einen 555 AMV kostet fast so viel wie der Mikrocontroller.) Und der 555 kann ohne eine weitere Komponente keine Arbeitszyklen von weniger als 50% ausführen. Der Mikrocontroller kann jeden Arbeitszyklus ausführen. Willkommen im 21. Jahrhundert.

Sie benötigen einige Kenntnisse in der Programmierung von Mikrocontrollern. Der Rest sind nur ein paar optoelektronische Komponenten wie die LED und die Fotodiode. Und natürlich müssen Sie sich eine kommerzielle virtuelle Wand ausleihen.

stevenvh
quelle
Ich bezweifle, dass sie eine echte Modulation machen, ich würde wetten, dass es nur ein einfacher Träger ist. Wenn Sie eine tatsächliche virtuelle Wand für den Einzelhandel haben, verwenden Sie eine Fotodiode, um das Signal mit einem Oszilloskop zu schnüffeln (oder es auseinanderzunehmen und die Einbauten direkt zu prüfen).
Connor Wolf
2
Also in that case the microcontroller is the simplest way to regenerate the signal. Was ? Der einfachste Weg, ein Signal mit fester Frequenz zu erzeugen, ist ein astabiler Hardware-Oszillator wie der übliche 555. Eine MCU ist ein WAY-Overkill und würde Bündel von Softwarekomplexität mit sich bringen. Grundsätzlich dauert es 20 Minuten, bis eine Perf-Platine zusammengelötet ist, und daraus wird ein mehrstündiges Unterfangen.
Connor Wolf
4
@Fake - Mit einem Mikrocontroller wird genau 1 (eine) Komponente benötigt, und Sie haben eine Rechteckwelle mit einer Genauigkeit von 1% bei jedem gewünschten Arbeitszyklus.
Stevenvh
1
@stevenvh Wie du gesagt hast : For someone who's acquainted with the microcontroller. Ansonsten dauert es Stunden und Stunden, bis man in die Macken der Plattform gerät, nach Errata sucht und so weiter. Natürlich gibt es die benötigte Unterstützungsschaltung und einen Programmierer. Ein einfacher Timer hat eine breite Eingangsspannung, während ein Mikrocontroller normalerweise einen 5-V- oder 3,3-V-Eingang benötigt, was mit sich selbst eine größere Komplexität wie Spannungsregler usw. mit sich bringt.
AndrejaKo
3
Übrigens: Roomba kann zwischen einer virtuellen Wand und ihrer Dockingstation unterscheiden, was bedeutet, dass in der Impulsfolge Daten enthalten sind.
Jippie