Welcome to Synthiam!

Program robots using technologies created from industry experts. ARC is our free-to-use robot programming software that makes features like vision recognition, navigation and artificial intelligence easy.

Get Started
France
Asked — Edited

Roomba Hack - Uart Questions

Hi,

I have finally found a Roomba 620 I wish to use as a robot base. Everything works great, thanks to @RichardR examples and some very interesting threads.
Now I try to fully understand UART functions and the Roomba Open Interface, and sometimes it is a bit confusing... So, at this point I need some expert enlightenments.

Here is an example I don't understand:

Richard R made a script for object avoidance and it works great :

Quote:


:top
$drive=1
uartinit(0, 2, 57600) #initiate UART port 2 (pins 18 Tx and Pin 19 Rx)
sleep(20)
uartWrite(0, 2,128,132) #Init iRobot create and place in full mode
sleep(20)
uartWrite(0,2,137,0,125,128,0) #forward slow

$x=0
REPEATUNTIL($x>0)

uartWrite(0,2,142,7) #Roomba Bump and wheel drop sensor

IF (UARTAvailable(0,2)>0)
$x=UARTRead(0,2,1)
$x=GetByte($x)

ENDIF
print($x)

IF ($x=2) # left bumper hit
uartWrite(0,2,137,255,155,128,0) # back up
sleep(1000)
uartWrite(0,2,137,0,100,255,255) #turn right
sleep(2000)
ELSEIF ($x=1) # right bumper hit
uartWrite(0,2,137,255,155,128,0) # back up
sleep(1000)
uartWrite(0,2,137,0,100,0,1) #turn left
sleep(2000)
ELSEIF ($x>2) # centre bump or wheel drop
uartWrite(0,2,137,255,155,128,0) # back up
sleep(1000)
uartWrite(0,2,137,0,100,0,1,157,0,180,137,0,0,0,0) #turn around 180deg
sleep(2000)
ENDIF

sleep(20)
ENDREPEATUNTIL
goto(top)


But I don't understand the GetByte values: $x=2 correspond to "left bumper hit", $x=1 to "right bumper hit" and $x>2 to "centre bump or wheel drop"... but when I look at the OI documentation :

User-inserted image


I don't see the fit with the bit values and I don't see how the Range could be 0-15 with only one byte...

Thanks for the help and sorry if it is a stupid question (I am afraid it will not be the last :D)

AI Support Bot
Related Content
Synthiam
Based on your post activity, we found some content that may be interesting to you. Explore these other tutorials and community conversations.
#1  
The bit positions all have a decimal weight.

Bit position 0 set to binary 1 has a weight of 1

Bit position 1 set to binary 1 has a weight of 2

Bit position 2 set to binary 1 has a weight of 4

Bit position 3 set to binary 1 has a weight of 8


If all 4 bit positions are set then the decimal value would be 15. 1+2+4+8=15
#2  
Thanks @Robot Doc.

All these "bit", "bytes", "16-bit values", "high bytes", "two’s complement" notions are completely new to me. But I think I get it...

So, to take the same example, if there is both a "Bump Left" and a "Wheel Drop Left", it will correspond to a bit position 1 (weight of 2) + a bit position 3 (weight of 8) and so, in the script, the $x value will be 10. Right?
PRO
Synthiam
#3  
Use GetBit()

Code:



$x = 2

if (getbit($x, 0))

print("Bump Right")

endif

if (GetBit($x, 1))

print ("Bump Left")

endif

if (GetBit($x, 2))

print ("Wheel Drop Right")

endif

if (GetBit($x, 3))

print ("Wheel Drop Left")

endif

#4  
I am at work now.... i will check this thread later when i get home.... i think this script i wrote for the 400 series roomba.... i think the baud rate is wrong for the 600 series. .. @Doc can help you too after all he is the roomba doctor:)
#5  
That script is a little rough... and the baud rate is wrong. It should be 115200 not 57600... The 600 series uses 115200 baud.... also you only need to initialize the UART once.....
#6  
@Richard' you are right. I already have modify baud rate and, as I said, the script works just fine (that's why it is not "required assistance thread" :) ).

But I want to better understand the way ARC and Roomba OI works together to go further in my future scripts, and your script was a good example to illustrate what I understand and what I don't...

@DJ, thanks for the tip and the script example
#7  
@fredebec... Ok no worries..... I have another script that can read 2 byte data like Roomba battery voltage.... I'll post it for you tomorrow (my time) afternoon when I get home from work...
#8  
fredebec

Quote:

So, to take the same example, if there is both a "Bump Left" and a "Wheel Drop Left", it will correspond to a bit position 1 (weight of 2) + a bit position 3 (weight of 8) and so, in the script, the $x value will be 10. Right?


Yes, you got it !
#9  
@DJ,
Ok, I see why it is interesting to use GetBit(). But now, I don't understand where the $x=2 come from....

The function is GetBit(Value, Bit). Why the value is $x=2 in that case ?

Thank you all for your help.

@Richard, thank you for your scripts, it helps me a lot to have concrete examples.
#10  
@fredebec Here's another example for getting the roomba's battery voltage and charge state.... This example is using UART 0, however...

Code:


uartinit(0, 0, 115200) #initialize UART port 0
sleep(100)
$RX_DATA=0
uartWrite(0,0,142,22) # Volatge check
sleep(50)
uartWrite(0,0,142,21) # charge state
sleep(50)
$rx = UartAvailable(0, 0)


if ($rx=3)
$RX_DATA = UARTRead(0, 0, $rx)
$MSB=GetByteAt($RX_DATA,0)
$LSB=GetByteAt($RX_DATA,1)
$Charge=GetByteAt($RX_DATA,2)
$voltage=($LSB+(256*$MSB))/1000

print("Battery Voltage = "+$voltage)

if ($charge=0)
print("Roomba is not charging")
elseif($Charge=1)
print("Roomba is recondioning charging")
elseif($Charge=2)
print("Roomba is fast charging")
elseif($Charge=3)
print("Roomba is trickle charging")
elseif($Charge=4)
print("Roomba is waiting to charge")
elseif($Charge=5)
print("Roomba is not charging/Fault")
endif

endif
#11  

Quote:

The function is GetBit(Value, Bit). Why the value is $x=2 in that case ?


The value of $x=2 just means that if bit position two is set to a 1 then "Wheel drop right" should be happening.
#12  
@Robot Doc, now I think I am lost again :D

When you say "is set to 1", you mean "the state of the bumper/wheel drop is 1", with 0 ($x=1) = no bump/wheel raised and 1 ($x=2) = bump/wheel dropped.
Am I correct ?
#13  
@Richard, thanks for the script. I will test it as soons as I can.
#14  
Each bit position represents the state of a single sensor. If the bit position is storing a 0 then the sensor is off. If the bit position is storing a 1 the the sensor is on.
PRO
Synthiam
#15  
I just used a $x to set a fake value to demonstrate the rest of the code. It's merely a place holder for the demo to run.