Ardumower Control Center

paddy

Active member
Hallo zusammen,

im WIKI gibt es seit langem eine Beschreibung zum RMCS, dem Robot mower communication standard. Bisher gab es aber keine Implementierung dazu. Dies habe ich jetzt nachgeholt und möchte euch mein Werk vorstellen. Ihr findet alles im Github unter dem User PaddyCube.

Das Control center basiert auf einem Node-RED Server, der auf einem Raspberry PI ausgeführt wird. Der Raspberry ist im Mower verbaut und kommuniziert mit seriellen Konsole mit dem Mower.

Anbei ein Video https://youtu.be/ayh-IaKrpdM
Man kann hier den Mower überwachen und steuern. Die manuelle Steuerung ist sehr tricky, da der Mower nur wenige Kommandos pro Sekunde über die Konsole verarbeiten kann. Bitte seit damit vorsichtig.

Ich werde in kürze ein kleines Tutorial nachreichen, wie man das Control Center aufsetzt. Es ist wirklich sehr leicht. Für die, die nicht waren können:

1. Raspberry Image auf den PI laden
2. Node-RED installieren
3. Alle Dateien aus dem Git ControlCenter in das .node-red Verzeichnis kopieren
4. node-red starten


Hi there,

in Wiki there is a page called RMCS, robot mower communication standard. But there was no implementation. Now there is one in my fork. You find everything on Github under user PaddyCube.

The control center is a node-red server running on a raspberry pi. The raspberry is inside the mower and communicates with Arduino by serial commands.
Visit the video above to get an picture.

You can observe the mower and also control it. Please be aware that manual control is highly experimental and slow because Arduino can handle only one command per second by console.

I will create a tutorial about how to set everything up, but for those who can't wait:

1. load a raspberry image to SD card
2. install node-red
3. copy everything from git Control center to corresponding .node-red folder
4. start node red

Patrick
 
Hallo,

eine erste Version der Anleitung kommt sicherlich schon die Tage. Leider sind mir die PI's ausgegangen und ich habe versäumt, bei der letzten Einrichtung alles zu dokumentieren. Macht nichts, der nächste ist schon geordert. Irgendwie vermehren sich die Dinger bei mir :)
 
Hi Paddy,

sieht echt toll aus, wahnsinn. Sollte es nicht relativ einfach sein, per Config zwischen USB Connection und WLAN-Connection umzuschalten? Mir wäre derzeit die "abgesetzter Server holt sich die Werte per Funk"-Variante lieber, um die maximale Fahrzeit des Akkus zu haben.

Habe erfolgreich einen ESP8266 geflashed, ins WLAN gehangen und schon son bissle mit Python und einem Connect rumgespielt. Hänge momentan son bissle daran, das PFOD-Protokoll geeignet zu parsen. Allerdings hast du schon alles was man benötigt (vor allem eine schöne GUI :woohoo: ), nur die Kommunikation wäre anders. Einziger Unterschied: das Kamera-Polling müsste bei TCP/IP abgeschaltet werden.

Arbeite mich gerne in NodeJS ein... kannst du mir nur den Hinweis geben, wo der Connect-Handle liegt? Würde dann sowas hier probieren: Node.js TCP client and server example .

Gruß, Dennis
 
Hallo Dennis,

die Kommunikation läuft wie gesagt per USB Kabel. Die Daten lassen sich bestimmt auch an über WLAN senden. Die Frage ist nur, wohin? Mit den ESP. habe ich mich nie beschäftigt, da kann ich nichts zu sagen.

Ist das dann so, dass der Server über WLAN die Daten anfragt und über die so aufgebaute TCP Verbindung empfängt?

Das Control Center selbst läuft unter Node-Red. Das ist eine Erweiterung zum node.js. Hier gibt es eine grafische Oberfläche, in der man die Flows konfiguriert. Ein Flow ist eine Art Programmablauf oder eine Page. Hier werden einzelne Bausteine (nodes) per Drag+Drop zusammengeklickt und konfiguriert.

Es gibt folglich einen Input-node vom Typ serielle Verbindung. Hierüber werden die eingehenden Nachrichten gelesen. Diesen Knoten müsste man lediglich durch einen passenden anderen ersetzen. Unterstützt wird hier vieles, HTTP, TCP, MQTT, DB, Twitter, you name it.

Zudem gibt es noch einen seriellen Output node, der Nachrichten an den Mower sendet. Dieser müsste ebenfalls durch etwas anderes ersetzt werden.

Sofern die eigentlichen Nutzdaten unverändert blieben, muss man nichts weiter anpassen.

Das schaffst du in kurzer Zeit und mit Google sicherlich schnell, wenn du das schon mit Python hinbekommen hast.

Was mir an keiner unserer Lösungen gefällt ist das Problem der Verbindungsabbrüche. Wenn der Mower ums Haus fährt, kann er mal die WLAN Verbindung verlieren. Er baut diese zwar wieder auf, ist für ein paar Sekunden oder Minuten aber weg. Für die reine Überwachung, Kamera Stream und simple Befehle ala "fahr heim" oder "geh in Auto Modus" ist das ok. Manuell fahren mit Joystick ist da schon eine andere Herausforderung. Die Latenz ist aktuell so hoch, dass ich es nur eingeschränkt empfehlen kann. Hier ist noch eine wichtige offene Baustelle. Ganz lösen lässt sich dies aber nicht.

Sofern du deinen stationären Server nicht verwendest, um den Mower gezielt zu fahren (z.B. Echtzeit Pfadplanung) spricht aus meiner Sicht nichts dagegen, es so zu machen.

Die Akkulaufzeit hat sich bei mir von über 4h auf knapp 3,5h verringert. Wie lange er vorher durchgehalten hat weiß ich nicht. Ich hatte bisher nicht die Geduld, den Akku leer zu fahren. Mit dem Raspberry huckepack sind es wie gesagt ca. 3,5h. Das reicht mir deutlich aus.

Gruß Patrick
 
Man verbindet sich mit dem ESP mit einem Programm wie Telnet oder Netcat (auf die DHCP-Adresse oder statische IP, je nach Config) auf Port 8080.
Dann muss man die Befehle eingeben, die pfodApp oder ArduRemote absetzen, bspw. {.} für das Hauptmenü und bekommt dann ebenfalls mit diesen geschleiften Klammern die Hauptmenü-Struktur zurück.

Per Python habe ich eine simple TCP-Verbindung auf den Port 8080 durchgeführt, dann einfach "{.}" hingeschickt und als Antwort das kryptische Hauptmenü zurückbekommen. Sieht die Kommunikation über USB nicht genauso aus (PFOD) oder kannst du mit der Menüstruktur vom ArduMower arbeiten (bspw. d-3 für das Communication Menu)?
RedNode habe ich mal bei einem Meetup gesehen. Hat mir gefallen, hab es bislang nur noch nicht geschafft zu testen, ob alle meine Geräte einbindbar sind.

Bzgl. der Anfoderungen: ich möchte den Mäher nicht aus der Ferne steuern im Sinne einer Remote Control. Aber bspw. ungefähr sehen, wo er ist (GPS), Batteriestand, Fehlerzustand, Drive Home durch eine Hausautomation (achtung, Regen), Sensordaten (Perimeter, Sonar, Bumper). Also dein Webinterface, aber Kamera und R/C optional. Senden einer Notification bei dauerhaften Fehler oder OFF-State. Also sind auch die Verbindungsabbrüche für mich kein Problem. Das ist dann eben so.

Hast du die 3,5h mit einem Standard-Raspi oder mit einem Pi Zero geschafft und hast du da eine Mini-USV dazwischen gepackt zwecks geordnetes Runterfahren bei Stromverlust?

( Cool wäre ja, wenn das Webinterface die Vorwärtsticks mitzählen würde und dann stolz berichtet: ich bin heute schon 3 Kilometer gefahren :) )
 
Hi Dennis.
Don't know if it can help but:
I use the Pfod command with the PI and NMEA Sentence.
Take a look at the end of Pfod.cpp or search for "dataFromPi" and look at the RpiRemote class .
I join also a python parts code to help you to understand.

The Pi send directly the Pfod tag:
send_pfo_message('a06',''+str(sliderSpeedRpmMax.get())+'','2','3','4','5','6',)
send_pfo_message('a15',''+str(sliderSpeedPwmMax.get())+'','2','3','4','5','6',)
to change value.
But it's a lower solution and i stop to work by this way, i Use PFOD only for Command and not Variable..
Variable are directly send into NMEA Sentence.

ardumower_2018-06-26.zip

By.
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/3545/ardumower_2018-06-26.zip/
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

die Kommunikation ist genau die über USB. Neben RMCS Kommandos kann man auch die bisherigen Kommandos der seriellen Konsole senden, also das Menü aufrufen, Motoren testen usw.

Auch die Ausgabe der Sensordaten ist exakt das gleiche wie über USB. In der seriellen Konsole laufen ja normalerweise 1x pro Sekunde Daten rein, die den Status, Spannung, Sensordaten usw. enthält.

Das Control Center nutzt exakt diese Daten. Der einzige Unterschied ist der Aufbau der Nachrichten. Schau mal im Wiki unter RMCS, hier sind die Nachrichten beschrieben. Im Ardumower Code muss man nur einen Parameter in der Robot.cpp setzen um RMCS zu nutzen. Ist dieser gesetzt, werden statt der bisherigen seriellen Ausgabe die RMCS Nachrichten gesendet.

Wenn du es also schaffst, die serielle Konsole über den ESP... auszugeben bist du schon am Ziel.

Zum PI:
Dieser hängt direkt an der PCB1.3 am Anschluss RPI (nicht am Backup). Zwischen PI und PCB ist nur noch ein DC/DC Wandler. Bernard hat dazu mal ein Video veröffentlicht. Bei mir ist es ein PI 3 B, kein Zero. Mit dem Zero geht es auch, ich hab aber eine USB Kamera und keine RPI Kamera angeschlossen. Der PI Zero hat damit für mich zu wenige USB Ports und mit Hubs habe ich es nicht stabil ans laufen bekommen.

Damit der PI nicht aus dem Leben gerissen wird, wenn das PCB ausschaltet, sendet der Arduino ein spezielles Kommando ($RMOFF). Der PI fährt dann sofort runter. Der Arduino wartet 60 Sekunden, bevor er alles trennt. Das reicht für den PI aus, um herunterzufahren. Besten Dank an dieser Stelle an Bernard, der die Idee dazu hatte und seine Umsetzung hier vorgestellt hat.

Zu der Distanz, wenn Odometrie aktiviert ist, kann man sich die Werte (Ticks) anzeigen lassen. Mit ein wenig JavaScript Code hat man da schnell berechnet, wie weit er gefahren ist. Vorwärts von Rückwärts zu unterscheiden wird da aber nichts, dazu ist die Latenz zu hoch bzw. müsste der Arduino so viele Nachrichten senden, die unnötig belasten. Man muss natürlich noch den regelmäßigen Überlauf des Zählers berücksichtigen.
Wenn es dich interessiert, die Info liefert zumindest die PFOD App unter dem Punkt Info. Der Mower berechnet es also bereits.

Ich nehme mal das für die weitere Entwicklung auf:
- Statistiken (gemähte Zeit, gefahrene KM pro Trip und gesamt)
- Erfassen weiterer Statistikdaten, etwa Temperatur
- Sicherung der Daten in Datenbank für Auswertungen über Monate, Jahre
- Verbesserung der manuellen Steuerung (Reaktion auf HTML Joystick)
- Absichern der manuellen Steuerung (Perimeter nicht verlassen, Stopp bei Bumper usw.)
- Konfiguration des Mowers auslesen (aktuell ist implementiert, ob Sonar, Odo usw. verfügbar ist. Zukünftig muss auch rein, wie viele Ticks pro U, Sonar Trigger bei x cm usw.)
- Konfiguration des Raspberry in separate Datei auslagern (Adresse des Kamerastreams, Adresse des USB Ports des Arduino usw)

Bevor ich das aber angehe, bringe ich erst mal das bisher erreichte in Form einer Doku raus.
 
Hallo zusammen,

der Raspberry ist eingetroffen und wurde direkt zur Dokumentation verwendet. In meinem Fork des Control Centers findet ihr eine umfassende Anleitung auf Deutsch. Ich habe einen Pull Request gestellt, das ist somit bestimmt bald im Master verfügbar. Für alle die nicht warten oder suchen wollen, im Anhang findet sich alles.

Die Anleitung ist bewusst einfach gehalten für Leute, die noch nie mit dem Raspberry oder mit Linux zu tun hatten. Nicht von den vielen Seiten verschrecken lassen, ich habe viele viele Screenshots mit rein gebracht und beschrieben, was genau gemacht wird.
Die Anleitung umfasst:
- SD Karte vorbereiten
- Raspberry konfigurieren
- WLAN einrichten
- Motion für die Kamera installieren und einrichten
- Node-RED installieren und einrichten
- Control Center in Betrieb nehmen
- Anpassungen am Control Center vornehmen (Adresse der Kamera, Anpassen einer Anzeige)

Als nächstes werde ich die Anleitung noch übersetzen und dann beginne ich damit, die manuelle Steuerung zu verbessern.

Anbei noch ein Video, bei dem ich die Framerate der Kamera deutlich erhöht habe und Daten wie etwa Sonar deutlich öfter rein kommen. Da macht das zusehen gleich noch mehr Spaß.
https://youtu.be/QRidlo4X82E
Gruß Patrick
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2946/ControlCenter_Installation.pdf/
 
Zuletzt bearbeitet von einem Moderator:
Die Anleitung findet ihr jetzt auch im Wiki unter http://wiki.ardumower.de/index.php?title=Control_Center_(Deutsch)
 
Eindrucksvolle Arbeit (Software und Anleitung) ! Ich habe die Anleitung auf der Wiki-Eingangsseite (unten) verlinkt.
 
Bin begeistert. Zwar im Moment unterwegs aber demnächst werde ich das bei mir auch umsetzen. Zwei Fragen hätte ich zur Hardware, sicher schon alles im Forum besprochen aber mit dem fummeligen Handy schwer zu finden: 1) wie ist der Pi am Mower spannumgstechnisch angeschlossen (Du sprachst von einem entsprechenden Beitrag hier im Forum...hast du da einen Link?)
2) welche Kamera benutzt du?

Gruss Michael
 
Hey Paddy,

Im Ardumower Code muss man nur einen Parameter in der Robot.cpp setzen um RMCS zu nutzen. Ist dieser gesetzt, werden statt der bisherigen seriellen Ausgabe die RMCS Nachrichten gesendet.

Und der wäre welcher?
Ich nutze Ardumower-1.0a9-Azurit und hab bis jetzt nichts dazu in der Robot.ccp gefunden, hab nen Zero W nach deiner ausführlichen Anleitung aufgesetzt und es funktioniert soweit auch alles, nur bekomme ich die Werte nicht, was so denke ich jetzt einfach mal, an dem Format der Nachrichten liegt.

Theoretisch könnte der Ardumower ja jetzt auch mit nem PS3 oder PS4 Controller gesteuert werden, die laufen mit Bluetooth und es gibt ja einige Tutorials dazu wie Roboter damit ferngesteuert werden können.

Gruss Benni
 
Hallo Michael,

der PI wird direkt an dem PCB 1.3 über den Anschluss PI Power versorgt. Bitte beachten, hier liegen 24V an, es muss zwingend ein DC/DC Konverter zwischen dem Anschluss und dem PI liegen. Alternativ kann der PI auch direkt an den Akku (mit DC/DC konverter), dann kann das PCB den PI aber nicht vom Strom trennen im Falle einer Unterspannung oder wenn die Idle Time auslöst. Den Link zu Bernard seinem Beitrag suche ich mal raus.

DIe Kamera die ich verwende ist eine günstige China USB Webcam. ein PI Kameramodul sollte es aber auch tun.

Gruß Patrick
 
Hallo,

es gibt einen Parameter rmcsUse, der muss gesetzt sein. Den gibt es aber nur in meinen Fork, Suche man nach PaddyCube/Ardumower. Meine Version ist sehr aktuell zum Original. Meine Änderungen wurden noch nicht in die Master-Version übernommen, deshalb findet sich dort noch nichts.

Gruß Patrick
 
Paddy, das ist eine richtig geile Arbeit! Find ich richtig gut.

Ich bin inzwischen in der Lage, dein ACC über WIFI zu nutzen. Zumindest erstmal für die Sonar-Werte.

Die Vorteile: unangetaster Azurit Code, kein Raspi im Chassis erforderlich
Die Nachteile: man muss den ESP8266 flashen, mögliche Reichweite-Probleme, keine Kamera

Wenn ich node red richtig verstanden habe, sind sogar beide Ansätze in einem Flow möglich. Je nach dem, welche Quelle (USB, Wifi) verfügbar ist, werden die Werte entsprechend gesetzt.

~~~~~~~~~~~~~~~~English Version~~~~~~~~~~~~~~~~~~~~~~~~

Paddy, really great work. I highly appreciate that.

I was able to use the node red ardumower control center while using wifi! At least for sonar as proof of concept.

The advantages: vanilla azurit source code, no raspi within the chassis needed
The disadvantages: flashing the ESP8266, possible wifi range problems, no camera

I guess, the node red is that flexible, that it may be possible to create one flow. If USB serial is available, the data is taken from this input. If TCP is possible, the data is taken from there.

~~~~~~~~~~~~~~~~~~ Proof of Concept ~~~~~~~~~~~~~~~~~~~~~~~
NodeRed.png


Inject: {m1}
TCP Request: IP, Port 8080, return when character is received: n
PFOD-Son:

Code:
var output = msg.payload.toString().split(",");

/*
0 time,
1 leftsen
2 rightsen
3 mowsen
4 sonleft
5 soncenter
6 sonright
7 perinside
8 permag
9 odoleft
10 odoright
11 yaw
12 pitch
13 roll
14 gyrox
15 gyroy
16 gyroz
17 accx
18 accy
19 accz
20 comx
21 comy
22 comz
23 hdop
24 sats
25 gspeed
26 gcourse
27 galt
28 lat
29 lon
1355.64,0.00,0.00,0.00,0,0,108,1,-21,0,0,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,4294967295,255,-1.00,1000.00,1000000.00,1000.00,1000.00
1355.84,0.00,0.00,0.00,0,0,108,1,-21,0,0,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,4294967295,255,-1.00,1000.00,1000000.00,1000.00,1000.00
*/

leftDist = {payload:parseFloat(output[4])};
leftDist.topic = 'sonarLeft';
rightDist = {payload:parseFloat(output[6])};
rightDist.topic = 'sonarRight';
centerDist = {payload:parseFloat(output[5])};
centerDist.topic = 'sonarCenter';

/*
{y5}
{=Sensor counters`300|time s`0|state`1|motL`2|motR`3|motM`4|bumL`5|bumR`6|son`7|peri`8|lawn`9|rain`10|dropL`11|dropR`12}
601.85,0,0,0,0,0,0,0,236,0,0,0,0
602.05,0,0,0,0,0,0,0,236,0,0,0,0
*/

//node.send('{y5}')

//var output = msg.payload.split(",");


//leftCounter = {payload:parseInt(output[8])};
//rightCounter = {payload:parseInt(output[8])};
//centerCounter = {payload:parseInt(output[8])};

leftCounter = {payload: 1};
rightCounter = {payload: 4};
centerCounter = {payload: 7};

// set correct values if origin value is 0
if (leftDist.payload === 0)
{
    leftDist.payload = 100;
}

if (rightDist.payload === 0)
{
    rightDist.payload = 100;
}

if (centerDist.payload === 0)
{
    centerDist.payload = 100;
}
return [leftDist, rightDist, centerDist, leftCounter, rightCounter, centerCounter];


//return msg;

Attachment: https://forum.ardumower.de/data/media/kunena/attachments/3922/NodeRed.png/
 
Zuletzt bearbeitet von einem Moderator:
Okay, bei mir läuft es mittlerweile auch... Hammer, bin echt begeistert :)
Was mus ich in Node-RED noch hinzufügen, damit ich den esp aus meinem Mower verbannen kann und über die PFOD app an port 8080 auf die Konsole zugreife? Sorry aber ich kenne mich mit Node noch nicht aus...

Gruß
Benni
 
dotmaster5 schrieb:
Was mus ich in Node-RED noch hinzufügen, damit ich den esp aus meinem Mower verbannen kann und über die PFOD app an port 8080 auf die Konsole zugreife? Sorry aber ich kenne mich mit Node noch nicht aus...

Versteh ich das richtig: statt mit dem ESP willst du dich mit dem Raspi verbinden? Da die PfodApp dieses sehr spezielle Protokoll spricht, müsstest du grob folgendes tun:
- TCP in node erstellen, auf Port 8080 lauschen lassen.
- zweite serielle Schnittstelle erstellen und auf einen anderen USB-Port legen. Mit dem USB auf die andere ArduMower-Console gehen, die PFOD spricht. Irgendwo gab es einen Thread, wo auf die Unterschiede zwischen dem "normalen" USB-Menü und der PFOD-Console für BT/Wifi hingewiesen wurde. Möglw. musst du auch direkt die GPIO Pins des Raspi an die entsprechenden Mega-Boards für Wifi/BT binden.
- TCP in und die zweite Serial mit einander verbinden.

Achtung: ungetestet.
 
Zuletzt bearbeitet von einem Moderator:
Oben