For Dave and Richard and anyone else who is interested, here is fully working and tested code for using the Kangaroo (with bi-directional comms) via the UART on the V4 with encoder feedback.
I am still quite new with EZ scripting so the code may not be as elegant as I would like, I could not find an ASCII to decimal function in ARC so I had to write a block of code to do this DJ maybe I am missing something here?
Anyway I think this does show how fantastic and versatile the V4 is, well done DJ and team!
TonyCode:
# -------------------------------------------------
# Name : V4_Roo_serial
# Author : Tony Ellis
# Date : 01/07/2014
# Version : 1.0
# -------------------------------------------------
definearray($byte,10)
$wheel_turn=63890
$dly=50
$FLAG=0
uartinit(0,0,19200) # initalise UART
# ***** Initalise Kangaroo
uartwrite(0,0,"D,start",13) # drive channel start
uartwrite(0,0,"T,start",13) # turn channel start
uartwrite(0,0,"T,p0",13) # this is also needed at start
#goto(START)
$val=2*$wheel_turn # load position
$COMM_CHR="DF3" # D=drive channel - F=move forward - 3=speed 3
goto(INC_POS)
halt()
:START
$val=$wheel_turn-500
$position=0
$unit=round($val/8)
$str="4000"
$x=1
goto(RAMP)
$str="7000"
$x=2
goto(RAMP)
$str="10000"
$x=3
goto(RAMP)
$str="7500"
$x=6
goto(RAMP)
$str="5500"
$x=7
goto(RAMP)
$str="2500"
$x=8
goto(RAMP)
uartwrite(0,0,"D,s0",13)
halt()
:RAMP
uartwrite(0,0,"D,s"+$str,13)
$v=$unit*$x
REPEATUNTIL($position>$v)
goto(GET_POS)
ENDREPEATUNTIL
print("position="+$position)
print("speed="+$str)
return
# -------------------------------------------------
# Subroutines
# ***** POSITION commands *****
:INC_POS # increment position subroutine
$str=tostring($val) # convert variable to string
$COMM="pi" # determine direction
IF (getcharat($COMM_CHR,1)="R")
$COMM="pi-"
ENDIF
goto(SEND_DATA)
goto(GET_POS)
REPEATUNTIL($FLAG=1)
goto(GET_POS)
ENDREPEATUNTIL
print("POSITION = "+$position)
return
:GET_POS # get current position subroutine
uartwrite(0,0,"D,getp",13)
sleep($dly)
goto(GET_DATA)
print($position)
return
# -------------------------------------------------
:SEND_DATA
$M_SPEED=(getbyteat($COMM_CHR,2)-48)*1200
$string=(getcharat($COMM_CHR,0)+","+$COMM+$str+"s"+$M_SPEED) # build data packet
uartwrite(0,0,$string,13) # send packet
sleep($dly) # delay required
return
# -------------------------------------------------
:GET_DATA
$num_bytes=uartavailable(0,0)
$data=uartread(0,0,$num_bytes)
$byte1=getbyteat($data,0) # byte 1 = command
$byte2=getbyteat($data,1) # byte 2 = ","
$byte3=getbyteat($data,2) # byte 3 = command completed status
# ***** Convert ASCII digits to decimal number
$total=0
$multiplier=1
$x=$num_bytes-2
REPEATUNTIL($x=3)#$num_bytes-7)
$byte[$x]=getbyteat($data,($x-1))
$byte[$x]=($byte[$x]-48)*$multiplier
$total=$total+$byte[$x]
$multiplier=$multiplier*10
$x--
ENDREPEATUNTIL
# ***** Determine byte 3
# $FLAG=0
IF ($byte3=80)
$FLAG=1 # "P" returned so move completed
ELSEIF ($byte3=112)
$FLAG=2 # lowercase "p" so move not completed
ELSEIF ($byte3=83)
$FLAG=3 # "S" returned so speed reached
ELSEIF ($byte3=115)
$FLAG=4 # lowercase "s" so still accelerating
ENDIF
IF ($FLAG<3)
$position=$total
ELSEIF ($FLAG>2)
$speed=$total
ENDIF
return
Asked
— Edited
:RAMP
uartwrite(0,0,"D,s"+$str,13)
$v=$unit*$x
Thats even odder I cannot write that line of code down even outside the UBB code, it always converts it to that text note?
As I cannot give the line of code here, anyone that wants a full listing just send me a email.
Tony
This will send a single byte with the value of 123...
Code:
The Kangaroo returns large numbers (just 10 wheel revolutions would be 638900) in an ASCII string for position (> a byte and would require a Dword var) and I want to convert this into a single decimal number so I devised the routine (***** convert ASCII digits to decimal number) in my listing to do this. I was just not sure if their was a better way? I really like your scripting language and want to use it efficiently.
My code listing got corrupted when it was pasted into the code view. I have looked through and there are a number of omissions/problems caused by pasting it in via the code view, complete lines missing and "<" and ">" directives are even extracted from some lines.
Apologies to anyone trying to use the code but with the corrupted parts its probably unusable, as I said before I am happy to sent the script to anyone that wants it.
Tony
Cube World sold all over the World, it was huge in the States and also Japan, here is a very cool Japanese TV advert
youtu.be/AotdNHrk0iM
Here is my favorite US TV advert for series 4 (sports)
youtu.be/fToQbGUT-s8
With our new cubes characters can now jump out of their cube into a tablet device.
Tony
Tony
Rather than just sending the script to individuals, can I recommend that you put it in an EZ-B project (with nothing else) and attach the project to a post? That way months/years from now, users will still be able to download and work with it without you needing to respond to every request.
Alan
The example first goes forward 2 revolutions (at speed 9) and continues to report positions back from the Kangaroo until it reaches the target position. It then goes in reverse for 1 revolution (at speed 3) again reporting back the position. You will see a slight lag in the position printout on the script window, this is because the V4 cannot fully keep up with the Kangaroo at these baud rates so it over-runs a bit, the position will still be got to accurately though.
For channel 2 just change the command string to something like "2F7" etc
As this is a tutorial I will post the script here so all can see.
Code:
I hope I'm not starting to sound too mushy or scripted but I really do appreciate this. I'm honored to be using scripts in my B9 crafted by a designer of your caliber and fame. I really look up to you and respect and amazed at what you can do. I'm looking forward to digging into this script and seeing if I can figure it out and apply it. I'm sure I'll have a question or two. Please don't feel like you need to respond right away and help figure it out. We both have busy lives and lots to do.
I've been showing my family your Cube World commercials and some of them remember them. My 40 yr old son (I was very young when he was born ;-) ) members clearly and got real excited. He says he really wanted to buy a set when they were available but didn't have the opportunity or cash. Good luck on the new roll out when it ready. I hope you are able to let me and others on the forum know when that will be. These and your little dinosaurs would make excellent gifts for my grand kids (and me too).
Mel
thanks,
en.wikipedia.org/wiki/PID_controller
Tony
I have though discovered a problem with the Kangaroo in that you cannot use high resolution encoders (of the type I use) in mixed mode (dual motor locomotion), I am having to design a circuit that divides the encoders outputs to get it all to work. With a single motor with high res encoder (independent mode) you should be ok, its just when the Kangaroo has to deal with 2 motors simultaneously it cannot keep up with the counts.
Tony