I am using this code, developed by halstaff, for a 3 axis animatronic head. I intend to have the "Pan" servo move left and hold upon receiving an input on C.3. Right now I am just trying to establish movement range and speed. The problem is this: with halstaff's code, the movement of the servos is slowed somewhat, giving a "realistic" head movement. When I added my pan section to establish speed and position, the servo moves at full speed. I'm confused as I am using the same variables as defined in the "symbol" section
Here is halstaff's code, with servo positions modified for the peculiarities of my 3 axis design.
Here is halstaff's code, with servo positions modified for the peculiarities of my 3 axis design.
Code:
#Picaxe 08M2 'Gertie 3 axis Witch head
'b18 byte variable 0-255 in 10uS increments.
'b15 Pause variable 0-65535 in 1mS increments.
'Hitec servo's like signals between 0.740 and 2.740 mS and period of 1 to 20 mS
'C.1 is nod servo
'C.2 is tilt servo
'C.4 is pan servo
symbol Nod = C.2
Symbol Pan = C.4
Symbol Tilt = C.1
symbol counter = b9
symbol pointer = b8
symbol delay = 39
symbol counter1 = b19
symbol pointer1 = b18
symbol delay1 = 45
symbol counter2 = b25
symbol pointer2 = b24
symbol delay2 = 55
start0:
pause 500
start1:'Nod Head
let b8=153 'set pointer offset so that head loop does not get stuck
let b6=150
let b7=150 'set default center values
servo Nod,pointer 'center servo
pause 7500
for counter = 150 to 75 step -1
servopos Nod,counter
pause delay
next counter
pause 3000
for counter = 75 to 150 step 1
servopos Nod,counter
pause delay
next counter
pause 3000
for counter = 190 to 150 step -1
servopos Nod,counter
pause delay
next counter
pause 4000
move: random w3 'place a random number in wo (also B0 & B1)
if b7<=75 then left 'check for random down
if b7>=75 and b7<=150 then middle 'check for random middle
if b7>=150 then right
goto move 'keep moving the head back to move loop
right: if pointer = 75 then move
if pointer = 150 then mr
for counter = 150 to 75 step -1
servopos Nod,counter
pause delay
next counter
pointer = 75
goto skipmr
mr: for counter = 150 to 75 step -1
servopos Nod,counter
pause delay
next counter
pointer = 75
skipmr: pause 7000 'delay to look natural
goto move 'return to move loop
middle: if pointer = 150 then move 'if head is already in the middle then go back to move
if pointer = 75 then ml
for counter = 190 to 150 step -1
servopos Nod,counter
pause delay
next counter
pointer = 150
goto skipml
ml: for counter = 75 to 150 step 1
servopos Nod,counter
pause delay
next counter
pointer = 150
skipml: pause 5000 'delay to look natural
goto move 'return to move loop
left: if pointer = 190 then move
if pointer = 75 then lmr
for counter = 150 to 190 step 1
servopos Nod,counter
pause delay
next counter
pointer = 190
goto skiplmr
lmr: for counter = 75 to 190 step 1
servopos Nod,counter
pause delay
next counter
pointer = 190
skiplmr: pause 7000 'delay to look natural
goto move 'return to move loop
start2: 'Pan head
let b18=153 'set pointer offset so that head loop does not get stuck
let b16=150
let b17=150 'set default center values
servo Pan,pointer1 'center servo
pause 8000
for counter1 = 150 to 100 step -1
servopos Pan,counter1
pause delay1
next counter1
pause 3000
for counter1 = 100 to 200 step 1
servopos Pan,counter1
pause delay1
next counter1
pause 3000
for counter1 = 200 to 150 step -1
servopos Pan,counter1
pause delay1
next counter1
pause 2000
move1: random w8 'place a random number in wo (also B0 & B1)
if b17<100 then left1 'check for random left
if b17>=100 and b17<=150 then middle1 'check for random middle
if b17>=150 then right1
goto move1 'keep moving the head back to move loop
right1: if pointer1 = 100 then move1
if pointer1 = 150 then mr1
for counter1 = 200 to 100 step -1
servopos Pan,counter1
pause delay1
next counter1
pointer1 = 100
goto skipmr1
mr1: for counter1 = 150 to 100 step -1
servopos Pan,counter1
pause delay1
next counter1
pointer1 = 100
skipmr1: pause 7000 'delay to look natural
goto move1 'return to move loop
middle1: if pointer1 = 150 then move1 'if head is already in the middle then go back to move
if pointer1 = 100 then ml1 'check to see if head is pointed left or right
for counter1 = 200 to 150 step -1
servopos Pan,counter1
pause delay1
next counter1
pointer1 = 150
goto skipml1
ml1: for counter1 = 100 to 150 step 1
servopos Pan,counter1
pause delay1
next counter1
pointer1 = 150
skipml1: pause 9000 'delay to look natural
goto move1 'return to move loop
left1: if pointer1 = 200 then move1
if pointer1 = 100 then lmr1
for counter1 = 150 to 200 step 1
servopos Pan,counter1
pause delay1
next counter1
pointer1 = 200
goto skiplmr1
lmr1: for counter1 = 100 to 200 step 1
servopos Pan,counter1
pause delay1
next counter1
pointer1 = 200
skiplmr1: pause 7000 'delay to look natural
goto move1 'return to move loop
start3: 'Tilt head
let b24=153 'set pointer offset so that head loop does not get stuck
let b22=150
let b23=150 'set default center values
servo Tilt,pointer2 'center servo
pause 4500
for counter2 = 150 to 80 step -1 'move head from middle to right side
servopos Tilt,counter2
pause delay2
next counter2
pause 3000
for counter2 = 80 to 210 step 1
servopos Tilt,counter2 'move head from right to left
pause delay2
next counter2
pause 3000
for counter2 = 210 to 150 step -1
servopos Tilt,counter2 'move head from right to middle
pause delay2
next counter2
pause 4000
move2: random w11 'place a random number in wo (also B0 & B1)
if b23<80 then left2 'check for random left
if b23>=80 and b23<=150 then middle2 'check for random middle
if b23>=150 then right2 'check for random right
goto move2 'keep moving the head back to move loop
right2: if pointer2 = 80 then move2 'if head is already Right goto back to move
if pointer2 = 150 then mr2 'check to see if head in pointed middle or the left
for counter2 = 210 to 80 step -1 'move head from left side to the right side
servopos Tilt,counter2
pause delay2
next counter2
pointer2 = 80 'set head pointer direction to right
goto skipmr2
mr2: for counter2 = 150 to 80 step -1 'move head from middle to right side
servopos Tilt,counter2
pause delay2
next counter2
pointer2 = 80 'set head pointer direction to right
skipmr2: pause 3000 'delay to look natural
goto move2 'return to move loop
middle2: if pointer2 = 150 then move2 'if head is already in the middle then go back to move
if pointer2 = 80 then ml2 'check to see if head is pointed left or right
for counter2 = 210 to 150 step -1
servopos Tilt,counter2 'move head from right to middle
pause delay2
next counter2
pointer2 = 150
goto skipml2
ml2: for counter2 = 80 to 150 step 1
servopos Tilt,counter2 'move servo from left to middle
pause delay2
next counter2
pointer2 = 150
skipml2: pause 4300 'delay to look natural
goto move2 'return to move loop
left2: if pointer2 = 210 then move2 'if head is already left then return to move
if pointer2 = 80 then lmr2 'check if the head is in the middle or the right
for counter2 = 150 to 210 step 1
servopos Tilt,counter2 'move head from middle to left
pause delay2
next counter2
pointer2 = 210
goto skiplmr2
lmr2: for counter2 = 80 to 210 step 1
servopos Tilt,counter2 'move head from right to left
pause delay2
next counter2
pointer2 = 210
skiplmr2: pause 4000 'delay to look natural
goto move2 'return to move loop