Need help receiving decimal values using fdserial_rxChar(fdserial *term)
Hi All,
I have an Arduino Leonardo sending two decimal speed values (64) to my Propeller Activity Board WX as a test using the follow cpp code:
#include <SoftwareSerial.h> . . SoftwareSerial prop(2,3); #define ARLO_FAST 64 . . . prop.begin(38400); int left, right; left = ARLO_FAST; right = ARLO_FAST; prop.print(left, DEC); prop.print(right, DEC);
I have verified that the Leonardo is sending the "64" decimal ASCII value by using a serial to USB converter and viewing the Leonardo serial output on the SimpleIDE terminal.
My Propeller C code looks like this:
#include "simpletools.h" #include "arlodrive.h" #include "fdserial.h" / ------ Global Variables and Objects ------ int leftSpeed; int rightSpeed; fdserial *fdser5_4; // ------ Main Program ------ int main() { fdser5_4 = fdserial_open(5, 4, 0b0000, 38400); // Pixy2_Line_Following while(1) { leftSpeed = fdserial_rxChar(fdser5_4); rightSpeed = fdserial_rxChar(fdser5_4); print(("Left = ")); print("%d\r", leftSpeed); print(("Right = ")); print("%d\r", rightSpeed); //drive_speed(leftSpeed, rightSpeed); } }
The problem I am having is that even though the decimal value 64 is being transmitted by the Leonardo over the serial connection with the Propeller, I am seeing the decimal values 52 and 54 being displayed on the SimpleIDE terminal.
I have even tried using serial.h with the same results!
What is my Propeller code missing that is causing the decimal value of "64" to be received as either "52" or "54"?
Is it a fdserial receiver buffer issue?
Any help would be appreciated to help move my project along.
Regards,
TCIII
Comments
With
prop.print(left, DEC);
you send the valueleft
as two ASCII characters '6' and '4' . The ASCII values for '6' and '4' are 54 and 52, that is what you receive in the Spin code (you only read single characters).You can send the value as a single character with
prop.write(left)
on the Arduino side. This limits the range of the speed value to 0..255.Or you receive the decimal values which are built from several ASCII characters on the Propeller side. This is a bit more complicated but allows to add some synchronization characters to distinguish between left and right value.
Andy
@Ariba,
Thanks for the response, much appreciated.
I eventually figured out that I needed to use
prop.write
and notprop.print
as you have pointed out.Regards,
TCIII
Hi All,
Now that I have gotten the Leonardo to Propeller Activity Board serial communication issue put to bed, I still have a problem, but with the Propeller code.
Since I don't need bidirectional communication I have switched from
fdserial.h
toserial.h
and have changeddrive_speed(int left, int right)
todrive_rampStep(int left, int right)
which is better suited to varying speed values in a loop.The problem I am having now is that only the right wheel turns at the commanded speed (64) while the left wheel stays stationary even though the print statements, in the Terminal, for the leftSpeed and the rightSpeed both show a speed value of 64.
It seems that the
leftSpeed
value is not being used in thedrive_rampStep(leftSpeed, rightSpeed)
or am I trying to do something that thedrive_rampStep(leftSpeed, rightSpeed)
function is not capable of in thewhile(1)
loop?Additionally the
"arlodrive.h"
header library that I am using is a specialized version for an Arlo that uses HB25s in place of the DHB10 Motor Controller. I can usedrive_speed(int left, int right)
,drive_goto(int left, int right)
, anddrive_rampStep(int left, int right)
in other programs and they function as expected.Regards,
TCIII
The arlo code shows that you can turn on debug so that it prints out messages as it goes through the code.
At the top of the arlodrive.h there these three lines:
If you remove the two "//" from the front of the first line you should get debug data.
The code is using pins 12 and 13 which should work. Did you try reversing the wires to see if the other motor works as well.
Mike
@iseries,
Thanks for the response, much appreciated.
Unfortunately my modified
arlodrive.h
does not contain the//#define ARLO_DEBUG
. Instead it has//#define interactive_development_mode
which I believe has the same function.It turns out that something had happened to my original Arlo motor/encoder calibration values in the eeprom. A recalibration of the Arlo motor/encoders solved the issue.
Now the Arduino Leonardo receives line tracking data ( x offset distance from the camera center of view x value) from the Pixycam2, converts it to left and right steering speed values, and transmits those two values over a serial link to the Propeller Activity Board running the C code in post #4 above.
I have a piece of white paper with a 1/8" black line drawn down the center to simulate a line path and if I move the line to the left of the camera FOV center, the right wheel speeds up and the left wheel slows down. Moving the line to the right of the camera FOV center, the right wheel slows down and the left wheel speeds up.
Regards,
TCIII
The character "6" is ASCII code 54. The character "4" is ASCII code 52.
To convert the ASCII characters to a numeric value you can subtract the character "0" from each digit. "0" is ASCII code 48. You multiply the previous values by ten and add the value for the new character to build up the entire number.
I'm pretty sure this functionality is built into one of the libraries you are using but it's been too long since I've used C on the Propeller for me to remember the syntax off the top of my head.
Edit: I think I just repeated what Andy said above. Sorry Andy. I hadn't read all the replies before commenting.
Edit again: Sorry all. I replied to the wrong comment.