Asked — Edited
Resolved Resolved by DJ Sures!

How To Use The Uart Script Functions

I am trying to interface my Robotics Bioloid to the EZ-Bv4 using UART 0 to transmit/receive the 5 word Comm packet; FF 55 Data_l ~Data_l Data_h ~Data_h ~ represents Inverse (1's Complement), Data_l is the least significant hex value, Data_h is the higher significant hex value the Robotis boomerang controller sends when a button is pressed. For example: FF 55 01 FE 00 is the value 01 (button U) FF 55 00 FF 01 is the value 256 (Hex 10) (button 5)

I can not get the new UartReadRinary, UartWriteBinary to work correctly.

Is there to be a tutorial on the use of the Uart script functions? Thanks for any help.


ARC Pro

Upgrade to ARC Pro

With ARC Pro, your robot is not just a machine; it's your creative partner in the journey of technological exploration.

PRO
Synthiam
#1  

Here is an example that will help you...


# Define the Button U
# --------------------------
DefineArray($ButtonU, 5)
$ButtonU[0] = 0xFF
$ButtonU[1] = 0x55
$ButtonU[2] = 0x01
$ButtonU[3] = 0xFE
$buttonU[4] = 0x00

# Define the Button 5
# --------------------------
DefineArray($Button5, 5)
$Button5[0] = 0xFF
$Button5[1] = 0x55
$Button5[2] = 0x00
$Button5[3] = 0xFF
$button5[4] = 0x01



# Init the hardware UART. You would only do this once
# but in this example i have to show that it must be done
# Also, i have no idea what baud rate you will be using
# --------------------------------------------------------
UartInit(0, 0, 9600)

# Send the Button U code
# ----------------------
UartWriteBinary(0, 0, $ButtonU)

# Now send the Button 5 code
# ---------------------------
UartWriteBinary(0, 0, $Button5)


#2  

Thanks DJ.

I get the general idea you show for writing to the Uart. What about UartReadBinary?

BTW - Thanks for the very quick response!

PRO
Synthiam
#3  

Read Binary puts the data into the provided Array Variable - there is EZ-Script help with an example

#4  

I am a lot closer but still having problems:

  1. If I don't press a controller button soon enough (several seconds) EZ-B4 disconnects and the red led flashes.

After a power cycle and 'connect' I start the get hex data script and hit button 5 I get this:

User-inserted image

and a RealTerm monitor connected to the RX of EZ-B4 shows this:

User-inserted image

Problem 2) RealTerm shows the HEX data but the script produced decimal data.

Here is the script:


# get hex data
uartinit(0, 0, 57600)

print("UART 0 Initialized at 57600 baud.")

:loop

$x = UartAvailable(0, 0)

sleep(500)

UARTReadBinary(0, 0, 6, $data)

$byte1 = $data[0]
$byte2 = $data[1]
$byte3 = $data[2]
$byte4 = $data[3]
$byte5 = $data[4]
$byte6 = $data[5]

sleep(200)
if ($byte1 == 255 AND $byte2 = 85)

print( $byte1 +" "+ $byte2 +" "+ $byte3 +" "+ $byte4 +" "+ $byte5+ " "+ $byte6 )

endif

sleep(200)

goto(loop)

#5  

You don't have to bother using hex. Just use decimal values, the Bioloid uses unsigned integers 0 to 255 to communicate.

if you convert the hex to the decimal value you'll see the same values.

I discovered this when trying to control the dynamixels with python.

PRO
Synthiam
#6  

What is the meaning of $x is in your code sniplet...


$x = UartAvailable(0, 0)

sleep(500)

UARTReadBinary(0, 0, 6, $data)

Because you are not using $x anywhere - and the Read Binary is hardcoded to a value of 6 characters. This means you are 100% certain there is 6 characters available? You cannot be 100% certain without actually checking. So hardcoding a value of 6 is why you're program is crashing. You're requesting more information than what is available.

Perhaps something like this will make more sense...


:readLoop
$x = UartAvailable(0, 0)

if ($x < 6)
  sleep(50)
  goto(readLoop)
endif

UARTReadBinary(0, 0, 6, $data)

#7  

DJ, Thanks again.
Works like a champ! Also gave me better understanding of how the script function operates.

Now I am ready to 'UartWriteBinary'.

PRO
Synthiam
#8  

Woo!:) your progress is impressive