Perimeter wire

Aus www.wiki.ardumower.de
Wechseln zu: Navigation, Suche

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 (a lawn sensor might be an alternative).

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 (or two) receiver coils. The closer the distance between coil and perimeter loop, the higher the signal. 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. So, there are two basic principles to detect the perimeter loop. We have implemented both methods (perimeter v1 and v2) which are described below.

Perimeter v1 (v0.9.3)

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)

Power supply

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!

Functional test

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:

Receiver

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:

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

Functional test

  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.

Choice for coil

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 results in a capacity of 4.7 nF and a resonation frequency of 7963 kHz.

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)

Arrangement of coils

The coils are arranged at the bottom of the robot, about 90 degress to each other, both turned 45 degress.

Measurements of signal strength

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

Layout of the wire

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

Perimeter v2 (SVN version)

While crossing the perimeter loop, something interesting happens: signal changes polarity, that means negative and positive voltages reverse each other. By using this principle, crossing the perimeter wire will be detected. The robot knows its current perimeter state all the time (inside/ouside). As with perimeter v1, we will again use a motor driver to generate the signal and an operation amplifier to amplify the received signal.

Principle:

  1. Amplify perimeter coil signal using OPAMP
  2. ADC sampling using Arduino
  3. Signal filterung and detection using a digital filter (Matched filter algorithmn).
  4. Evaluation of filter output

Simulation

Signal shape and matched filter is simulated here: Matched filter simulation

You can see how it works:

  1. Choose the perimeter signal at the right side (Set slider 'example signals': pseudonoise4_pw).
  2. Increase the noise a little bit (Set slider 'noise' to 2).
  3. At the left bottom plot ('Matched filter') you can see that the repeated signal was detected 3 times.
  4. 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.

Sender

The motor driver is driven by 3.2 Khz (two pulse widths 4.8 Khz and 2.4 Khz). The circuit draws max. 20W (12V, 1.7A). We use a motor driver with integrated current limiting and thermal switch-off (e.g. MC33926).

sender circuit:

 motor driver M1OUT1     o---------- perimeter loop (20-450 meters)--+
                                                                     |
 motor driver M1OUT2     o---------- perimeter loop -----------------+
 motor driver Vin        o-- 12V
 motor driver M1IN1      o-- Arduino Nano pinIN1
 motor driver M1IN2      o-- Arduino Nano pinIN2
 motor driver M1PWM_nD2  o-- Arduino Nano pinPWM
 motor driver M1nSF      o-- Arduino Nano pinFault
 motor driver M1FB       o-- Arduino Nano pinFeedback
 motor driver EN         o-- Arduino Nano pinEnable
 motor driver VDD        o-- Arduino +5V
 motor driver M1D1       o-- GND (via Jumper)
 motor driver SLEW       o-- VDD (via Jumper)
 
               |---------o-- GND
 Potentiometer 100k -----o-- Arduino Nano pinPot
               |---------o-- Arduino +5V
 
 ACS712-05 OUT ------o-- Arduino Nano pinChargeCurrent    
 ACS712-05 A   ------o-- charging pin (+)
 ACS712-05 B   ------o-- battery charger +24V
 battery charger GND-o-- charging pin (-)

Example of sender implementation on a dot matrix board: [1] [2] [3]

Using a current sensor (ACS712-05) it can be detected if the robot has reached the charging pins - this allows to switch off the perimeter during charging.

Using a potentiometer, the max. current can be set. In the Arduino software, first set IMAX pot to zero (0), and place robot in the center of the garden. Now, slowly increase IMAX pot, until 'sig' in the pfodApp plot ("Plot->Perimeter") increases (wait 10 seconds). Where 'sig' reaches its maximum, keep IMAX pot setting.

How the signal looks when perimeter wire loop is open:

Receiver

We use a coil in upright position (centered at front in robot), connected to "pinPerimeterLeft". When using the LM386 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".

The signal output of LM386 should look like this. For more details, see signal "pseudonoise4_pw" in the simulator applet.

receiver circuit:

                                      LM386 IN  o------- capacitor 4,7nF ----------- coil 100 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 etc.)

ADC calibration

Note: Run the ADC calibration once ("pfodApp->ADC Calibration"), so that the received signal is symmetric around zero.


Example plots (pfodApp)

sig:  coil signal
mag:  filter result (negative: inside, positive: outside - strengh: distance to perimeter)
smag: filter output without sign, low-passed
in:   inside (1) oder outside (0)
cnt:  number of "inside-outside" transitions (counter)
on:   perimeter active (1) or inactive (0)

Videos

  1. Perimeter2 demo
  2. 120m perimeter wire test

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