Eine Arduino-Virtual-Wall für den IRobot Roomba

Einige unserer Türschwellen sind nicht voll Roomba-kompatibel. Der Staubsauger fährt in einer Richtung hinüber, kommt aber nicht wieder zurück weil sich dort ein etwas steilerer Absatz befindet der den Bumper auslöst. Die Schwelle wirkt sozusagen als Roomba-Ventil. Da bleibt einem nur die Türen geschlossen zu halten oder der Bau einer (virtuellen) Wand.

Eine virtuelle Wand ist ein einfaches Infrarot-Signal, dass dem Roomba mitteilt, dass es an dieser Stelle nicht weiter geht. Er verhält sich dann so als würde er an einer Hardware-Wand entlang fahren.

Benötigte Bauteile

Virtuellen Wände kann man natürlich käuflich erwerben (zum Beispiel drüben bei Amazon). Ich hatte die benötigten Teile für eine Arduino-Virtual-Wall in meiner Bastelkiste rumliegen, also habe ich mir mal so eine Wand selbst gebaut. Folgende Teile habe ich für den Prototyp verwendet:

  • 1 Arduino (hier Arduino Nano)
  • 1 Infrarot LED (hier TSAL5100)
  • 1 Widerstand (hier 39 Ohm)

Alles in allem kosten diese Bauteile so ca. 5 Euro.

Die TSAL5100 Infrarot-LED hat seine Peak-Wellenlänge bei 940 nm. Das scheint für den Roomba optimal zu passen. Der Abstrahlwinkel beträgt ± 10 Grad. Gefühlt scheint mir das etwas viel zu sein. In einem Abstand von 3 Metern hat der “Strahl” bei 20 Grad Abstrahlwinkel schon einen Durchmesser von gut einem Meter. Entsprechend abgeschwächt ist das Signal, das beim Roomba ankommt. Trotzdem erkennt er das Signal bei dieser Entfernung noch sicher.

Schaltplan

Naja, einen Schaltplan benötigt man für meine Virtual Wall eingetlich nicht. Ich habe trotzdem mal schnell einen gezeichnet. Meine Virtual Wall soll die Arduino-IRremote Library verwenden. Diese Library verwendet standardmäßig den Pin D3 des Arduino. Von D3 führt der Weg also über den Vorwiderstand (39 Ohm) weiter zur IR-LED und zurück zu einem der GND-Pins des Arduino.

Software

Die Software muss wie auch bei “normalen” Fernbedienungen ein 38kHz Träger-Signal erzeugen. Dieses Signal wird mit 1kHz moduliert. Das heißt die 38kHz Pulse werden in jeder Millisekunde ein- bzw. ausgeschaltet. Das ist mit dem Arduino leicht zu realisieren. Noch einfacher geht es mit der Arduino-IRremote-Library:


#include <IRremote.h>

IRsend irsend; // IRemote initialisieren (Pin 3)

void setup()
{ irsend.enableIROut(38); // 38 kHz Träger
}

void loop()
{ irsend.mark(1000); // 1 ms Mark
  irsend.space(1000); // 1 ms Space
}

Und hier noch kurz ein Zeitraffer-Video der virtuellen Wand im Einsatz: Die IR-LED befindet sich links etwa in der Mitte. Ich hatte die Schaltung etwas mit dem Gel-Akku abgeschirmt, damit der Roomba sie nicht überfährt. Der Infrarot-Strahl zeigt in Richtung untere rechte Ecke des Videos. Die Entfernung zwischen LED und gegenüber liegender Wand beträgt gut 3 Meter.

Nun muss das Ganze nur noch zusammen gelötet und in einem kleinen Gehäuse verstaut werden. Der IR-Empfänger sitzt vorn oben auf dem Gehäuse des Roomba. Deshalb darf die IR-LED nicht zu tief aufgestellt werden. Ansonsten schattet der Roomba selbst das Signal ab, wenn er dicht an der Virtual Wall vorbei fährt.

Werbung:

Siehe auch:

Weblinks


9 comments to Eine Arduino-Virtual-Wall für den IRobot Roomba

  • Erkan

    Das ist eine sehr beeindruckende Lösung. Ich habe früher auch immer gerne elektronische Schaltungen gebastelt aber auf die Idee wäre ich nicht gekommen. Das Video zeigt, dass es funktioniert, ein tolles Beispiel. Ich hab mir die Anleitung auf Englisch auch angesehen, aber die haben leider kein Video dazu gedreht und da ist der Text auch viel zu lang. Der Artikel hier hat die richtige Länge.

  • Martin

    Meine Mathematik ist schon etwas eingerostet. Wie kommst du von dem Abstrahlwinkel auf den Durchmesser des abgestrahlten Lichtkegels?

    • Ja, das mit der eingerosteten Mathe kenne ich aus eigener Erfahrung ;-)

      Wenn man sich zu dem Problem eine Skizze macht, dann erkennt man, dass sich vom Zentrum des Kegels zur Außenseite ein rechtwinkliges Dreieck ergibt. Der Rand des Lichtkegels entspricht der Hypotenuse, die Katheten sind der Abstand zur LED und der halbe Durchmesser des Lichtkegels.

      Im rechtwinkligen Dreieck gilt:

      tan(alpha) = Gegenkathete / Ankathete

      Ich nenne den Abstrahlwinkel hier mal “alpha” und den Abstand zur LED (Ankathete) “a”. Den Durchmesser des Strahls im Abstand a (also die Gegenkathete zum Winkel alpha) nenne ich “h”.

      tan(alpha) = h / a

      h = tan(alpha) * a

      10 Grad in Bogenmaß umrechnen…

      10 * (pi/180) = 0.1745 (grundet)

      und dann ausrechnen …

      h = tan(0.1745) * 300 cm = 53 cm (ebenfalls gerundet).

      Die Gegenkathete des rechtwinkligen Dreiecks beschreibt nur den halben Durchmesser des Lichtkegels, also …

      2 * 53 cm = 106 cm

  • Lukas

    warum bekomme ich mit dem oben stehenden code folgrnde Fehlermedungen?

    Arduino: 1.6.9 (Mac OS X), Board: “Arduino Nano, ATmega328″

    roomba:3: error: ‘IRsend’ does not name a type
    IRsend irsend; // IRemote initialisieren (Pin 3)
    ^
    /Users/lukas/Documents/Arduino/roomba/roomba.ino: In function ‘void setup()’:
    roomba:6: error: ‘irsend’ was not declared in this scope
    { irsend.enableIROut(38); // 38 kHz Träger
    ^
    /Users/lukas/Documents/Arduino/roomba/roomba.ino: In function ‘void loop()’:
    roomba:10: error: ‘irsend’ was not declared in this scope
    { irsend.mark(1000); // 1 ms Mark
    ^
    exit status 1
    ‘IRsend’ does not name a type

    Dieser Bericht wäre detaillierter, wenn die Option
    “Ausführliche Ausgabe während der Kompilierung”
    in Datei -> Voreinstellungen aktiviert wäre.

    Ich nutze das erste mal einen Arduino, bin also ganz “hilflos”

    Vielen Dank für eure Hilfe!

  • Lukas

    Vielen Dank Heiner,

    jetzt klappt es!

    Muss mur noch rausfinden warum meine ir-led nichts tut.
    Da es die Tsal5100 nicht mehr gibt habe ich die osram SFH 4346 genommen.
    Abgesehen vom Abstrahlwinkel hat sie die gleichen Werte, aber sie sendet nicht.

    • Hast Du die LED richtig rum drin? Richtiger Vorwiederstand?

      Mit den meisten Digitalkameras kann man sehen, ob die LED tatsächlich nicht leuchtet. Die nehmen meist auch einen Teil des infraroten Lichts mit auf. Man kann vorher testen, ob die eigene Kamera geeignet ist, indem man sich die LED einer Fernbedienung in der Vorschau der Kamera ansieht.

  • Lukas

    Ja richtig rum und mit handcam gesehen dass da nix passiert.
    Vorwiderstand hab ich auch 39 Ohm genommen.

    • Hmm, da fällt mir erst mal nix ein. Evtl. irgendein Flüchtigkeitsfehler oder ein Defekt der LED. Teste doch mal, ob Dein Aufbau funktioniert, wenn Du ihn mit dem Blink-Beispiel (an Pin 13) ansteuerst.

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>