#picaxe20M2
; More info at:http://forum.allaboutcircuits.com/showthread.php?t=77919
;
; This code may be re-used, modified, and shared by anybody, as long as the information and credits above are not altered or removed.
; Please post improved code ideas and updates to a thread in the electronics chat area of allaboutcircuits.com
; Have fun, remember to wear eye and hearing protection when shooting!
;declarations
dirsB=$FF ; All port B pins to outputs (20M2 pins 11-18)
dirsC=$0F ; first 4 ports of port C as outputs (20M2 pins 7-10)
pinsB = %00000000 ; Reset all port B Pins to 0
pinsC=$00 ; Reset all port C outputs to 0
;variables
symbol delaytime = w0 ;delaytime variable random requires word variables
symbol outs = b10 ; outputs
symbol adjust = b11 ; Potentiometer connected to C.7 (20M2 pin 3) to adjust delays
;initialization
servo B.4,75 ; initialise servo on B.4
delaytime = $1F ;seed pseudo-random generator
;main loop
main:
readadc c.7,adjust ; Pot connected between V+ and Gnd, wiper connected to C.7 (20M2 pin 3). Used for adjusting random timing.
adjust = adjust * 100 ; make 0-254 number 0-25400
random delaytime ; get pseudo-random number between 0 and 65535
delaytime = delaytime % 7000 ; Mod 7000 to get number between 0 and 7000
;delaytime = delaytime + 3000 ;add 3000 for 3-10second delaytime (depreciated by user potentiometer addition)
delaytime = delaytime + adjust ; add user chosen delaytime to delay.
pause delaytime ;pause for 0-26,100 milliseconds (0-26 seconds, user set potentiometer + 0-7 seconds)
random delaytime ; get new random number for output states
outs = delaytime/256 ;use first 8 bits of delaytime word for random port b outputs
pinsB= outs ;set portB pins high or low psuedo-random (20M2 pins 11-18)
if delaytime > 32768 then
servopos B.4,225 ; move servo to up position
pause 300 ; wait for servo to finish pushing target up
servopos B.4,75 ; return servo to idle position
pause 300 ; wait for servo to finish moving
endif
random delaytime ; get new random number for output states
outs = delaytime/512 ;use last 4 bits of delaytime word for random port c outputs
pinsC= outs ;set portC pins high or low psuedo-random (20M2 pins 7-10)
pause 500 ;wait ½ second to ensure all chosen targets to reset are up
pinsB = $06 ;disable outputs other than Servo on B.4 after the ½ second delay so cylinders aren't pushing on target
pinsC = $00 ;disable outputs after the ½ second delay so cylinders aren't pushing on target
goto main ; keep doing it until power is removed.
init: servo 4,75 ; initialise servo
main:
do
random w0
loop until w0 <= 10000 and w0 >= 3000
pause w0
servopos b.4,75 ; move servo to one end
pause 2000 ; wait 2 seconds
servopos b.4,150 ; move servo to middle
do : loop until pinc.1 = 1
goto main ; loop back to start
for b5=75 to 150
servopos B.4, b5 'Set servo position to next step 75, 76, 77... to 150
pause 10 ' Wait a little bit
next b5 ' loop again through increment of servo and delay
for b5=75 to 150 step 5
servopos B.4, b5
pause 10
next b5
'*** Program constants
symbol servo_delay = 5 'Delay to slow down servo motion (5ms default)
init:
'set servos to known position
servo 1,75
servo 2,75
servo 4,75
pause servo_delay
move_forward:
for b1 = 75 to 150
servopos 1,b1
pause servo_delay
next b1
for b1 = 75 to 150
servopos 4,b1
servopos 2,b1
pause servo_delay
next b1
for b1 = 150 to 75 step -1
servopos 1,b1
pause servo_delay
next b1
for b1 = 150 to 75 step -1
servopos 4,b1
servopos 2,b1
pause servo_delay
next b1
goto move_forward
#picaxe20M2
; More info at:http://forum.allaboutcircuits.com/showthread.php?t=77919
;
; This code may be re-used, modified, and shared by anybody, as long as the information and credits above are not altered or removed.
; Please post improved code ideas and updates to a thread in the electronics chat area of allaboutcircuits.com
; Have fun, remember to wear eye and hearing protection when shooting!
;declarations
dirsB=$FF ; All port B pins to outputs (20M2 pins 11-18)
dirsC=$0F ; first 4 ports of port C as outputs (20M2 pins 7-10)
pinsB = %00000000 ; Reset all port B Pins to 0
pinsC=$00 ; Reset all port C outputs to 0
;variables
symbol delaytime = w0 ;delaytime variable random requires word variables
symbol outs = b10 ; outputs
symbol adjust = b11 ; Potentiometer connected to C.7 (20M2 pin 3) to adjust delays
symbol servo_delay = 5
;initialization
'set servos to known position
servo 1,75
servo 2,75
servo 4,75
pause servo_delay
delaytime = $1F ;seed pseudo-random generator
;main loop
main:
readadc c.7,adjust ; Pot connected between V+ and Gnd, wiper connected to C.7 (20M2 pin 3). Used for adjusting random timing.
adjust = adjust * 100 ; make 0-254 number 0-25400
random delaytime ; get pseudo-random number between 0 and 65535
delaytime = delaytime % 7000 ; Mod 7000 to get number between 0 and 7000
;delaytime = delaytime + 3000 ;add 3000 for 3-10second delaytime (depreciated by user potentiometer addition)
delaytime = delaytime + adjust ; add user chosen delaytime to delay.
pause delaytime ;pause for 0-26,100 milliseconds (0-26 seconds, user set potentiometer + 0-7 seconds)
random delaytime ; get new random number for output states
outs = delaytime/256 ;use first 8 bits of delaytime word for random port b outputs
pinsB= outs ;set portB pins high or low psuedo-random (20M2 pins 11-18)
if delaytime > 32768 then
for b1 = 75 to 150
servopos 1,b1
pause servo_delay
next b1
for b1 = 75 to 150
servopos 4,b1
servopos 2,b1
pause servo_delay
next b1
for b1 = 150 to 75 step -1
servopos 1,b1
pause servo_delay
next b1
for b1 = 150 to 75 step -1
servopos 4,b1
servopos 2,b1
pause servo_delay
next b1
' servopos B.4,225 ; move servo to up position
' pause 300 ; wait for servo to finish pushing target up
' servopos B.4,75 ; return servo to idle position
' pause 300 ; wait for servo to finish moving
endif
random delaytime ; get new random number for output states
outs = delaytime/512 ;use last 4 bits of delaytime word for random port c outputs
pinsC= outs ;set portC pins high or low psuedo-random (20M2 pins 7-10)
pause 500 ;wait ½ second to ensure all chosen targets to reset are up
pinsB = $06 ;disable outputs other than Servo on B.4 after the ½ second delay so cylinders aren't pushing on target
pinsC = $00 ;disable outputs after the ½ second delay so cylinders aren't pushing on target
goto main ; keep doing it until power is removed.