Perimeter-Schleife: Unterschied zwischen den Versionen

Aus www.wiki.ardumower.de
Wechseln zu: Navigation, Suche
(Zusammenfassung)
(Einstellen der Sendeleistung)
 
(172 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
=Zusammenfassung=
 
=Zusammenfassung=
Eine Perimeter-Schleife (oder Begrenzungsdraht) ist eine Art 'elektronischer Zaun': er veranlaßt den ArduMower zum Stoppen / Umkehren sobald die Grenze erreicht ist. Nicht in jeder Umgebung ist eine Perimeter-Schleife notwendig - Rasensensoren könnten eine Alternative sein.
+
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: im Garten wird ein Schleifendraht verlegt, durch den ein Signal gesendet und vom Ardumower ausgewertet wird. Gebraucht werden ein Sender zur Erzeugung und Übergabe des Signals an die Schleife und ein Empfänger zur Signalauswertung im ArduMower.
+
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 (oder zwei) Empfangsspulen liefern ein Signal, dessen Stärke je nach Abstand zwischen Schleifendraht und Empfangsspule(n) variiert. Interessanteweise wechselt das Signal in dem Moment seine Polarität, wo der ArduMower (genauer: die Empfänger-Spule) den Schleifendraht überfährt. Es gibt zwei pribzipielle Möglichkeiten, den Begrenzungsdraht zu orten. Wir haben beide Methoden implementiert (Perimeter V1 und V2) wie nachfolgend beschrieben.
+
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.  
  
 
<gallery>
 
<gallery>
 
File: Ardumower_perimeter.jpg | Perimeterdraht
 
File: Ardumower_perimeter.jpg | Perimeterdraht
File: Ardumower_perimeter_components.jpg | Komponenten
 
 
File: Perimeter_signal_strength.jpg | Signalstärke
 
File: Perimeter_signal_strength.jpg | Signalstärke
 
File: Perimeter_gradient.png | Verlauf der Signalstärke
 
File: Perimeter_gradient.png | Verlauf der Signalstärke
File: Ardumower_perimeter_magneticfield.png | Perimeter-Magnetfeld
 
 
File: Perimeter_excluding_objects.png | Objekte ausschließen
 
File: Perimeter_excluding_objects.png | Objekte ausschließen
 
File: Perimeter_divide.png | Flächen aufteilen
 
File: Perimeter_divide.png | Flächen aufteilen
 
</gallery>
 
</gallery>
  
[http://hyperphysics.phy-astr.gsu.edu/hbase/magnetic/magcur.html Magnetfeld Berechnungstool]
+
=Begrenzungsschleife=
 
+
Videos:
+
[http://youtu.be/r4ZMgasMkH0 Magnetfeld Demovideo]
+
 
+
=Perimeter-Schleife V2 (erforderlich für aktuellen ArduMower Code)=
+
  
 
[[Image:Yt-brand-standard-logo-95x40.png|thumb|180px|https://www.youtube.com/watch?v=NIer_kITelc&feature=youtu.be]]
 
[[Image:Yt-brand-standard-logo-95x40.png|thumb|180px|https://www.youtube.com/watch?v=NIer_kITelc&feature=youtu.be]]
  
Dies ist die neue Version von Sender und Empfänger für die Perimeter-Schleife (erhältlich über den [https://www.marotronics.de/index.php?k=7 shop] [[File: shopping.png|link=https://www.marotronics.de/index.php?k=7]]).
+
Dies ist die neue Version von Sender und Empfänger für die Begrenzungsschleife (erhältlich über den [https://www.marotronics.de/index.php?k=7 shop] [[File: shopping.png|link=https://www.marotronics.de/index.php?k=7]]).
  
Beim Überfahren des Perimeter-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) 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 [http://en.wikipedia.org/wiki/Matched_filter matched filter] ausgewertet wird. Der Filter liefert als Ergnis einen Peak: positiv - ArduMower innerhalb der Schleife oder negativ / außerhalb der Begrenzungsschleife.
+
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 [http://en.wikipedia.org/wiki/Matched_filter Matched-Filter] ausgewertet wird. Der Filter liefert als Ergebnis einen Peak: positiv - ArduMower innerhalb oder negativ - ArduMower außerhalb der Begrenzungsschleife.
  
Prinzipablauf:
+
Prinzipablauf Sender:
  Senderseite
+
# Erzeugen des Ausgangssignals durch den Arduino Nano (ca. 3 Khz)
# Erzeugen des Ausgangssignals durch den Arduino Nano
+
 
# Verstärkung des Ausgangssignals durch den Motortreiber (MC33926), Schleifendrahtenden anstatt eines Motors an den Ausgang anschließen
 
# Verstärkung des Ausgangssignals durch den Motortreiber (MC33926), Schleifendrahtenden anstatt eines Motors an den Ausgang anschließen
  
  ArduMower
+
Prinzipablauf Empfänger:
 
# Eingangssignal per Empfangsspule aufnehmen
 
# Eingangssignal per Empfangsspule aufnehmen
# Eingangssignal per Operationsverstärker (z.B. LM386) verstärken
+
# Eingangssignal per Operationsverstärker (LM386) verstärken
# ADC sampling durch Arduino Mega
+
# ADC sampling durch Arduino Mega (mit 9615 Hz)
# Signalfilterung and Analyse durch ein digitales Filter (software-basierter matched filter algorithmus)
+
# Signalfilterung and Analyse durch ein digitales Filter (software-basierter Matched-Filter-Algorithmus)
# Auswertung des matched filter Ergebnisses (zur Feststellung des Aufenthaltbereiches innen / außen in Bezug auf die Schleife, Schleifenabfahren usw.)
+
# 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.
  
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 Spule treffen.
+
Für ein besseres Verständnis des Filters gibt es den [http://www.grauonline.de/alexwww/ardumower/filter/filter.html Matched Filter Simulator]. Für weitere Informationen zum Filter, schaue Dir auch das [https://www.youtube.com/watch?v=NIer_kITelc Matched Filter Video] an. Using a simple symmetric signal (which looks equal on positive and negative side of the zero point), you cannot differentiate between an 'inside perimeter' and 'outside perimeter' signal. When the mower is traversing the perimeter loop, the signal polarity changes (positive becomes negative and negative becomes positive). We want to detect this polarity change of the signal. Using an unsymmetrical signal, you can do this. You can see the difference in the simulator. The default signal (slider 'example signal') is a symmetric signal - press the 'Invert' button to invert the signal (change its polarity). In the correlation result (graph 'Matched filter') the polarity can not be detected. Now use an asymmetrical signal ('pseudonoise5_pw'). Press again 'Invert' to change signal polarity. Now you can see polarity of the signal in the filter output (graph 'Matched filter'). It's the sign of the peak (positive or negative sign).  
  
 
<gallery>
 
<gallery>
 
File: Ardumower_perimeter2.jpg| Innen/außen-Erkennung über den Polaritätswechsel
 
File: Ardumower_perimeter2.jpg| Innen/außen-Erkennung über den Polaritätswechsel
 
File: Fluxdirections.png| Flussrichtungen
 
File: Fluxdirections.png| Flussrichtungen
</gallery>
 
 
== Signal ==
 
Der Schlüssel zu einem guten Empfang des Perimetersignals überall auf dem Rasen ist die Optimierung des Signal-Rausch-Abstandes (SNR=signal/noise ratio). Um das SNR zu maximieren gibt es zwei Ansätze:
 
# Signalstärke hochfahren (elektr. Leistung) or
 
# Erhöhung der Signallänge
 
 
Wir nutzen eine Kombination beider Ansätze: der Sender wiederholt ständig einen digitalen Code ('pseudonoise4_pw') mit 9615 Hz :
 
 
1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1
 
 
'1' bedeutet einen positiven Signalimpuls, '-1' einen negativen. Der kürzeste erzeugte Signalwechsel ist '-1,1', das entspräche dem höchsten Ton (wenn man es hörbar darstellen würde) von 4808 Hz. TDas andere Extrem wäre der längste erzeugte Signalwechsel mit '1,1,-1,-1', bei einem Frequenz von 2404 Hz.
 
 
Die Spule erkennt nur diese Signalwechsel des Sendersignals - so (ohne den Kondensatorin Serienschaltung zu Spule) zeigt sich das Empfangssignal wie folgt:
 
 
1,0,-1, 0,1,-1,1,-1, 0,1,-1,1,0,-1, 0,1,-1, 0,1,-1, 0,1,0,-1
 
 
Verwendet man jedoch den Kondensator in Reihe zur Spule sind gesendetes und empfangenes Signal vom Prinzipverlauf wieder identisch.
 
 
<gallery>
 
 
File: Perimeter_signal_steps.png | Perimetersignal an Sender und Empfangsspule
 
File: Perimeter_signal_steps.png | Perimetersignal an Sender und Empfangsspule
 +
File: Matched_filter_principle.png| Matched filter
 +
File: Perimeter_signal_good_bad.png|What makes a good/bad signal
 
</gallery>
 
</gallery>
  
Der Arduino ADC sampelt das Empfangssignal mit 9615 Hz.
+
== Sender ==
 +
[[Image:Ina169_marotronics.jpg|thumb|200px| Wichtig für Marotronics INA169: Pads verlöten für 5A Betrieb]]
 +
[[File: Ardumower_perimeter_overview.jpg|600px]]
  
== Filter ==
+
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). Unser Motortreiber verfügt über eine integrierte Strombegrenzung und eine Übertemperaturabschaltung (z.B. MC33926)
Die gewählte Signalform hat eine spezielle Charakteristik:
+
  
Übersetzungspause ...it does not [http://en.wikipedia.org/wiki/Matched_filter correlate] in parts with itself - only as a whole sequence (because it looks 'random'). Because of this characteristic, the starts of the signal can be detected by a [http://en.wikipedia.org/wiki/Matched_filter matched filter] (aka 'correlation' with the search signal) and they generate a high peak in the matched filter result, even when high noise was added (due to motors etc.). The polarity of the peak (positive or negative) determines if the coil is inside or outside of the perimeter wire.
+
Anschluss der Induktionsschleife erfolgt am MC33926 zwischen M1OUT1 und M1OUT2.  
  
You can see how it works: For a better understanding of the perimeter signal and the filter, the matched filter is simulated here:
+
[[File:warning.png]] Wichtig: Die Schleifenlänge kann im Bereich 20 - 450m betragen und muss mindestens 5 Ohm bzw. darf maximal 12 Ohm Widerstand aufweisen. Die maximal Begrenzungs-Fläche beträgt 1000 m2.
[http://www.grauonline.de/alexwww/ardumower/filter/filter.html Matched filter simulation]
+
  
# Choose the perimeter signal at the right side (Set slider 'example signals': pseudonoise4_pw).
+
* [https://www.marotronics.de/Perimeter-Sender-Board-Prototyp-mit-Platinen-Zubehoer Sender PCB im Shop]
# Increase the noise a little bit (Set slider 'noise' to 2).
+
* [https://github.com/Ardumower/ardumower/blob/master/pcb/Produzierte_Platinen/sender_v2_geschlossen/Perimeter%20sender%20v2.pdf Sender PCB Schaltbild]
# At the left bottom plot ('Matched filter') you can see that the repeated signal was detected 3 times.
+
* [https://github.com/Ardumower/ardumower/tree/master/pcb/Produzierte_Platinen/sender_v2_geschlossen/Platinenbilder Sender PCB Bilder]
# Now simulate moving the coil outside of the perimeter wire. Click on 'Invert' to set amplifcation to '-1'. The matched filter results a negative match.
+
  
See also: [https://www.youtube.com/watch?v=NIer_kITelc Video about the matched filter]
+
=== Sendersoftware ===
  
<gallery>
+
<b>Tipp</b>: Wenn Du Dich nie zuvor mit Arduino beschäftigt hast, lies zuerst unsere Einführung <b>[http://wiki.ardumower.de/index.php?title=Arduino_first_steps 'erste Schritte mit dem Arduino']</b>.
  File: Matched_filter_principle.png| Matched filter
+
  File: Perimeter_signal_good_bad.png|What makes a good/bad signal
+
</gallery>
+
  
== Sender ==
+
<b>Download</b>:  
<gallery>
+
Du findest den Code für den Schleifensender im Ordner 'sender' unter [http://wiki.ardumower.de/index.php?title=Ardumower_LP#Programm_downloaden_und_Arduino_programmieren Ardumower Download]
File: Schleifensender_Ardumower_V2.JPG | Sender circuit
+
File: Ardumower_sender_pcb.jpg| Ardumower sender PCB
+
File: Perimeter2_sender_open.jpg| Sender signal (6.5V, open perimeter)
+
File: Perimeter2_sender_closed.jpg| Sender signal (6.5V, 120m/7 Ohm closed perimeter)
+
File: Sender_v2_signal_sender_5v_4ohm.png| Sender signal (6.5V, 2m + 4ohm R, closed perimeter)
+
File: perimeter_wiring_motor_driver.png | Perimeter wiring options
+
</gallery>
+
  
We use a motor driver as output amplifier and an Arduino Nano to generate the signal. The motor driver is driven by 3.2 Khz (two pulse widths 4808 Hz and 2404 Hz). With large enough perimeter wires, the circuit typically draws 10W (6.5V, 1.7A). We use a motor driver with integrated current limiting and thermal switch-off (e.g. MC33926). The perimeter wire length should be in the range 20m - 450m and must be at least 5 Ohm.
+
[[File: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 [http://wiki.ardumower.de/index.php?title=Arduino_first_steps hier für ein Treiber-Downgrade].
  
sender circuit:
+
=== Einstellen der Sendeleistung ===
 +
Zum Einstellen der Sendeleistung wie folgt vorgehen:
  
<blockquote style="background-color: lightgrey; border: solid thin grey;">
+
[[File:warning.png]] Wichtig: Deine Induktionsschleife sollte mindestens ein Widerstand von 12 Ohm aufweisen. Im Idealfall schaltet man ein 12 Ohm (50W) Lastwiderstand in Reihe. So kommt man dann auf ein Gesamtwiderstand der Begrenzungsschleife die im Bereich von ca 12-15 Ohm liegt.
<pre>
+
motor driver M1OUT1    o---------- perimeter loop (20-450 meters, > 5 Ohm) --+
+
                                                                              |
+
motor driver M1OUT2    o---------- perimeter loop ---------------------------+
+
motor driver Vin        o-- 6.5V
+
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 (-)
+
</pre>
+
</blockquote>
+
  
'''Example of sender implementation on a dot matrix board:  [http://www.braunschweiger.org/content/download/SenderR212.pdf]
+
Die Versorgungsspannung des Motortreibers wird über das Poti des DC/DC-Wandlers zwischen 6.5 bis 12V eingestellt. Die Spannung am DC/DC-Wandler so einstellen, dass nicht mehr als 1 Ampere zum fließen kommt.
[http://www.braunschweiger.org/content/images/SenderR212_Front.jpg] [http://www.braunschweiger.org/content/images/SenderR212_Back.jpg]'''
+
  
=== Sender Perimeterschleife Rasengröße ===
+
Beispiel:
At an operating voltage of 6.5V, the perimeter wire length should not exceed 450m. For 'kitchen test' a 100 Ohm resistor in series with 5m wire could make the job!
+
Deine Induktionsschleife hat: 12 Ohm
 +
Deine Eingstellte Spannung am DC/DC-Wandler: 8 Volt
  
Assuming an ideal lawn shape (circle shape), we get a lawn radius:
+
Der verbrauchte Strom und die verbrauchte Leistung ist dann:  
  radius = length / (2*PI) = 450m / (2*PI) = 70 meter
+
  Strom: I = U / R = 8 Volt / 12 Ohm => 0,7 Ampere
 +
Verbrauchte Leistung: P = U * I = 8 Volt * 0,7 Ampere => 5,6 Watt
  
Assuming there is no maximum perimeter radius for good signal quality, the maximum lawn area size (ideal circle shape) would be:
+
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 Motortreiber nicht mehr richtig). Dann hilft nur noch ein zur Schleife in Reihe geschalteter Hochlastwiderstand. Wichtig: der Hochlastwiderstand muss für die Leistung ausgelegt sein! In dem gezeigten Beispiel mit 12 Ohm sollte man also einen 10 Watt Lastwiderstand verwenden.
area = PI * (r*r) = PI * (70m * 70m) = 15000 m2
+
  
However, assuming there is a maximum perimeter radius for good signal quality of 18m, the maximum lawn area size (ideal circle shape) would be:
+
Weitere Informationen: [http://wiki.ardumower.de/index.php?title=Der_Perimetersender_ohne_automatische_Regelung]
area = PI * (*r) = PI * (18m * 18m) = 1000 m2
+
  
=== Einstellung der Senderstromstärke ===
+
=== Automatische Schleifensignalabschaltung ===
To change the power (current/voltage) of the sender, you have several options:
+
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 befindet sich auf dem Sender PCB ein Stromsensor (INA169, 5A) zwischen Ladegerät und Ladeanschlüsse.
  
*DC/DC Voltage: The motor driver supply voltage can be changed (6.5-12V via the potentiometer on the DC converter). That's one way to do it and it's the recommended way. NOTE: The minimum voltage (Vin) for the MC33926 motor driver is 5v. If the voltage is lower, the motor driver shuts down sporadically (undervoltage detection-Arduino LED starts to flash).
+
Zum Aktivieren dieser Funktion ist "#define USE_CHG_CURRENT" auf 1 zu setzen
  
*Normal amplitude: Instead of switching the perimter wire between +Vin and -Vin (double amplitude/default), the motor driver can switch it between +Vin and GND (normal amplitude). This will reduce current. To use normal amplitude, comment out the corresponding code line in 'sender.ino':
+
    #define USE_CHG_CURRENT      1    // use charging current sensor for robot detection? (set to '0' if not connected!)
  
  // #define USE_DOUBLE_AMPLTIUDE    1 
+
=== Sender Diagnose ===
 +
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
  
*Power resistor: If your perimeter wire resistance (R) is below 5 Ohms, you will not be able to further reduce voltage below 6.5v (otherwise the Arduino will not work properly). Then you have to increase the perimeter wire resistance (R) by using a power resistor (example: 5 ohm, 10W) in series with your perimeter wire.  
+
Bei der Platine "Sender V2" ist dieses Signal am Ausgang "D13" verfügbar und auf die LED "Mover_in_Ladestation" geschaltet.
  
@6 volts (Vin): 5 ohm power resistor => I=U/R=6v/5ohm=1.2A  (P=U*I=6v*1.2A=7.2W)
+
Um Fehler zu finden bzw. um den Schleifensender besser zu verstehen, öffne mit der Arduino IDE die serielle Konsole (CTRL+SHIFT+M) auf 19200 Baud. Hier ein Beispiel der möglichen Zustände (Roboter in Ladestation/Roboter nicht in Ladestation usw.):
 
+
So, your power resistor should be a 10W type or better. Activate 'normal-amplitude' in sender code (do not use double amplitude).
+
 
+
=== Senderstromüberwachung (in Entwicklung) ===
+
Idea: Replace poti VR1 by a digital poti (MCP4151-5K) and control LM2596 module output voltage (and so current) via Arduino:
+
  
 
<gallery>
 
<gallery>
File: Lm2596_circuit.jpg | LM2596 module circuit
+
File:Perimeter_sender_console.png|Fehlersuche mit serieller Konsole
 
</gallery>
 
</gallery>
  
MCP4151-5K version:
+
== Empfänger ==
  
Vout = 1.23V*(1+VR1/R1)
+
[[File: Perimeter_v2_receiver_circuit.png|400px]]
  
Using VR1=5K...
+
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 [https://www.marotronics.de/Schleifenempfaenger-Kit-perimeter-receiver-Kit 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.
Vstart (on reset): Vout=1.23V*(1+2.5K/0.33K)=10v
+
Vmax:  Vout=1.23V*(1+5K/0.33K)=19v
+
  
===Sender automatic standby===
+
<gallery>
The sender can be switched off during the time the robot is in the charging station. To detect the robot, a current sensor (ACS712) is connected between the charger and the charging pins.
+
File: Ardumower_chassis_components.png | Position der Perimeterspule
 +
File: Ardumower_coil_position.jpg | Eine zentrierte, aufrecht montierte Spule
 +
File: Ardumower_lm386_circuit.png | LM386 Modul Schaltplan
 +
File: Dcdc_noise.jpg | NOTE: Perimeterspule/Verstärker von DC/DC-Wandlern fernhalten (Störstrahlung)!
 +
File: Tire_coil_distance.jpg | Abstand Spule-Rad: Einfluß auf den Wendekreis (Kurvenwinkel)
 +
</gallery>
  
=== Sendersoftware ===
+
[https://www.marotronics.de/Schleifenempfaenger-Kit-perimeter-receiver-Kit Das Empfänger-Kit ist erhältlich im Shop]
  
<b>NOTE</b>: If you have never worked with Arduino before, read our <b>[http://wiki.ardumower.de/index.php?title=Arduino_first_steps 'Arduino first steps' introduction]</b>.
 
  
[[File:warning.png]] Note: Always verify that the pin configuration in your Arduino code (sender.ino) matches your actual circuit!
+
'''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.  
  
In the sender.ino you have this option:
+
'''Wichtig''': Die aktuelle Software erfordert das Weglassen des Kondensators 4.7nF in Reihe mit der Spule ('differential signal').
  
* Define if you have connected a charging current sensor for automatic sender standby:  #define USE_CHG_CURRENT 1  (or 0)
 
 
=== Sender Zustandsanzeige ===
 
The perimeter sender status is indicated by the sender LED (Arduino Nano LED):
 
* ON: perimeter wire loop is closed and working
 
* OFF: perimeter wire loop is opened and not working
 
* blinking: robot is charging and perimeter will be switched OFF (energy saving)
 
  
 +
===Einstellungen===
 
<gallery>
 
<gallery>
File:Perimeter_sender_console.png | Perimeter sender console output
+
  File:Cheat_sheet.png | Perimeter settings
 
</gallery>
 
</gallery>
  
=== Sendertest per PC-Soundkarte ===
+
At first, activate the perimeter in the Ardumower software (pfodApp->Options->Perimeter Use: YES). It is recommended to keep the default perimeter settings.
You can use your sound card to try out the sender with just a coil:
+
 
+
# Connect a coil (100 mH) to your sound card microphone/line input (max 1V)
+
# Launch the [http://www.grauonline.de/alexwww/ardumower/oscilloscope/oscilloscope.html web oscilloscope], and choose Filter 'Matched', Frequency '9615' Hz, Visualization Math 'MinMax'
+
# The output signal should reflect the distance to your perimeter loop - the polarity (negative/positive) should indicate the side of the loop (inside/outside)
+
 
+
Try to move the coil as close as possible to the perimeter loop (for both inside/outside case) (Keep in mind that this is without pre-amplifier, so the signal will be only valid close to the loop - the microphone input cannot be higher than 1V, so we cannot use the pre-amplifier here).
+
 
+
<gallery>
+
File:Ardumower_web_oscilloscope_time_signal_received.jpg | Actual received time signal (Filter Off, Time scale: x5)
+
File:Ardumower_web_oscilloscope_time_signal.jpg | Ideal time signal, generated by sender (Filter Off, Time scale: x5)
+
File:Ardumower_web_oscilloscope.jpg  | Matched filter signal (Frequency: 9615 Hz, Math: MinMax)
+
File:Perimeter_signal_good_bad.png | What makes a good/bad signal
+
</gallery>
+
 
+
[https://www.youtube.com/watch?v=vg5Xg0__66A Video explaining all steps]
+
 
+
== Empfänger ==
+
 
+
For receiving the signal, we use a coil (100 mH or 150 mH) in upright position (centered at front in robot), connected through a capacitor 4.7nF (only older software versions) to an LM386 operational amplifier (to amplify the received signal). When using the LM386 module, capacitor C3 on the LM386 module should be bypassed (which is needed so that the LM386 generates a signal between 0..5V and not the default range -5V..+5V). The LM386 output pin should be connected to an analog Arduino pin ('pinPerimeterLeft').
+
 
+
<gallery>  
+
File: Perimeter_v2_receiver_circuit.png | Receiver circuit and shortened capacitor C3
+
File: Ardumower_chassis_components.png | Perimeter coil position
+
File: Ardumower_coil_position.jpg | One centered, upright coil
+
File: Ardumower_lm386_circuit.png | LM386 module schematics
+
File: Tire_coil_distance.jpg | Tire-coil distance effecting rotation angle
+
File: Coil_motor_layout.png | Two coils (experimental), coil-coil distance rear-driven 12.5cm, front-driven 19cm
+
</gallery>
+
 
+
receiver circuit:
+
 
+
<blockquote style="background-color: lightgrey; border: solid thin grey;">
+
<pre>
+
                                      LM386 IN  o------- capacitor 4.7nF ----------- coil 100 mH  (or 150 mH)
+
Arduino pinPerimeterLeft  o------o  LM386 OUT
+
                                      LM386 GND o----------------------------------- coil
+
</pre>
+
</blockquote>
+
 
+
'''NOTE''': It's recommended to directly mount the coil on the amplifier module. This ensures the 'small signal' of the coil is not distorted by other components (motors, DC/DC converters etc.).  
+
  
'''Differential signal''': Leave out capacitor 4.7nF in latest software versions (using differential signal).
+
The perimeter settings are:
  
'''Non-differential signal''': If you use the capacitor 4.7nF to reconstruct the sender signal again (see section signal), the receiver circuit is an oscillation circuit (C and L, and perimeter wire acting as antenna) and everything (C,L,wire length) has to match. Because this makes it difficult to tune, the non-differential signal is not recommended.
+
* 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 ===
 
=== Abstand Spule/Verstärker zu Motoren ===
Ensure all minimum distances to the following components:
+
Achte auf die Einhaltung aller Mindestabstände zwischen den folgenden Komponenten:
  * Coil to gear motor: > 15cm
+
  * Spule zu Radmotor: > 15cm
  * Coil to mower motor: > 10cm  
+
  * Spule zu Mähmotor: > 10cm  
  * Coil to DC/DC converter: > 10cm
+
  * Spule zu DC-DC Wandler: > 10cm
  
 
<gallery>
 
<gallery>
  File: Dcdc_noise.jpg | NOTE: Keep away coil/pre-amplifier from DC/DC converters and motors!
+
  File: Dcdc_noise.jpg | Achtung: Halte Spule/Vorverstärker von den DC-DC-Wandlern und Motoren fern
 
</gallery>
 
</gallery>
  
 
=== Signalmessungen ===
 
=== Signalmessungen ===
The sender / coil / LM386 amplifier outputs should look like this: (for more details about the signal, see section signal above)
+
Sender / Spule / LM386 Verstärker Ausgangssignale sollten etwa so aussehen: (witere Details über das Signal s. Abschnitt Signal)
 
<gallery>  
 
<gallery>  
  File: Perimeter_signal_steps.png | Perimeter signal at sender, receiver coil, and LM386 (theory)
+
  File: Perimeter_signal_steps.png | Signal am Sender und an Empfangsspule und LM386 (Prinzip)
  File: coil_signal_without_capacitor.png | differential signal/coil signal without capacitor  (5V sender, 5 ohm loop - blue: perimeter, yellow: coil, gray: LM386 amplifier out)
+
  File: coil_signal_without_capacitor.png | Sender-Signal / Spulensignal (5V sender, 5 Ohm Schleife - blau: Perimeter, gelb: Spule, grau: LM386 Verstärkerausgang)
  File: Lm_output_dc_noise.jpg | LM386 output, with DC noise (differential signal/coil without capacitor)
+
  File: Perimeter2_sender_open.jpg| Sendersignal (6.5V, ohne Perimeterschleife)
File: Perimeter2_receiver_coil.jpg | LM386 output (non-differential signal/coil with capacitor, 12V sender, 120m loop)
+
  File: Lm_output_dc_noise.jpg | Schleifen-Empfänger: LM386 Ausgang mit DC Störungen
  File: coil_signal_with_capacitor.png | non-differential signal/coil signal with capacitor (5V sender, 5 ohm loop - gray: perimeter, yellow: coil, blue: LM386 amplifier out)
+
File: Lm_output_motor_noise.jpg | LM386 output, with motor noise (differential signal/coil without capacitor)
+
 
</gallery>
 
</gallery>
  
=== Signal und Rauschmessungen ===
+
=== ADC-Kalibrierung am Empfänger ===
Some coil measurements without amplifier but with noise (motors, DC/DC etc.):
+
[[File: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.
<gallery>
+
# Der Perimetersender und die Motoren des ArduMower müssen während der Kalibrierung ausgeschaltet sein!
File: Coil_60k_parallel.jpg | Coil and 60k parallel resistor, without noise (coil background noise Vpp=7 mV)
+
# 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.
File: Coil_dc_converter_noise.jpg | Coil and 60k parallel resistor, DC converter noise (DC/DC noise Vpp=18 mV)
+
# Führe die ADC-Kalibrierung einmal aus ("pfodApp->ADC Calibration")
File: Coil_motor_noise.jpg | Coil and 60k parallel resistor, motor noise
+
File: Perimeter2_receiver_coil_pwm.jpg | Coil signal and series 4.7nF capacitor, pulse modulated perimeter signal (not recommended), without noise
+
File: Fft_signal.png | FFT signal
+
File: Fft_motors.png | FFT motors
+
File: Fft_dcdc.png | FFT DC/DC
+
</gallery>
+
 
+
=== Empfänger-ADC-Kalibrierung ===
+
[[File:warning.png]] The ADC calibration ensures that the zero point (silence) is detected correctly, and so later the received signal is symmetric around zero.
+
# The perimeter sender and robot motors must be switched off during calibration!
+
# If you cannot avoid that another sender is disturbing during calibration, remove the coil during calibration (connect LM386 input line to GND)
+
# Run the ADC calibration once ("pfodApp->ADC Calibration")
+
  
When calibrated correctly, the signal in the pfodApp plot ('sig') should be around zero (0) when the perimeter sender is switched off. When the perimeter sender is switched on, the plotted signal ('sig') should have the same maximum amplitude for both positive and negative axis (is 'symmetric around zero').
+
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.
  
 
<gallery>
 
<gallery>
  File: perimeter_v2_sig_symmetric.jpg | symmetric signal when sender is on (after ADC calibration)
+
  File: perimeter_v2_sig_symmetric.jpg | symmetrisches Signal bei eingeschaltetem Sender (nach ADC-Kalibrierung)
  File: perimeter_v2_sender_off.jpg | zero signal when sender is off (after ADC calibration)
+
  File: perimeter_v2_sender_off.jpg | Nullsignal bei ausgeschaltetem Sender (nach ADC-Kalibrierung)
 
</gallery>
 
</gallery>
  
=== Empfänger Problemanalyse und Fehlerbehebung ===
+
=== Problemanalyse und Fehlerbehebung am Empfänger ===
  
The receiver signal, filter result and signal quality can be monitored via Android phone (pfodApp->Plot->Perimeter):
+
Empfangenes Signal, Filterergebnis und Signalqualität können per Android Handy über die pfodApp->Plot->Perimeter angezeigt werden:
  
 
<gallery>
 
<gallery>
  File: Perimeter_snr.png | Signal-to-noise ratio (SNR)
+
  File: Perimeter_snr.png | Signal-Rausch-Verhältnis (SNR)
  File: Perimeter_signal_38khz.png | signal, filter result, LP filter result, inside/outside, counter, on/off, quality
+
  File: Perimeter_signal_38khz.png | Signal, Filterergebnis, LP Filterergebnis, innen/außen, Ereigniszähler, Signal ein/aus, Signalqualität
  File: Perimeter_plot_moving_from_inside_to_outside.png | Moving from inside to outside
+
  File: Perimeter_plot_moving_from_inside_to_outside.png | Fahren von innen nach außen
 
  File: Perimeter_v2_plot.png
 
  File: Perimeter_v2_plot.png
 
  File: Perimeter_v2_plot_new.png
 
  File: Perimeter_v2_plot_new.png
Zeile 306: Zeile 201:
 
</gallery>
 
</gallery>
  
Plot signal description:
+
Beschreibung der im Plot angezeigten Signalverläufe:
  sig:  coil signal (raw pulse sequence after ADC) - it's a short snapshot (32 samples), and it's taken every 20 seconds
+
  sig:  Spulensignal (Sequenz der Rohimpulse nach ADC) als kurzer Snapshot (32 samples), Update alle 20 Sekunden
       (so you need to wait 20 seconds for the next snapshot)
+
       (also 20 Sekundenwarten bis zum nächsten Snapshot)
  mag:  filter result: inside (negative) or outside (positive), magnitude: distance to perimeter wire/magnetic signal strength (RSSI)
+
  mag:  Filterergebnis: innen (negativ) oder außen (positiv), magnitude: Abstand zur Perimeterschleife / magnetische Signalstärke (RSSI)
       - this is used for <b>perimeter tracking</b>
+
       - wird benutzt zum <b>Perimeter verfolgen</b>
  smag: filter result, low-pass filtered, without sign (smooth mag) - this is used for <b>'sender-off' detection</b>
+
  smag: Filterergebnis, low-pass-gefiltert, ohne Vorzeichen (geglätteter mag-Verlauf) - verwendet zur Erkennung des <b>'Sender-aus' Zustandes</b>
       The threshold can bet set via pfodApp (Settings->Perimeter->Timed-out if below smag)
+
       Der Grenzwert kann über die pfodApp gesetzt werden (Settings->Perimeter->Timed-out if below smag)
  in:  binary result, low-pass filtered: inside (1) oder outside (0) - this is used for <b>perimeter boundary detection</b>
+
  in:  binäres Ergebnis des low-pass Filters: innerhalb (1) oder außerhalb (0) der Perimeterschleife - wird benutzt zur <b>Erkennung des Perimetergrenzverlaufs</b>
       If the robot is not inisde for a certain time, it will go into error. The threshold can bet set via pfodApp
+
       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)
+
       (Settings->Perimeter->Timeout (s) if not inside) eingestellt werden
  cnt:  number of "inside-outside" transitions (counter)
+
  cnt:  Anzahl der Wechsel von innen nach außen (counter, Zähler)
  on:  perimeter sender active (1) or inactive (0), evaluation based on smag result
+
  on:  Perimetersender ist aktiv, Roboter innerhalb und smag ausreichend (1) oder inaktiv/außerhalb/smag zu klein (0)
  qty:  <b>signal quality</b> (how distinguisable inside and outside were in filter result
+
  qty:  <b>Signalqualität</b> (Aussage über die Verläßlichkeit der Erkennung 'innerhalb / außerhalb' aus dem Filterergebnis)
       computes ratio:  match score with template signal / match score with inverse template signal              
+
       Verhältnis aus Vergleich mit Mustersignal zu Vergleich mit inversem Mustersignal              
       1.0 means poor quality, you should get 1.5 or higher)
+
       1.0 bedeutet schlechte Qualität, Du solltest Werte von 1.5 oder höher)
  
The 'mag' plot should be clear (without spikes): Inside the perimeter loop, the signal should be a clear negative curve, outside it should be a clear positive curve. If your 'mag' curve is not clear (and has spikes), try to troubleshoot/optimize:
+
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:
  
* Always test using long, correctly rolled-off perimeter wire (20m or longer) - Never use unrolled or too short perimeter wire. For 'kitchen test' a 100 Ohm resistor in series with 5m wire @ 5V could make the job
+
* Verbinde die Empfangsspule mit 'pinPerimeterLeft' auf dem PCB (am falschen Pin könnte das Signal 'etwas schwach' reinkommen)
* Verify, your coil is connected correctly at 'pinPerimeterLeft' (you still may get a poor signal when connected at a wrong Arduino pin!)
+
* 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.
 
* 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 parallele Anzeige des Signal per pfodApp (Plot --> Perimeter).
+
* 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).
* Minimize cable length between coil and LM386-pre-amplifier (directly mount coil onto pre-amplifier)
+
* Die Kabelverbindung zwischen Spule und LM386-Vorverstärker muss möglichst kurz sein - am Besten die Spule direkt am Verstärker anschließen!
* Increase distance between coil and mower motor/DC converter (move away coil 30cm or more from any motors or DC converters)
+
* Halte den Abstand zwische Spule und Motoren sowie DC/DC-Wandlern möglichst groß (30cm oder mehr!)
* Add some magnetic shield (e.g. your battery) between coil and motors/DC converter
+
* Nutze die magnetische Abschirmwirkung (z.B. Deines Akkus) zwischen Spule und Störquellen.
* Adjust voltage of sender: increase voltage (sender DC converter potentiometer) for for longer perimeter (>80m), decrease (sender potentiometer) for shorter perimeter (>25m)
+
* While motors are running, try to tilt coil slightly to one side so that 'qty' curve increases
+
  
== Messungen ==
+
Weitere Fehlerquellen:
 
+
[http://wiki.ardumower.de/index.php?title=Der_Perimetersender_ohne_automatische_Regelung]
For your reference, here are some outdoor measurements of different sender/receiver/perimeter loop combinations:
+
 
+
1) 120m (0.7mm^2), R=4 Ohm, 6.5V, coil Vpp 20mV
+
Noise (max): smag=192
+
Signal (min): smag=254
+
SNR=Signal/Noise=254/192=1.3
+
 
+
2) 30m (0.7mm^2), R=1.0 Ohm (+4 Ohm series R), 6.5V, coil Vpp 120 mV
+
Noise (max): smag=192
+
Signal (min): smag=896
+
SNR=Signal/Noise=896/192=4.6
+
  
 
=== Videos ===
 
=== Videos ===
#[http://www.youtube.com/watch?v=FL6K98B2Zsk&feature=player_detailpage#t=265 Perimeter2 demo]
+
#[http://www.youtube.com/watch?v=FL6K98B2Zsk&feature=player_detailpage#t=265 Perimeter2 Demo]
#[https://www.youtube.com/watch?v=QCA6Dm3rs3M 120m perimeter wire test]
+
#[https://www.youtube.com/watch?v=QCA6Dm3rs3M Test 120m Perimeterschleife]
#[https://www.youtube.com/watch?v=NIer_kITelc Perimeter wire and matched filter theory (German)]
+
#[https://www.youtube.com/watch?v=NIer_kITelc Theorie zu Perimeterschleife und Matched Filter (in deutsch)]
#[https://www.youtube.com/watch?v=VxJN2xb55dU&feature=youtu.be Sender PCB]
+
#[https://www.youtube.com/watch?v=VxJN2xb55dU&feature=youtu.be Sender-PCB]
 +
#[http://www.youtube.com/watch?v=FGaUSg-uUxk Perimeter Stoptest]
 +
#[http://www.youtube.com/watch?v=8R8QaffNlJw Perimeter Verfolgungstest]
 +
#[http://www.youtube.com/watch?v=CftrnetFVYc&feature=youtu.be Test zum Finden und Verfolgen mit L50]
 +
#[http://www.youtube.com/watch?feature=player_embedded&v=fjuQViS2rHM Test zum Finden und Verfolgen mit Rotenbach]
 +
#[http://youtu.be/r4ZMgasMkH0 Magnetfeld Demovideo]
  
= Abfahren der Begrenzungsschleife =
+
= Verfolgung der Begrenzungsschleife =
  
The tracking of the perimeter wire is performed using a (software) digital PID controller. The controller's parameters (P,I,D) can be configured via the phone (pfodApp).
+
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.
  
 
<gallery>
 
<gallery>
Zeile 362: Zeile 249:
 
</gallery>
 
</gallery>
  
You can find more information about PID controllers here:  
+
Mehr Informationen über PID-Regler sind hier zu finden:  
 
[http://www.ardumower.de/index.php/de/forum/anleitungen-hilfe/121-pid-regelung-fuer-drehzahl-drehung-etc-richtig-einstellen Forum].
 
[http://www.ardumower.de/index.php/de/forum/anleitungen-hilfe/121-pid-regelung-fuer-drehzahl-drehung-etc-richtig-einstellen Forum].
 
= Sensor Signalfusion =
 
The perimeter magnetic field could be used as input for a [http://wiki.ardumower.de/index.php?title=Sensor_fusion robot position estimation].
 
  
 
= Weiterführende Links =
 
= Weiterführende Links =
#[http://www.ardumower.de/index.php/en/forum/schleifensensoren-generator/83-ir-bake-generator-empfaenger-diy Another idea for navigation are infrared landmarks]
+
#[http://www.ardumower.de/index.php/en/forum/schleifensensoren-generator/83-ir-bake-generator-empfaenger-diy Ein anderer Navigationsansatz sind Infrarot-Baken]
#[http://grauonline.de/wordpress/?page_id=364 More details about the matched filter]
+
#[http://grauonline.de/wordpress/?page_id=364 Mehr Details zum 'matched filter']
#[http://www.grauonline.de/alexwww/ardumower/oscilloscope/oscilloscope.html Sound card oscilloscope including matched filter]
+
#[http://www.grauonline.de/alexwww/ardumower/oscilloscope/oscilloscope.html Soundkarten-Oszilloskop inklusive 'matched filter']
 
+
 
+
 
+
= Perimeter V1 (für alten Code V0.9.3, nicht mehr empfohlen) =
+
 
+
This was the first version of our perimeter sender and receiver. It has some drawbacks (orientation issues, no sender-off detection, no inside/outside state detection), so it's not recommended to build it anymore. Use the second version (v2) of our perimeter sender and receiver further below.
+
 
+
== Sender ==
+
You can use the sender of a commercial lawn robot (the sender shown here is compatible with Tianchen or Rotenbach robot mowers), or you build one yourself.
+
 
+
So, here's the sender:
+
 
+
An Arduino (e.g. Nano) generates a square signal that is used to switch the direction of a motor driver (L298N) at 7.8 Khz. Thereby, the motor driver will switch the output between VCC and GND. A resonator circuit amplifies the signal spikes as it's dimensioned so that its resonation frequency is the same as the switching frequency (7.8 Khz). That way, the motor drive only needs to be operated at 5V (instead of 12V). The power supply should be able to supply 2W (400mA at 5V). One part of the signal is captured by the Arduino (ADC) through a diode and a voltage divider. This allows to detect if the perimeter loop is connected or not. A 150 mA current will flow through in the perimeter wire (wire cross section 2-3 mm^2) - the wire should not be longer than 500m.
+
 
+
<gallery>
+
File: Arduino_perimeter_sender.png ‎
+
</gallery>
+
 
+
Because it's sometimes difficult to find a specific coil, here are possible combinations (coil / capacitor) you can use (all will have a resonation frequency of 7.8 Khz):
+
*Combination 1: Coil: 160µH, Capacitor: 3,3µF/50V  (tested)
+
*Combination 2: Coil 33mH, Capacitor: 12nF (not tested)
+
 
+
==== Stromversorgung ====
+
It is recommended to use a voltage step-down converter (e.g. module using LM2596) to generate the 5V voltage. Before connecting, set the voltage of the converter to 5V.
+
 
+
'''Warning''' : never connect more than 5V on the Arduino 5V pins, or you will damage the Arduino. Therefore, always measure the 5V voltage before connecting it to the Arduino 5V pin!
+
 
+
==== Funktionstest ====
+
1. After uploading the code and connecting the perimeter wire, the Arduino LED should be ON. Now remove the perimeter wire -  the Arduino LED should go OFF.
+
2. If that doesn't work: Using a voltmeter, measure once at Arduino pin D9 and once at motor driver output pin (OUT_1) against ground - both should have a DC voltage of 2.5 Volt.
+
3. If you have an oscilloscope, replace the perimeter wire by the oscilloscope. The measured signal look like below:
+
 
+
The output signal shows a higher amplitude (high spikes) as the input signal:
+
 
+
<gallery>
+
File: Perimetersignal.jpg|signal on the sender output
+
File: Ardumower_perimeter_sender_schematics.png|resonator circuit basic principle
+
File: Arduino_perimeter_sender_photo.jpg
+
</gallery>
+
 
+
For a simple receiver test, you can simply connect the receiver coil to an oscilloscope. The measured oscilloscope signal should look like below:
+
 
+
This signal can be detected easily with a coil:
+
 
+
<gallery>
+
File: Coilsignal.jpg|coil signal at receiver coil
+
File: Fft.jpg|signal in frequency spectrum, superposed by motor noise
+
File: Ardumower_perimeter_spectrum_plot.jpg| frequency spectrum via pfodApp
+
</gallery>
+
 
+
== Empfänger ==
+
The receiver uses 2 coils mounted left and right in the robot. The signal strenght of left and right coils is evaluated to be able to compare them.
+
 
+
Principle:
+
# Amplification of alternating signal using OPAMP
+
# Optional: Bandpass-filtering to filter-out noise caused by motors etc.
+
# Evaluation of signal strength of left and right coil
+
 
+
Advantage of this version: analog controlling works great.
+
Disadvantage: You cannot detect, where you are (inside/outside) if your missed the perimter crossing. Also, you cannot detect if you drive clockwise or anti-clockwise on the perimeter wire.
+
 
+
<gallery>
+
File: Arduino_perimeter_receiver.png
+
</gallery>
+
 
+
A coil receives the sender's signal. A resonator circuit (LC) amplifies the received signal at resonation frequency (7.8 kHz). Then the signal is amplified using an LM386 (here: Arduino sound sensor using coil instead of microphone). A bandpass-filter  (digital filter, FFT) on the Arduino filters the desired frequency (7.8 Khz) and outputs a PWM signal (pulse width is proportional to signal strength). A lowpass-filter converts it to a DC voltage.
+
Note: Wiring between Nano and Mega has been simplified - see schematics for exact wiring.
+
 
+
We have tested the following combinations of amplifier und coils:
+
 
+
'Arduino sound sensor'
+
<gallery>
+
File: Soundsensor.jpg| Amplifying signal using LM386 - Arduino Sound Sensor using coil instead microphone
+
File: YwRobot_Sensor.jpg |Arduino Sound Sensor using LM386
+
File: YwRobot_circuit.png |Arduino Sound Sensor module schematics
+
File: Coil_85mh.jpg|85 mH coils
+
</gallery>
+
 
+
LM386 amplifier
+
<gallery>
+
File: Lm386_amplifier.jpg| LM386 amplifier (200x amplification)
+
File: Lm386_modified.jpg| LM386 amplifier modified
+
File: Ardumower_lm386_circuit.png | LM386 module schematics
+
File: Coil_small.jpg| 104 mH coil
+
</gallery>
+
 
+
Important: When using this amplifier, capacitor C3 should be bypassed (will give a VCC/2 offset required for Arduino) and the coil will be connected to "IN" and "GND".
+
 
+
'''NOTE''': It's recommended to directly mount the coil on the amplifier module. This ensures the 'small signal' of the coil is not distorted by other components (motors etc.)
+
 
+
=== Funktionstest ===
+
# Make sure that the sender works correctly (see further above).
+
# Increase the Arduino Sound Sensor potentiometer to maximum (rotate counter-clock-wise).
+
# After uploading the code, move one coil towards the perimeter wire. The Arduino LED should start to blink. Now, hold both coils at same distance over the perimeter wire. The Arduino LED should be always ON now.
+
# If that doesn't work, open the serial console (19200 baud), and verify the signal values.
+
 
+
=== Spulenauswahl ===
+
Induction math, only approximation:
+
 
+
L = 1nH x n² x ((D² / mm² ) / (l / mm))
+
l = coil length
+
D = coil diameter
+
 
+
Example: An inductance of 85 mH, and diamter of 10 mm, and length of 40 mm require about  5830 windings.
+
 
+
This inductance of 85 mH and a capacity of 4.7 nF results in a resonation frequency of 7963 Hz.
+
 
+
f0 = 1 / (2 * PI * sqrt(L * C)) = 1 / (2 * PI * sqrt(0.085 H * 0.0000000047 F)) =  7963 Hz
+
 
+
Because it's sometimes difficult to find a specific coil, here are possible combinations (coil / capacitor) you can use (all will have a resonation frequency of 7.8 Khz):
+
Combination 1: Coil: 85mH, Capacitor: 4.7nF  (tested)
+
Combination 2: Coil 104mH, Capacitor: 4nF (tested)
+
 
+
=== Anordnung der Spulen ===
+
The coils are arranged at the bottom of the robot, about 90 degress to each other, both turned 45 degress.
+
<gallery>
+
File: Ardumower_spulen.jpg| Arrangement of coils
+
File: L50_coils.jpg |Example (Ambrogio L50)
+
File: L50_parcours.jpg |Test parcours
+
</gallery>
+
 
+
=== Messung der Signalstärke ===
+
To compare measurements, the signal strength has been determined at several distances. The signal strength (i.e. the calculated ADC value) is shown in the Android pfodApp. The distance (cm) is the length calculated from the perimeter loop until the coil (coil built-in the robot).
+
 
+
<gallery>
+
File: Perimeter_plot.png
+
</gallery>
+
 
+
=== Schleifenverlegung ===
+
 
+
It's important that the wire layout is round and does not have corners! Let's assume that the wire has a corner, and the robots drives exactly over the corner, it will not be able to detect the wire as both wire and coils are aligned.
+
 
+
<gallery>
+
File: Schleifen_blind.jpg  | Not recommened: robot cannot detect sharp edges!
+
File: Ardumower_coil_signal.png| How does the signal change when rotating the coil?
+
</gallery>
+
 
+
=== Videos ===
+
#[http://www.youtube.com/watch?v=FGaUSg-uUxk Perimeter stop test]
+
#[http://www.youtube.com/watch?v=8R8QaffNlJw Perimeter tracking test]
+
#[http://www.youtube.com/watch?v=CftrnetFVYc&feature=youtu.be Finding and tracking test L50]
+
#[http://www.youtube.com/watch?feature=player_embedded&v=fjuQViS2rHM Finding and tracking test Rotenbach]
+

Aktuelle Version vom 4. Juli 2016, 10:11 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. Using a simple symmetric signal (which looks equal on positive and negative side of the zero point), you cannot differentiate between an 'inside perimeter' and 'outside perimeter' signal. When the mower is traversing the perimeter loop, the signal polarity changes (positive becomes negative and negative becomes positive). We want to detect this polarity change of the signal. Using an unsymmetrical signal, you can do this. You can see the difference in the simulator. The default signal (slider 'example signal') is a symmetric signal - press the 'Invert' button to invert the signal (change its polarity). In the correlation result (graph 'Matched filter') the polarity can not be detected. Now use an asymmetrical signal ('pseudonoise5_pw'). Press again 'Invert' to change signal polarity. Now you can see polarity of the signal in the filter output (graph 'Matched filter'). It's the sign of the peak (positive or negative sign).

Sender

Wichtig für Marotronics INA169: Pads verlöten für 5A Betrieb

Ardumower perimeter overview.jpg

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). Unser Motortreiber verfügt über eine integrierte Strombegrenzung und eine Übertemperaturabschaltung (z.B. MC33926)

Anschluss der Induktionsschleife erfolgt am MC33926 zwischen M1OUT1 und M1OUT2.

Warning.png Wichtig: Die Schleifenlänge kann im Bereich 20 - 450m betragen und muss mindestens 5 Ohm bzw. darf maximal 12 Ohm Widerstand aufweisen. Die maximal Begrenzungs-Fläche beträgt 1000 m2.

Sendersoftware

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

Download: Du findest den Code für den Schleifensender im Ordner 'sender' unter 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.

Einstellen der Sendeleistung

Zum Einstellen der Sendeleistung wie folgt vorgehen:

Warning.png Wichtig: Deine Induktionsschleife sollte mindestens ein Widerstand von 12 Ohm aufweisen. Im Idealfall schaltet man ein 12 Ohm (50W) Lastwiderstand in Reihe. So kommt man dann auf ein Gesamtwiderstand der Begrenzungsschleife die im Bereich von ca 12-15 Ohm liegt.

Die Versorgungsspannung des Motortreibers wird über das Poti des DC/DC-Wandlers zwischen 6.5 bis 12V eingestellt. Die Spannung am DC/DC-Wandler so einstellen, dass nicht mehr als 1 Ampere zum fließen kommt.

Beispiel:

Deine Induktionsschleife hat: 12 Ohm
Deine Eingstellte Spannung am DC/DC-Wandler: 8 Volt

Der verbrauchte Strom und die verbrauchte Leistung ist dann:

Strom: I = U / R = 8 Volt / 12 Ohm => 0,7 Ampere
Verbrauchte Leistung: P = U * I = 8 Volt * 0,7 Ampere => 5,6 Watt

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 Motortreiber nicht mehr richtig). Dann hilft nur noch ein zur Schleife in Reihe geschalteter Hochlastwiderstand. Wichtig: der Hochlastwiderstand muss für die Leistung ausgelegt sein! In dem gezeigten Beispiel mit 12 Ohm sollte man also einen 10 Watt Lastwiderstand verwenden.

Weitere Informationen: [1]

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 befindet sich auf dem Sender PCB ein Stromsensor (INA169, 5A) zwischen Ladegerät und Ladeanschlüsse.

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!)

Sender Diagnose

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.

Um Fehler zu finden bzw. um den Schleifensender besser zu verstehen, öffne mit der Arduino IDE die serielle Konsole (CTRL+SHIFT+M) auf 19200 Baud. Hier ein Beispiel der möglichen Zustände (Roboter in Ladestation/Roboter nicht in Ladestation usw.):

Empfänger

Perimeter v2 receiver circuit.png

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:

  • 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.

Weitere Fehlerquellen: [2]

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'