Shop OBEX P1 Docs P2 Docs Learn Events
Program Differances and too much Servo Rotation BS1 — Parallax Forums

Program Differances and too much Servo Rotation BS1

DunedonDunedon Posts: 13
edited 2008-07-03 15:33 in BASIC Stamp
Hi ... I've got two projects that I've tried on my servo's (continuous rotation) and they both produce differant results in the amount of the rotation ... I assume it's due to the extra code travelled in the one project and I'm wondering if there is anything I can do about it.

If I use this code as the entire program I get a nice small rotation (maybe 1 degree or less)·with each step (the behaviour I want):
FOR X = 0 TO 200 
PULSEOUT 6, 151 
PAUSE 20 
NEXT

But if I use a larger program I get a swing of about 10·degrees (maybe more) using the exact same code to send the pulse each step·(without the for-next loop). Ignore the Button code, I've removed it from this program for now and am just using the auto-movement code.
' PUPPET2.BS1 
' ------------------------ 
' PIN 0: Head Up Button 
' PIN 1: Head Left Button 
' PIN 2: Head Right Button 
' PIN 3: Head Down Button 
' PIN 6: Head Up/Down Servo 
' PIN 7: Head Left/Right Servo 
' {$STAMP BS1} 
' {$PBASIC 1.0}
 
Init: 
'Button PINS 
SYMBOL btn_U = 0 
SYMBOL btn_D = 3 
SYMBOL btn_L = 1 
SYMBOL btn_R = 2 

 
'Button WorkSpaces 
SYMBOL btn_U_Wrk = B2 
SYMBOL btn_D_Wrk = B3 
SYMBOL btn_L_Wrk = B4 
SYMBOL btn_R_Wrk = B5 

 
'Head Location Variables 
SYMBOL headUD = 6 
SYMBOL headLR = 7 
SYMBOL headUD_Wrk = B6 
SYMBOL headLR_Wrk = B7 

 
'Temp Variable 
SYMBOL UseAuto = B8 
SYMBOL AutoTemp = B9 
SYMBOL UPLEFT = B10 
SYMBOL DOWNRIGHT = B11 
SYMBOL RandValue = W5 

 
'Initialze Servo 
LET PINS = 0 
LET DIRS = %00000011 
LET UPLEFT = 151 
LET DOWNRIGHT = 149 
LET headUD_Wrk = 90 
LET headLR_Wrk = 90 

 
Main: 
LET UseAuto = 1 
RANDOM RandValue 

 
Do_Auto: 
'Enter the Automovement code here 
AutoTemp = RandValue / 6550 MIN 0 
DEBUG AutoTemp 
BRANCH AutoTemp, (AutoMove_1,AutoMove_2,AutoMove_3,AutoMove_4,AutoMove_5,AutoMove_6,AutoMove_7,AutoMove_8) 
PAUSE 20 
GOTO Main 

 
'Up 
AutoMove_1: 
DEBUG "1", headUD_Wrk, headLR_Wrk 
LET headUD_Wrk = headUD_Wrk + 1 MAX 180 
PULSOUT headUD, UPLEFT 
PAUSE 20 
GOTO Main 

 
'Down 
AutoMove_2: 
DEBUG "2", headUD_Wrk, headLR_Wrk 
LET headUD_Wrk = headUD_Wrk - 1 MIN 0 
PULSOUT headUD, DOWNRIGHT 
PAUSE 20 
GOTO Main 

 
'Left 
AutoMove_3: 
DEBUG "3", headUD_Wrk, headLR_Wrk 
LET headLR_Wrk = headLR_Wrk + 1 MAX 180 
PULSOUT headLR, UPLEFT 
PAUSE 20 
GOTO Main 

 
'Right 
AutoMove_4: 
DEBUG "4", headUD_Wrk, headLR_Wrk 
LET headLR_Wrk = headLR_Wrk - 1 MIN 0 
PULSOUT headLR, DOWNRIGHT 
PAUSE 20 
GOTO Main 

 
'Up/Left 
AutoMove_5: 
DEBUG "5", headUD_Wrk, headLR_Wrk 
LET headUD_Wrk = headUD_Wrk + 1 MAX 180 
PULSOUT headUD, UPLEFT 
PAUSE 20 
LET headLR_Wrk = headLR_Wrk + 1 MAX 180 
PULSOUT headLR, UPLEFT 
PAUSE 20 
GOTO Main 

 
'Up/Right 
AutoMove_6: 
DEBUG "6", headUD_Wrk, headLR_Wrk 
LET headUD_Wrk = headUD_Wrk + 1 MAX 180 
PULSOUT headUD, UPLEFT 
PAUSE 20 
LET headLR_Wrk = headLR_Wrk - 1 MIN 0 
PULSOUT headLR, DOWNRIGHT 
PAUSE 20 
GOTO Main 

 
'Down/Right 
AutoMove_7: 
DEBUG "7", headUD_Wrk, headLR_Wrk 
LET headUD_Wrk = headUD_Wrk - 1 MIN 0 
PULSOUT headUD, DOWNRIGHT 
PAUSE 20 
LET headLR_Wrk = headLR_Wrk - 1 MIN 0 
PULSOUT headLR, DOWNRIGHT 
PAUSE 20 
GOTO Main 

 
'Down/Left 
AutoMove_8: 
DEBUG "8", headUD_Wrk, headLR_Wrk 
LET headUD_Wrk = headUD_Wrk - 1 MIN 0 
PULSOUT headUD, DOWNRIGHT 
PAUSE 20 
LET headLR_Wrk = headLR_Wrk + 1 MAX 180 
PULSOUT headLR, UPLEFT 
PAUSE 20 
GOTO Main

Q1) Is this a problem with the BS1 due to the instruction processing speed?
Q2) Can anything be done to allow me to get the small step increasements I want? (ie: code change, or change to BS2)
Q3) And unrelated ... since I have continuious rotation servo's, is there any way to have to reset to the same beginning position when powered up?· Will normal servo's reset to a "center" position if sent a pulse of 150?
Thanks in advance for any help you can give - I really appreciated it [noparse]:)[/noparse] - Keith

·

Comments

  • allanlane5allanlane5 Posts: 3,815
    edited 2008-07-03 14:19
    The problem is that the servo's don't "Hold Position" when they're not being commanded. So I suspect you're getting some "coasting" behavior between updates.

    One solution would be to have a routine "Servo_Refresh:" which you call every 20 mSec, to 'refresh' the current commanded settings of all your servo's. One problem with this solution is you'll need a "word" value for each servo to hold it's desired setting.· For that I think you'll need a BS2.

    The other problem is, "Modified" servo's have been "Modified" to REMOVE the explicit positioning ability. This allows them to be used as "wheel" motors, but does remove their "center" position ability.
  • Mike GreenMike Green Posts: 23,101
    edited 2008-07-03 14:23
    1) Probably not. The servo speed is set by the pulse width which is determined only by the 2nd value in the PULSOUT statement. The only problem you will run into regarding processing speed is that the BS1 will not be able to provide at least 50 pulses a second. If a servo doesn't see a control pulse within about 20ms, it may turn itself off until the next control pulse comes in. This may cause some "stuttering". The solution here would be to reduce the PAUSE length to compensate for the time spent doing calculations.

    2) Depends on what you mean by "step increments". Servos are not that accurate and the speed is not closely reproducible over time using the same pulse width.

    3) No. The only way you can do that is to have some external position sensor. For a wheel, often this is done by having a hole in one position on the opaque wheel and having an LED positioned to shine through that hole. A phototransistor is on the other side to sense when the hole is present and the Stamp moves the wheel until the phototransistor indicates that the hole is there. Normal servos will move to whatever absolute position you specify (by sending a specific pulse width).
  • jeffjohnvoljeffjohnvol Posts: 197
    edited 2008-07-03 15:33
    Would a stepper motor be more accurate?

    If you want to measure position, I have been successful using an absolute encoder from usdigital.com. (http://www.usdigital.com/news/press-releases/introducing-the-ma2) It gives 0-5 volts and using an ADC chip it gives pretty reliable information.
Sign In or Register to comment.