Raindancer Firmware (Deutsch): Unterschied zwischen den Versionen

Aus www.wiki.ardumower.de
Wechseln zu: Navigation, Suche
(Für eine minimale Inbetriebnahme sollten folgende Voraussetzungen erfüllt sein)
(config.h)
Zeile 151: Zeile 151:
  
 
Hier H eingeben. Danach werden alle verfügbaten Befehle angezeigt. Diese am besten kopieren und abspeichern, so dass man diese einsehen kann.
 
Hier H eingeben. Danach werden alle verfügbaten Befehle angezeigt. Diese am besten kopieren und abspeichern, so dass man diese einsehen kann.
 +
 +
 +
= QUICKSTART TO MOW =
 +
Der roboter ist über das Konsolenkabel verbunden. Speed: 115200
 +
 +
==Zum warm werden: Konfiguration des Batterie service==
 +
In config.h folgendes setzen und Software neu aufspielen.
 +
 +
#define CONF_DISABLE_BATTERY_SERVICE false
 +
 +
bat.show eingeben. Es sollte die richtige Batterispannung angezeigt werden.
 +
 +
==Inbetriebnahme der Motoren==
 +
Den Befehl clc.mt,1,150 eingeben.
 +
Damit wird der Motor links direkt mit einer PWM con 150 angesteuert.
 +
Bei Werten unter 100 kann es sein, dass sich der Motor nicht dreht.
 +
Gestoppt wird das Rad dann mit clc.mt,0,0
 +
 +
Das Rad linke sollte sich vorwärts drehen. Falls nicht muss es umgepolt werden.
 +
 +
Das gleiche für das rechte Rad:
 +
clc.mt,2,150
 +
 +
Sollten sich die Räder nicht drehen, kann man es noch mit einer höheren PWM versuchen.
 +
 +
 +
Anmerkung: Die PWM für die Motoren läuft mit 20000Hz. Original Adrumower PWM ist 3900Hz.
 +
Wenn man die Originalwerte verwenden möchte, muss man nachfolgende Zeilen in pinman.cpp auf 3900 abändern.
 +
#define PWM_FREQUENCY 20000
 +
#define TC_FREQUENCY 20000
 +
 +
 +
==Inbetriebnahme der Encoder==
 +
Den Befehl clc.mt,1,150 eingeben, damit sich das linke Rad dreht.
 +
Dann clc.enc eingeben, um die Encoderwerte anzuzeigen.
 +
Die Encoder haben zwei Zähler. Einmal einen Absolutencoder, der zählt immer positive egal wie rum sich das Rad dreht.
 +
Und einmal einen Encoder, der bei Forwärtfahrt hochzählt und bei Rückwärtsfahrt zurückzählt.
 +
Beide angezeigten Zähler des linken Rades  müssen nun hochzählen.
 +
 +
Die Ausgabe wird mit dem Befehl: h beendet.
 +
 +
Beispiel:
 +
motor 1 = Links
 +
motor 2 = rechts -sollte nicht zählen, wenn der linke Motor läuft.
 +
!03,motor 1 enc: 972 absEnc: 972 rpm: 2.596326  m/h: 125.773315 deltaTicks: 2 deltaTime: 32986us
 +
!03,motor 2 enc: 974 absEnc: 974 rpm: 3.325853  m/h: 161.113647 deltaTicks: 2 deltaTime: 33445us
 +
!03,motor 1 enc: 974 absEnc: 974 rpm: 2.923552  m/h: 141.625061 deltaTicks: 2 deltaTime: 33156us
 +
!03,motor 2 enc: 975 absEnc: 975 rpm: 2.678638  m/h: 129.760696 deltaTicks: 1 deltaTime: 33144us
 +
!03,motor 1 enc: 976 absEnc: 976 rpm: 3.132316  m/h: 151.738159 deltaTicks: 2 deltaTime: 32857us
 +
!03,motor 2 enc: 976 absEnc: 976 rpm: 2.296233  m/h: 111.235962 deltaTicks: 1 deltaTime: 32859us
 +
!03,motor 1 enc: 978 absEnc: 978 rpm: 3.251686  m/h: 157.520752 deltaTicks: 2 deltaTime: 32998us
 +
!
 +
 +
Falls der enc negative beim Vorwärtsfahren zählt kann man das in der config.h konfigurieren:
 +
#define CONF_LEFT_ENCODER_INVERSE false
 +
#define CONF_RIGHT_ENCODER_INVERSE false
 +
 +
das gleiche für das rechte Rad durchführen:
 +
clc.mt,1,150
 +
 +
Befehl wird mit clc.mt,0,0 gestoppt.
 +
 +
Nachdem die Zeilen in der config.h richtig eingestellt wurden, neu kompilieren und aufspielen.

Version vom 29. April 2018, 13:31 Uhr

Achtung! Die Software ist noch im Wandel und kann jederzeit geändert/erweitert werden.

Download

Github Download

Überblick

Die Raindancer Firmware mäht nach dem Chaos Prinzip. Der Roboter fährt von der Ladestation eine angegebenen Strecke am Perimeter lang und fängt dann an zu mähen. Die Mähzeit beträgt mit den original Ardumowerkomponenten bei dem Raindancer Chassis ca. 2.3h. Nachdem die Batteriespannung auf 23,7V heruntergegangen ist, sucht der Roboter das Perimeterkabel und fährt dieses bis zur Ladestation entlang. In der Ladestation angekommen, wird die Batterie geladen. Der nächste Mähvorgang wird aktuell über das Mobile Phone gestartet.

Die Firmware wurde entwickelt für Roboter mit dem Antriebsmotoren hinten, kann aber auch für das original Chassis verwendet werden. Optimierungen für das original Chassis erfolgen zu einem späteren Zeitpunkt. Der Mower dreht sich auf dem Perimeter. Wenn eine Spule über das Perimeterkabel gefahren ist, fährt der Roboter noch ca. 20cm weiter. Dann werden beide Spulen, in die Schleife gedreht und ab da an wird dann mit einem Zufallswinkel weitergedreht. Da das original Chassis einen kurzen Abstand zwischen Spulen und Rädern hat, gibt es hier folgenden Workaround: In der config.h kann eingestellt werden, dass der Mower weiter zurückfährt, dann einen festen Winkel dreht (Drehung auf dem Perimeter simuliert) und nach dem Drehen des festen Winkels wird der Zufallswinkel gedreht.

Für die Perimetererkennung wird ein 128Bit Signal verwendet. Daher muss die Raindancer Sendersoftware auf den Sender aufgespielt werden. Beim annähren an das Perimeterkabel wird der Roboter langsamer. Die Bedingungen dafür müssen ggf. im Code angepasst werden. Erkennt der Roboter das Signal für 2Sekunden nicht, bleibt er stehen und schaltet die Mootoren aus. Erkennt er es wieder, fährt er weiter.

Die Firmware unterstützt in der aktuellen Version eine durchfahrende Ladestation (einfügen einer einseitig befahrbaren Ladestation folgt zu einem späteren Zeitpunkt). Das Anfahren der Ladestation kann in der Software ausgeschaltet werden. Dann bleibt der Roboter am Perimeter stehen, wenn die Batteriespannung unter 23,7V fällt. Zum Laden kann der Roboter dann ausgeschaltet werden, an das Ladekabel angeschlossen werden und wieder eingeschaltet werden. Der Roboter geht dann in den Lademodus. Fällt die Spannung unter 21,7V löst die Unterspannungsabschaltung aus falls diese nicht überbrückt wird.

Mit dem original Motoren und Rädern fährt der Roboter mit einer Geschwindigkeit von ca. 1200m/h. Um ein vernünftiges Schnittbild zu erlangen, muss der Roboter bei einer 1000m² Fläche ca. 6-9h pro Tag mähen (meine Erfahrung). Hängt natürlich auch von der Art und Verwinkelung der Fläche ab.

Der Roboter unterstütz zusätzlich einen selbstgebauten Bumperduino mit zwei MaxSonar Sonarsenoren und einem MPX5010DP FREESCALE Drucksensor für einen Druckwellenschlauch. https://github.com/kwrtz/Raindancer/blob/master/DipTrace/DistanceBumperSensor/DistanceBumperSensor.pdf Die Auswertung übernimmt ein Arduino Nano, welcher an PinUserSwitch2/3 des PCB1.3 angeschlossen ist. Bei Erkennen eines Hindernisses mit den Sonarsenoren, wird der Roboter langsamer und bumped seicht gegen das Hindernis wo dann der Bumper oder Bumperduino auslöst. Die Platine ist relative einfach aufgebaut. Die MaxSonar Sensoren können weggelassen werden und es kann eine eigene Lösung an den Nano angeschlossen werden, oder die aktuelle Raindancer Software kann erweitert werden. Die original Ardumower Ultraschall Sensoren werden aktuell nicht unterstützt.

Falls ein original Bumperduino verwendet wird oder eigene Bumper, können diese wie bisher an die Bumper Pins angeschlossen werden.

Für die Bedienung wird das Serielle Interface verwendet. Auf dem Handy eignet sich die Software Arduino Central (kostenlos mit Wer bung oder ohne Werbung für wenige Euros). Die Bedienung erfolgt über Kommandozeilenbefehle. Die gesendete Zeile muss mit CR abgeschlossen werden. Die Ausgabe erfolgt automatisch auf der Console oder auf dem Mobile Phone, je nachdem von wo gerade der Befehl eingegeben wurde. Die meisten Befehle sind nach Services Gruppiert. Die Gruppe entspricht den angesprochenen Services in der Software. Der auf den Service folgende Befehl ist dann durch einen Punkt getrennt. Leerzeichen werden übersprungen und haben keine Bedeutung. Dies ist gerade bei Verwendung des Mobile Phones nützlich, wo ein Leerzeichen nach einem Punkt eingefügt wird.

Beipiel: clc.enc Der Service clc enthält den Befehl enc. Damit wird der closes loop control service angesprochen und ihm mittgeteilt, dass er die Encoderdaten anzeigen soll.

Parameter werden mit einem Komma getrennt. Beispiel: pc.cm,60,30 //drives 60 cm with speed 30 (//drives... gehört nich zum Befehl) Damit wird der Positioncontrol Service angesprochen. Fahre 60cm mit der Geschwindigkeit von 30%

Der Befehl H zeigt die Hilfe an.

Viele Befehle geben Ausgaben auf der Konsole aus. Um diese Ausgabe zu deaktivieren, kann man h eingeben oder den gleichen Befehl wieder (der die Ausgabe angestoßen hat). Falls ein Error oder Motorstall ausgegeben wird, kann dieser mit dem Befehl reset zurückgesetzt werden.

Die Software ist Modular aufgebaut. Die einzelnen Module beeinflussen sich fast gar nicht. Damit ist es relative einfach etwas Abzuändern oder zu Erweitern. https://github.com/kwrtz/Raindancer/blob/master/Documentation/SoftwareStructure.pdf Zur Dartsellung wurde die Software UMLET verwendet.

Es gibt einen Hardware Abstraction Layer. Die gesamte Kommunikation mit der Hardware erfolgt über Objekte in hardware.h. Die meisten Objekte in hardware.h sind in InOutInterface.h definiert. In hardware.cpp findet die Initialisierung und Pinzuordnung der Hardware statt. Services sammeln Daten oder steuern die Motoren und stellen ihren Service der Steuerung zur Verfügung. Als Steuerung wird ein Behaviourtree verwendet. Der Behaviourtree greift auf die Services über das Blackboard zu. Nodes des Behaviourtree tauschen informationen über das Blackboard aus.

Für die grafische Erstellung des BHT wurde SPLAN verwednet. https://www.electronic-software-shop.com/elektronik-software/splan-70.html?language=de Um die Dateien des BHT betrachten kann folgende kostenlose Software verwendet werden: https://www.electronic-software-shop.com/support/kostenlose-datei-viewer/?xoid=oep38ca4ehqn37a7dn3rnrpie6 Die Dateien des BHT befinden sich hier https://github.com/kwrtz/Raindancer/tree/master/Documentation

Der Roboter kennt zwei Modi: Manuel und Auto. Im manuellen laufen alle Services, aber der Behaviourtree ist ausgeschaltet. Im Auto mode wird der BHT aktiviert.

Welcher Modi wird wann gestartet: MANUAL Roboter wird eingeschaltet und ist nicht in der Ladestation AUTO Der Roboter wird in der Ladestation eingeschaltet und erkennt eine Spannung an den Ladekontakten. Das Behaviour Charging wird aktiviert. Der Roboter wird geladen.

Ist der Roboter im MANUAL Mode, kann er mit dem Befehl A in den Automode geschaltet werden. Erkennt der Roboter das Perimetersignal, fängt er an zu mähen.

Offene Punkte

  • Stabilität der Software langfristig Prüfen. Stand 28.04.2018 Aktuell hat die aktuelle Softwareversion 63h gemäht, hat dabei 59km zurückgelegt und hat 8426 mal rotiert.
  • Der Linienverfolgungsalgorithmus wurde aktuell für das Chassis mit Antriebsrädern hinten optimiert. Aufgrund des kurzen Abstandes von Spule zu den Rädern des original Chassis kann es notwendig sein einen anderen Algorithmus zu programmieren.
  • Optimierung für das Original Chassis (Das mähen funktioniert mit dem Workaround schon sehr gut. Ggf. mit den Parametern CONF_PER_CORRECTION_ANGLE und CONF_PERIMETER_DRIVE_BACK_CM etwas spielen)
  • Ausweichen von Objekten, die nahe am Perimeter stehen optimieren (SecondReverse2 im BHT)
  • Einseitig befahrbare Ladestation umsetzen

Weitere Wünsche

  • Regensensor einbinden
  • Die Ladestation wird aktuell nur counter clockwise angefahren.
  • Verstärken des Signals der Ladestation auf +-20V Spannung Hub
  • SRF08 einbinden
  • I2C Temperatursensoren einbinden
  • Anfahren der Ladestation mit GPS. 15m vor der Ladestation auf den Perimeter fahren und dann in die Ladestation einfahren.
  • GPS Karte - es kann sein, dass der Mower das Signal in der Mitte des Rasens nicht erkennt, da das Signal zu schwach ist. Man kann dann mit GPS dann sehen, ob man auf der Fläche ist. Wenn man nun sagt, dass das Signal mindesten in 15m Abstand vom Perimeter erkannt werden muss, kann man es innerhalb der Fläche vernachlässigen wenn das GPS Signal anzeigt, das man auf der Fläche ist.
  • GPS Karte - Vermerken wo der Robbi schon gemäht hat. Dann ggf. in weniger gemähten Bereichen mähen.

Die GPS Karte wird vermutlich auf einen externen Prozessor ausgelagert weden müssen.


Für eine minimale Inbetriebnahme sollten folgende Voraussetzungen erfüllt sein

  • PCB1.3 mit Arduino DUE
  • Original Ardumower Antriebsmotoren mit Encoder
  • Original Mähmotor
  • Zwei Ardumower Perimeterspulen vorne Links/Rechts. Bei original Chassis ggf. montiert: Links/Mitte (kommt darauf an, welchen Linienverfolgungsalgorithmus man verwendet)
  • BT Modul
  • RTC mit EEPROM
  • Die erste Brücke für die Encoder ist auf de PCB1.3 überbrückt.
  • 24V Spanungsversorgung

Optional kann verwendet werden

  • Ardumower Bumper Pins
  • Durchfahrende Ladestation
  • Selbst gebauter Bumperduino mit 2MaxSonar Sensoren an PinUserSwitch2/3

config.h

Die Datei config.h enthält die Grundkonfiguration der Firmware.

Konsolenspeed:
#define CONF_PC_SERIAL_SPEED			115200 // Speed serial consol
Solle das bluetooh Modul bereits mir der original Ardumower Software konfigurert worden sein, ist die Zeile 
#define CONF_BT_SERIAL_SPEED			115200 
mit 
#define CONF_BT_SERIAL_SPEED			19200
zu ersetzen.
Einstellen des Radumfangs und Radabstandes:
#define CONF_RADUMFANG_CM			80.738f // Wheel circumfence in cm original ardumower: 78.54f 
#define CONF_DISTANCE_BETWEEN_WHEELS_CM		36.0f	// Distance where the wheels hits the ground do not measure on top of the wheels!!!


Für die erste Inbetriebnahme sollten die meisten Services deaktiviert werden um Fehlermeldungen zu Verhindern:
#define CONF_ENABLEWATCHDOG             	false   // Set to false to disable Watchdog. true to enable.
#define CONF_DISABLE_RANGE_SERVICE		true    // Disables my own range sensor running on bumper duino on pinUserSwitch3 => diNearObsacleSensor
#define CONF_DISABLE_BUMPER_SERVICE		true   // Disables original bumper sensor on pinBumperLeft => diBumperL and  pinBumperRight => diBumperR
#define CONF_DISABLE_BUMPERDUINO_SERVICE	true   // Disables my own bumper duino sensor on pinUserSwitch2 => diBumperSensor
#define CONF_DISABLE_PERIMETER_SERVICE	        false   // Disables perimeter sensor
#define CONF_DISABLE_RTC_SERVICE		true    // Disables rtc sensor
#define CONF_DISABLE_EEPROM_SERVICE		true   // Disables EEPROM requests
#define CONF_DISABLE_BATTERY_SERVICE	        true   // Disables battery sensor
#define CONF_DISABLE_CHARGE_SERVICE		true   // Disables charge system service
#define CONF_DISABLE_MOTOR_STALL_CHECK  	true   // Disables the motor stall/encoder check in closed loop control
#define CONF_DISABLE_MOW_MOTOR          	false   // Disables the mow motor
#define CONF_DISABLE_CHARGINGSTATION    	true


NUR FÜR DAS original Ardumower Chassis sollten noch folgende Konstanten abeänder abgeändert werden:
#define CONF_PER_CORRECTION_ANGLE       30
#define CONF_PERIMETER_DRIVE_BACK_CM    40.0f  


Da nun häufiger kompiliert wird, ist es sinvoll den Roboter aufzubocken, so dass die Antriebsräder und der Mähmotor frei drehen können.

Nach dem ersten kompilieren und aufspielen sollte als letzte Zeile folgendes angezeigt werden:

Press H for help.


Hier H eingeben. Danach werden alle verfügbaten Befehle angezeigt. Diese am besten kopieren und abspeichern, so dass man diese einsehen kann.


QUICKSTART TO MOW

Der roboter ist über das Konsolenkabel verbunden. Speed: 115200

Zum warm werden: Konfiguration des Batterie service

In config.h folgendes setzen und Software neu aufspielen.

#define CONF_DISABLE_BATTERY_SERVICE	false

bat.show eingeben. Es sollte die richtige Batterispannung angezeigt werden.

Inbetriebnahme der Motoren

Den Befehl clc.mt,1,150 eingeben. Damit wird der Motor links direkt mit einer PWM con 150 angesteuert. Bei Werten unter 100 kann es sein, dass sich der Motor nicht dreht. Gestoppt wird das Rad dann mit clc.mt,0,0

Das Rad linke sollte sich vorwärts drehen. Falls nicht muss es umgepolt werden.

Das gleiche für das rechte Rad: clc.mt,2,150

Sollten sich die Räder nicht drehen, kann man es noch mit einer höheren PWM versuchen.


Anmerkung: Die PWM für die Motoren läuft mit 20000Hz. Original Adrumower PWM ist 3900Hz. Wenn man die Originalwerte verwenden möchte, muss man nachfolgende Zeilen in pinman.cpp auf 3900 abändern.

  1. define PWM_FREQUENCY 20000
  2. define TC_FREQUENCY 20000


Inbetriebnahme der Encoder

Den Befehl clc.mt,1,150 eingeben, damit sich das linke Rad dreht. Dann clc.enc eingeben, um die Encoderwerte anzuzeigen. Die Encoder haben zwei Zähler. Einmal einen Absolutencoder, der zählt immer positive egal wie rum sich das Rad dreht. Und einmal einen Encoder, der bei Forwärtfahrt hochzählt und bei Rückwärtsfahrt zurückzählt. Beide angezeigten Zähler des linken Rades müssen nun hochzählen.

Die Ausgabe wird mit dem Befehl: h beendet.

Beispiel:
motor 1 = Links
motor 2 = rechts -sollte nicht zählen, wenn der linke Motor läuft.
!03,motor 1 enc: 972 absEnc: 972 rpm: 2.596326  m/h: 125.773315 deltaTicks: 2 deltaTime: 32986us
!03,motor 2 enc: 974 absEnc: 974 rpm: 3.325853  m/h: 161.113647 deltaTicks: 2 deltaTime: 33445us
!03,motor 1 enc: 974 absEnc: 974 rpm: 2.923552  m/h: 141.625061 deltaTicks: 2 deltaTime: 33156us
!03,motor 2 enc: 975 absEnc: 975 rpm: 2.678638  m/h: 129.760696 deltaTicks: 1 deltaTime: 33144us
!03,motor 1 enc: 976 absEnc: 976 rpm: 3.132316  m/h: 151.738159 deltaTicks: 2 deltaTime: 32857us
!03,motor 2 enc: 976 absEnc: 976 rpm: 2.296233  m/h: 111.235962 deltaTicks: 1 deltaTime: 32859us
!03,motor 1 enc: 978 absEnc: 978 rpm: 3.251686  m/h: 157.520752 deltaTicks: 2 deltaTime: 32998us
!

Falls der enc negative beim Vorwärtsfahren zählt kann man das in der config.h konfigurieren:

#define CONF_LEFT_ENCODER_INVERSE		false
#define CONF_RIGHT_ENCODER_INVERSE		false

das gleiche für das rechte Rad durchführen:

clc.mt,1,150

Befehl wird mit clc.mt,0,0 gestoppt.

Nachdem die Zeilen in der config.h richtig eingestellt wurden, neu kompilieren und aufspielen.