Induktionsschleife / IR-Baken

Details

Tipp: Benutze das WIKI für aktuelle Informationen!

Eine Induktionsschleife ist wie ein “virtueller” Zaun: er weist den Roboter in seine Schranken. Eine Schleife ist praktisch aber nicht zwangsläufig für jede Umgebung notwendig (ein Rasensensor ist eine Alternative). Eine weitere Möglichkeit zum Erreichen der Ladestation sind Infrarotbaken (s.u.).

Grundprinzip
Man verlegt eine Schleife (ein Kabel) im Garten durch welches ein Signal geschickt wird welches der Roboter detektieren kann. Es werden dazu benötigt: ein Sender (um das Signal auf die Schleife zu geben) und ein Empfänger (um das Signal im Roboter zu detektieren).

ardumower perimeter


Wie wird ein Überfahren der Schleife detektiert?
Das Signal der Schleife wird mit einer (oder zwei) Empfängerspulen empfangen. Je näher man der Schleife kommt, umso stärker ist das Signal. Beim Überfahren der Schleife passiert aber noch etwas interessantes: das Signal wechsel die Polarität, d.h. negative und positive Spannung kehren sich um. Grundsätzlich gibt es also zwei Arten wie man ein Überfahren der Induktionsschleife detektieren kann. Ersteres haben wir mit "Perimeter v1" bereits umgesetzt und letzteres befindet sich in der Entwicklung ("Perimeter v2" - siehe weiter unten).


Sender/Empfänger-Prinzip über Signalstärke (Perimeter v1)
Man kann den Sender eines fertigen Mähroboters verwenden (der hier gezeigte Sender ist kompatibel mit Tianchen oder Rotenbach-Mährobotern) oder baut sich einen eigenen Sender.

Nun zum Sender und Empfänger:

Sender für Induktionsschleife
Ein Arduino (z.B. Nano) generiert ein Rechtecksignal, mit welchem die Drehrichtung eines Motortreiber (L298N) mit 7,8 Khz geschaltet wird. Dabei schaltet der Motortreiber-Ausgang ständig zwischen VCC und GND. Ein Schwingkreis verstärkt die Spitzen des Signals da er so dimensioniert ist, dass dessen Resonanzfrequenz der Schaltfrequenz entspricht (7,8 Khz). Der Motortreiber braucht daher nur mit 5V betrieben werden (statt mit 12V). Das Netzteil sollte für 2W (d.h. 400mA bei 5V) ausgelegt sein. Über eine Diode und einen Spannungsteiler geht ein Teil Signals in den Arduino (ADC). Hierüber kann eine Unterbrechung der Induktionsschleife erkannt werden. Etwa 150 mA fließen durch die Induktionsschleife (Querschnitt 2-3 mm^2). Diese sollte nicht wesentlich länger als 500m sein.

arduino perimeter sender

Da man nicht überall eine passende Spule bekommen kann, hier ein paar
mögliche Kombinationen für Spule/Kondensator (ergeben alle etwa dieselbe Resonanzfrequenz 7,8 Khz):
Variante 1: Spule: 160µH, Elko: 3,3µF/50V  (getestet)
Variante 2: Spule 33mH, Kondensator: 12nF (ungetestet)
Variante 3: Spule 220µH, Kondensator: 2.2µF/160V (getestet)
s. auch: Schwingkreisrechner (externer Link)


Spannungsversorgung
Die 5V Spannungsversorgung sollte über einen Step-Down-Spannungsregler (z.B. Modul mit LM2596) erfolgen, welcher die stabilisierte 5V Spannung generiert. Dazu zuvor den Spannungsregler auf 5V einstellen. Achtung: auf keinen Fall mehr als 5V in den Arduino 5V-Pin schicken, dadurch würde der Arduino zerstört. Daher immer die Spannung der 5V-Spannungsversorgung messen bevor man diese an den Arduino 5V-Pin anschließt!


Arduino-Code
Siehe Downloads.

Funktionstest (Sender)
1. Nach dem Übertragen des Codes und Anschließen der Induktionsschleife sollte die Arduino-LED (L) leuchten. Nun die Induktionsschleife zum Test entfernen - die Arduino-LED (L) sollte ausgehen.
2. Falls dies nicht funktioniert: Mit einem Multimeter einmal am Arduino Pin D9 und am einmal am Motortreiberausgangs-Pin (OUT_1) gegen Masse messen - es muss dort jeweils eine Gleichspannung (DC) von 2,5 Volt anliegen.
3. Falls ein Oszilloskop zur Verfügung steht, dieses anstelle der Induktionsschleife einbauen. Des so gemessene Signal sollte wie folgt aussehen:

Das Ausgangssignal weist eine deutliche höhere Amplitude (stärkere Spitzen) auf als das Eingangssignal:

perimeter signal    ardumower perimeter sender schematics     arduino perimeter sender photo

(links: Signalverlauf direkt am Schleifensenderausgang, rechts: Funktionsprinzip)

Erklärung des "Ringings": das "Nachschwingen" beim Sender erklärt sich dadurch, dass der Schwingkreis mit einem Rechteck-Signal angeregt wird, d.h. der Schwingkreis wird nicht nur mit einer Grund-Frequenz angeregt, sondern auch mit den harmonischen Frequenzen. Die Grund-Frequenz ist gewünscht für die Resonanz.

4. Wenn der Schleifensender richtig arbeitet, kann man zum Empfangstest einfach ein Oszilloskop an die Empfängerspule anschließen und dann die Induktionsschleife quer über die Spule legen. Das am Oszilloskop gewonnen Signal sollte ungefähr so aussehen:

Dieses Signal kann man dann gut mit einer Spule detektieren:
coilsignal     fft     ardumower perimeter spectrum plot

(links: Signalverlauf der Spule am Schleifenempfänger, mitte: Signal im Frequenzspektrum, überlagert mit Störungen vom Motor, rechts: Frequenzspektrum via pfodApp)



Empfänger für Induktionsschleife

Hierfür befinden sich mindestens 2 Spulen (rechts und links) im Roboter. Es werden die Signalstärke von rechter und linker Spule ausgewertet, um diese miteinander vergleichen zu können.

Prinzip:
1. Verstärken des Wechselsignals mit einem OPV
2. ADC-Sampling am Arduino
3. Optional: Bandpaß-Filterung, um Störsignale (Motor etc.) herauszufiltern - wir verwenden hierfür einen digitalen Filter (FFT-Algorithmus).
4. Auswertung der Signalstärke von linker und rechter Spule

Vorteil dieser Empfängervariante: Die analoge Regelung funktioniert sehr gut.
Nachteil: Man kann nicht feststellen, wo man sich gerade befindet (innen/außen) wenn man das Überfahren der Schleife einmal nicht mitbekommen hat. Man kann in diesem Fall auch nicht feststellen ob man die Induktionsschleife links oder rechts herum abfährt.
arduino perimeter receiver

Eine Spule empfängt das Signal vom Sender. Ein Schwingkreis (Kondensator) verstärkt das gesuchte Signal bei Resonanzfrequenz (7,8 Khz). Die eigentliche Verstärkung des Signals passiert mit einem LM386 (hier: Arduino Sound Sensor mit Spule anstatt Mikro). Ein Arduino Nano führt den Bandpaß auf 7,8 Khz durch (filtert nur diese Frequenz mit einem digitalen Filter heraus: FFT) und erzeugt am Ausgang ein PWM-Signal (Pulsweite proportional zur Signalstärke). Ein Tiefpaß wandelt dieses in eine Gleichspannung Spannung um.
Achtung: Die Verdrahtung zum Arduino-Mega wurde vereinfacht - siehe Schaltbild für exakte Verdrahtung.

Wir haben folgende Kombinationen von Verstärker und Spule getestet:
soundsensor    YwRobot Sensor   YwRobot circuit    coil 85mh
(links außen: Verstärkung des Signals mit "Arduino Sound Sensor" und Spule anstatt Mikro.
links: Arduino Sound Sensor (LM386)
rechts: Schaltbild Arduino Sound Sensor - das Schaltbild für den Arduino Sound Sensor findet man auch hier
rechts außen: Spulen mit 85 mH)

lm386 amplifier     lm386 modified      lm386 circuit      coil small

(links außen: LM386-Verstärker (200 fache Verstärkung)
mitte: Schaltbild LM386-Verstärker
rechts: Spule mit 104 mH)
Wichtig: Bei diesem Verstärker sollte der Kondensator C3 überbrückt werden (ergibt einen VCC/2 Offset passend für Arduino) und die Spule an "IN" und "GND" angeschlossen werden.


Arduino Code

Siehe Downloads

Funktionstest (Empfänger)
1. Zunächst sicherstellen, dass der Sender funktioniert (siehe oben).
2. Am Sound-Sensor die Empfindlichkeit (Verstärkung) über das Poti auf Maximum einstellen (gegen den Uhrzeiger drehen).
3. Nach dem Übertragen des Codes eine Spule in die Nähe der Induktionsschleife bringen (bzw. die Induktionsschleife direkt auf die Spule legen). Die Arduino-LED (L) sollte anfangen zu blinken. Nun beide Spulen in gleichem Abstand über die Induktionsschleife halten. Jetzt sollte die Arduino-LED (L) dauerleuchten.
4. Falls dies nicht passiert, die serielle Konsole öffnen (19200 Baud) und Werte beobachten.

Digitaler Filter
Der FFT-Algorithmus teilt das Frequenzband in Abschnitte gleicher Breite ein ("Bins") und liefert uns für jeden Bin wie stark dieser Frequenzabsschnitt im Signal vorkommt. Zum Filtern schauen wir uns den "Bin" mit der gesuchten Frequenz an und werten dort die Signalstärke aus.

Wahl der Spule
Spulenmathematik, aber nur als einfache Näherungsformel:

L = 1nH x n² x ((D² / mm² ) / (l / mm))
l = Länge der Spule
D = Durchmesser der Spule

Beispiel: 85 mH erfordern bei einem Durchmesser von 10 mm und
bei einer Länge von 40 mm etwa 5830 Windungen.

Diese Induktivität 85 mH ergibt mit einer Kapazität von 4,7 nF eine Resonanzfrequenz von 7963 kHz.

Da man nicht überall eine passende Spule bekommen kann, hier ein paar
mögliche Kombinationen für Spule/Kondensator (ergeben alle etwa dieselbe Resonanzfrequenz 7,8 Khz):
Variante 1: Spule: 85mH (115 Ohm), Kondensator: 4,7nF  (getestet)
Variante 2: Spule 104mH, Kondensator: 4nF (getestet)
s. auch: Schwingkreisrechner (externer Link)



Anordnung der Spulen

Die Spulen befinden sich flach am Boden, etwa 90 Grad zueinander, beide um 45 Grad gedreht.

ardumower spulen

Beispiel  (Ambrogio L50):

l50 coils    l50 parcours


Vergleichsmessung der Signalstärke
Für eine Vergleichsmessung wurden die Signalstärken bei verschiedenen Abständen ermittelt. Die Signalstärke (d.h. der ermittelte ADC-Wert) wird in der Android-pfodApp angezeigt. Die Entfernung ist der Abstand (cm) von Induktionsschleife zur Spule im eingebautem Zustand.

perimeter plot


Wie ändert sich das Signal bei Drehung der Spule?
Es wird für die Regelung beim Abfahren der Schleife immer nur die Signalstärke ausgewertet (also wie stark der Signalausschlag ist).
Man sieht, dass die Stärke des Signalausschlages auch von der Orientierung abhängig ist (und nicht nur von der Entfernung zum Induktionskabel).

ardumower coil signal

Ordnet man nun 2 Spulen (90 Grad versetzt) an, so würde die Summe aus beiden Spule ein Signal ergeben welches unabhängig von der Orientierung ist. Es würde nur noch der Abstand zum Induktionskabel gemessen.


Verlegung der Schleife
Es ist wichtig, dass die Schleife rund verläuft - Angenommen sie ist eckig verlegt und der Roboter fährt genau über die Ecke, wird er die Schleife nicht detektieren können. Denn genau für den Fall, dass Spule und Schleife gleich ausgerichtet sind, wird kein Signal empfangen (s.o.). Daher ist es wichtig, in der Schleife niemals Ecken zu verlegen, so dass mindestens eine Spule etwas empfangen kann.
schleifen blind

Demo-Videos

video  Ambrogio-Arduimower: Induktionsschleifentest (Stopp)

video Ambrogio-Ardumower: Schleifenfahrttest

video Ambrogio-Ardumower: Hineinfahren in die Schleife im Uhrzeigersinn

video Rotenbach-Ardumower: Suchen und Abfahren der Schleife

Abfahren der Induktionsschleife
Das Abfahren der Induktionsschleife wird mit Hilfe eines digitalen Reglers (PID) bewerkstelligt. Der PID-Regler kann über die Handy-App (pfodApp) konfiguriert werden.

ardumower perimeter pid

Weitere Informationen über digitale Regler findet ihr hier.


Abschirmung / Störungen
Da die Spule nur Spannungen im Bereich bis ca. 150mV empfängt, spielt Abschirmung eine große Rolle.

  • Abschirmung der Spule selber (in Ferritkern/Stahlrohr setzen)
  • Operationsverstärker (LM386) abschirmen (Alufolie umwickeln)
  • Welligkeit der Batteriespannung entfernen (paralleler Puffer-Kondensator)
  • Motorgehäuse auf Masse legen
  • Motoren abschirmen (Stahlbleche im rechten Winkel)

 



Sender/Empfänger-Prinzip über Polaritätswechsel ("Perimeter v2" - In Entwicklung)

Beim Überfahren der Schleife passiert etwas interessantes: das Signal wechsel die Polarität, d.h. negative und positive Spannung kehren sich um. Bei diesem Ansatz wird ein Überfahren der Schleife (innen/außen) durch diesen Polaritätswechsel erkannt. Wir verwenden wieder (wie bei "Perimeter v1") einen Motortreiber zum Erzeugen des Signals und eine fertige Operationsverstärkerschaltung zum Empfang.

Prinzip:
1. Verstärken des Wechselsignals mit einem OPV
2. ADC-Sampling am Arduino
3. Signal-Filterung und Detektion mit einem digitalen Filter (Matched Filter Algorithmus).
4. Auswertung des Filters


ardumower perimeter2            perimeter sampling

Signalform, Filter und Simulation: wir experimentieren noch mit dem optimalen Signalform - das Signal könnte wie "pseudonoise4_pw" aus dem Simulator-Applet aussehen. Wir verwenden einen Matched Filter um das Signal zu detektieren, d.h. einen digitalen Korrelations-Filter mit "PN-Code" wie er beispielsweise auch beim GPS-System verwendet wird. Wir möchten das Signal nicht nur Nahe der Schleife sondern auch noch in der Mitte des Gartens (also in der Mitte der Schleife) empfangen. Der Matched Filter liefert uns auch dann noch hervorragende Ergebnisse wenn das (im Vergleich relativ schwache) Signal durch Motorstörungen überlagert wurde. Weiterhin liefert uns der Matched Filter einen positiven Peak wenn das Signal gefunden wurde und einen negativen Peak wenn das invertierte Signal gefunden wurde (die Schleife also überfahren wurde).

Im Simulations-Applet kann dies alles nachvollzogen werden:

applet matchedfilter

Sender

Der Motortreiber wird mit 3,2 Khz angesteuert (genauer: Pulsweite mit abwechselnd 4,8 Khz und 2,4 Khz). Die Schaltung verbraucht max. 20W (12V, 1.7A). Es wird ein Motortreiber mit integrierter Strombegrenzung und thermischer Schutzabschaltung empfohlen (z.B. MC33926).

sender circuit:

motor driver M1OUT1     o---------- perimeter loop (20-450 meters)--+
                                                                    |

motor driver M1OUT2     o---------- perimeter loop -----------------+
motor driver Vin        o-- 12V
motor driver M1IN1      o-- Arduino Nano pinIN1
motor driver M1IN2      o-- Arduino Nano pinIN2
motor driver M1PWM_nD2  o-- Arduino Nano pinPWM
motor driver M1nSF      o-- Arduino Nano pinFault
motor driver M1FB       o-- Arduino Nano pinFeedback

motor driver EN         o-- Arduino Nano pinEnable
motor driver VDD        o-- Arduino +5V
motor driver M1D1       o-- GND (via Jumper)
motor driver SLEW       o-- VDD (via Jumper)

              |---------o-- GND
Potentiometer 100k -----o-- Arduino Nano pinPot
              |---------o-- Arduino +5V

ACS712-05 OUT ------o-- Arduino Nano pinChargeCurrent    
ACS712-05 A   ------o-- charging pin (+)
ACS712-05 B   ------o-- battery charger +24V
battery charger GND-o-- charging pin (-)

      

Über den Stromsensor (ACS712-05) wird erkannt wenn der Roboter die Lade-Pins der Ladestation erreicht hat, so dass die Induktionsschleife während der Ladezeit abgestellt werden kann. 
Über das Potentiometer kann die Maximal-Leistung für den Motortreiber eingestellt werden (Strom). Zunächst IMAX auf Null stellen, den Roboter in die Mitte des Gartens stellen und dann ganz langsam IMAX mit dem Poti erhöhen. Im pfodApp-Plot ("Plot->Perimeter") sollte nun 'sig' nach einiger Zeit (10 Sekunden) größer werden. An der Stelle wo 'sig' das Maximum erreicht, IMAX belassen. Der richtige IMAX-Wert hängt mit der Leistungsanpassung zusammen. Ist IMAX für die Schleifenlänge zu groß gewählt, reduziert der Motortreiber automatisch die Leistung und das Signal wird schlechter.

Einige Beispiel-Werte für IMAX:
Schleifenlänge=60m, IMAX=0.14
Schleifenlänge=120m, IMAX=2.0

Besonderheit zum MC33926: der Treiber erkennt Kurzschluß bzw. Überstrom und schaltet dann einfach ab - für diesen Fall Versorgungsspannung kurzfristig trennen!

Das Signal bei geöffneter Schleife sollte etwa so aussehen:

perimeter2 sender open    


Achtung: Schleifenlänge beachten. Für Tests in der Wohnung folgende Simulationsschaltung verwenden welche eine lange Schleife simuliert:


Simulationsschaltung
einer langen Schleife
Für Tests in der Wohnung sollte man eine längere Schleife (150m) simulieren, damit das Signal ähnlich ist. Die benötigte Spule kann mich sich schnell selber bauen: einen Ferritkern ca. 30 mal mit Kabel umwickeln (so dass sich eine Induktivität von ca. 200 µH +/- 50% ergibt ). Der Motortreiber sollte für diesen Fall mit 5V betrieben werden.

sender 'long perimeter simulation' circuit:

MC motor driver M1OUT1 o---------- 8 Ohm resistor 20W --- coil (200 µH, 1.7A) --------------------+
                                                                                                  |

MC motor driver M1OUT2 o--------------------  perimeter loop (1-5 meters)  -----------------------+
...


Empfänger

ardumower one center coil
Es wird nur noch eine einzige aufrecht (hochkant) stehende Spule verwendet (mittig im Roboter, vertikale Lage). Diese muss an "pinPerimeterLeft" angeschlossen werden. Die LC-Kombination soll Störungen des Mähmotors beseitigen. Der Ausgangs-Elko des LM386-Moduls muss überbrückt werden, damit der Null-Pegel Offset bei 2,5V liegt!

receiver circuit:

                                     LM386 IN  o------- capacitor 4,7nF ----------- coil 100 mH
Arduino pinPerimeterLeft   o------o  LM386 OUT
                                     LM386 GND o----------------------------------- coil

Das Signal wird mit 19,2 Khz gesampelt und via Matched Filter ausgewertet.


Das Signal am Ausgang des LM386 sollte nahe der Schleife etwa so aussehen: ein Wechselsignal beim dem die Länge eines Pulses durch eine Signal-Code-Folge (sog. PN-Code) vorgegeben ist, d.h. das Signal hält den Zustand (Hi oder Lo) anhand einer Code-Folge. Für weitere Details, siehe Signal "pseudonoise4_pw" im Simulations-Applet.

perimeter2 receiver coil     perimeter2 receiver coil pwm

(links: Signal, rechts: Signal mit Stromregelung über PWM)

Wichtig: wenn Spule und Mähmotor gleich ausgerichtet sind, kann der Motor stören - dann sollte die Spule leicht gekippt werden. die Ausrichtung der Spule muss ausgetestet werden. Man führt dazu den Mäher mit eingeschaltetem Mähmotor über die Schleife und schaue ob innen und außen zuverlässig erkannt wird (innerhalb der Schleife sollte die LED an gehen, außerhalb aus - andernfalls Spulenanschlüsse tauschen!). Je nach Kippen der Spule (vorne, hinten, rechts, links) ergibt sich ggf. eine Verbesserung.

ADC-Kalibrierung
Damit das Signal (sig) symmetrisch um Null verläuft, einmalig eine ADC-Kalibrierung bei ausgeschaltetem Schleifensender durchführen ("pfodApp->ADC Calibration").


Beispiel-Plots (pfodApp)

Der Plot beinhaltet:

sig
:  das Spulen-Signal
mag: Filterergebnis (negativ: innen, positiv: außen - Stärke: Entfernung zur Schleife) - zur Detektion der Schleife beim Abfahren
smag: Filterergebnis ohne Vorzeichen, aber mit Tiefpaß - zur Schleifenausfallerkennung
in:  innen (1) oder außen (0)
cnt:  Anzahl "innen-nach-außen" Übergange (Zähler)
on:  Schleife aktiv (1) oder inaktiv (0)


150m Schleife, Motortreiber mit 12V

Der Mäher wurde in die Mitte der Schleife gesetzt. Der Mähmotor wurde eingeschaltet. Das Schleifen-Signal (sig) ist stärker als beim Betrieb mit 5V. Der Matched-Filter (mag) liefert "innen" (d.h. innerhalb der Schleife) durchgängig ein negatives Signal, außerhalb durchgängig ein positives Signal. Die Schleife wird als eingeschaltet (on) erkannt.
perimeterV2screenshot    perimeter2 plot 12v    ardumower perimeter2 test


150m Schleife, Motortreiber mit 5V
Der Mäher wurde in die Mitte der Schleife gesetzt. Der Mähmotor wurde eingeschaltet. Das Schleifen-Signal (sig) ist schwächer als beim Betrieb mit 12V. Die gelegentlichen "Ausreißer" verursacht der Mähmotor. Der Matched-Filter (mag) liefert kein durchgängig negatives Signal (d.h. ein "innen"), die gelegentlichen Spitzen in den positiven Bereich kommen vom Mähmotor. Es wird dennoch durchgängig ein "innen" (in) detektiert. Die Schleife wird als eingeschaltet (on) erkannt.
perimeter2 plot 5v
 


video  Perimeter2-Demo


Weitere Informationen zum Matched Filter (Blog)

Infrarotbaken
Eine weitere Möglichkeit zum Erreichen der Ladestation sind Infrarotbaken. Eine Schaltung zum Nachbauen findet man hier.

 

   
© Ardumower