Perimeter wire: Unterschied zwischen den Versionen

Aus www.wiki.ardumower.de
Wechseln zu: Navigation, Suche
(Sender)
(Perimeter)
 
(31 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 8: Zeile 8:
 
<gallery>
 
<gallery>
 
File: Ardumower_perimeter.jpg | Perimeter wire
 
File: Ardumower_perimeter.jpg | Perimeter wire
File: Ardumower_perimeter_components.jpg | Components
 
 
File: Perimeter_signal_strength.jpg | Signal strength
 
File: Perimeter_signal_strength.jpg | Signal strength
 
File: Perimeter_gradient.png | Perimeter gradient
 
File: Perimeter_gradient.png | Perimeter gradient
Zeile 34: Zeile 33:
 
# The matched filter output is evaluated (for perimeter inside/ouside detection, tracking etc.)
 
# The matched filter output is evaluated (for perimeter inside/ouside detection, tracking etc.)
  
The images below explain why the polarity of the received coil signal changes between inside and outside of the perimeter wire. The image shows the direction of the electric flux lines sent out from the perimeter wire and how they hit the coil for both inside and outside position. For a better understanding of the perimeter filter, see the [http://www.grauonline.de/alexwww/ardumower/filter/filter.html Matched filter simulation]. For more details about the filter, also see the [https://www.youtube.com/watch?v=NIer_kITelc Matched filter video].
+
The images below explain why the polarity of the received coil signal changes between inside and outside of the perimeter wire. The image shows the direction of the electric flux lines sent out from the perimeter wire and how they hit the coil for both inside and outside position.  
 +
 
 +
For a better understanding of the perimeter filter, see the [http://www.grauonline.de/alexwww/ardumower/filter/filter.html Matched filter simulation]. For more details about the filter, also see the [https://www.youtube.com/watch?v=NIer_kITelc Matched filter video]. 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>
Zeile 45: Zeile 46:
  
 
==Sender==
 
==Sender==
<gallery>
+
[[Image:Ina169_marotronics.jpg|thumb|200px| Note for Marotronics INA169: Short pads for 5A operation]]
File: Schleifensender_Ardumower_V2.JPG | Sender circuit
+
[[File: Ardumower_perimeter_overview.jpg|600px]]
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. The maximum perimeter area is 1000 m2.
+
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). We use a motor driver with integrated current limiting and thermal switch-off (e.g. MC33926).  
 +
 
 +
[[File:warning.png]] The perimeter wire length should be in the range 20m - 450m and must be at least 5 Ohm and not more than 12 Ohm. The maximum perimeter area is 1000 m2.
 +
 
 +
MC33926 wiring: The perimeter wire is connected between MC33926 M1OUT1 and M1OUT2.
  
 
* [https://www.marotronics.de/Perimeter-Sender-Board-Prototyp-mit-Platinen-Zubehoer sender PCB in the shop]
 
* [https://www.marotronics.de/Perimeter-Sender-Board-Prototyp-mit-Platinen-Zubehoer sender PCB in the shop]
Zeile 61: Zeile 60:
  
 
===Sender software===
 
===Sender software===
 
 
<b>NOTE</b>: If you have never worked with Arduino before or if your Arduino Nano does not seem to respond, please read our <b>[http://wiki.ardumower.de/index.php?title=Arduino_first_steps 'Arduino first steps' introduction]</b>.
 
<b>NOTE</b>: If you have never worked with Arduino before or if your Arduino Nano does not seem to respond, please read our <b>[http://wiki.ardumower.de/index.php?title=Arduino_first_steps 'Arduino first steps' introduction]</b>.
  
Zeile 68: Zeile 66:
 
[[File:warning.png]] Note: Always verify that the pin configuration in your Arduino code (sender.ino) matches your actual circuit!
 
[[File:warning.png]] Note: Always verify that the pin configuration in your Arduino code (sender.ino) matches your actual circuit!
  
In the sender.ino you have this option:
 
  
* Define if you have connected a charging current sensor for automatic sender standby:   #define USE_CHG_CURRENT 1  (or 0)
+
===Sender power control===
 +
[[File:warning.png]] The perimeter wire resistance (R) must be at least 5 Ohm and not more than 12 Ohm. Ideally, a 12 ohms (50W) power resistor is placed in series with the perimeter wire, so you get a total resistance of the perimeter wire at 12-15 ohms.
  
===Sender current control===
+
To change the power (current/voltage) of the sender, proceed like this:
To change the power (current/voltage) of the sender, you have several options:
+
  
*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).
+
The motor driver output voltage can be changed between 6.5-12V via the potentiometer on the DC/DC converter. Adjust the potentiometer so that not more than 1 Ampere current flows.
  
*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':
+
Example:  
 +
Your perimeter wire resistance (R): 12 Ohm
 +
Your adjusted voltage at the DC/DC converter: 8 Volt
  
  // #define USE_DOUBLE_AMPLTIUDE    1 
+
The consumed current and power is then:
 +
Current: I = U / R = 8 Volt / 12 Ohm => 0.7 Ampere
 +
Power:  P = U * I = 8 Volt * 0.7 Ampere => 5.6 Watt
  
*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.  
+
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 motor driver will not work properly). Then you have to increase the perimeter wire resistance (R) by using a power resistor in series with your perimeter wire. Important: your power resistor must be suitable for the power! In the example above usng a 12 Ohm power resistor, it should be a 10 Watt type.
 
+
@6 volts (Vin): 5 ohm power resistor => I=U/R=6v/5ohm=1.2A  (P=U*I=6v*1.2A=7.2W)
+
 
+
So, your power resistor should be a 10W type or better. Activate 'normal-amplitude' in sender code (do not use double amplitude).
+
  
 
===Sender automatic standby===
 
===Sender automatic standby===
The sender can be switched off during the time the robot is in the charging station. To detect the robot, a current sensor is connected between the charger and the charging pins.
+
The sender can be switched off during the time the robot is in the charging station. To detect the robot, a current sensor (INA169, 5A) is connected between the charger and the charging pins.
  
 
===Sender diagnostics===
 
===Sender diagnostics===
Zeile 95: Zeile 92:
 
* OFF: perimeter wire loop is opened and not working
 
* OFF: perimeter wire loop is opened and not working
 
* blinking: robot is charging and perimeter will be switched OFF (energy saving)
 
* blinking: robot is charging and perimeter will be switched OFF (energy saving)
 +
 +
To find errors (or to better understand the sender), open the serial console via Arduino IDE (CTRL+SHIFT+M) at 19200 baud. Now you can see the possible states (robot in charging station, robot outside charging station etc.):
  
 
<gallery>
 
<gallery>
File:Perimeter_sender_console.png | Perimeter sender console output
+
  File:Perimeter_sender_console.png | Perimeter sender console output
 
</gallery>
 
</gallery>
  
 
==Receiver==
 
==Receiver==
 +
 +
[[File:Perimeter_v2_receiver_circuit.png |400px]]
  
 
For receiving the signal, we use a coil (100 mH or 150 mH) in upright position (centered at front in robot) connected to an LM386 operational amplifier (to amplify the received signal). When using the [https://www.marotronics.de/Schleifenempfaenger-Kit-perimeter-receiver-Kit 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').
 
For receiving the signal, we use a coil (100 mH or 150 mH) in upright position (centered at front in robot) connected to an LM386 operational amplifier (to amplify the received signal). When using the [https://www.marotronics.de/Schleifenempfaenger-Kit-perimeter-receiver-Kit 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>  
 
<gallery>  
File: Perimeter_v2_receiver_circuit.png | Receiver circuit and shortened capacitor C3
 
 
  File: Ardumower_chassis_components.png | Perimeter coil position
 
  File: Ardumower_chassis_components.png | Perimeter coil position
 
  File: Ardumower_coil_position.jpg | One centered, upright coil  
 
  File: Ardumower_coil_position.jpg | One centered, upright coil  
Zeile 127: Zeile 127:
 
</gallery>
 
</gallery>
  
pfodApp->Options->Perimeter:
+
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)
 
* Timed-out if below smag (timedOutIfBelowSmag) - default setting: 300 | If smag below this value, sender is considered as off (perimeter timeout appears)
Zeile 158: Zeile 160:
 
===Signal measurements===
 
===Signal measurements===
 
The sender / coil / LM386 amplifier outputs should look like this: (for more details about the signal, see section signal above)
 
The sender / coil / LM386 amplifier outputs should look like this: (for more details about the signal, see section signal above)
<gallery>  
+
<gallery>
  File: Perimeter_signal_steps.png | Perimeter signal at sender, receiver coil, and LM386 (theory)
+
  File: Perimeter_signal_steps.png | Perimeter signal at sender, receiver coil, and LM386 (principle)
  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, coil signal (5V sender, 5 ohm loop - blue: perimeter, yellow: coil, gray: LM386 amplifier out)
  File: Lm_output_dc_noise.jpg | LM386 output, with DC noise (differential signal/coil without capacitor)
+
  File: Perimeter2_sender_open.jpg| Sender signal (6.5V, open perimeter)
File: Perimeter2_receiver_coil.jpg | LM386 output (non-differential signal/coil with capacitor, 12V sender, 120m loop)
+
  File: Lm_output_dc_noise.jpg | LM386 output, with DC noise  
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>
  
Zeile 211: Zeile 211:
 
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:
 
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!)
 
* Verify, your coil is connected correctly at 'pinPerimeterLeft' (you still may get a poor signal when connected at a wrong Arduino pin!)
 
* Decrease the threshold for a smag timeout via 'pfodApp->Options->Perimeter->Timed-out if below smag'  
 
* Decrease the threshold for a smag timeout via 'pfodApp->Options->Perimeter->Timed-out if below smag'  
Zeile 217: Zeile 216:
 
* Minimize cable length between coil and LM386-pre-amplifier (directly mount coil onto pre-amplifier)
 
* 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)
 
* 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  
+
* 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
+
  
 
==Broken perimeter wire==
 
==Broken perimeter wire==
Zeile 238: Zeile 235:
 
  File: Peri_broken3.jpg | Method 2: Launch the web oscilloscope, and set frequency view
 
  File: Peri_broken3.jpg | Method 2: Launch the web oscilloscope, and set frequency view
 
</gallery>
 
</gallery>
 
==Measurements==
 
 
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===

Aktuelle Version vom 2. Juli 2016, 16:24 Uhr

Abstract

A perimeter wire (or buried wire fence, BWF) is like a 'virtual fence': it stopps the robot when it reaches its boundaries. A perimeter is not always necessary for all surroundings.

Principle idea: You will install a perimeter loop (a wire) in your garden through which a signal is sent and this signal is detected by the robot. So, you'll need: a sender (to transmit the on the wire) and a receiver (to detect the signal in the robot).

How is the signal detected? The signal is detected by one receiver coils. The closer the distance between coil and perimeter loop, the higher the signal strength. Also, something interesting happens when the robot crosses the perimeter loop: the signal changes its polarity, that means positive and negative voltages reverse each other.

Perimeter

This is the new version of the perimeter sender and receiver (that can be purchased via the shop Shopping.png).

The perimeter sender outputs a digital code sequence (a 'pseudo-noise' code), and the receiver will detect that code using a software-based digital matched filter. Depending on wheter the match result peak is positive or negative, the robot is inside or outside of the perimeter wire.

Sender principle:

  1. Sender PCB generates an output signal using an Arduino Nano (about 3 Khz)
  2. The generated signal is amplified using a motor driver (MC33926), the motor driver output is connected to the perimeter wire (instead of a motor)

Receiver principle:

  1. A coil receives the signal
  2. The signal is amplified using an operational amplifier (LM386)
  3. The Arduino Mega samples the signal using its analog-to-digital converter (ADC) at 9615 Hz
  4. The digital signal is filtered using a digital filter (matched filter algorithmn)
  5. The matched filter output is evaluated (for perimeter inside/ouside detection, tracking etc.)

The images below explain why the polarity of the received coil signal changes between inside and outside of the perimeter wire. The image shows the direction of the electric flux lines sent out from the perimeter wire and how they hit the coil for both inside and outside position.

For a better understanding of the perimeter filter, see the Matched filter simulation. For more details about the filter, also see the Matched filter video. 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

Note for Marotronics INA169: Short pads for 5A operation

Ardumower perimeter overview.jpg

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). We use a motor driver with integrated current limiting and thermal switch-off (e.g. MC33926).

Warning.png The perimeter wire length should be in the range 20m - 450m and must be at least 5 Ohm and not more than 12 Ohm. The maximum perimeter area is 1000 m2.

MC33926 wiring: The perimeter wire is connected between MC33926 M1OUT1 and M1OUT2.

Sender software

NOTE: If you have never worked with Arduino before or if your Arduino Nano does not seem to respond, please read our 'Arduino first steps' introduction.

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

Warning.png Note: Always verify that the pin configuration in your Arduino code (sender.ino) matches your actual circuit!


Sender power control

Warning.png The perimeter wire resistance (R) must be at least 5 Ohm and not more than 12 Ohm. Ideally, a 12 ohms (50W) power resistor is placed in series with the perimeter wire, so you get a total resistance of the perimeter wire at 12-15 ohms.

To change the power (current/voltage) of the sender, proceed like this:

The motor driver output voltage can be changed between 6.5-12V via the potentiometer on the DC/DC converter. Adjust the potentiometer so that not more than 1 Ampere current flows.

Example:

Your perimeter wire resistance (R): 12 Ohm
Your adjusted voltage at the DC/DC converter: 8 Volt

The consumed current and power is then:

Current: I = U / R = 8 Volt / 12 Ohm => 0.7 Ampere
Power:  P = U * I = 8 Volt * 0.7 Ampere => 5.6 Watt

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 motor driver will not work properly). Then you have to increase the perimeter wire resistance (R) by using a power resistor in series with your perimeter wire. Important: your power resistor must be suitable for the power! In the example above usng a 12 Ohm power resistor, it should be a 10 Watt type.

Sender automatic standby

The sender can be switched off during the time the robot is in the charging station. To detect the robot, a current sensor (INA169, 5A) is connected between the charger and the charging pins.

Sender diagnostics

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)

To find errors (or to better understand the sender), open the serial console via Arduino IDE (CTRL+SHIFT+M) at 19200 baud. Now you can see the possible states (robot in charging station, robot outside charging station etc.):

Receiver

Perimeter v2 receiver circuit.png

For receiving the signal, we use a coil (100 mH or 150 mH) in upright position (centered at front in robot) connected 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').


You can get the receiver kit in the shop


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

Note: Leave out capacitor 4.7nF in latest software versions ('using differential signal').


Settings

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

Coil/amplifier-to-motor distances

Ensure all minimum distances to the following components:

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

Signal measurements

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

Receiver ADC calibration

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

Receiver diagnostics/troubleshooting

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, robot is inside and smag is high enough (1) or inactive/outside/smag too low (0)
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:

  • Verify, your coil is connected correctly at 'pinPerimeterLeft' (you still may get a poor signal when connected at a wrong Arduino pin!)
  • Decrease the threshold for a smag timeout via 'pfodApp->Options->Perimeter->Timed-out if below smag'
  • Reverse coil if the in/out is inverted or reverse the perimeter wire
  • 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

Broken perimeter wire

Once in a while your perimeter wire may get broken, and your perimeter loop resistance will probably increase to a few Megaohms (MOhm). If that is the case, you can find the location of the break like this:

  1. Using a metal plate, plug one wire of the perimeter sender output into earth ground (the other wire of the sender output is still connected to the perimeter wire)
  2. Optional: increase your sender output voltage to 20 Volts (NOTE: the MC33926 driver can NOT operate higher than 28v, and your sender Arduino Nano may not operate higher than 20v)
  3. Method 1 (using two LM386 amplifiers and earphone): Connect 1st LM386 amplifier (NOTE: do NOT remove capacitor C3!) signal output to a 2nd LM386 input. Connect 2nd LM386 output to an earphone.
  4. Method 2 (using one LM386 amplifier and a PC): Connect the LM386 amplifier (NOTE: do NOT remove capacitor C3!) signal output (signal and GND) to your PC's microphone input, launch the web oscilloscope, and switch into frequency view (choose visualization 'frequency spectrum')
  5. Turn on the perimeter sender - while traversing the perimeter wire, you will notice a peak frequency of 3.2 Khz in the Web oscilloscope
  6. Now start at the side of the perimeter wire (the side that is still connected to the perimeter wire), and walk along the perimeter wire - the peak frequency of 3.2 Khz should always be there (and hearable)
  7. At the location where the wire is broken, the 3.2 Khz frequency is gone (and no longer hearable)! Demonstration video

Videos

  1. Perimeter2 demo
  2. 120m perimeter wire test
  3. Perimeter wire and matched filter theory (German)
  4. Sender PCB
  5. Perimeter stop test
  6. Perimeter tracking test
  7. Finding and tracking test L50
  8. Finding and tracking test Rotenbach
  9. Magnetic field demonstration video

Tracking of perimeter

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

You can find more information about PID controllers here: Forum.

Further links

  1. Another idea for navigation are infrared landmarks
  2. More details about the matched filter
  3. Sound card oscilloscope including matched filter