Canada
Asked — Edited

4-In-1 Sensor Questions

I am attempting to get a 4-in-1 sensor to work as I need it to and not have much success - I need a hand. I am trying to get the 4- in-1 sensor to drive 2 servos to keep something level/plumb. I have the servos set to go up or down depending on the sensor readings. The problems I'm having are;

  1. It will kind of work for a short time but will only drive one servo at a time even if both should move,
  2. The Y axis stops working after a few minutes,
  3. Then everything stops working,
  4. For some reason the 'Sleep' command above the 'loop' is run each time and anything else put there -except the first line. I am running the sensor on a EZBv4/2. My code is a modified version of one from a JD project. Here's my code;

ControlCommand("MPU9150", Init)

sleep(1000)

:loop
#Added these because $AccelX and $AccelY were not recognized later in the script for some reason.
$XAccel = $AccelX
$YAccel = $AccelY

if ("x" =0)

print(1)  

sleep(2000)
  
goto(loop)
  
endif 
  
ControlCommand("MPU9150", RunOnce)

print("x: " + $XAccel)
print("y: " + $YAccel)

if ($XAccel > 1000)
ServoUp(D1,10)
Servospeed(D1,2)
 
ELSEif ($XAccel  < -1000)
ServoDown(D3,10)
Servospeed(D3,2)
Endif

if ($YAccel > 1000)
ServoUp(D3,10)
Servospeed(D3,2) 
  
ELSEif ($YAccel < -1000)
ServoDown(D3,10)
Servospeed(D3,2) 
Sleep(500)

endif  
sleep(1500)

goto(loop)

Has anyone played with these sensors much and got them working? I know I have a lot to learn about them so your assistance will be appreciated.
Thanks


ARC Pro

Upgrade to ARC Pro

Unlock the true power of automation and robotics by becoming a proud subscriber of Synthiam ARC Pro.

#17  

Hi Bob, Great work!

There may be a need to have external pots monitoring joint positions to provide proof positive feedback of "where the robot is now" So then you are checking the pot values along with the MPU values and deciding what action to take from there.

I agree with the comments about values out of range. "getServo() returns the last postion ARC told the servo to go to.... doesn't mean the servo got there..."

I see that in your calls to ServoUp and ServoDown you are asking the servo to move 15* at each step. In just six iterations you will have moved 90*. Perhaps the reaction should just be a couple of degrees, which is quite a lot for keeping balance.

Thanks for plowin' the field! S~

PRO
USA
#18  

4-in-1 demo

bear in mind i don't have DJ's communication skills.

#19  

Great demo, ptp. Can you monitor the X and Y axis at the same time and have the robot respond accordingly ?

PRO
USA
#20  

Bob,

Yes all the axis if you want.

Check the project:

JD_9150Serial.EZB

the problem is not monitoring 1,2,3 axis, the problem is the execution speed several factors:

  1. Connection WIFI (EZB4 v1) vs WIFI (EZB4 v2) vs USB (EZB4 v2)
  2. Ez-script code execution
  3. Other scripts

I don't believe you can handle a Balanced robot or avoid a fall (Humanoid) or other fast reactions with ARC/EZ-Script only.

I'm guessing some details (i can be wrong), remember Inverted Pendulum EZ-BIT product: https://www.ez-robot.com/Shop/AccessoriesDetails.aspx?productNumber=1360

the EZ-Bit consists of a micro-controller and MPU-9150 (4-in-1 Sensor) and has 2 servo ports to control the continuous servo wheels.

Calculating the angle (tilt/pitch), running the actions (back,forward) everything is executed in EZ-BIT micro-controller, a solution like that you don't have speed issues.

PRO
USA
#21  

For the demo i used an Arduino Mini Pro 3.3v and 4-in-1 sensor. The 4-in-1 sensor is connected to the Arduino I2C Bus, and arduino serial port is connected to the EZB serial port 0.

Than i have two versions to handle the serial communication:

  1. Pool_IMU Script

:loop
#write command 
UARTWrite(0, 0, "get_dmp_euler", 10)
#read response
UARTReadAvailable(0, 0)
sleep(100)
Goto(loop)

  1. Push_IMU Script

#write command to initiate push data 200 ms interval
UARTWrite(0, 0, "set_push 200", 10)
:loop
#read response
UARTReadAvailable(0, 0)
Goto(loop)

The second script is more efficient a single call to EZB to read the serial port vs two calls.

There is space for more improvement

Handling variable data (Text) and parsing text with EZ-Script is not efficient compared to use I2C bus:


:loop
# 2 bytes per angle x 3 = 6
$data=I2CRead (0, 0, Addr, 6)
sleep(100)
goto(loop)

To support the above solution you need a different micro-controller, one with 2 x I2c bus. Arduino mini is out of the picture, we need an arm cortex micro-controller.

The 4-in-1 sensor is connected to the ARM cortex i2c bus 0 (master), and the second i2c bus 1 (slave) is connected to EZB.

Another interesting detail, with a small adaption the 4-in-1 sensor supports a secondary I2C address, so is possible to use the same micro-controller to handle 2 x 4-in-1 sensors.

The cost is not relevant: cortex micro-controller is $20 vs Arduino mini $10 and you have more processing power plus the possibility to connect via I2C to EZB.

if you want more details or help with a micro-controller to handle the 4-in-1 sensor drop me an email.

PRO
Synthiam
#22  

Man, you never cease to amaze me PTP