Perimeter-Schleife: Unterschied zwischen den Versionen

Aus www.wiki.ardumower.de
Wechseln zu: Navigation, Suche
(Einstellungen)
(Einstellungen)
Zeile 156: Zeile 156:
 
</gallery>
 
</gallery>
  
At first, activate the perimeter in the Ardumower software (pfodApp->Options->Perimeter Use: YES).
+
At first, activate the perimeter in the Ardumower software (pfodApp->Options->Perimeter Use: YES). It is recommended to keep the default perimeter settings.
  
Further options are:
+
The perimeter settings are:
  
 
* Timed-out if below smag (timedOutIfBelowSmag) - default setting: 300 | If smag below this value, sender is considered as off (perimeter timeout appears)
 
* Timed-out if below smag (timedOutIfBelowSmag) - default setting: 300 | If smag below this value, sender is considered as off (perimeter timeout appears)

Version vom 30. Mai 2016, 14:07 Uhr

Zusammenfassung

Eine Begrenzungsschleife (oder Perimeterdraht) ist eine Art 'elektronischer Zaun': er veranlaßt den ArduMower zum Stoppen / Umkehren sobald die Grenze erreicht ist. Nicht in jeder Umgebung ist eine Begrenzungsschleife notwendig.

Das Prinzip: durch den im Garten verlegten Schleifendraht wird ein Signal gesendet, das der Ardumower ausgewertet. Gebraucht werden ein Sender zur Erzeugung und Übergabe des Signals an die Schleife und ein Empfänger zur Signalauswertung im ArduMower.

Und so wird das Signal empfangen: eine Empfangsspule liefert ein Signal, dessen Stärke je nach Abstand zwischen Schleifendraht und Empfangsspule variiert. Interessanterweise wechselt das Signal in dem Moment seine Polarität, wo der ArduMower (genauer: die Empfänger-Spule) den Schleifendraht überfährt.

Begrenzungsschleife

Dies ist die neue Version von Sender und Empfänger für die Begrenzungsschleife (erhältlich über den shop Shopping.png).

Beim Überfahren des Schleifendrahtes passiert nun etwas Interessantes: die Polarität der Signalspannung wechselt von negativ auf positiv bzw. umgekehrt - je nachdem, ob man von innen oder außen kommt. Dadurch werden sowohl das Überfahren selbst als auch der Status (Aufenthalt innerhalb oder außerhalb der Schleife) eindeutig erkennbar. Wie bei der V1 nutzen wir zur Signalverstärkung wieder den Motortreiber für das Ausgangssignal und einen Operationsverstärker für das Eingangssignal von der Empfangsspule. Der Sender übergibt eine digitale Signalfolge (auch als 'pseudo-noise' bezeichnet) an die Schleife, die vom Empfänger über einen software-basierten digitalen Matched-Filter ausgewertet wird. Der Filter liefert als Ergebnis einen Peak: positiv - ArduMower innerhalb oder negativ - ArduMower außerhalb der Begrenzungsschleife.

Prinzipablauf Sender:

  1. Erzeugen des Ausgangssignals durch den Arduino Nano (ca. 3 Khz)
  2. Verstärkung des Ausgangssignals durch den Motortreiber (MC33926), Schleifendrahtenden anstatt eines Motors an den Ausgang anschließen

Prinzipablauf Empfänger:

  1. Eingangssignal per Empfangsspule aufnehmen
  2. Eingangssignal per Operationsverstärker (LM386) verstärken
  3. ADC sampling durch Arduino Mega (mit 9615 Hz)
  4. Signalfilterung and Analyse durch ein digitales Filter (software-basierter Matched-Filter-Algorithmus)
  5. Auswertung des matched filter Ergebnisses (zur Feststellung des Aufenthaltbereiches inner- / außerhalb der Schleife, Schleifenabfahren usw.)

Folgende Bilder erklären den Wechsel der Signalpolarität innerhalb und außerhalb der Schleife. Sie zeigen auch die Richtung der magnetischen Flusslinien, die vom Begrenzungsdraht ausgehen und wie sie die Spule innerhalb und außerhalb der Begrenzungsschleife treffen. Für ein besseres Verständnis des Filters gibt es den Matched Filter Simulator. Für weitere Informationen zum Filter, schaue Dir auch das Matched Filter Video an.

Sender

Wir benutzen einen Arduino Nano zur Erzeugung und einen Mototreiber als Ausgangsverstärker des Signals. Der Motortreiber wird mit 3,2 kHz betrieben (2 Impulsbreiten 4808 und 2404 Hz). Bei ausreichend langen Schleifendrähten benötigt der Generator typischerweise 10W (6.5V, 1.7A). Unser Motortreiber verfügt über eine integrierte Strombegrenzung und eine Übertemperaturabschaltung (z.B. MC33926). Die Schleifenlänge kann im Bereich 20 - 450m betragen und muss mindestens 5 Ohm Widerstand aufweisen. Die maximal Begrenzungs-Fläche beträgt 1000 m2.

Sendersoftware

NOTE: Wenn Du Dich nie zuvor mit Arduino beschäftigt hast, lies zuerst unsere Einführung 'erste Schritte mit dem Arduino'.

Download: You can find the sender code in the 'sender' folder of the Ardumower Download

Warning.png Wichtig: Vergewissere Dich, dass die Pin-Konfiguration des Arduino im benutzten Code (sender.ino) mit Deinem Senderaufbau übereinstimmt! Falls Dein Arduino Nano sich nicht flashen lässt, schaue bitte hier für ein Treiber-Downgrade.

Im Code (sender.ino) die passende Option für die automatische Schleifenabschaltung (bei Verwendung des oben beschriebenen Stromsensors Option 1) wählen:

  • Define if you have connected a charging current sensor for automatic sender standby: #define USE_CHG_CURRENT 1 (or 0)

Einstellung der Senderstromstärke

Zur Einstellung der Sendeleistung (Spannung*Strom) gibt es verschiedene Möglichkeiten:

  • Spannung am DC/DC-Wandler: die Versorgungsspannung des Motortreibers kann über das Poti des Wandlers zwischen 6.5 bis 12V eingestellt werden. Das ist der empfohlene Weg. Beachte: der MC33926 Motortreibermotor benötigt eine Mindestspannung (Vin) von 5V. Bei zu geringer Spannung regelt der Motortreiber sporadisch ab und die Arduino-LED zur Anzeige von Unterspannung fängt an zu blinken.
  • Normale Amplitude: statt die Perimeterschleife zwischen +Vin und -Vin (doppelte Amplitude ist Standardwert) umzuschalten, kann der Motortreiber auch nur zwischen +Vin und GND (einfache Amplitude). So zieht die Schleife weniger Strom. Zur Einstellung der einfachen Amplitude muß die entsprechende Codezeile in 'sender.ino' auskommentiert werden:
 // #define USE_DOUBLE_AMPLTIUDE    1   
  • Hochlastwiderstand: Bei einem Schleifenwiderstand kleiner 5 Ohm kann der Strom nicht weiter reduziert werden, indem man die Spannung runterdreht: unterhalb von ca. 6V arbeitet der Arduino nicht mehr richtig. Dann hilft nur noch ein zur Schleife in Reihe geschalteter Hochlastwiderstand (R: z.B. 5 Ohm, 10W).
@6V (Vin): 5 ohm Hochlastwiderstand => I=U/R=6V/5Ohm=1.2A   (P=U*I=6V*1.2A=7.2W)

Daher also die mindestens 10W Belastbarkeit des Widerstandes! In diesem Falle auch die 'einfache Amplitude' im Sendercode aktivieren (doppelte Amplitude nicht benutzen!).

Automatische Schleifensignalabschaltung

Während sich der ArduMower in der Ladestation aufhält, wird das Schleifensignal nicht benötigt und wir können Energie sparen. Zum Erkennen des Ladestatus wird im Sender ein Stromsensor (INA169) zwischen Ladegerät und Ladeanschlüsse geschaltet.

Zum aktivieren dieser Funktion ist "#define USE_CHG_CURRENT" auf 1 zu setzen

   #define USE_CHG_CURRENT       1     // use charging current sensor for robot detection? (set to '0' if not connected!)

Desweiteren muss der Stromsensor am analogen Eingang A2 kalibriert werden:

  • Der Mover befindet sich nicht in der Ladestation/ Ladestrom = 0 Ampere
  • Den seriellen Monitor aufrufen
  • In der Befehlszeile 1 eingeben und Button "Senden" drücken
  • Mit diesem Befehl wird die Spannung am analogen Eingang A2 gemessen und im EEPROM als Referenzwert "chargeADCZero" gespeichert
  • Am Monitor erscheint folgender Text:
   received key=1
   calibrateChargeCurrentSensor (note: robot must be outside charging station!)
   calibration done
   chargeADCZero=755

Die Kalibrierung ist damit erfolgt. Bei den weiteren Messungen wird im seriellen Monitor unter "chgCurrentADC" der Wandlerwert des analogen Eingangs A2 angezeigt:

   time=4	chgCurrent=0.000	chgCurrentADC=755.55	 isCharging=0


Wir simmulieren einen Ladevorgang durch Belastung der Ladebuchse durch einen 22 Ohm Widerstand. Es fließt ein Ladestrom von ca. 0,8 Ampere. Damit ändert sich der "chgCurrentADC" auf 712.63. "chgCurrent" zeigt den Ladestrom in Ampere

   time=8      chgCurrent= 0.801       chgCurrent  ADC=712.63	  isCharging=1	

Das Flag "ischarging" wird auf "1" gesetzt und die Perimeterschleife wird für die Dauer der Ladung abgeschaltet.

Sender Zustandsanzeige

Die LED auf dem Arduino Nano signalisiert den Senderstatus:

  • An: Perimeterschleife ist angeschlossen und arbeitet
  • Aus: Perimeterschleife ist geöffnet (oder durch Defekt unterbrochen) und arbeitet nicht
  • Blinkt: der ArduMower wird geladen und die Perimeterschleife ist zur Energieeinsparung durch die Software deaktiviert

Bei der Platine "Sender V2" ist dieses Signal am Ausgang "D13" verfügbar und auf die LED "Mover_in_Ladestation" geschaltet.

Empfänger

Zum Signalempfang verwenden wir eine Spule (100 mH or 150 mH) in aufrechter Position, in der Mitte am vorderen Rand des ArduMower. Sie ist zur Verstärkung des empfangenen Signals mit dem Eigang eines LM386 Operationsverstärkers verbunden. Auf dem LM386 Modul wird der Kondensator C3 überbrückt, damit der Verstärker ein Signal zwischen 0..5V statt im Standardbereich -5V..+5V) liefert. Der Ausgang des LM386 sollte mit dem Arduino Analog-Pin ('pinPerimeterLeft') verbunden werden. Der Analog-Pin 'pinPerimeterRight' wird bei Verwendung des Senders V2 nicht benötigt.

Das Empfänger-Kit ist erhältlich im Shop


Achtung: Die Spule muss direkt an den Verstärkermodul angeschlossen werden. So wird die Störfestigkeit des schwachen Spulensignals gegenüber Einflüssen anderer Komponenten (Motore, DC-DC-Wandler) verbessert.

Wichtig: Die aktuelle Software erfordert das Weglassen des Kondensators 4.7nF in Reihe mit der Spule ('differential signal').


Einstellungen

At first, activate the perimeter in the Ardumower software (pfodApp->Options->Perimeter Use: YES). It is recommended to keep the default perimeter settings.

The perimeter settings are:

  • Timed-out if below smag (timedOutIfBelowSmag) - default setting: 300 | If smag below this value, sender is considered as off (perimeter timeout appears)
  • Timeout (s) if not inside (timeOutSecIfNotInside) - default setting: 8
  • Trigger timeout (perimeterTriggerTimeout) - default setting: 0 | Perimeter outside trigger timeout when escaping from inside (ms)
  • Perimeter out roll time max (perimeterOutRollTimeMax) - default setting: 2000 | Max (random generator) roll time after perimeter out (ms)
  • Perimeter out roll time min (perimeterOutRollTimeMin) - default setting: 750 | Min (random generator) roll time after perimeter out (ms)
  • Perimeter out reverse time (perimeterOutRevTime) - default setting: 2200 | Time to drive reverse after perimeter out (ms)
  • Perimeter tracking roll time (perimeterTrackRollTime) - default setting: 1500 | Hit obstacle while tracking: roll time
  • Perimeter tracking reverse time (perimeterTrackRevTime) - default setting: 2200 | Hit obstacle while tracking: reverse time
  • Transition timeout (trackingPerimeterTransitionTimeOut) - default setting: 2000 | Max. time required for a in/out transition during tracking, robot will start rotating after this timeout
  • Track error timeout (trackingErrorTimeOut) - default setting: 10000 | Max. time required for a in/out transition during tracking, robot will go into error after this time
  • Track_P (perimeterPID.Kp) - default setting:51 | Perimeter PID "P" setting
  • Track_I (perimeterPID.Ki) - default setting:12.5 | Perimeter PID "I" setting
  • Track_D (perimeterPID.Kd) - default setting:0.8 | Perimeter PID "D" setting
  • Use differential signal (useDifferentialPerimeterSignal) - default setting: YES | Use differential signal (see signal section)
  • Swap coil polarity (swapCoilPolarity) - default setting:NO
  • Block inner wheel (trackingBlockInnerWheelWhilePerimeterStruggling) - default setting: YES | robot is wheel-spinning while tracking => roll to get ground again

Abstand Spule/Verstärker zu Motoren

Achte auf die Einhaltung aller Mindestabstände zwischen den folgenden Komponenten:

* Spule zu Radmotor: > 15cm
* Spule zu Mähmotor: > 10cm 
* Spule zu DC-DC Wandler: > 10cm

Signalmessungen

Sender / Spule / LM386 Verstärker Ausgangssignale sollten etwa so aussehen: (witere Details über das Signal s. Abschnitt Signal)


ADC-Kalibrierung am Empfänger

Warning.png Die ADC-Kalibrierung (bei ausgeschaltetem Sender!) sorgt für eine korrekte Erkennung der Nulllinie (Stille), sodass das empfangene Signal später symmetrisch zur Nulllinie angezeigt wird.

  1. Der Perimetersender und die Motoren des ArduMower müssen während der Kalibrierung ausgeschaltet sein!
  2. Wenn eine Störung durch einen anderen Sender nicht zu vermeiden ist, muß während der Kalibrierung die Spule entfernt und der Eingang es LM386 mit GND verbunden werden.
  3. Führe die ADC-Kalibrierung einmal aus ("pfodApp->ADC Calibration")

Nach der korrekt durchgeführten Kalibrierung sollte das Signal per pfodApp Plot ('sig') bei ausgeschaltetem Perimetersender ungefähr als Null angezeigt werden. Nach Einschalten des Perimetersenders sollte das Signal etwa diesselbe positive wie negative Maximalamplitude ('Symmetie zur Nulllinie') aufweisen.

Problemanalyse und Fehlerbehebung am Empfänger

Empfangenes Signal, Filterergebnis und Signalqualität können per Android Handy über die pfodApp->Plot->Perimeter angezeigt werden:

Beschreibung der im Plot angezeigten Signalverläufe:

sig:  Spulensignal (Sequenz der Rohimpulse nach ADC) als kurzer Snapshot (32 samples), Update alle 20 Sekunden 
      (also 20 Sekundenwarten bis zum nächsten Snapshot)
mag:  Filterergebnis: innen (negativ) oder außen (positiv), magnitude: Abstand zur Perimeterschleife / magnetische Signalstärke (RSSI)
      - wird benutzt zum Perimeter verfolgen
smag: Filterergebnis, low-pass-gefiltert, ohne Vorzeichen (geglätteter mag-Verlauf) - verwendet zur Erkennung des 'Sender-aus' Zustandes
      Der Grenzwert kann über die pfodApp gesetzt werden (Settings->Perimeter->Timed-out if below smag)
in:   binäres Ergebnis des low-pass Filters: innerhalb (1) oder außerhalb (0) der Perimeterschleife - wird benutzt zur Erkennung des Perimetergrenzverlaufs
      Ist der ArduMower eine bestimmte Zeit außerhalb der Schleife, geht er in den Fehlerstatus. Diese Zeit kann per pfodApp
      (Settings->Perimeter->Timeout (s) if not inside) eingestellt werden
cnt:  Anzahl der Wechsel von innen nach außen (counter, Zähler)
on:   Perimetersender ist aktiv, Roboter innerhalb und smag ausreichend (1) oder inaktiv/außerhalb/smag zu klein (0)
qty:  Signalqualität (Aussage über die Verläßlichkeit der Erkennung 'innerhalb / außerhalb' aus dem Filterergebnis)
      Verhältnis aus Vergleich mit Mustersignal zu Vergleich mit inversem Mustersignal              
      1.0 bedeutet schlechte Qualität, Du solltest Werte von 1.5 oder höher)

Im Plot soll der 'mag'-Verlauf frei von Spitzen sein: innerhalb der Schleife sollte das Signal eine negative Kurve, außerhalb eine positive Kurve beschreiben. Weist die Kurve Spitzen auf, versuche folgende Maßnahmen zur Fehlerbeseitigung bzw. Optimierung:

  • Benutze immer einen ausreichend langen und korrekt abgerollten Schleifendraht (20m oder länger). Benutze niemals einen zu kurzen (Mindestwiderstand 5 Ohm!) oder gar aufgerollten Draht.
  • Für den 'Wohnzimmertest' sollte ein 100 Ohm Widerstand in Reihe mit 5m Draht bei 6V seine Aufgabe erfüllen.
  • Verbinde die Empfangsspule mit 'pinPerimeterLeft' auf dem PCB (am falschen Pin könnte das Signal 'etwas schwach' reinkommen)
  • Verringere smag-Mindestwert via 'pfodApp->Options->Perimeter->Timed-out if below smag'
  • Die Spulenpolung kann per pfodApp eingestellt werden (wird 'außen' angezeigt, wenn der Ardumower sich innrhalb der Schleife befindet?). Denselben Effekt hat das Umklemmen der Schleifenenden am Senderausgang.
  • Sollte das Signal schwach erscheinen, überprüfen, ob am Spulenverstärker das Poti "voll aufgedreht" ist! Hilfreich ist die gleichzeitige Anzeige des Signal per pfodApp (Plot --> Perimeter).
  • Die Kabelverbindung zwischen Spule und LM386-Vorverstärker muss möglichst kurz sein - am Besten die Spule direkt am Verstärker anschließen!
  • Halte den Abstand zwische Spule und Motoren sowie DC/DC-Wandlern möglichst groß (30cm oder mehr!)
  • Nutze die magnetische Abschirmwirkung (z.B. Deines Akkus) zwischen Spule und Störquellen.
  • Einstellen der Senderspannung: bei längeren Perimeterschleifen (>80m) die Spannung höher wählen (Potentiometer DC/DC-Wandler), bei kürzeren Schleifen (>25m) eher niedriger (anstreben einer Sendeleistung = Spannung * Strom von ca 10W)
  • Versuche bei laufenden Motoren die Spule leicht zu einer Seite zu neigen um die Signalqualität 'qty' zu erhöhen.

Messungen

Zum Vergleich Beispielwerte, gemessen an verschiedenen, im Gelände getesteten Kombinationen von Sender-/Empfänger-/Schleifenparametern:

1) 120m (0.7mm^2), R=4 Ohm, 6.5V, Spule Vpp 20mV

Störsignalpegel (max): smag=192
Signal (min): smag=254
SNR=Signal/Störsignal=254/192=1.3

2) 30m (0.7mm^2), R=1.0 Ohm (+4 Ohm series R), 6.5V, Spule Vpp 120 mV

Störsignalpegel (max): smag=192
Signal (min): smag=896
SNR=Signal/Störsignal=896/192=4.6

Videos

  1. Perimeter2 Demo
  2. Test 120m Perimeterschleife
  3. Theorie zu Perimeterschleife und Matched Filter (in deutsch)
  4. Sender-PCB
  5. Perimeter Stoptest
  6. Perimeter Verfolgungstest
  7. Test zum Finden und Verfolgen mit L50
  8. Test zum Finden und Verfolgen mit Rotenbach
  9. Magnetfeld Demovideo

Verfolgung der Begrenzungsschleife

Das Abfahren der Schleife wird über einen softwareseitig realisierten digitalen PID-Regler gesteuert. Die Regler-Parameter (P,I,D) können über ein Android-Handy per pfodApp eingestellt werden.

Mehr Informationen über PID-Regler sind hier zu finden: Forum.

Weiterführende Links

  1. Ein anderer Navigationsansatz sind Infrarot-Baken
  2. Mehr Details zum 'matched filter'
  3. Soundkarten-Oszilloskop inklusive 'matched filter'