Multiple MaxBotix I2C Pixhawk 2.1 problem

Finally I was able to change the address of the sensor. I looked at the arduino forum and found the solution. I will share with everyone so that anyone who wants to buy cheap I2C sensors can use multiple of them.

Code:

#include “Wire.h”
#define SensorAddress byte(0x70)
#define NewSensorAddress byte(0x68)
#define RangeCommand byte(0x51)
#define ChangeAddressCommand1 byte(0xAA)
#define ChangeAddressCommand2 byte(0xA5)
void setup() {
Serial.begin(9600); //Open serial connection at 9600 baud
Wire.begin();

changeAddress(SensorAddress,NewSensorAddress,1);
}
void loop(){
takeRangeReading(); //Tell the sensor to perform a ranging cycle
delay(100); //Wait for sensor to finish
word range = requestRange(); //Get the range from the sensor
Serial.print("Range: "); Serial.println(range); //Print to the user
}

//Commands the sensor to take a range reading
void takeRangeReading(){
Wire.beginTransmission(NewSensorAddress); //Start addressing
Wire.write(RangeCommand); //send range command
Wire.endTransmission(); //Stop and do something else now
}
//Returns the last range that the sensor determined in its last ranging cycle in centimeters. Returns 0 if there is no communication.
word requestRange(){
Wire.requestFrom(NewSensorAddress, byte(2));
if(Wire.available() >= 2){ //Sensor responded with the two bytes
byte HighByte = Wire.read(); //Read the high byte back
byte LowByte = Wire.read(); //Read the low byte back
word range = word(HighByte, LowByte); //Make a 16-bit word out of the two bytes for the range
return range;
}
else {
return word(0); //Else nothing was received, return 0
}
}
void changeAddress(byte oldAddress, byte newAddress, boolean SevenBitHuh){
Wire.beginTransmission(oldAddress); //Begin addressing
Wire.write(ChangeAddressCommand1); //Send first change address command
Wire.write(ChangeAddressCommand2); //Send second change address command
if(SevenBitHuh){ newAddress = newAddress << 1; } //The new address must be written to the sensor
Wire.write(newAddress); //Send the new address to change to
Wire.endTransmission();
}

3 Likes

Can you help me change the code to use multiple maxbotix sensors. I changed the addresses of each sensor. But I don’t know how to change the code so that it assigns the address I put in “RNGFND_ADDR”.

hi Lucas. I could change the address too, but the pix still getting just 1 sonar? Did you make work 2 or more sonars?

Bye!

MaxBotix driver has no parameters for address change, You can use LightWare I2C (Type 7) driver do accomplish this.
http://ardupilot.org/copter/docs/common-lightware-sf10-lidar.html#i2c-connection

As noted in wiki, you need to map address in decimal , so 0x70= is 112 you must write in parameters for first RangeFinder and then you can use 0x68 = 110 for second unit and so on…

1 Like

Hi! Could you make more than 1 sensor work? Infact the idea of I2C is to connect a lot of devices, but the rangefinder configuration only acept 2 rngfnd and rngfnd2. How I suppose to connect 6 I2C sensor for example? thanks!

The sensor is not working when I select LightWare, only as Maxbotix.

You mentioned above that it might be necessary to change the lightware code to read. It is not necessary?

You need to change rangefinder address in parameters

I changed the address, but it didn’t work.

Hello lucas, i’m having the same issues as you do, did you manage to connect both sensors? for me i tried to use a lidar with a sonar sensor, if i use the lidar alone it works fine via uavcan, and if it is the sonar alone it works, but when i try to use both of them, i only get the lidar data on rngfnd1, and rngfnd2 is always 0 or 20
and in order to use multiple sensors of the same type, like yours, you have to change the adress of each sensor via arduino code, but first, you must find a solution for the rngfnd2 not displaying data, i’m stuck here unfortunatly

Hello,
I use GY-us42y2. Need to use in I2C with pixhawk.
Impossible to change sensor address. With arduino code, 222 or 224 address always came back.
Pixhawk need a 0 to 127 address.
How can I change it definitively?

hello, i have same problem. i want to set two GY-us42y2 in my drone, one of them bellow for landing and another front on my drone, but i don’t know how do this;
can you help me?
could you set this?
thanks alot.

tried everything in this thread… but still can only get one “emulated” maxbotix i2c sensor to work on the bus

what flight controller are you using?

Micoair405v2… So far the only combination that works is one sensor set to maxbotixI2C set to 0x09 address, any other addresses, multiple sensors or lightwareI2C type do not work

I wonder if its related to this, what are you using to emulate the sonar?

I ran across that just a few ago… I’m using this JSN-SRT04T-sonar-adapter-for-Ardupilot/JSN-SRT04T.ino at main · geofrancis/JSN-SRT04T-sonar-adapter-for-Ardupilot · GitHub with a 168 pro mini board and AJ-SR04M set to polled serial mode

Have you tried 0x70 (112) and set as maxbotix? I am going to look into this, im going to try with a rp-2040 just to make sure its not something with the 8 bit 168/328 chips.

ok , I thought I had it there but it looks like it was fixed.

yes, I have tried that too… even 0x68 “secondary maxbotix address” 0x08, 10,11 don’t work either… why just 09? so strange

I think the lightware driver is looking on both i2c busses but but only works with one sensor at a time, the maxbotix driver works with many but its checking the wrong i2c bus.