Hallo,
wie versprochen nun das HowTo von mir…
Was wird beschrieben?
Beschrieben wird der Bau eines Xbee Moduls was ständig von Roomba mit Strom versorgt wird und AUSSEN an den Roomba angebracht wird.
Vorteil
Garantie bleibt erhalten, da wir den offiziellen Roomba Interface Port nutzen und nix am Roomba verändern.
Nachteil
Roomba könnte nun unter umständen nichtmehr überall drunter passen. Bei mir allerdings passt er nach wie vor unter die Heizung und unters Bett, also genau wie vorher.
Bauteile
1MINI-DIN-Stecker, 7-polig (Reichelt)
1DC/DC - Wandler R-783.3-1.0 SIP3 (Conrad)
2Xbee Modul (eService-online oder 1-wire.de)
1Xbee zu USB Modul (eService-online oder 1-wire.de)
1Gehäuse (z.b. Reichelt SP 2044 SW)
1Kondensator 10µF ( laut Datenblatt des DC/DC Wandler optional!)
1*Widerstand 2k
Bevor du lötest
müssen deine Xbee´s konfiguriert werden… D.h. ein Xbee wird mit dem USB Adapter die „Basis“ spielen das andere wird verbaut und ist der „Client“ für den Roomba… dazu muss jedoch jedes Xbee einmal in den USB Adapter gesteckt und konfiguriert werden. Wie du das machst und anschließend dein Xbee („Basis“) auch gleich in IPS einbindest kannst du in diesem tollen Tutorial nachlesen: hier entlang bitte (ich bin bei den Device ID´s der Anleitung geblieben! Also hat das Xbee am Roomba die ID 13… das ist für das verständnis der späteren Befehle im IPS wichtig! Wichtig ist weiterhin das die Xbees mit 19200baud senden und empfangen! NUR das funktioniert!)
Nun ans Löten
Nimm dir den untenstehenden Schaltplan und löte einfach alles zusammen. Die Pins habe ich alle mit nem Stück Schrumpfschlauch gesichert… man weiss ja nie… Mit nem heißen Schraubenzieher nen Schlitz in das Gehäuse gebrannt, alles drin verfrachten, Gehäuse zuschrauben. Kabel nach Bild an Stecker löten.
Da die Stecker ziemlich groß, also dann nach oben hin abstehend sind, habe ich die schwarze Hülle weggelassen und die beiden Metallhälften mit je zwei Punkten Sekundenkleber fixiert. Anschließend habe ich den innenraum zur Sicherheit mit Montagekleber ausgedrückt und mit einem nassen Finger geglättet.
Die Hochzeit
Als nächstes entfernst du die obere Abdeckung des Roomba… Dazu den Kehrbehälter entfernen und die oberste Roomba schicht nach oben drücken (ja die sitzt sehr fest, hatte auch Angst was abzubrechen)
Nun wird die InterfaceSchnittstelle sichtbar. Hier kannst du nun dein selbstgebautes XbeeInterface anstecken. Wenn du willst kannst du ja für die Optik ein Loch in die oberste Abdeckung bringen und schwupp die wupp siehts dann wieder besser aus ;o) weil Sie wieder passt…
Roomba konfigurieren
Im Rohzustand kann dein Roomba noch nicht mit dem Xbee reden weil beide auf 19200baud eingestellt sein müssen. Dein Xbee sollte das mittlerweile sein ;o) Bei deinem Roomba sieht das noch anders aus. Schalte den Roomba mit einem drücken auf clean einfach ein. Als nächstes halte die Cleantaste gedrückt… Roomba schaltet sich aus und nach ca 10sec. ertönt ein Signal. Wenn das Signal fertig ist mit abspielen, Taste loslassen und nochmal kurz drücken um Roomba wieder einzuschalten. Fertig…
IPS und Roomba
Wie Ihr euer XBee Modul unter IPS einrichtet sollte klar sein. Nun wollen wir aber auch das IPS mit Roomba kommuniziert.
Was Ihr alles an Variablen und Scripten anlegen müsst entnehmt Ihr dem Bild unten.
Als erstes gibt es da die RegisterVariable… diese bekommt ein Script zugeordnet… (im Bild ist das „test“) mit folgendem Inhalt
<?
SetValueString(57727 /*[Roomba\.Roomba Info\XBee.RX]*/ ,$IPS_VALUE );
?>
Script Roomba Info
hier müssen sämtliche IPS Variablen an euer System angepasst werden…
<?
//Daten als dez-String auslesen
$instr=GetValueString("XBee.RX");
$datenstr="";
for($i=0; $i<strlen($instr); $i++) {
$datenstr.=strtoupper(ord($instr{$i}))." ";
}
SetValueString("XBee.Daten",$datenstr); //String ausgeben
//String auflösen und prüfen der Daten
$Byte="";
$Byte = explode(" ",$datenstr);
//=========================================================================
//Anzeige Charging State
$ChargingState = $Byte[16];
switch ($ChargingState) {
case 0:
SetValueInteger(47126 /*[Roomba\Ladestatus]*/ , 0);
break;
case 1:
SetValueInteger(47126 /*[Roomba\Ladestatus]*/ , 1);
break;
case 2:
SetValueInteger(47126 /*[Roomba\Ladestatus]*/ , 2);
break;
case 3:
SetValueInteger(47126 /*[Roomba\Ladestatus]*/ , 3);
break;
case 4:
SetValueInteger(47126 /*[Roomba\Ladestatus]*/ , 4);
break;
case 5:
SetValueInteger(47126 /*[Roomba\Ladestatus]*/ , 5);
break;
}
//Anzeige Charging Source
$ChargingSource = $Byte[39];
switch ($ChargingSource) {
case 0:
SetValueInteger(31048 /*[Roomba\Mode]*/ , 0);
break;
case 1:
SetValueInteger(31048 /*[Roomba\Mode]*/ , 1);
break;
case 2:
SetValueInteger(31048 /*[Roomba\Mode]*/ , 2);
break;
}
//Berechnung der Batteriespannung
$BatteryVoltage = ($Byte[18])+($Byte[17]*256);
$BatteryVoltage=$BatteryVoltage / 1000;
$BatteryVoltage = round($BatteryVoltage,1);
SetValueFloat(25663 /*[Roomba\Akkuspannung]*/ , $BatteryVoltage);
//Berechnung des Stroms aus Akku
$BatteryCurrent = ($Byte[20])+($Byte[19]*256);
if ($BatteryCurrent >= 32768 /*[Objekt #32768 existiert nicht]*/) {
$BatteryCurrent = $BatteryCurrent - 65536;
}
SetValueInteger("BatteryCurrent", $BatteryCurrent);
//Berechnung der Restbatteriekapazität
$BatteryCharge = ($Byte[23])+($Byte[22]*256);
SetValueInteger("BatteryCharge", $BatteryCharge);
//Berechnung der Batteriekapazität
$BatteryCapacity = ($Byte[25])+($Byte[24]*256);
SetValueInteger("BatteryCapacity", $BatteryCapacity);
//Berechnung der Restbatteriekapazität in %
$BatteryChargePercent = $BatteryCharge / $BatteryCapacity * 100;
$BatteryChargePercent = round($BatteryChargePercent,0);
SetValueFloat(46523 /*[Roomba\Akkustatus]*/ , $BatteryChargePercent);
//Berechnung der Batterietemperatur
$BatteryTemperature = ($Byte[21])+($Byte[21]*0);
SetValueInteger(46709 /*[Roomba\Akku Temperatur]*/ , $BatteryTemperature);
?>
getriggert wird dieses script über die Aktualisierung der Variable „Xbee.RX“
Script auslesen
hier werden die 80kb Daten vom Roomba befohlen… Roomba sendet dann und der Inhalt landet in der Registervariable und das zugeordnete Script schiebt den Inhalt dann in Xbee.RX diese Aktualieiserung startet dann Script „Roomba Info“
<?
$ID=27283 /*[XBee Gateway]*/ ;
XBee_SendBuffer($ID,13, chr(128)); //Start Command
XBee_SendBuffer($ID,13, chr(149)); //Opcode 149
XBee_SendBuffer($ID,13, chr(1)); //Number of packets
XBee_SendBuffer($ID,13, chr(100)); //Packet ID 100
?>
dieses wird jede Minute gestartet…
Script Clean
setzt Roomba einfach in den Cleanmodus
<?
$ID=27283 /*[XBee Gateway]*/ ;
XBee_SendBuffer($ID,13, chr(128)); //Start Command
XBee_SendBuffer($ID,13, chr(135));
?>
Script Dock
setzt Roomba in den Dock Modus
<?
$ID=27283 /*[XBee Gateway]*/ ;
XBee_SendBuffer($ID,13, chr(128)); //Start Command
XBee_SendBuffer($ID,13, chr(143)); //Opcode 149
?>
Script Wartung
lässt Roomba langsam von der Basis rückwärts fahren und bleibt stehen.
<?
$ID=27283 /*[XBee Gateway]*/ ;
XBee_SendBuffer($ID,13, chr(128)); //Start Command
sleep(1);
XBee_SendBuffer($ID,13, chr(131)); //Start Command
sleep(1);
XBee_SendBuffer($ID,13, chr(145).chr(255).chr(206).chr(255).chr(206)); //Opcode 149
sleep(4);
XBee_SendBuffer($ID,13, chr(145).chr(0).chr(0).chr(0).chr(0)); //Opcode 149
XBee_SendBuffer($ID,13, chr(128)); //Start Command
sleep(1);
?>
So im großen und ganzen ist das das Handwerkszeug um dann weiter zu spielen ;o)
Sooo dann hoffe ich das ich nix vergessen ahbe und alles klappt. Rein rechtlich übernehme ich nix für nix!