Position Controller Serial communication problems...
Howdy...
I'm using the wheel kit that comes with the position controllers (#29319) and some code that queries these encoders in a loop.
This loops works anything from 1 minute up to 15 minutes and then it get stuck on one of the PosCtrl.rx calls.
PosCtrl.tx(QPOS+1)
wheel_pos1.BYTE[1] := PosCtrl.rx <==== Get stuck in one for the PosCtrl.rx
wheel_pos1.BYTE[0] := PosCtrl.rx
Unfortunately the Simple serial does not seem to support any timeout functionality so I need to figure out how to "unhang" the call to PosCtrl.rx
A quick test with Full Duplex Serial as a replacement for simple serial did not work, maybe just a setup issue but does full duplex serial support communication on one pin at all ?
Is there a problem with the Position Controllers or my code ?
Any ideas ?
I'm using the wheel kit that comes with the position controllers (#29319) and some code that queries these encoders in a loop.
This loops works anything from 1 minute up to 15 minutes and then it get stuck on one of the PosCtrl.rx calls.
PosCtrl.tx(QPOS+1)
wheel_pos1.BYTE[1] := PosCtrl.rx <==== Get stuck in one for the PosCtrl.rx
wheel_pos1.BYTE[0] := PosCtrl.rx
Unfortunately the Simple serial does not seem to support any timeout functionality so I need to figure out how to "unhang" the call to PosCtrl.rx
A quick test with Full Duplex Serial as a replacement for simple serial did not work, maybe just a setup issue but does full duplex serial support communication on one pin at all ?
Is there a problem with the Position Controllers or my code ?
Any ideas ?
. . . CON ' Global constants required, can be removed from here _clkmode = xtal1 + pll16x _xinfreq = 6_250_000 MPC_Pin = 25 QPOS = $08 'Query Position QSPD = $10 'Query Speed CHFA = $18 'Check for Arrival TRVL = $20 'Travel Number of Positions CLRP = $28 'Clear Position SREV = $30 'Set Orientation as Reversed STXD = $38 'Set TX Delay SMAX = $40 'Set Speed Maximum SSRR = $48 'Set Speed Ramp Rate PING_Pin1 = 0 ' I/O Pin For PING))) PING_Pin2 = 1 ' I/O Pin For PING))) . . . OBJ PosCtrl : "simple_serial" . . . VAR word wheel_pos1 word wheel_pos2 word wheel_speed1 word wheel_speed2 word pingCenter1 word pingCenter2 word pingRight1 word pingRight2 word pingLeft1 word pingLeft2 Long SensorStack[300] . . . PUB start | x , y cognew(SensorsUpdate,@SensorStack) . . . PRI getWheelPosition PosCtrl.tx(QPOS+1) wheel_pos1.BYTE[1] := PosCtrl.rx wheel_pos1.BYTE[0] := PosCtrl.rx PosCtrl.tx(QPOS+2) wheel_pos2.BYTE[1] := PosCtrl.rx wheel_pos2.BYTE[0] := PosCtrl.rx PRI getWheelSpeed PosCtrl.tx(QSPD+1) wheel_speed1.BYTE[1] := PosCtrl.rx wheel_speed1.BYTE[0] := PosCtrl.rx PosCtrl.tx(QSPD+2) wheel_speed2.BYTE[1] := PosCtrl.rx wheel_speed2.BYTE[0] := PosCtrl.rx PRI ClearPos PosCtrl.tx(CLRP) PRI SensorsUpdate PingServo.Start 'Start Servo handler PingServo.Ramp '<-OPTIONAL 'Start Background Ramping PingServo.set(PingServoCh1, 1500) PingServo.set(PingServoCh2, 1500) PosCtrl.init(MPC_Pin,MPC_Pin, 19200) ' Establish comunications to MPC ClearPos PosCtrl.tx(SREV+2) PosCtrl.tx(STXD) PosCtrl.tx(200) repeat readPingCenter getWheelSpeed getWheelPosition PRI readPingCenter pingCenter1 := ping.Millimeters(PING_Pin1) pingCenter2 := ping.Millimeters(PING_Pin2) PRI readPingLeft pingLeft1 := ping.Millimeters(PING_Pin1) pingLeft2 := ping.Millimeters(PING_Pin2) PRI readPingRight pingRight1 := ping.Millimeters(PING_Pin1) pingRight2 := ping.Millimeters(PING_Pin2)
Comments
You might want to have a look at the attached code as an example.
Regards,
TCIII
Wheel_Controller.spin does not seem to work either...
The speed/position returned is always zero...
Anyone used this driver ?
Simple serial seem to sooner or later get stuck in one of the rx calls.
Wheel_Controller.spin always return 0 for speed and position...
If I hook the HB25 to the position controllers and try for example go_Distance, the robot goes amok and runs off.
Actually, I just have to give one of the wheels a little bit of a turn and is starts spinning out of control, the only thing I did was to call PosControl.open(MPC_Pin).
If I use FullDuplex I always get 204 returned (speed and pos) and it seem to always time out.
Anyhow, I'm thinking about by-passing the micro controller on the position controller and just solder wires from the actual opto interrupter...
Anyone done this ?
Since your wheel starts to spin out of control when given a little bit of a turn, it might just be that you are driving the wheel in the opposite direction that the position controller is programmed for?
Just a thought.
Regards,
TCIII
I'm not really interested in using the Wheel_Controller object so I dropped the idea.
All I really want is the speed and distance from the encoders.
I actually want to write my own Wheel Controller object that only uses the speed and distance feedback from the wheel encoders.
If I can get this to work, I can migrate the code to another project...
I thought of one thing yesterday, I'm using a 6.25 MHz crystal to run the propeller @ 100 MHz.
Let me try a 5MHz crystal from one of the proto boards to see if it is more stable.
I'll be out of town until next week though so I won't be able to test this for a while.