Perimeter-Schleife

Aus www.wiki.ardumower.de
Version vom 6. Juli 2015, 21:55 Uhr von Pemiso (Diskussion | Beiträge) (Sendertest per PC-Soundkarte)

Wechseln zu: Navigation, Suche

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.

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.

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. Interessanterweise wechselt das Signal in dem Moment seine Polarität, wo der ArduMower (genauer: die Empfänger-Spule) den Schleifendraht überfährt. Es gibt zwei prinzipielle Möglichkeiten, den Begrenzungsdraht zu orten. Wir haben beide Methoden implementiert (Perimeter V1 und V2) wie nachfolgend beschrieben.

Magnetfeld Berechnungstool

Videos: Magnetfeld Demovideo

Perimeter-Schleife V2 (erforderlich für aktuellen ArduMower Code)

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

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 matched filter ausgewertet wird. Der Filter liefert als Ergebnis einen Peak - positiv: ArduMower innerhalb oder negativ: außerhalb der Begrenzungsschleife.

Prinzipablauf:

 Senderseite
  1. Erzeugen des Ausgangssignals durch den Arduino Nano
  2. Verstärkung des Ausgangssignals durch den Motortreiber (MC33926), Schleifendrahtenden anstatt eines Motors an den Ausgang anschließen
 ArduMower
  1. Eingangssignal per Empfangsspule aufnehmen
  2. Eingangssignal per Operationsverstärker (z.B. LM386) verstärken
  3. ADC sampling durch Arduino Mega
  4. Signalfilterung and Analyse durch ein digitales Filter (software-basierter matched filter algorithmus)
  5. Auswertung des matched filter Ergebnisses (zur Feststellung des Aufenthaltbereiches innen / außen in Bezug auf die 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 Spule treffen.

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:

  1. Signalstärke hochfahren (elektr. Leistung) oder
  2. 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. Das andere Extrem wäre der längste erzeugte Signalwechsel mit '1,1,-1,-1', bei einer Frequenz von 2404 Hz.

Die Spule erkennt nur diese Signalwechsel des Sendersignals - so (also 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.

Der Arduino ADC sampelt das Empfangssignal mit 9615 Hz.

Filter

Die gewählte Signalform hat eine spezielle Charakteristik:

Weil es wie ein Zufallssignal aussieht, stimmt es nicht in Teilen mit sich selbst überein, sondern erst als komplette Sequenz (Übereinstimmung). Aufgrund dieser Charakteristik können die Startpunkte der Signalsequenz durch ein matched filter ('Korrelation' mit dem gesuchten Signalmuster) ermittelt werden: sie erscheinen als Nadelimpuls im Filterergebnis - und zwar auch bei einem stark verrauschten Signal (z.B. durch Störimpulse von Motoren etc.). Die Polarität der Spitze (positiv oder negativ) gibt an, ob sich die Spule inner- oder außerhalb der Begrenzungsschleife befindet.

Du kannst sehen, wie das funktioniert: für ein tiefergehendes Verständnis des Perimetersignals und des Filters schau Dir folgende Simulation (in eglisch) an: Matched filter simulation

  1. Wähle eine Perimetersignalform: setze den Schieberegler (rechts oben 'example signals') auf pseudonoise4_pw (Wert 23).
  2. Hebe den Wert des Störsignal ein wenig an: setze den Schieberegler ('noise') auf den Wert 2.
  3. Der Plot 'Matched filter' (links unten) zeigt, dass das wiederholte Signal 3 mal entdeckt wurde.
  4. Nun simuliere die Bewegung der Spule aus der Perimeterschleife nach außen: Klicke auf 'Invert' und setze damit die Verstärkung auf '-1'. Der Filter liefert 3 negative Spitzen.

Mehr dazu unter: Video über matched filter

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.

Sender Pin-Belegung:

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

Beispiel für den Senderaufbau mit einer Lochrasterplatine: [1] [2] [3]

Sender Perimeterschleife und Rasengröße

Bei einer Betriebsspannung von 6.5V sollte die Perimeterschleife nicht über 450 m lang sein. (Für den 'Wohnzimmertest' tut es auch ein 100 Ohm Widerstand in Reihe mit 5m Schaltdraht.)

Setzen wir mal eine kreisrunde Rasenfläche voraus erhalten wir für 450m Schleifenlänge (= Kreisumfang) einen Radius von 70m:

radius = Schleifenlänge / (2*PI) = 450m / (2*PI) = 70 meter

Wäre die Signalqualität nicht durch den Radius begrenzt, entspräche der eingegrenzte Rasen einer Fläche von 15000m2:

Fläche = PI * (radius*radius) = PI * (70m * 70m) = 15000 m2

Da jedoch der maximale Radius für ausreichende Signalqualität bei ca. 18m liegt, ergibt sich die maximale Rasenfläche (Annahme immer noch: Kreisfläche!) zu 1000m2: Fläche = PI * (radius*radius) = PI * (18m * 18m) = 1000 m2

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

Senderstromüberwachung (in Entwicklung)

Idee: das Poti VR1 wird durch ein digitales Poti (z.B. MCP4151-5K) ersetzt. So kann die Vin des Motortreibers (und damit auch der Strom) über den Arduino eingestellt werden:

MCP4151-5K version:

Vout = 1.23V*(1+VR1/R1)
Using VR1=5K...
Vstart (on reset):  Vout=1.23V*(1+2.5K/0.33K)=10v
Vmax:  Vout=1.23V*(1+5K/0.33K)=19v

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 ein Stromsensor (ACS712) zwischen Ladegerät und Ladeanschlüsse geschaltet.

Sendersoftware

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

Warning.png Wichtig: Vergewissere Dich, dass die Pin-Konfiguration des Arduino im benutzten Code (sender.ino) mit Deinem Senderaufbau übereinstimmt!

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)

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

Sendertest per PC-Soundkarte

Du kannst den Sender mit Deine Soundkarte und einer Spule testen:

  1. Verbinde eine Spule (100 mH) mit dem Mikrofon-/Line-Eingang (max 1V) Deiner Soundkarte
  2. Starte das Web-Oszilloskop, und wähle Filter 'Matched', Frequenz '9615' Hz, Visualization Math 'MinMax'
  3. Das Ausgangssignal sollte den Abstand zur Perimeterschleife wiederspiegeln - die Polarität (negativ/positiv) zeigt den Aufenthaltsbereich (innerhalb/außerhalb) der Schleife.

Versuche in beiden Fällen (innen/außen), die Spule so dicht wie möglich an der Schleife zu positionieren, um ein auswertbares Signal zu empfangen (zur Erinnerung: wir arbeiten hier ohne die Signalverstärkung durch den Operationsverstärker, da der Soundkarteneingang nur mit max 1V beaufschlagt werden darf).

Video zur Erklärung aller Schritte

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').

receiver circuit:

                                      LM386 IN  o------- capacitor 4.7nF ----------- coil 100 mH  (or 150 mH)
 Arduino pinPerimeterLeft   o------o  LM386 OUT
                                      LM386 GND o----------------------------------- coil

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

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.

Abstand Spule/Verstärker zu Motoren

Ensure all minimum distances to the following components:

* Coil to gear motor: > 15cm
* Coil to mower motor: > 10cm 
* Coil to DC/DC converter: > 10cm

Signalmessungen

The sender / coil / LM386 amplifier outputs should look like this: (for more details about the signal, see section signal above)

Signal und Rauschmessungen

Some coil measurements without amplifier but with noise (motors, DC/DC etc.):

Empfänger-ADC-Kalibrierung

Warning.png The ADC calibration ensures that the zero point (silence) is detected correctly, and so later the received signal is symmetric around zero.

  1. The perimeter sender and robot motors must be switched off during calibration!
  2. If you cannot avoid that another sender is disturbing during calibration, remove the coil during calibration (connect LM386 input line to GND)
  3. 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').

Empfänger Problemanalyse und Fehlerbehebung

The receiver signal, filter result and signal quality can be monitored via Android phone (pfodApp->Plot->Perimeter):

Plot signal description:

sig:  coil signal (raw pulse sequence after ADC) - it's a short snapshot (32 samples), and it's taken every 20 seconds 
      (so you need to wait 20 seconds for the next snapshot)
mag:  filter result: inside (negative) or outside (positive), magnitude: distance to perimeter wire/magnetic signal strength (RSSI)
      - this is used for perimeter tracking
smag: filter result, low-pass filtered, without sign (smooth mag) - this is used for 'sender-off' detection
      The threshold can bet set via pfodApp (Settings->Perimeter->Timed-out if below smag)
in:   binary result, low-pass filtered: inside (1) oder outside (0) - this is used for perimeter boundary detection
      If the robot is not inisde for a certain time, it will go into error. The threshold can bet set via pfodApp
      (Settings->Perimeter->Timeout (s) if not inside)
cnt:  number of "inside-outside" transitions (counter)
on:   perimeter sender active (1) or inactive (0), evaluation based on smag result
qty:  signal quality (how distinguisable inside and outside were in filter result
      computes ratio:  match score with template signal / match score with inverse template signal              
      1.0 means poor quality, you should get 1.5 or higher)

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:

  • 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
  • Verify, your coil is connected correctly at 'pinPerimeterLeft' (you still may get a poor signal when connected at a wrong Arduino pin!)
  • 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).
  • Minimize cable length between coil and LM386-pre-amplifier (directly mount coil onto pre-amplifier)
  • Increase distance between coil and mower motor/DC converter (move away coil 30cm or more from any motors or DC converters)
  • Add some magnetic shield (e.g. your battery) between coil and motors/DC converter
  • 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

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

  1. Perimeter2 demo
  2. 120m perimeter wire test
  3. Perimeter wire and matched filter theory (German)
  4. Sender PCB

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.

Sensor Signalfusion

Das Magnetfeld der Perimeterschleife könnte man als Input nutzen für eine Positionsabschätzung des ArduMower.

Weiterführende Links

  1. Ein anderer Navigationsansatz sind Infrarot-Baken
  2. Mehr Details zum 'matched filter'
  3. 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.

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:

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:

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:

  1. Amplification of alternating signal using OPAMP
  2. Optional: Bandpass-filtering to filter-out noise caused by motors etc.
  3. 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.

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'

LM386 amplifier

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

  1. Make sure that the sender works correctly (see further above).
  2. Increase the Arduino Sound Sensor potentiometer to maximum (rotate counter-clock-wise).
  3. 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.
  4. 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.

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

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.

Videos

  1. Perimeter stop test
  2. Perimeter tracking test
  3. Finding and tracking test L50
  4. Finding and tracking test Rotenbach