IRobot Roomba an IPS

Verdammt, jetzt bringt ihr mich doch glatt dazu, auch so ein Teil haben zu wollen. Wehe wenn es eine IPS-Implementierung gibt, dann weiß ich schon, wer demnächst unterm Einbauschrank als „Untermieter“ hier einzieht…
:rolleyes:

Eine Höhle und ein Feuer davor wären manchmal eigentlich auch eine ganz nette Behausung. Da gibt es zumindest keine Softwarebugs, nur echte.

Hallo Thomas,

habe gerade die Mail erhalten, dass der Scooba rausgeschickt wurde. War wohl nichts mit „lieferbar“. Am Freitag sind glaube ich alle von Klein & More beliefert worden.

Na da bin ich mal gespannt, ob der Scooba wirklich so unerträglich laut ist (Ich werde ihn sowieso nur starten, wenn ich mit dem Hund draußen bin.

Ich wünsche einen schönen Tag.

Christoph.

Na dann brauchste aber unbedingt einen Saugroboter, was meinst Du was es in so eine Höhle dreckig ist?

Ich wünsche einen schönen Tag.

Christoph.

Hallo Christoph,

diese Mail hab ich heute auch bekommen. Hoffe das morgen schon die Post klingelt. Werde meine ersten Erfahrungen dann auch hier preisgeben.

Grüße Thomas

Hmmm, der Scooba würde mich auch schon reitzen, aber der Finanzielle teil spielt da imo noch nicht mit :frowning: leider…
Aber meine Finanzministerin würde mir warscheinlich auch die Hammelbeine langziehen…

Ist auf jeden fall erstmal mit auf die Wunschliste gesetzt…

korny

Habe mir heute den 560er zugelegt und muss sagen, wow! Ein schniekes Gerät, zumindest für Leute die nicht technikabweisend drauf sind. Man muss mitunter schon ein bisschen basteln und tüfteln, damit der Roomba das tut was er soll, aber dann macht es Freude, ihm zuzusehen.

Unbedingt achten sollte man auf Möbel die um die 8 cm hoch sind, denn da kann es vorkommen, dass sich der Roboter festfährt, mit seiner Oberseite herumscheuert und sich gleich mal ein paar schöne Kratzer zuzieht :frowning:

Die Frage der Fernsteuerung betreffend habe ich das hier gefunden: klick

Das Produkt finde ich allerdings arg teuer, es kostet nochmal mehr als halb so viel wie der Roboter selbst. Allerdings hat man dann ein WLAN-Webinterface, also wäre hier eine spezielle IPS-Anbindung erstmal nicht zwingend erforderlich. Blöde ist die größere Höhe des Roboters, damit gibt es so schon genug Schwierigkeiten. Insbesondere die kleine „Garage“ die iich unter dem Einbauschrank baue, wäre dann wohl wieder zu niedrig…

Ein Interface für den Einbau wäre auf jeden Fall die elegantere Lösung.

Hallo,

hab noch eine preiswerte Möglichkeit gefunden, den Roomba zumindest z.B. per IPS loslegen zu lassen: 560: Fernbedienung? - Seite 2 - RoombaForum - Das Forum für die iRobot Roomba Staubsauger Roboter

Man braucht nur ein Gerät, das mit IPS funktioniert und IR-Signale senden kann. Ich nehme an, so etwas gibt es (sogar FS20-kompatibel, oder?). Außerdem müsste man halt jemanden finden, der die Codes dieser Roomba-Kommandozentrale besorgt. Wohl der schwierigere Teil.

Hallo Sokkederheld,

IR-Befehle senden geht mit IR-Trans sehr gut. Wenn Du eine Harmony FB benutzt kannst Du die entsprechenden Befehle einfach aus dem Internet laden und dann auch wieder an IR-Trans zum Anlernen senden.

Was die Bodenfreiheit angeht, da habe ich auch so meine Probleme. Ich habe am Bumper einen stabilen Filz geklebt, so dass nur 1 -2 mm Bodenfreiheit übrigbleiben. So klettert der Roomba nicht mehr auf alles und fährt sich fest. Besser wäre es natürlich, wenn die Räder, bzw. die vordere Rolle, verkleinert werden könnten.

Ich wünsche einen schönen Abend.

Christoph.

@Doc

bist Du schon weiter gekommen? Bilder???

Den Schaltregler kannst Du ohne Bedenken einsetzen.
Ich habe auch zwei davon im MK und alles ohne Probleme.
Und das mit Kompass, Navi, Cam…

Zur Not kannst Du ihn ja einpacken…

Grüße an die MK-Flieger :cool:
Fabian

Hi Prof,

den 3,3V Schaltregler habe ich heute von Conrad abgeholt. Am WE werde ich mal unseren „WALL.E“ mit IPS verheiraten. Mal schauen, ob das so funktioniert, wie vorgestellt.
Wenn ich gewusst hätte, wie klein dieser Schaltregler ist, wäre er schon längst in meinem MK und ich hätte mir den Kühlkörper für die Navi-Ctrl gespart.
Das Ding wird ja ganz schön heiss.
Ich werde weiter berichten.

Gruß,
Doc

So, es ist vollbracht.

„Wall.E“ hört nun auf IPS :stuck_out_tongue:

Ich bin allerdings von meiner Idee, die Kommunikation über die XBees mit 115kbs zu machen abgewichen, da hier doch so einige Datenpackete verloren gingen und der Roomba keine Prüfsumme mit verschickt.
Die Kommunikation mit 19200 funktioniert dagegen nun tadellos.
Was auch nicht richtig funktionierte war das Abfragen vieler ausgewählter Sensoren gleichzeit, da der Roomba das Datenpacket teilweise zerschnibbelte, was das Auswerten erschwerte.
Was aber auch hier wieder problemlos funktioniert ist das Abfragen „aller“ 58 Sensoren auf einmal über das Datenpaket 100. Das sind dann immer exakt 80Byte.
Bilder des Umbaus werde ich mal posten, wenn ich das XBee-Modul in den Roomba eingebaut habe.

Allerdings stehe ich im Moment etwas auf dem Schlauch, was das Auswerten der Daten angeht.

  1. Wie kann ich am einfachsten Überprüfen, ob die Stringlänge wirklich 80 Byte enthält, um evtl. bei fehlenden Daten das Script abbrechen zu können?

  2. Es werden manche Daten als 2 Byte Wert übermittelt, die dann ein Vorzeichen enthalten müssen, wie z.B. der Strom in und aus dem Akku.
    2 Byte > Range -32768 bis 32767 um auch die negativen Ströme anzeigen zu können. Wie setzt man das um?

Viele Grüße,
Doc

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : XBee.Daten.ips.php
Trigger  : 
Interval : 
*/
//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);

//Berechnung der Batteriespannung
$BatteryVoltage = ($Byte[18])+($Byte[17]*256);
$BatteryVoltage=$BatteryVoltage / 1000;
SetValueFloat("BatteryVoltage", $BatteryVoltage);

//Berechnung des Stroms
$BatteryCurrent = ($Byte[20])+($Byte[19]*256);
$BatteryCurrent = $BatteryCurrent - 65535;
SetValueFloat("BatteryCurrent", $BatteryCurrent);

//Berechnung der Restkapazität
$BatteryCharge = ($Byte[23])+($Byte[22]*256);
SetValueInteger("BatteryCharge", $BatteryCharge);
?>

Hallo Doc,

  1. um die Stringlänge zu ermitteln benutzt man üblicherweise die Funktion strlen(…).

  2. Vorzeichenbehaftete Zahlen im Zweierkomplement kannst Du so erfassen:

$BatteryCurrent = ($Byte[19]<<8) + $Byte[20];
if ($BatteryCurrent > 0x7fff) $BatteryCurrent |= 0xffff0000;

Ich habe sehr den Eindruck, dass hier, wie so häufig, wieder einmal jede Menge überflüssige Umwandlungen vorgenommen wurden. Lass doch mal sehen, was der String „XBee.RX“ tatsächlich enthält. Nimm am besten diese Funktion um ihn in einer lesbaren Form darzustellen. Dann sehen wir weiter.

function Str2Hex($string)
{
 $Hex = "";
 for($i=0; $i<strlen($string); $i++)
   $Hex .= sprintf("%02X ", ord($string[$i]));
 return $Hex;
}

Gruß
HJH

Hallo HJH,

ich habe das jetzt so gelöst. Wenn ich das so überschauen kann, müsste das doch das gleiche sein, oder? Nur vermutlich umständlicher :o

//Berechnung des Stroms aus Akku
$BatteryCurrent = ($Byte[20])+($Byte[19]*256);
if ($BatteryCurrent >= 32768) {
   $BatteryCurrent = $BatteryCurrent - 65536;
}
SetValueInteger("BatteryCurrent", $BatteryCurrent);

Die Werte aus dem RX-String sehen bei mir so aus:
„0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 62 242 255 92 41 10 47 10 136 0 0 10 215 10 236 10 236 10 218 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 246 247 15 186 0 0 0 0 0 0 2 0 0 0 5 0 1 0 0 0 0 0 0 0 0 0 0 0“

Das Script zum Auswerten sieht in der Zwischenzeit nun so aus.
Allerdings fehlt noch die Abfrage, ob tatsächlich 80 bytes enpfangen wurden.
Ich merke schon, ich muss mich noch intensiver mit PHP auseinander setzten.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : XBee.Daten.ips.php
Trigger  : 
Interval : 
*/
//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:
   SetValueString("ChargingState", "Not Charging");
   break;
case 1:
   SetValueString("ChargingState", "Reconditioning Charging");
   break;
case 2:
   SetValueString("ChargingState", "Full Charging");
   break;
case 3:
   SetValueString("ChargingState", "Trickle Charging");
   break;
case 4:
   SetValueString("ChargingState", "Waiting");
   break;
case 5:
   SetValueString("ChargingState", "Charging Fault Condition");
   break;
}

//Anzeige Charging Source
$ChargingSource = $Byte[39];
switch ($ChargingSource) {
case 0:
   SetValueString("ChargingSource", "No Charging Source");
   break;
case 1:
   SetValueString("ChargingSource", "Internal Charger");
   break;
case 2:
   SetValueString("ChargingSource", "Home Base");
   break;
}

//Anzeige OI Mode
$OIMode = $Byte[40];
switch ($OIMode) {
case 0:
   SetValueString("OIMode", "Off");
   break;
case 1:
   SetValueString("OIMode", "Passive");
   break;
case 2:
   SetValueString("OIMode", "Safe");
   break;
case 3:
   SetValueString("OIMode", "Full");
   break;
}

//Berechnung der Batteriespannung
$BatteryVoltage = ($Byte[18])+($Byte[17]*256);
$BatteryVoltage=$BatteryVoltage / 1000;
$BatteryVoltage = round($BatteryVoltage,1);
SetValueFloat("BatteryVoltage", $BatteryVoltage);

//Berechnung des Stroms aus Akku
$BatteryCurrent = ($Byte[20])+($Byte[19]*256);
if ($BatteryCurrent >= 32768) {
   $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,1);
SetValueFloat("BatteryChargePercent", $BatteryChargePercent);

//Berechnung der Batterietemperatur
$BatteryTemperature = ($Byte[21])+($Byte[21]*0);
SetValueInteger("BatteryTemperature", $BatteryTemperature);

?>

Achso, gesendet zur Abfrage wird übrigens das hier:

$ID=30045;
XBee_SendBuffer($ID, chr(128)); //Start Command
XBee_SendBuffer($ID, chr(149));  //Opcode 149
XBee_SendBuffer($ID, chr(1)); //Number of packets
XBee_SendBuffer($ID, chr(100));  //Packet ID 100

Hallo Doc,

ja, Dein Code führt zum selben Ergebnis. Bei mir werden statt der mathematischen lediglich ultraschnelle Schiebe- und Verknüpfungsfunktionen verwendet. Auf das Ergebnis hat das aber keinen Einfluss.

„XBee.RX“:
Könntest Du bitte mal die Funktion Str2Dec zur Darstellung des Strings verwenden? Aus Deiner Darstellung geht nicht hervor, welche Zeichen wirklich gesendet und welche nur zur besseren Lesbarkeit eingefügt wurden.

Also bitte mal diese Funktion verwenden (nicht die, die ich Dir vorhin geschickt habe):

function Str2Dec($daten)
{
 $Dec = "";
 for($i=0; $i<strlen($daten); $i++)
  {
   $Dec .= sprintf("%03d ", ord($daten[$i]));
  }
 return $Dec;
}

Gruß
HJH

Hallo,

das ging ja fix! Bin schon schwer gespannt auf die Fotos.

Soweit ich richtig verstanden habe, braucht man für die IPS-Anbindung also an „Hardware“:

-2x Xbee-Modul
-1x"USB-Carrier" oder wie sich das Teil schimpft
-1x Schaltregler um die Spannungsversorgung des Roomba anzuzapfen

Oder hab ich irgendetwas vergessen? Die Buchse für den RS232-Anschluss würd ich ja eher ungern benutzen, aus optischen und Formfaktor-Gründen. Ich nehme an, man kann auch einfach ein paar Litzen (GND, Rx, Tx, V+) anlöten und fertig, oder?

Naja, vorerst muss ich mal hinbekommen, dass der Roomba vernünftigt mit den Sch*** Lighthouses klarkommt… er bleibt immer irgendwann in einem Raum und fährt solange rum bis der Akku leer ist.

Hallo HJH,

irgendwie kommt da nichts an?

$daten=GetValueString("XBee.RX");
function Str2Dec($daten)
{
 $Dec = "";
 for($i=0; $i<strlen($daten); $i++)
  {
   $Dec .= sprintf("%03d ", ord($daten[$i]));
  }
 return $Dec;
 }
SetValueString("XBee.HJH",$Dec);

Oder hab’ ich da was falsch verstanden?

Grüße,
Doc

Hallo,

da fehlt noch, am besten in der vorletzten Zeile ein


$Dec = Str2Dec($daten);

ansonsten hast Du zwar die Function geschrieben aber nie aufgerufen.

Hier nochmals komplett:


$daten=GetValueString("XBee.RX"); 

function Str2Dec($daten) 
{ 
 $Dec = ""; 
 for($i=0; $i<strlen($daten); $i++) 
  { 
   $Dec .= sprintf("%03d ", ord($daten[$i])); 
  } 
 return $Dec; 
 }
 
$Dec = Str2Dec($daten); 

SetValueString("XBee.HJH",$Dec);  

Das passt fasst. Ich habe noch einen C für den Recon Schaltregler benötig, s.Datenblatt und einen 2k Widerstand für die TX Leitung des Roomba, da das XBee nur 3,3V hat.
Ich werde auch einen Stecker von innen an die Buchse löten, damit der Roomba von Oben wie Original aissieht, das XBee kommt dann hinter die Versorgungsspannungsbuchse, da ist noch genügend Platz.

Was mir allerdings noch nicht gefällt ist, das das XBee auch bei komplett ausgeschalteten Roomba noch mit Spannung versorgt wird, da diese auch dann noch an der Buchse anliegt.
Oder gibt es da eine Einstellung am XBee, diesen bei fehlenden Daten „schlafen“ zu legen?

Doc

Mal ganz blöd gefragt: Muss das Modul nicht ständig aktiv sein, damit IPS jederzeit den Roboter starten kann? Es hätte ja nicht viel Sinn eine Anbindung zu machen, wenn man den Roomba dann immer von Hand einschalten muss…

Prima,

jetzt hats funktioniert.
Ist schon blöd, wenn man mit Funktionen nicht umgehen kann :confused:

Hier sind dann mal die Daten, aber ich verstehe nicht, warum man die so besser sind?

Meine Auswertung:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 60 225 255 92 29 9 189 10 136 0 0 10 216 10 233 10 254 10 220 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 240 164 202 74 2 0 0 1 67 0 28 0 0 0 10 0 2 0 0 0 0 0 0 0 0 0 0 0

und die von HJH:
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 004 060 225 255 092 029 009 189 010 136 000 000 010 216 010 233 010 254 010 220 000 000 000 000 001 000 000 000 000 000 000 000 000 000 000 000 240 164 202 074 002 000 000 001 067 000 028 000 000 000 010 000 002 000 000 000 000 000 000 000 000 000 000 000