Steuerung (Updates)

Ich habe heute angefangen, einen Prototyp der Arduino-Software zu entwickeln, d.h.

--geplante Features erster Prototyp--
1. Antriebsmotoren
2. zwei Bewegungsschema
a) vorwärts+drehen (Tianchen TC-G158 & Co.)
b) vorwärts+rückwärts (Ambrogio L50)
3. Mähmotor
4. Automat (Änderung über Zustände)
5. Bumper
6. Kompass
7. Ultraschall
8. PID (digitaler Regler für Induktionsschleifenfahren, Kompaßfahren etc.)
9. "Hohes Gras"-Erkennung (Mähmotorstrom)
10. Kreis-Mähen

Eigentlich muss ich nur meinen bereits entwickelten ATMEGA-Code nach Arduino portieren...also relativ schnell machbar.
Werde das ganze zunächst mit meinem modifiziertem TC-G158 Board testen, welches ja bereits Arduino-kompatibel ist ;)

Sobald die genannten Features der ersten Version gut laufen, werde ich den Code dann veröffentlichen. Später werden dann fehlende Features ergänzt (Mähmotor Geschwindigkeitsmodulation, Induktionsschleife, Nach-Hause-Fahren, Ladekontrolle)
 
Roger schrieb:
@nero76
ich bin gespannt auf deinen Prototyp der Arduino-Software.

Also, da das Original Controller-Board von meinem Ambrogio L50 ja defekt ist, habe ich diesen Robot jetzt erstmal als Grundlage genommen - ist im Prinzp aber kein großer Unterschied zu Rotenbach/Tianchen etc. (Robot ist Robot, Software soll ja beide abdecken).
Die Hardware (d.h. für den Antrieb) ist gerade fertig geworden und funktioniert. Als nächstes werde ich dann die Tianchen-Module für die Induktionsschleife ausprobieren, dann alle weiteren Sensoren (Kompaß etc.), d.h. damit die Software testen und verbessern.
Hier schon mal zwei Bilder:
L50 Arduino 1
L50 Arduino 2
Melde mich wieder in ein paar Tagen wenn alles läuft :)
 
Zuletzt bearbeitet von einem Moderator:
Roger schrieb:
@nero76
ich bin gespannt auf deinen Prototyp der Arduino-Software.
Gibt es zufällig jemanden der Code oder Codeschnipsel für Mähroboter in BASCOM hat?

Ich habe leider nur Arduino-Codeschnipsel. Das einfache "Umherfahren" (Motorstrom, Bumper abfragen, drehen etc.) ist heute fertig geworden. Als nächstes kommt wohl die Induktionsschleife dran...

Arduino-Code (Pre0.1)
 
Zuletzt bearbeitet von einem Moderator:
Version 0.3.3 ist draußen und hat den Probelauf (in unserem Dschungel) absolviert :)

Die Highlights habe ich mal als Video zusammengefaßt :)

http://www.youtube.com/watch?v=5v975n5punU&feature=youtu.be
 
Gebial :woohoo: :woohoo: :woohoo: :woohoo: :woohoo:

Der Ferrari Mäher gefällt mir gut :evil: :evil: :evil: :evil:

Wie ist das verhalten mit dem US Sensor ??? ist er sehr empfindlich ?? Und könnte man auch 4 oder 6 US Sensoren einbauen ??

Mir juckt es schon in den Finger, aber noch fehlen mir ein paar Teile :( :(


Mfg Hendrik


ps wie schaut das Problem mit dem Kompass aus??
 
Hendrik schrieb:
Wie ist das verhalten mit dem US Sensor ??? ist er sehr empfindlich ?? Und könnte man auch 4 oder 6 US Sensoren einbauen ??
Mir juckt es schon in den Finger, aber noch fehlen mir ein paar Teile :( :(

ps wie schaut das Problem mit dem Kompass aus??

Der Sensor ist relativ empfindlich. Nur in Grenzsituationen übersieht er schon mal was. Klar, kann man mehr einbauen. Ich baue übrings gerade die Arduino-Steuerung auch in meinen Tianchen ein (siehe Anhang), dort sollen dann 2 Ultraschall-Sensoren zum Einsatz kommen (4 oder 6 ist wohl etwas übertrieben, aber gehen würde das auch). Werde die Software dahingehend noch anpassen.

Das Problem mit dem Kompass kommt später dran. Eigentlich hat sich das Hauptproblem ("Robot mäht primär an der tiefsten Stelle des Gartens") schon durch die neue Arduino-Steuerung erledigt. Der Robot fährt nun überall hin (warum bekommen das Hersteller von 1500 EUR teuren Mährobotern selber nicht auch hin?! ;-))
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/hb0bfb9c.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Die nächste Version der Software (v0.4 - fast fertig) wird eine weitere "Zwischenschicht" haben. Für jeden Robot gibt es dann eine extra Datei...

aml50.h Ambrogio L50 configuration
spm12320.h Supoman SPM12-320 configuration (Rotenbach etc.)
tcg158.h Tianchen TC-G158 configuration (using original board connected to Arduino)

...welche die Konfiguration/typischen Werte für diesen Robot beinhaltet und welche man als Vorlage nehmen und anpassen kann.

Dies ist notwendig geworden, weil sich die Programmierung der Roboter teilweise unterscheidet.

Das ganze wird deart universell, dass man auch komplett andere Hardware einsetzen kann. Die Konfigurationsdatei wird dann vom Programm aufgerufen, um z.B. Sensoren abzufragen (readSensor) oder Motoren anzusteuern (setActuator). Die Konfiguration bestimmt dann selber, wie das zu tun ist. Damit wird es erstmal möglich sein, die Original-Steuerung (verbunden mit dem Arduino Mega) zu verwenden. In meinem Fall ist das die Original-Tianchen-Steuerung und bei robi2mow z.B. die Original Ambrogio-L50-Steuerung.

Beispiel einer Konfiguration (hier Tianchen Original-Board mit Arduino verbunden):



Code:
// Tianchen TC-G158 configuration (using original board connected to Arduino)
// (Arduino Mega)
/*
  STC uC pinout:
     04 02 32 30        01-      09-TILT    17-         25-MR.S
  05 06 03 01 31 29     02-BUZZ  10-        18-MOW.M    26-MUX.S1
  07 08       28 27     03-      11-        19-MR.D     27-ML.S
  09 10  TOP  26 25     04-      12-        20-MOW.S    28-L.1234
  11 12       24 23     05-      13-MR.C    21-BUMP.L   29-MUX.Z (0=bat, 1=rain, 2=pow, 3=pow) 
  13 15 17 19 22 21     06-RC    14-ML.C    22-BUMP.R   30-ML.D
     14 16 18 20        07-      15-        23-MUX.S0   31-IR
                        08-      16-        24-         32-
*/
// ------ configuration --------------------------------------------------
// ------ features 
const char driveBiDir = 0;      // drive bidirectional (1) (forward/backward) or make turns only (0)? 
const char useBumper = 1;       // has bumpers? 
const char useCompass = 0;      // use compass sensor?
const char useAccel = 1;        // use ultra sonic sensor?
const char useSonar = 1;        // use acceleration sensor?
const char useTilt = 1;         // has tilt sensor? (required for TC-G158 board)
const char useButton = 1;       // has digital ON/OFF button?
const char usePerimeter = 1;    // use perimeter?
// ------ pins
#define pinMotorLeftPWM 4          // left motor pins
#define pinMotorLeftDir 31
#define pinMotorLeftSense A1
#define pinMotorRightPWM  3        // right motor pins
#define pinMotorRightDir 33
#define pinMotorRightSense A0
#define pinMotorMow 2              // mower motor pins
#define pinMotorMowSense A3
#define pinBumperLeft 39           // bumper pins
#define pinBumperRight 37
//#define pinSonarCenterTrigger 24         // ultrasonic sensor pins
//#define pinSonarCenterEcho 22
#define pinSonarRightTrigger 30         
#define pinSonarRightEcho 32
#define pinSonarLeftTrigger 34         
#define pinSonarLeftEcho 36
//#define pinPerimeterRight A4       // perimeter
//#define pinPerimeterLeft A5
#define pinPerimeterMuxZ A6           // perimeter mux Z (only TC-G158 board)
#define pinLED 13                  // LED
#define pinBuzzer 53               // Buzzer
#define pinTilt 35                 // Tilt sensor (required for TC-G158 board)
#define pinButton 51               // digital ON/OFF button
//#define pinBatteryVoltage A2       // battery voltage sensor
//#define pinChargeCurrent A8        // charge current sensor
#define pinMuxS0 28                // mux S0 (only TC-G158 board)
#define pinMuxS1 26                // mux S1 (only TC-G158 board)
#define pinMuxZ A7                 // mux Z (only TC-G158 board)
// compass (I2C):   SCL A5 ,  SDA A4
// ------- other
#define BAUDRATE 19200            // serial output baud rate
#define MAX_MOTOR_SPEED 127       // motor wheel max PWM  (8-bit PWM=255, 10-bit PWM=1023)
#define MAX_MOTOR_CURRENT 30      // motor wheel max current (8-bit ADC:0..255 , 10-bit ADC:0..1023)
#define MAX_MOW_SPEED   63       // motor mower max PWM
#define MAX_MOW_CURRENT 60        // motor mower max current
#define motorRightSenseZero 0     // motor right sense zero point 
#define motorLeftSenseZero 0      // motor left sense zero point
#define motorMowSenseZero 0       // motor mower sense zero point
#define chargeSenseZero 0         // charge current sense zero point
#define BATTERY_FAC 4.7           // battery conversion factor
#define MAX_ECHO_TIME 5000        // ultrasonic sensor max echo time
#define MAX_PERIMETER 900         // perimeter threshold 
// ------ configuration end -------------------------------------------

void config(){
  pinMode(pinMotorLeftPWM, OUTPUT);
  pinMode(pinMotorLeftDir, OUTPUT); 
  pinMode(pinMotorRightPWM, OUTPUT);
  pinMode(pinMotorRightDir, OUTPUT); 
  pinMode(pinMotorMow, OUTPUT); 
  digitalWrite(pinMotorMow, HIGH);
  //pinMode(pinMotorLeftSense, INPUT);     
  //pinMode(pinMotorRightSense, INPUT);     
  pinMode(pinMotorMowSense, INPUT);     
  pinMode(pinLED, OUTPUT);    
  pinMode(pinBuzzer, OUTPUT);    
  //pinMode(pinBatteryVoltage, INPUT);      
  pinMode(pinMuxZ, INPUT);
  pinMode(pinPerimeterMuxZ, INPUT);
  pinMode(pinMuxS0, OUTPUT);
  pinMode(pinMuxS1, OUTPUT);  
  if (usePerimeter){
    //pinMode(pinPerimeterRight, INPUT);    
    //pinMode(pinPerimeterLeft, INPUT);        
  }  
  if (useButton){
    pinMode(pinButton, INPUT);
    pinMode(pinButton, INPUT_PULLUP);
  }    
  if (useBumper){
    pinMode(pinBumperLeft, INPUT); 
    pinMode(pinBumperLeft, INPUT_PULLUP);
    pinMode(pinBumperRight, INPUT);     
    pinMode(pinBumperRight, INPUT_PULLUP);
  }     
  if (useTilt){
    pinMode(pinTilt, INPUT); 
    pinMode(pinTilt, INPUT_PULLUP);    
  }  
  if (useSonar){
    //pinMode(pinSonarCenterTrigger, OUTPUT); 
    //pinMode(pinSonarCenterEcho, INPUT); 
    pinMode(pinSonarLeftTrigger, OUTPUT); 
    pinMode(pinSonarLeftEcho, INPUT); 
    pinMode(pinSonarRightTrigger, OUTPUT); 
    pinMode(pinSonarRightEcho, INPUT); 
  }  
  if (useAccel) initADXL345B();
  if (useCompass) initHMC5883L();
}

void mux(int channel){
  digitalWrite(pinMuxS0, channel & 1);
  digitalWrite(pinMuxS1, channel & 2);  
  delay(1);
}

int readSensor(char type){
  switch (type) {
    case SEN_MOTOR_RIGHT: return(analogRead(pinMotorRightSense)-motorRightSenseZero); break;
    case SEN_MOTOR_LEFT: return(analogRead(pinMotorLeftSense)-motorLeftSenseZero); break;
    case SEN_MOTOR_MOW: return(analogRead(pinMotorMowSense)-motorMowSenseZero); break;
    case SEN_PERIM_LEFT: mux(0); return(analogRead(pinPerimeterMuxZ)); break;
    case SEN_PERIM_RIGHT: mux(2); return(analogRead(pinPerimeterMuxZ)); break;
    case SEN_PERIM_LEFT_EXTRA: mux(3); return(analogRead(pinPerimeterMuxZ)); break;
    case SEN_PERIM_RIGHT_EXTRA: mux(1); return(analogRead(pinPerimeterMuxZ)); break;    
    case SEN_BAT_VOLTAGE: mux(0); return((int)(((double)analogRead(pinMuxZ)) * BATTERY_FAC)); break;
    //case SEN_CHG_CURRENT: return(analogRead(pinChargeCurrent)-chargeSenseZero); break;
    case SEN_BUMPER_RIGHT: return(digitalRead(pinBumperRight)); break;
    case SEN_BUMPER_LEFT: return(digitalRead(pinBumperLeft)); break;    
    case SEN_BUTTON: return(digitalRead(pinButton)); break;    
    case SEN_SONAR_RIGHT: return(readHCSR04(pinSonarRightTrigger, pinSonarRightEcho)); break;
    case SEN_SONAR_LEFT: return(readHCSR04(pinSonarLeftTrigger, pinSonarLeftEcho)); break;
    case SEN_ACCEL: readADXL345B(); break;
    case SEN_GYRO: readL3G4200D(); break;
    case SEN_COMPASS: readHMC5883L(); break;
  }
  return 0;
}

void setActuator(char type, int value){
  switch (type){
    case ACT_MOTOR_MOW: analogWrite(pinMotorMow, 255-value); break;
    case ACT_MOTOR_LEFT: setL298(pinMotorLeftDir, pinMotorLeftPWM, value);
    case ACT_MOTOR_RIGHT: setL298(pinMotorRightDir, pinMotorRightPWM, value); break;
  }
}
 
Hallo zusammen,

es gibt mal wieder eine neue Version (0.4.1).

Neues Feature (optional): Messermodulation

Die Idee dahinter ist folgende: Das Messer schneidet das Gras am besten ab einer bestimmten Mindestgeschwindigkeit. Bisher lief der Mähmotor leider immer mit voller Spannung (unabhängig davon ob der Robot gerade über hohem oder niedrigen Gras fährt). Das schont aber den Akku nicht. Und es ist laut. Wenn man nun die Drehzahl des Mähmotors mißt, kann man die Motorspannung damit regeln. Genau das macht dieses Feature. Auf hohem Gras steigt nun die Motorspannung, auf niedrigem sinkt sie wieder.

Um das Feature zu nutzen, braucht man einen Drehzahlmesser für den Mähmotor. Ich benutze dazu einen Hall-Sensor (A1302 KUA-T). An die Motorwelle kommt dann ein kleiner Magnet (siehe genannten Link für Details).

Anschluß des Hallsensors (Beispiel):

Code:
Hall Sensor A1302 +5V    ----  +5V
Hall Sensor A1302 GND    ----  GND            
Hall Sensor A1302 Signal ----  Arduino Pin 18


PS: Man braucht nur einen Hall-Sensor für die Drehzahlmessung (der Link zeigt wie man mit zwei Sensoren auch noch die Drehrichtung aus der Zeitdifferenz bestimmen kann).

Gruss,
Alexander
 
Roger schrieb:
Hast du schon praktische Erfahrungen damit gemacht? Entsteht durch das Magnetgewicht an der Motorwelle eine Unwucht, die man evtl. durch ein Gegengewicht ausgleichen muss?

Nein, ich muss noch Erfahrungen sammeln - Ich habe es implementiert weil der Ambrogio L50 über so einen Hall-Sensor am Mähmotor verfügt. Die optimale Drehzahl/Regelung etc. muss ich noch herausfinden (bei 3300 RPM Sollwert scheint er schon ganz gut zu schneiden und dies sehr leise).

Für den Tianchen Roboter allerdings versuche ich diese Idee nachträglich einzubauen (mit einem kleinen Magneten und dem Hall-Sensor). Die Idee mit dem Gegengewicht werde ich mir merken (Danke!)
 
Zuletzt bearbeitet von einem Moderator:
Roger schrieb:
Hast du schon praktische Erfahrungen damit gemacht? Entsteht durch das Magnetgewicht an der Motorwelle eine Unwucht, die man evtl. durch ein Gegengewicht ausgleichen muss?

Ich habe heute mein Neodym-Magnet Sortiment bekommen und direkt ausprobiert (siehe Anhang).

Es hat auf Anhieb funktioniert. Es reicht wenn man den Magneten genau in der Mitte (wie auf dem Bild) platziert (evtl. mit Zweikomponentenkleber fixieren).

Ich finde eine einfache Lösung um die Drehzahl zu messen :)

UPDATE: Hier noch ein DEMO-Video :)
http://www.youtube.com/watch?v=um5jXMPC6IM&feature=youtu.be Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/ha54d571.jpg/
 
Zuletzt bearbeitet von einem Moderator:
super idee!

evt. könnte man auch einen weissen kreis auf die Welle kleben, der zur hälfte geschwärzt ist. dann könnte man optisch den weiss-schwarz wechsel=drezahl messen...

misst du auch die akkueinsparung? oder ist das noch eine vermutung, dass damit was gewonnen wird?
 
ozett schrieb:
super idee!

evt. könnte man auch einen weissen kreis auf die Welle kleben, der zur hälfte geschwärzt ist. dann könnte man optisch den weiss-schwarz wechsel=drezahl messen...

misst du auch die akkueinsparung? oder ist das noch eine vermutung, dass damit was gewonnen wird?

Ja, optisch wäre auch denkbar. Muss man alles schön abdunkeln.

Die Akkuspannung wird gemessen (siehe Ladeschaltung ), aber noch nicht weiter verarbeitet.

Versprechen würde ich mir insofern etwas, dass das Mähwerk "zum Ende hin" (d.h. wenn nur noch wenig Gras übrig ist) eigentlich nicht auf 100% laufen muss. Über den Motorstrom (Mittelwert) könnte man das aber sicherlich auch lösen, da muss ich mal schauen.
 
Zuletzt bearbeitet von einem Moderator:
nur so als idee für den spass beim programmieren:
beim sabo mowit wird wohl der motorstrom gemessen. und immer wenn der motor mehr leistung braucht, dann fängt er an ein paar runden im kreis zu mähen. warum? sabo sagt: dann ist das gras an dieser stelle dichter und wird hier spiralförmig gemäht. die stelle ist dann sicher abgemäht, und man muss nicht auf zufällige querfahrten warten. finde ich eigentlich nicht schlecht, die idee...
 
ozett schrieb:
nur so als idee für den spass beim programmieren:
beim sabo mowit wird wohl der motorstrom gemessen. und immer wenn der motor mehr leistung braucht, dann fängt er an ein paar runden im kreis zu mähen. warum? sabo sagt: dann ist das gras an dieser stelle dichter und wird hier spiralförmig gemäht. die stelle ist dann sicher abgemäht, und man muss nicht auf zufällige querfahrten warten. finde ich eigentlich nicht schlecht, die idee...

Ja, gute Idee! Dieser Spiral-Mäh-Modus ist mit auf der TODO-Liste. Der Clou ist aber wohl zu erkennen wann "mehr Strom" fließt. Meine Idee ist dass man einen Mittelwert der Strommessungen über die Zeit berechnet und dann schaut inwieweit der gerade gemessene Strom davon abweicht:

Geringe Abweichung: weiter normal mähen
Größere Abweichung: Spiral-Mäh-Modus starten
Sehr große Abweichung: Blockade des Messers o.ä. - Messer aus, rückwärts und normal mähen mit Messer an
 
Zuletzt bearbeitet von einem Moderator:
Version 0.5 der Steuerung ist online (Neu: RC-Fernbedienung)

Hier erfährt man wie ich es umgesetzt habe. Desweiteren sieht man auf dem Bild mit wie wenig Raum ich bei den Komponenten auskommen muss (z.B. einziger möglicher Ort für meine Spulen!)
 
Feine Sache mit der RC Fernbedienung.
Allerdings muss mein Mäher erst mal laufen.
Habe jetzt alles soweit zusammen gebaut aber irgendwie ist der Wurm drin.
Erstes Problem, der Mäher fängt nach dem Aktivieren sofort an zu rangieren, als ob er ständig ein Signal bekommt zudrehen.
Bumper oder anderes ist nicht angeschlossen. Einzig die Spulen sind drauf geschaltet.
Sind aber sauber eingestellt und er reagiert so auch, wenn der Signal Generator aus ist.
Das Motortest Programm läuft sauber durch, richtige Seiten, Drehrichtungen und Geschwindigkeiten.
Vielleicht muss ich mal ne Nacht drüber schlafen und sehe morgen den Fehler.
Aktueller Stand:
0.21 läuft fehlerhaft
0.33 Mower läuft nicht an
0.5 kann ich nicht aufspielen.

Ein weiteres Problem, ich weiß nicht in welchem Status der Mower ist, da bei mir nicht's piept.

Ich brauche wohl ne Mütze voll Schlaf, ich seh den Wald vor Bäumen nicht.
 
naneona schrieb:
Ich brauche wohl ne Mütze voll Schlaf, ich seh den Wald vor Bäumen nicht.
Auf jeden Fall ausgeschlafen die Sache angehen ;)

Zum Testen würde ich den Mäher erstmal wieder aufbocken! Dann Am PC via serieller Konsole anschauen was er so macht. Es ist auch sehr ratsam mindestens einen Taster und einen Piezo-Buzzer anzuschließen - damit man später am Rasen wenigstens ein bisschen Feedback bekommt. Den Taster braucht man, um den entsprechenden Mähmodus zu aktivieren (gibt inzwischen mehrere), den Piezo-Speaker um zu wissen, welchen Modus man gerade wählt.

Am PC sieht man übrings den Zustand des "Mähautomaten". Also ob er sich gerade für "vorwärts" (FORW), rückwärts (REV), drehen (ROLL) etc. entschieden hat. Man sieht auch den Grund dafür. Wenn z.B. ein Bumper angesprochen hat, zählt dieser Wert um eins hoch. Beispiel:

bum 0002 0000 (linker Bumper hat zweimal angesprochen)

Insgesamt werden ausgegeben:

Code:
1) Zeit des aktuellen Automat-Zustands (ms)
2) loop()-Durchgänge pro Sekunde
3) gewählter Sensor-Verbose-Modus (0=Zählerstände/1=Sensorwerte/2=Sensorwerte)
4) aktuelle Automat-Status (FORW, REV, ROLL etc.)
5) nach-Hause-fahren? (1/0)
6) Ansteuerung/Geschwindigkeit Motor: links (PWM), rechts (PWM), Mähwerk (Drehzahl)
7) Stromüberschreitungszähler Motor: links, rechts, Mähwerk
8) Bumperzähler: links, rechts
9) Ultraschall-Abstand-unterschritten: Zähler
10) Neigung (errechnet mit Beschl.-Sensor)
11) Kompaß-Kurs
12) Induktionsschleifendetektor: Zähler
13) Batterie-Spannung
14) Ladestrom

Also einfach mal schauen, was er dort so anzeigt - Evtl. löst ja ständig ein Bumper aus, obwohl keiner dran ist.

PS: Falls die Motor-Geschwindigkeit beim rangieren zu hoch ist ("Mäher reagiert etwas hecktisch"), mal "MAX_MOTOR_SPEED" heruntersetzen (z.B. auf 160)
 
Zuletzt bearbeitet von einem Moderator:
Hallo zusammen,

die Software hat einige Updates erfahren:

- Code für Schleifenempfänger v0.5 unterstützt nun zusätzlich I2C Schnittstelle (alte Verdrathung läuft weiterhin)
- Code für IMU 0.4.0 unterstützt nun Kalibrierung ohne externe App - gestartet wird die Kalibrierung per Arduino Konsole oder per pfodApp (verwendet I2C Schnittstelle)
- Code für Ardumower 0.9.1.4 unterstützt nun Starten/Stoppen der Kalibrierung via pfodApp (Untermenü Settings/IMU)

Die Anleitung zum Kalibrieren auf der Projektseite werde ich anpassen.

Gruss,
Alexander
 
Nachtrag: Kalibrierung ist nochmals verbessert worden und arbeitet etwas präziser (IMU-Code v0.4.1).

Kalibrierungs-Ergebnisse sollten nun genauso exakt sein wie in damaliger Version mit externer Kalibrierungs-App. Mit "exakt" ist insbesondere gemeint, dass der Norden exakt 180 Grad gegenüber dem Süden liegt nach der Kalibrierung. Falls das nicht der Fall ist, fährt der Roboter nicht den exakten Umkehrkurs zurück.
 
Oben