Creating an I2C sonar for Arducopter

I've created an I2C digital signal sonar module to avoid the noise problems I have been having with the current analog signal sonar module.

Why?

Seeing all the problems we are having with noisy sonar data got me thinking

Where does the noise come from? Is it:

  • RF noise from the ESCs affecting the sonar module directly ?
  • RF noise from the ESCs affecting the analog signal line between the sonar and APM?
  • Noise on the DC power supply affecting the Sonar module?
  • Something else?


The current popular solution of remote mounting the sonar has probably eliminated DC power as the primary source of our noise. In other words - if noisy DC power was the ource of the noise problem then no matter where you mount the sonar you would still have the noise. Regardless if DC noise were still an issue Maxbotics has a solution to DC noise in their FAQ.

Personally I've found that remote mounting the sonar module has only partially solved my noise problems. This is probably due to the Sonar power and signal cable passing within 10mm of one of the ESCs near where it plugs in to the APM on my arducopter.


(This photo shows how close my ESC is to the analog port on the IMU Shield)

 

So I wondered if I could get rid of the analog signal path and see how the sonar noise changed. This has led me to put together a I2C sonar module. This communicates digitally between the sonar and APM using the I2C port on the APM IMU shield. It also allows you to use the PWM output from the sonar which Maxbotics recommends as "the most accurate"

 

Hardware

All that is needed is an Arduino, an I2C cable and some software.

Arduino mini

DIY Drones GPS Cable

The GPS cable supplies power and connects data lines between the Arduino and APM IMU Shield (you need to cut one end off the cable)

APM IC2 Function Arduino Mini

PIN1 <-----> GND <-----> GND

PIN2 <-----> 5V <-----> VCC

PIN3 <-----> SDA <-----> A4

PIN4 <-----> SCL <-----> A5

 

Three Wires connect the Arduino to the Sonar

Arduino Function Sonar

GND <-----> GND <-----> GND

VCC <-----> 5V <-----> V+

D5 <-----> PWM <-----> PIN2

 

Here is what it looks like mounted on the sonar - with double sided tape

The sonar is on a standard jdrones sonar mount

Software

The Arduino then needs to be programmed as an I2C slave.

Here is my code Sonar_I2C_Sender_v005.zip

You must use an FTDI cable to program an Arduino Mini

The code continuously reads and stores the sonar distance as a PWM signal from the module.

It responds to any I2C request for data with a two byte integer representing the current sonar range in cm.

Additionally it has the ability to return noise filtered sonar data.

Note the MaxBotix experts strongly recommend a mode or median filter not averaging filter.

Currently the code can be requested to return spike filtered, median or mode filtered data.

 

I have modified the Arducopter code to use this I2C sonar and started testing

Here is my sonar library APM_I2CSonar.zip

If the testing all works OK I'll see if Chris or Jason want to put it in the code repository

 

Results

To put it simply the results so far are great!

Indoor and outdoor tethered tests show no noise and no data problems

Here is a graph showing Sonar data in red and baro in green.

first segment is with motors running second with motors off

Its too windy to fly here today (in the Aussie vernacular: It's strong enough to blow ya dog off its chain!)

Stay tuned!

 

Andrew

 

Views: 19602

Comment by Hindole Dutta on May 21, 2012 at 5:03am

Hi,

     I read your post on interfacing arducopter with a I2C sonar module. I am trying to interface the srf08 sonar sensor with my APM board. I tried modifying the code and so far after debugging it, I don't get any compile time errors. But I then the APM does not boot up properly... I can't figure out, I read the code again and again, but don't seem to understand how tweaking the sonar part is messing with the entire thing...

I am actually using the Gnd,SDA,SCL and VCC ports of the magnetometer, and am currently using the arducopter ver 2.3 because of the limitations of my atmega 1260.

Also, I would like to know are you able to test your sonar via the APM planner, as in does it read out the same values as with an analog sensor? 

Thanks.

Comment by Rob_Lefebvre on May 21, 2012 at 5:20am

Hindole, did you perhaps add any new parameters that get added to the EEPROM storage?  If so, that might be your problem.  It's very easy to break the storage system, and then it won't boot.  Look in the serial monitor after booting.  If the board is just stuck there, blinking the yellow TX light, and nothing else, that's probably it.

Comment by Hindole Dutta on May 21, 2012 at 5:55am
I just put everything into a #if at the places where the code was checkin conditions and intilizing the values for an analog sensor.. could you be a bit more clear as to what parameters affrct the eeprom storage please... Ya i did define one parameter in a different way.. but i am not sure.. thanks.
Comment by Hindole Dutta on May 21, 2012 at 9:58pm

Maybe yuo can have a look in my code, I just changed included the libraries of the SRF08 sonar and made some adjustments in the AP_RangeFinder library and my code.

http://dl.dropbox.com/u/16314442/arducopter%20modified.rar

 Thanks.

Comment by Hindole Dutta on May 21, 2012 at 10:30pm

And this is the eedump data... 

http://dl.dropbox.com/u/16314442/eedump.rar

Comment by Hindole Dutta on May 22, 2012 at 1:17am

Yes and I forgot to mention... my serial monitor first shows some random data when the apm is booting, then because after that it the GPS process and then it says ready to fly but my green LED does not glow. 

Comment by Redemptioner on January 2, 2013 at 6:02am

Hey agmatthews,

Great work on this, just wondering if the "lego Arduino" is pretty much the same thing as the Arduino mini, looks similar but has a usd "stick" on the end so it can be plugged directly into a usb port. At present I don't need to go down this track after sorting out shielding and "correct" filtering of my sonar (use a choke not a resistor).

Sonar noise reduction

 

Legostick Arduino

 

Keep it up mate.

Comment by John Grouse on February 6, 2013 at 9:32pm

Just received MaxBotix new I2C XL MB1232 sonar in the post.  Will test it on both APM and MultiWii controllers. 

Regardless of the interface being I2C I will still hook it up with shielded wire around the four wires (connected to ground on one end).  This seemed to make the most amount of difference to noise on the conventional MaxBotix sonar.  Hopefully a reduced timeslice in the code using I2C.


Developer
Comment by Randy on February 6, 2013 at 11:33pm

John,

     By the way, there is a library written to connect to the maxbotix i2c sonars.  You can find this in the AP_RangeFinder directory in the Libraries folder.

AP_RangeFinder_MaxsonarI2CXL.h

AP_RangeFinder_MaxsonarI2CXL.cpp

     It works but I haven't made it so the code automatically detects whether there is an i2c sonar there and use it if it is.  To do that the sonar object would need to be dynamically created instead of statically defined like it is now.

Comment by Chris on February 26, 2013 at 4:12am

I have also just bought the i2c version of the max sonar. I already did some changes in the Ardupilot code regarding this. My concern of detecting it automatically is, that a dynamic creation would increase the code size. Right now I am using compiler flags (ifdefs). Moreover right now I get some strange data over the I2C bus on my ardupilot, looks like my i2c data gets corrupted but I do not have a oszi to check this right now. My same test code runs perfect on a spare Arduino Uno....Do you have changed anything regarding pull ups...

Comment

You need to be a member of DIY Drones to add comments!

Join DIY Drones

© 2019   Created by Chris Anderson.   Powered by

Badges  |  Report an Issue  |  Terms of Service