| davidbuckley.net |
| home > Bambino > Programs 1 to 16 | Programs 17 to 21 | Programs 22 - 28 | 14 January 2012 |
Developer Programming instructions
'Bambino-22
Sertxd("B22",cr) 'report program number @4800
#PicAxe 20M2
#no_data
'PICAXE IC Memory ext I/O Outputs Inputs ADC Memory Starts Polled Resonator
' £ Type pins bytes slot pins Vars. RAM Spad Data Table* Int. def. opt.
'2.28 PICAXE-20M2 20 2k 18 1-16 1-17 4 28 512 256 512 8 Yes 4 -32
'PICAXE-20M2 circuit board with LEDs off takes 1mA
'PICAXE-20M2 circuit board with LEDs off and servos connected takes 10mA
'Bambino-01 'Test eyeLEDs, whiskerLEDs and speaker
'Bambino-02 'Test InfraRed input
'Bambino-02a 'Test Eye light values
'Bambino-02b 'Test Whisker light values
'Bambino-03 'Play the inbuilt tunes using keys 1 to 4 and beep on 5
'Bambino-04 'Set servos to mid position
'Bambino-05 'Calibrate servo mid positions and put values in EEPROM.
'Bambino-06 'Introduce _iStand:- initialise with feet in mid position
'Bambino-07 'Set rollR
'Bambino-08 'Set rollL
'Bambino-09 'Check rollR, rollL
'Bambino-10 'Introduction of _Stand
'Bambino-11 'Investigate effect of rollspeed; watch roll for all three speeds
'Bambino-12 'Investigate effect of rollspeed; watch Roll and Stand for all three speeds
'Bambino-13 'Check paceFL paceFR; Investigate effect of pacespeed
'Bambino-14 'Check Fd
'Bambino-15 'Test Rt, Lt
'Bambino-15a 'Test T2L Turn to Light, T2D Turn to Dark
'Bambino-16 'Test Bk
'Bambino-17 'Creaton of sections ACTIONS, BEHAVIOURS, ACTS;
'Introduction of ACT parameter 'Ado'
'Bambino-17a 'Demo routine
'Bambino-18 'Walk Fd with obstacle avoidance using eyes from 02a
'Bambino-18a 'Walk Fd with drop-off avoidance using whiskers values from 02b
'Bambino-18b 'rewritten with autocalibration of down whiskers and reading of whiskers as subroutines
'Bambino-19 'If IR command then do it otherwise walk and avoid
'Bambino-20 'rewrite to incorporate rollC and paceC in EEPROM 254,255
'Bambino-21 'rewrite to clearer code
'Bambino-22 'remember a sequence of key presses
'-----------------------------------------------------------------
'modified
'--------
'New
'---
'be able to record some moves and replay them using Key [1]
'Press [|] to start recording
'Press [POWER] or [1] to end recording
'Press [1] to play recording
'RockAdo is moved to key [2] it can be included in remembered moves.
'symbol nokey =255
'=================================================================
'TVR010 PicAxe IR-controller
'---------------------------
'Before use, the transmitter must be programmed with the Sony transmit code.
'1. Insert 2 AAA size batteries, preferably alkaline.
'2. Press S and B at the same time. S is in the centre of the arrows.
' The top left red LED should light.
'3. Press 0. The LED should flash.
'4. Press 1. The LED should flash.
'5. Press 3. The LED should go out.
'6. Press the red power button (top right).
'-------------------------------------------
'IRin cmnds PicAxe controller
'DO NOT PRESS OTHER KEYS
'ie [A] [B] [C] [D] [E] [F] [G]
'They change the Mode and [B] has to be pressed to change back.
'[square] [triangle [()] [L] [X] [backwards F] have no effect
Symbol KEY_POWER = 21 'Sleep
Symbol KEY_UP = 16 'Step Forward
Symbol KEY_DOWN = 17 'Step Backward
Symbol KEY_RIGHT = 18 'Turn Right
Symbol KEY_LEFT = 19 'Turn Left
Symbol KEY_BAR = 96
Symbol KEY_TENT = 54
Symbol KEY_VERT_CROSS = 37
Symbol KEY_VCROSS = 37 'synonym for easier coding
Symbol KEY_DIAG_CROSS = 20
Symbol KEY_XCROSS = 20 'synonym for easier coding
symbol IRkey1 = 0
symbol IRkey2 = 1
symbol IRkey3 = 2
symbol IRkey4 = 3
symbol IRkey5 = 4
symbol IRkey6 = 5
symbol IRkey7 = 6
symbol IRkey8 = 7
symbol IRkey9 = 8
Symbol KEY_MINUS = 98
Symbol KEY_0 = 9 'Quit command mode
Symbol KEY_PLUS = 11
'=================================================================
symbol servopace =c.0 'left connector
symbol servoroll =c.4 'right connector
symbol VoiceLed_ =c.5 'low =>LED on
symbol eyeLedL_ =c.2 'low =>LED on
symbol eyeLedR_ =b.1 'low =>LED on
symbol whiskerLedL_ =c.3 'low =>whisker LED on
symbol whiskerLedR_ =b.3 'low =>whisker LED on
symbol eyeR =c.7
symbol eyeL =c.1
symbol iIRin =c.6
symbol oIRout =b.2
'symbol general =b0
symbol flags =w1
symbol B_flags =b3
'symbol f_doIRcmnds =bit29
symbol f_play =bit28
symbol f_record =bit29
symbol f_direction =bit30 '1=forwards, 0=backwards
symbol f_defaultB =bit31 'defaultBehaviour 1=use default
symbol servosAt =w2
symbol rollat =b4
symbol paceat =b5
symbol ServosTo =w3
symbol rollTo =b6
symbol paceTo =b7
symbol Smoveby =w4
symbol rollby =b8
symbol paceby =b9
symbol Scentre =w5
symbol rollC =b10
symbol paceC =b11
symbol Sspeed =w6
symbol rollspeed =b12 '4 is too fast, 0 won't move
symbol pacespeed =b13 '6 is about max for servos to keep up
symbol counters =w7
symbol spulse =b14
symbol iA =b15
symbol temp =w8
symbol tempL =b16
'symbol tempH =b17
symbol sframe =22 'time between servo pulses
symbol Ado =b18 'parameter for ACTs
symbol obstacle =b19 '%11 bitmap of obstacles %LeftRight
symbol lightL =b20 'light level Left
symbol lightR =b21 'light level Right
symbol IRcmnd =b22 'cmnd from IRremote
symbol nokey =255
'symbol cmnd =b23 'Action to be done
'=================================================================
initialise:
rollby =15 '+ve right
paceby =20 '+ve Left foot forward
rollspeed =1 '4 is too fast, 0 won't move
pacespeed =2 '6 is about max for servos to keep up
rollC =150 'Default, 100 is roll to the left
paceC =150 'Default, 100 is left foot back
read 254,temp 'set in prog5
if temp>130 and temp<170 then 'so servo is always between 100,200
rollC =temp
endif
read 255,temp 'set in prog5
if temp>130 and temp<170 then 'so servo is always between 100,200
paceC =temp
endif
sertxd("rollC=",#rollC," paceC=",#paceC,cr)
low eyeLedR_ 'make output LED on
low eyeLedL_ 'make output LED on
gosub _iStand
f_defaultB =1 'defaultBehaviour On
f_record =0
bptr =32
poke bptr,0 'no recording
start:
sertxd("S")
Ado =4 'for RockAdo
irin [50,Walkabout],iIRin,IRcmnd 'irin with timeout, no IR =>Walkabout
gosub beep50 'so we know IR received
goto IRacty
'=================================================================
'Activities
'----------
IRacty:
sertxd("IR")
DoIRcmnd:
sertxd(#IRcmnd)
sertxd("f_play",#f_play,"f_rec",#f_record)
sertxd("@",#bptr,"=",#IRcmnd)
select IRcmnd
case KEY_POWER
if f_record=1 then
f_record =0
@bptr =0 'end marker
else
gosub rest
gosub EyesON
goto DoIRcmnd 'have already got IRcmnd in rest:
endif
case KEY_UP
if f_record=1 then
@bptrinc =IRcmnd
endif
gosub Fd
case KEY_DOWN
if f_record=1 then
@bptrinc =IRcmnd
endif
gosub Bk
case KEY_RIGHT
if f_record=1 then
@bptrinc =IRcmnd
endif
gosub Rt
case KEY_LEFT
if f_record=1 then
@bptrinc =IRcmnd
endif
gosub Lt
case IRkey1
f_play =1 'play
bptr =32 'set to start
sertxd("bptr",#bptr)
case IRkey2
if f_record=1 then
@bptrinc =IRcmnd
endif
gosub RockAdo
case KEY_0
goto Start 'QUIT
case KEY_BAR
f_record =1
f_play =0
bptr =32 'set to start
end select
if f_play=1 then
f_record =0
IRcmnd =@bptrinc 'read remembered command
if IRcmnd=0 then '0=end
f_play =0
IRcmnd =nokey 'no move
endif
goto DoIRcmnd
endif
GetIR:
if f_record=1 then
low VoiceLed_ 'turn on mouth while waiting
else
high VoiceLed_ 'turn off mouth while waiting
endif
irin iIRin,IRcmnd 'Get IRcmnd
gosub beep50 'so we know IR received
goto DoIRcmnd 'Do code
'-----------------------------------------
Walkabout:
sertxd("W")
obstacle =0
gosub EyesOFF
EwhiskerR:
readadc c.7,lightR
low eyeLedR_ 'eyeR on
readadc c.7,tempL
high eyeLedR_ 'eyeR off
if lightR>tempL then 'why this happens I don't know
tempL =lightR
endif
tempL =tempL -lightR
if tempL<2 then EwhiskerL 'ignore
obstacle =obstacle or 1
EwhiskerL:
readadc c.1,lightL
low eyeLedL_ 'eyeL on
readadc c.1,tempL
high eyeLedL_ 'eyeL off
if lightL>tempL then 'why this happens I don't know
tempL =lightL
endif
tempL =tempL -lightL
if tempL<5 then Walk 'ignore
obstacle =obstacle or %10
Walk:
gosub B_fast
b0 =obstacle 'to use bits
if bit0=0 then
low eyeLedR_
endif
if bit1=0 then
low eyeLedL_
endif
on obstacle gosub Fd,Lt,Rt,Bk
irin [50,Walkabout],iIRin,IRcmnd 'irin with timeout, no IR =>Walkabout
goto start 'QUIT if IRin
'=================================================================
'Behaviours
'----------
B_fast:
rollspeed =3
pacespeed =6
return
B_turn:
rollspeed =1 'slow so foot doesn't bounce
pacespeed =5
return
'=================================================================
'Program Acts
'------------
RockAdo:
if f_defaultB=1 then gosub B_fast
for iA=1 to Ado
gosub _rollR
gosub _rollL
next iA
gosub Stand
return
FdAdo:
for iA=1 to Ado
gosub Fd
next iA
return
BkAdo:
for iA=1 to Ado
gosub Bk
next iA
return
Rest:
gosub _rollL
gosub _iStand
pwmout eyeLedR_,100,400 'active low so high Dutycycle for dim
pwmout eyeLedL_,100,400 'active low so high Dutycycle for dim
_RestIRwait:
high VoiceLed_
irin iIRin,IRcmnd 'irin with no timeout
gosub beep50 'so we know IR received
if IRcmnd=KEY_POWER then _RestIRwait 'wait until different IRcmnd
pwmout eyeLedR_,off
pwmout eyeLedL_,off
return
'=================================================================
'Actions
'-------
Fd:
sertxd ("Fd")
f_direction =1
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _FdL 'else _FdR
_FdR:
'sertxd ("_FdR")
gosub _rollL
gosub _RF
gosub Stand
return
_FdL:
'sertxd ("_FdL")
gosub _rollR
gosub _LF
gosub Stand
return
'-----------------------------------------
Bk:
sertxd ("Bk")
f_direction =0
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _BkR 'else _BkL
_BkL:
gosub _rollR
gosub _RF
gosub Stand
return
_BkR:
gosub _rollL
gosub _LF
gosub Stand
return
'-----------------------------------------
Rt:
sertxd ("Rt")
if paceat<paceC and f_direction=1 then gosub Fd 'need left foot forward
if paceat<paceC and f_direction=0 then gosub Bk 'need left foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _RF
return
'-----------------------------------------
Lt:
sertxd ("Lt")
if paceat>paceC and f_direction=1 then gosub Fd 'need right foot forward
if paceat&lgt;paceC and f_direction=0 then gosub Bk 'need right foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _LF
return
'=================================================================
_RF:
'sertxd ("_RF")
paceto =paceC -paceby
for spulse=paceat to paceto step -pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
_LF:
'sertxd ("_LF")
paceto =paceC +paceby
for spulse=paceat to paceto step pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
'-----------------------------------------
Stand: 'stand with both feet flat
'sertxd (" Sd")
if rollat<rollC then _StandR 'else _StandL
_StandL:
'sertxd ("_SL")
for spulse=rollat to rollC step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_StandR:
'sertxd ("_SR")
for spulse=rollat to rollC step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_rollL:
'sertxd ("_rL")
rollto =rollC -rollby
for spulse=rollat to rollto step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_rollR:
'sertxd ("_rR")
rollto =rollC +rollby
for Spulse=rollat to rollto step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_iStand:
'initialise with feet in mid position
for spulse=0 to 10
pulsout servopace,paceC 'pulse servo paceC
pulsout servoroll,rollC 'pulse servo rollC
pause 70 'pause 70ms - do it slowly
next spulse
rollat =rollC
paceat =paceC
return
'-----------------------------------------
beep50:
sound VoiceLed_,(50,10) 'this leaves mouthLED ON
high VoiceLed_ 'turn off mouth
return
beep150:
sound VoiceLed_,(150,10) 'this leaves mouthLED ON
high VoiceLed_ 'turn off mouth
return
EyesOFF:
high eyeLedR_
high eyeLedL_
return
EyesON:
low eyeLedR_
low eyeLedL_
return
'=================================================================
'Bambino-23
Sertxd("B23",cr) 'report program number @4800
#PicAxe 20M2
#no_data
'PICAXE IC Memory ext I/O Outputs Inputs ADC Memory Starts Polled Resonator
' £ Type pins bytes slot pins Vars. RAM Spad Data Table* Int. def. opt.
'2.28 PICAXE-20M2 20 2k 18 1-16 1-17 4 28 512 256 512 8 Yes 4 -32
'PICAXE-20M2 circuit board with LEDs off takes 1mA
'PICAXE-20M2 circuit board with LEDs off and servos connected takes 10mA
'Bambino-01 'Test eyeLEDs, whiskerLEDs and speaker
'Bambino-02 'Test InfraRed input
'Bambino-02a'Test Eye light values
'Bambino-02b'Test Whisker light values
'Bambino-03 'Play the inbuilt tunes using keys 1 to 4 and beep on 5
'Bambino-04 'Set servos to mid position
'Bambino-05 'Calibrate servo mid positions and put values in EEPROM.
'Bambino-06 'Introduce _iStand:- initialise with feet in mid position
'Bambino-07 'Set rollR
'Bambino-08 'Set rollL
'Bambino-09 'Check rollR, rollL
'Bambino-10 'Introduction of _Stand
'Bambino-11 'Investigate effect of rollspeed; watch roll for all three speeds
'Bambino-12 'Investigate effect of rollspeed; watch Roll and Stand for all three speeds
'Bambino-13 'Check paceFL paceFR; Investigate effect of pacespeed
'Bambino-14 'Check Fd
'Bambino-15 'Test Rt, Lt
'Bambino-15a'Test T2L Turn to Light, T2D Turn to Dark
'Bambino-16 'Test Bk
'Bambino-17 'Creaton of sections ACTIONS, BEHAVIOURS, ACTS;
'Introduction of ACT parameter 'Ado'
'Bambino-17a'Demo routine
'Bambino-18 'Walk Fd with obstacle avoidance using eyes from 02a
'Bambino-18a 'Walk Fd with drop-off avoidance using whiskers values from 02b
'Bambino-18b 'rewritten with autocalibration of down whiskers and reading of whiskers as subroutines
'Bambino-19 'If IR command then do it otherwise walk and avoid
'Bambino-20 'rewrite to incorporate rollC and paceC in EEPROM 254,255
'Bambino-21 'rewrite to clearer code
'Bambino-22 'remember a sequence of keys presses
'Bambino-23 'remember up to 8 sequences of key presses in RAM
'-----------------------------------------------------------------
'modified
'--------
'New
'---
'symbol nokey - deleted
'nokey: 'wait until no IR received
'IRgetAct_cmnd: 'get Act key1 - key8
'DoIRcmnd:; case KEY_POWER - rewritten ->DoIRacty, DoCmnd
'[KEY_BAR] enters learn mode
'[KEY_BAR] has to be followed by a number key 1-8
' = the Act to be remembered
'up to 8 Acts can be learned
'learned Acts can call coded Acts
'a learned Act which chains itself repeats forever, eg #1 = Fd,1
'Acts can chain to other Acts, eg Fd,Bk,2 - chain to Act2
'[KEY_POWER] stops the playing Act.
'[KEY_TENT] selects coded Acts = subroutines,
'[KEY_TENT] has to be followed by a number key 1-8
' [key1]=>RockAdo
'coded Acts play until the end.
'=================================================================
'TVR010 PicAxe IR-controller
'---------------------------
'Before use, the transmitter must be programmed with the Sony transmit code.
'1. Insert 2 AAA size batteries, preferably alkaline.
'2. Press S and B at the same time. S is in the centre of the arrows.
' The top left red LED should light.
'3. Press 0. The LED should flash.
'4. Press 1. The LED should flash.
'5. Press 3. The LED should go out.
'6. Press the red power button (top right).
'-------------------------------------------
'IRin cmnds PicAxe controller
'DO NOT PRESS OTHER KEYS
'ie [A] [B] [C] [D] [E] [F] [G]
'They change the Mode and [B] has to be pressed to change back.
'[square] [triangle [()] [L] [X] [backwards F] have no effect
Symbol KEY_POWER = 21 'Sleep
Symbol KEY_UP = 16 'Step Forward
Symbol KEY_DOWN = 17 'Step Backward
Symbol KEY_RIGHT = 18 'Turn Right
Symbol KEY_LEFT = 19 'Turn Left
Symbol KEY_BAR = 96 'learn an Act
Symbol KEY_TENT = 54 '
Symbol KEY_VERT_CROSS = 37
Symbol KEY_VCROSS = 37 'use synonym easier coding
Symbol KEY_DIAG_CROSS = 20
Symbol KEY_XCROSS = 20 'use synonym easier coding
symbol IRkey1 = 0
symbol IRkey2 = 1
symbol IRkey3 = 2
symbol IRkey4 = 3
symbol IRkey5 = 4
symbol IRkey6 = 5
symbol IRkey7 = 6
symbol IRkey8 = 7
symbol IRkey9 = 8
Symbol KEY_MINUS = 98
Symbol KEY_0 = 9 'QUIT command mode
Symbol KEY_PLUS = 11
'=================================================================
symbol servopace =c.0 'left connector
symbol servoroll =c.4 'right connector
symbol VoiceLed_ =c.5 'low =>LED on
symbol eyeLedL_ =c.2 'low =>LED on
symbol eyeLedR_ =b.1 'low =>LED on
symbol whiskerLedL_ =c.3 'low =>whisker LED on
symbol whiskerLedR_ =b.3 'low =>whisker LED on
symbol eyeR =c.7
symbol eyeL =c.1
symbol iIRin =c.6
symbol oIRout =b.2
'symbol general =b0
symbol flags =w1
symbol B_flags =b3
'symbol f_doIRcmnds =bit29
symbol f_play =bit28
symbol f_record =bit29
symbol f_direction =bit30 '1=forwards, 0=backwards
symbol f_defaultB =bit31 'defaultBehaviour 1=use default
symbol servosAt =w2
symbol rollat =b4
symbol paceat =b5
symbol ServosTo =w3
symbol rollTo =b6
symbol paceTo =b7
symbol Smoveby =w4
symbol rollby =b8
symbol paceby =b9
symbol Scentre =w5
symbol rollC =b10
symbol paceC =b11
symbol Sspeed =w6
symbol rollspeed =b12 '4 is too fast, 0 won't move
symbol pacespeed =b13 '6 is about max for servos to keep up
symbol counters =w7
symbol spulse =b14
symbol iA =b15
symbol temp =w8
symbol tempL =b16
'symbol tempH =b17
symbol sframe =22 'time between servo pulses
symbol Ado =b18 'parameter for ACTs
symbol obstacle =b19 '%11 bitmap of obstacles %LeftRight
symbol lightL =b20 'light level Left
symbol lightR =b21 'light level Right
symbol cmnd =b22 'cmnd from IRremote
symbol Act =b23
symbol Aend =b24 'end of record slot
symbol act1 =32
symbol act2 =32 *2
symbol act3 =32 *3
symbol act4 =32 *4
symbol act5 =32 *5
symbol act6 =32 *6
symbol act7 =32 *7
symbol act8 =32 *8
for Act=act1 to act8
poke Act,255 'set stop markers
next Act
'=================================================================
initialise:
rollby =15 '+ve right
paceby =20 '+ve Left foot forward
rollspeed =1 '4 is too fast, 0 won't move
pacespeed =2 '6 is about max for servos to keep up
rollC =150 'Default, 100 is roll to the left
paceC =150 'Default, 100 is left foot back
read 254,temp 'set in prog5
if temp>130 and temp<170 then 'so servo is always between 100,200
rollC =temp
endif
read 255,temp 'set in prog5
if temp>130 and temp<170 then 'so servo is always between 100,200
paceC =temp
endif
sertxd("rollC=",#rollC," paceC=",#paceC,cr)
low eyeLedR_ 'make output LED on
low eyeLedL_ 'make output LED on
gosub _iStand
f_defaultB =1 'defaultBehaviour On
f_record =0
bptr =32
poke bptr,0 'no recording
start:
sertxd("S")
Ado =4 'for RockAdo
irin [50,Walkabout],iIRin,cmnd 'irin with timeout, no IR =>Walkabout
gosub beep50 'so we know IR received
goto DoCmnd
'=================================================================
'Activities
'----------
IRacty:
sertxd("IR")
irin iIRin,cmnd 'Get cmnd
gosub beep50 'so we know IR received
DoCmnd:
sertxd(cr,#cmnd," @",#bptr)
sertxd(" f_p",#f_play," f_r",#f_record,",")
select cmnd
case KEY_POWER
if f_record=0 and f_play=0 then
gosub rest
gosub EyesON
goto DoCmnd 'have already got IRcmnd in rest:
else
f_play =0
if f_record=1 then
f_record =0
poke bptr,255 'end marker
endif
gosub dump
endif
case KEY_UP
gosub Fd
case KEY_DOWN
gosub Bk
case KEY_RIGHT
gosub Rt
case KEY_LEFT
gosub Lt
case KEY_0
goto Start 'QUIT
case <IRkey9 'Act keya
if f_record<>1 then
f_play=1 'play
bptr =32 *cmnd +32 'set to start
sertxd(" play@",#bptr,cr)
endif
case KEY_BAR
f_play =0
f_record =1
gosub IRgetAct_cmnd
bptr =32 *cmnd +32
Aend =bptr +31
gosub nokey
sertxd("rec@",#bptr,cr)
goto IRacty 'get cmnds
case KEY_TENT 'coded acts
gosub IRgetAct_cmnd
cmnd =cmnd +128 'set topbit for coded Acts
sertxd(" Act",#cmnd,cr)
goto DoCmnd
case >127
sertxd("case >127",cr)
Act =cmnd -128
on Act gosub RockAdo 'add others
end select
if f_record=1 then
if bptr<Aend then
@bptrinc =cmnd
else 'end of slot
gosub beep150
cmnd =KEY_POWER
goto DoCmnd
endif
endif
if f_play=1 then
irin [50,_playon],iIRin,cmnd
goto Start 'if IR received =>break
_playon:
cmnd =@bptrinc
if cmnd<>255 then DoCmnd'255=end
f_play =0
endif
goto IRacty 'get IR
'-----------------------------------------
Walkabout:
sertxd("W")
obstacle =0
gosub EyesOFF
EwhiskerR:
readadc c.7,lightR
low eyeLedR_ 'eyeR on
readadc c.7,tempL
high eyeLedR_ 'eyeR off
if lightR>tempL then 'why this happens I don't know
tempL =lightR
endif
tempL =tempL -lightR
if tempL<2 then EwhiskerL 'ignore
obstacle =obstacle or 1
EwhiskerL:
readadc c.1,lightL
low eyeLedL_ 'eyeL on
readadc c.1,tempL
high eyeLedL_ 'eyeL off
if lightL>tempL then 'why this happens I don't know
tempL =lightL
endif
tempL =tempL -lightL
if tempL<5 then Walk 'ignore
obstacle =obstacle or %10
Walk:
gosub B_fast
b0 =obstacle 'to use bits
if bit0=0 then
low eyeLedR_
endif
if bit1=0 then
low eyeLedL_
endif
on obstacle gosub Fd,Lt,Rt,Bk
irin [50,Walkabout],iIRin,cmnd 'irin with timeout, no IR =>Walkabout
goto start 'QUIT if IRin
'=================================================================
'Behaviours
'----------
B_fast:
rollspeed =3
pacespeed =6
return
B_turn:
rollspeed =1 'slow so foot doesn't bounce
pacespeed =5
return
'=================================================================
'Acts
'----
RockAdo: '#128
if f_defaultB=1 then gosub B_fast
for iA=1 to Ado
gosub _rollR
gosub _rollL
next iA
gosub Stand
return
FdAdo:
for iA=1 to Ado
gosub Fd
next iA
return
BkAdo:
for iA=1 to Ado
gosub Bk
next iA
return
Rest:
gosub _rollL
gosub _iStand
pwmout eyeLedR_,100,400 'active low so high Dutycycle for dim
pwmout eyeLedL_,100,400 'active low so high Dutycycle for dim
_RestIRwait:
high VoiceLed_
irin iIRin,cmnd 'irin with no timeout
gosub beep50 'so we know IR received
if cmnd=KEY_POWER then _RestIRwait 'wait until different IRcmnd
pwmout eyeLedR_,off
pwmout eyeLedL_,off
return
'=================================================================
'Actions
'-------
Fd:
sertxd ("Fd")
f_direction =1
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _FdL 'else _FdL
_FdR:
'sertxd ("_FdR")
gosub _rollL
gosub _RF
gosub Stand
return
_FdL:
'sertxd ("_FdL")
gosub _rollR
gosub _LF
gosub Stand
return
'-----------------------------------------
Bk:
sertxd ("Bk")
f_direction =0
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _BkR 'else _BkL
_BkL:
gosub _rollR
gosub _RF
gosub Stand
return
_BkR:
gosub _rollL
gosub _LF
gosub Stand
return
'-----------------------------------------
Rt:
sertxd ("Rt")
if paceat<paceC and f_direction=1 then gosub Fd 'need left foot forward
if paceat<paceC and f_direction=0 then gosub Bk 'need left foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _RF
return
'-----------------------------------------
Lt:
sertxd ("Lt")
if paceat>paceC and f_direction=1 then gosub Fd 'need right foot forward
if paceat>paceC and f_direction=0 then gosub Bk 'need right foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _LF
return
'=================================================================
_RF:
'sertxd ("_RF")
paceto =paceC -paceby
for spulse=paceat to paceto step -pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
_LF:
'sertxd ("_LF")
paceto =paceC +paceby
for spulse=paceat to paceto step pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
'-----------------------------------------
Stand: 'stand with both feet flat
'sertxd (" Sd")
if rollat<rollC then _StandR 'else _StandL
_StandL:
'sertxd ("_SL")
for spulse=rollat to rollC step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_StandR:
'sertxd ("_SR")
for spulse=rollat to rollC step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_rollL:
'sertxd ("_rL")
rollto =rollC -rollby
for spulse=rollat to rollto step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_rollR:
'sertxd ("_rR")
rollto =rollC +rollby
for Spulse=rollat to rollto step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_iStand:
'initialise with feet in mid position
for spulse=0 to 10
pulsout servopace,paceC 'pulse servo paceC
pulsout servoroll,rollC 'pulse servo rollC
pause 70 'pause 70ms - do it slowly
next spulse
rollat =rollC
paceat =paceC
return
'-----------------------------------------
dump:
for bptr=32 to 40
sertxd (cr,#bptr,"=",#@bptr)
next bptr
sertxd (cr)
return
badkey:
high eyeLedR_
pause 100
low eyeLedR_
high eyeLedL_
pause 100
low eyeLedL_
return
beep50:
sound VoiceLed_,(50,10)
return
beep150:
sound VoiceLed_,(150,10)
return
EyesOFF:
high eyeLedR_
high eyeLedL_
return
EyesON:
low eyeLedR_
low eyeLedL_
return
IRgetAct_cmnd:
irin iIRin,cmnd 'key1 - key8 => 0-7
if cmnd<8 then _IRgetActEnd
gosub badkey
goto IRgetAct_cmnd 'repeat until valid act
_IRgetActEnd:
gosub beep50
return
nokey:
irin [50,_nokeyend],iIRin,cmnd'irin timeout =>return
goto nokey
_nokeyend:
return
'=================================================================
'Bambino-24
Sertxd("B24",cr) 'report program number @4800
#PicAxe 20M2
#no_data
'PICAXE IC Memory ext I/O Outputs Inputs ADC Memory Starts Polled Resonator
' £ Type pins bytes slot pins Vars. RAM Spad Data Table* Int. def. opt.
'2.28 PICAXE-20M2 20 2k 18 1-16 1-17 4 28 512 256 512 8 Yes 4 -32
'PICAXE-20M2 circuit board with LEDs off takes 1mA
'PICAXE-20M2 circuit board with LEDs off and servos connected takes 10mA
'Bambino-01 'Test eyeLEDs, whiskerLEDs and speaker
'Bambino-02 'Test InfraRed input
'Bambino-02a'Test Eye light values
'Bambino-02b'Test Whisker light values
'Bambino-03 'Play the inbuilt tunes using keys 1 to 4 and beep on 5
'Bambino-04 'Set servos to mid position
'Bambino-05 'Calibrate servo mid positions and put values in EEPROM.
'Bambino-06 'Introduce _iStand:- initialise with feet in mid position
'Bambino-07 'Set rollR
'Bambino-08 'Set rollL
'Bambino-09 'Check rollR, rollL
'Bambino-10 'Introduction of _Stand
'Bambino-11 'Investigate effect of rollspeed; watch roll for all three speeds
'Bambino-12 'Investigate effect of rollspeed; watch Roll and Stand for all three speeds
'Bambino-13 'Check paceFL paceFR; Investigate effect of pacespeed
'Bambino-14 'Check Fd
'Bambino-15 'Test Rt, Lt
'Bambino-15a'Test T2L Turn to Light, T2D Turn to Dark
'Bambino-16 'Test Bk
'Bambino-17 'Creaton of sections ACTIONS, BEHAVIOURS, ACTS;
'Introduction of ACT parameter 'Ado'
'Bambino-17a'Demo routine
'Bambino-18 'Walk Fd with obstacle avoidance using eyes from 02a
'Bambino-18a 'Walk Fd with drop-off avoidance using whiskers values from 02b
'Bambino-18b 'rewritten with autocalibration of down whiskers and reading of whiskers as subroutines
'Bambino-19 'If IR command then do it otherwise walk and avoid
'Bambino-20 'rewrite to incorporate rollC and paceC in EEPROM 254,255
'Bambino-21 'rewrite to clearer code
'Bambino-22 'remember a sequence of keys presses
'Bambino-23 'remember up to 8 sequence of keys presses in RAM
'Bambino-24 'remember up to 8 sequence of key presses in EEPROM
'-----------------------------------------------------------------
'modified
'--------
'DoCmnd:
' select cmnd - eptr
' case <IRkey9 - eptr
' case KEY_BAR - eptr, Act0 now starts at EEPROM0, before it was at RAM32
' case >127 - eptr, Act0 now starts at EEPROM0, before it was at RAM32,
'New
'---
'case [KEY_XCROSS] sertxds EEPROM values as DATA x,x,x,x, to a PC
'symbol eptr
'=================================================================
'[KEY_BAR] enters learn mode
'[KEY_BAR] has to be followed by a number key 1-8
' = the Act to be remembered
'up to 8 Acts can be learned
'learned Acts can call coded Acts
'a learned Act which chains itself repeats forever, eg #1 = Fd,1
'Acts can chain to other Acts, eg Fd,Bk,2 - chain to Act2
'[KEY_POWER] stops the playing Act.
'[KEY_TENT] selects coded Acts = subroutines,
'[KEY_TENT] has to be followed by a number key 1-8
' [key1]=>RockAdo
'coded Acts play until the end.
'
'[KEY_XCROSS] 'Dump EEPROM DATA to PC
'
'When recording an Act,
' after [IRkey1],[IRkey2],[IRkey3],[IRkey4],[IRkey5],[IRkey6],[IRkey7],[IRkey8]
' is used to chain another Act there is no point in recording more moves
' because they will never be replayed since control is transfered to the new Act,
' just press [KEY_POWER] to end recording.
'NOTE do not record more than 30 moves for Act8 otherwise it will overwrite the servo calibration of RollC and PaceC
'=================================================================
'TVR010 PicAxe IR-controller
'---------------------------
'Before use, the transmitter must be programmed with the Sony transmit code.
'1. Insert 2 AAA size batteries, preferably alkaline.
'2. Press S and B at the same time. S is in the centre of the arrows.
' The top left red LED should light.
'3. Press 0. The LED should flash.
'4. Press 1. The LED should flash.
'5. Press 3. The LED should go out.
'6. Press the red power button (top right).
'-------------------------------------------
'IRin cmnds PicAxe controller
'DO NOT PRESS OTHER KEYS
'ie [A] [B] [C] [D] [E] [F] [G]
'They change the Mode and [B] has to be pressed to change back.
'[square] [triangle [()] [L] [X] [backwards F] have no effect
Symbol KEY_POWER = 21 'Sleep
Symbol KEY_UP = 16 'Step Forward
Symbol KEY_DOWN = 17 'Step Backward
Symbol KEY_RIGHT = 18 'Turn Right
Symbol KEY_LEFT = 19 'Turn Left
Symbol KEY_BAR = 96 'learn an Act, next [key] selects a Act
Symbol KEY_TENT = 54 'next [key] selects a Coded-Act
Symbol KEY_VERT_CROSS = 37 'use synonym for easier coding
Symbol KEY_VCROSS = 37
Symbol KEY_DIAG_CROSS = 20 'use synonym for easier coding
Symbol KEY_XCROSS = 20 'transfer EEPROM to PC for including in programs '
'Coded Acts
symbol IRkey1 = 0 ' RockADo
symbol IRkey2 = 1
symbol IRkey3 = 2
symbol IRkey4 = 3
symbol IRkey5 = 4
symbol IRkey6 = 5
symbol IRkey7 = 6
symbol IRkey8 = 7
symbol IRkey9 = 8
Symbol KEY_MINUS = 98
Symbol KEY_0 = 9 'QUIT command mode
Symbol KEY_PLUS = 11
'=================================================================
symbol servopace =c.0 'left connector
symbol servoroll =c.4 'right connector
symbol VoiceLed_ =c.5 'low =>LED on
symbol eyeLedL_ =c.2 'low =>LED on
symbol eyeLedR_ =b.1 'low =>LED on
symbol whiskerLedL_ =c.3 'low =>whisker LED on
symbol whiskerLedR_ =b.3 'low =>whisker LED on
symbol eyeR =c.7
symbol eyeL =c.1
symbol iIRin =c.6
symbol oIRout =b.2
'symbol general =b0
symbol flags =w1
symbol B_flags =b3
'symbol f_doIRcmnds =bit29
symbol f_play =bit28
symbol f_record =bit29
symbol f_direction =bit30 '1=forwards, 0=backwards
symbol f_defaultB =bit31 'defaultBehaviour 1=use default
symbol servosAt =w2
symbol rollat =b4
symbol paceat =b5
symbol ServosTo =w3
symbol rollTo =b6
symbol paceTo =b7
symbol Smoveby =w4
symbol rollby =b8
symbol paceby =b9
symbol Scentre =w5
symbol rollC =b10
symbol paceC =b11
symbol Sspeed =w6
symbol rollspeed =b12 '4 is too fast, 0 won't move
symbol pacespeed =b13 '6 is about max for servos to keep up
symbol counters =w7
symbol spulse =b14
symbol iA =b15
symbol temp =w8
symbol tempLo =b16
symbol tempHi =b17
symbol sframe =22 'time between servo pulses
symbol Ado =b18 'parameter for ACTs
symbol obstacle =b19 '%11 bitmap of obstacles %LeftRight
symbol lightL =b20 'light level Left
symbol lightR =b21 'light level Right
symbol objthresh =70 'light/dark whisker threshold for obstacle
symbol cmnd =b22 'cmnd from IRremote
symbol Act =b23
symbol Aend =b24 'end of record slot
symbol eptr =b25 'pointer to EEPROM
symbol act1 =32
symbol act2 =32 *2
symbol act3 =32 *3
symbol act4 =32 *4
symbol act5 =32 *5
symbol act6 =32 *6
symbol act7 =32 *7
symbol act8 =32 *8
for Act=act1 to act8
poke Act,255 'set stop markers
next Act
'=================================================================
initialise:
rollby =15 '+ve right
paceby =20 '+ve Left foot forward
rollspeed =1 '4 is too fast, 0 won't move
pacespeed =2 '6 is about max for servos to keep up
rollC =150 'Default, 100 is roll to the left
paceC =150 'Default, 100 is left foot back
read 254,temp 'set in prog5
if temp>130 and temp<170 then 'so servo is always between 100,200
rollC =temp
endif
read 255,temp 'set in prog5
if temp>130 and temp<170 then 'so servo is always between 100,200
paceC =temp
endif
sertxd("rollC=",#rollC," paceC=",#paceC,cr)
low eyeLedR_ 'make output LED on
low eyeLedL_ 'make output LED on
gosub _iStand
f_defaultB =1 'defaultBehaviour On
f_record =0
start:
sertxd("S")
Ado =4 'for RockAdo
irin [50,Walkabout],iIRin,cmnd'irin with timeout, no IR =>Walkabout
gosub beep50 'so we know IR received
goto DoCmnd
'=================================================================
'Activities
'----------
IRacty:
sertxd("IR")
irin iIRin,cmnd 'Get cmnd
gosub beep50 'so we know IR received
DoCmnd:
sertxd(cr,#cmnd," @",#eptr)
sertxd(" f_p",#f_play," f_r",#f_record,",")
select cmnd
case KEY_POWER
if f_record=0 and f_play=0 then
gosub rest
gosub EyesON
goto DoCmnd 'have already got IRcmnd in rest:
else
f_play =0
if f_record=1 then
f_record =0
poke eptr,255 'end marker
endif
'gosub dump
endif
case KEY_UP
gosub Fd
case KEY_DOWN
gosub Bk
case KEY_RIGHT
gosub Rt
case KEY_LEFT
gosub Lt
case KEY_0
goto Start 'QUIT
case <IRkey9 'Act keys 1-8 => Acts 0-7
if f_record<>1 then
f_play=1 'play
eptr =32 *cmnd 'set to start
sertxd(" play@",#eptr,cr)
endif
case KEY_BAR
f_play =0
f_record =1
gosub IRgetAct_cmnd
eptr =32 *cmnd
Aend =eptr +31
gosub nokey
sertxd("rec@",#eptr,cr)
goto IRacty 'get cmnds
case KEY_TENT 'coded acts
gosub IRgetAct_cmnd
cmnd =cmnd +128 'set topbit for coded Acts
sertxd(" Act",#cmnd,cr)
goto DoCmnd
case KEY_XCROSS 'Dump DATA to PC
for Act=0 to 7
sertxd(cr,lf,"'Act ",#Act,cr,lf,"DATA ")
for eptr=0 to 30
tempLo =Act *32 +eptr
read tempLo,cmnd
sertxd(#cmnd,",")
next eptr
tempLo =Act *32 +31
read tempLo,cmnd
sertxd(#cmnd)
next Act
sertxd(cr,lf)
case >127
sertxd("case >127",cr)
Act =cmnd -128
on Act gosub RockAdo 'add others
end select
if f_record=1 then
if eptr<Aend then
write eptr,cmnd
eptr =eptr +1
else 'end of slot
gosub beep150
cmnd =KEY_POWER
goto DoCmnd
endif
endif
if f_play=1 then
irin [50,_playon],iIRin,cmnd
goto Start 'if IR received =>break
_playon:
read eptr,cmnd
eptr =eptr +1
if cmnd<>255 then DoCmnd '255=end
f_play =0
endif
goto IRacty 'get IR
'-----------------------------------------
Walkabout:
sertxd("W")
obstacle =0
gosub EyesOFF
EwhiskerR:
readadc c.7,lightR
low eyeLedR_ 'eyeR on
readadc c.7,tempLo
high eyeLedR_ 'eyeR off
if lightR>tempLo then 'why this happens I don't know
tempLo =lightR
endif
tempLo =tempLo -lightR *256 /lightR 'scale
if tempLo<objthresh then EwhiskerL 'ignore
obstacle =obstacle or 1
EwhiskerL:
readadc c.1,lightL 'withLEDoff
low eyeLedL_ 'eyeL on
readadc c.1,tempLo 'withLEDon
high eyeLedL_ 'eyeL off
if lightL>tempLo then 'why this happens I don't know
tempLo =lightL
endif
tempLo =tempLo -lightL *256 /lightL 'scale
if tempLo<objthresh then Walk 'ignore
obstacle =obstacle or %10
Walk:
gosub B_fast
b0 =obstacle 'to use bits
if bit0=0 then
low eyeLedR_
endif
if bit1=0 then
low eyeLedL_
endif
on obstacle gosub Fd,Lt,Rt,Bk
irin [50,Walkabout],iIRin,cmnd 'irin with timeout, no IR =>Walkabout
goto start 'QUIT if IRin
'=================================================================
'Behaviours
'----------
B_fast:
rollspeed =3
pacespeed =6
return
B_turn:
rollspeed =1 'slow so foot doesn't bounce
pacespeed =5
return
'=================================================================
'Acts
'----
RockAdo: '#128
if f_defaultB=1 then gosub B_fast
for iA=1 to Ado
gosub _rollR
gosub _rollL
next iA
gosub Stand
return
FdAdo:
for iA=1 to Ado
gosub Fd
next iA
return
BkAdo:
for iA=1 to Ado
gosub Bk
next iA
return
Rest:
gosub _rollL
gosub _iStand
pwmout eyeLedR_,100,400 'active low so high Dutycycle for dim
pwmout eyeLedL_,100,400 'active low so high Dutycycle for dim
_RestIRwait:
high VoiceLed_
irin iIRin,cmnd 'irin with no timeout
gosub beep50 'so we know IR received
if cmnd=KEY_POWER then _RestIRwait 'wait until different IRcmnd
pwmout eyeLedR_,off
pwmout eyeLedL_,off
return
'=================================================================
'Actions
'-------
Fd:
sertxd ("Fd")
f_direction =1
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _FdL 'else _FdL
_FdR:
'sertxd ("_FdR")
gosub _rollL
gosub _RF
gosub Stand
return
_FdL:
'sertxd ("_FdL")
gosub _rollR
gosub _LF
gosub Stand
return
'-----------------------------------------
Bk:
sertxd ("Bk")
f_direction =0
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _BkR 'else _BkL
_BkL:
gosub _rollR
gosub _RF
gosub Stand
return
_BkR:
gosub _rollL
gosub _LF
gosub Stand
return
'-----------------------------------------
Rt:
sertxd ("Rt")
if paceat<paceC and f_direction=1 then gosub Fd 'need left foot forward
if paceat<paceC and f_direction=0 then gosub Bk 'need left foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _RF
return
'-----------------------------------------
Lt:
sertxd ("Lt")
if paceat>paceC and f_direction=1 then gosub Fd 'need right foot forward
if paceat>paceC and f_direction=0 then gosub Bk 'need right foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _LF
return
'=================================================================
_RF:
'sertxd ("_RF")
paceto =paceC -paceby
for spulse=paceat to paceto step -pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
_LF:
'sertxd ("_LF")
paceto =paceC +paceby
for spulse=paceat to paceto step pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
'-----------------------------------------
Stand: 'stand with both feet flat
'sertxd (" Sd")
if rollat<rollC then _StandR 'else _StandL
_StandL:
'sertxd ("_SL")
for spulse=rollat to rollC step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_StandR:
'sertxd ("_SR")
for spulse=rollat to rollC step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_rollL:
'sertxd ("_rL")
rollto =rollC -rollby
for spulse=rollat to rollto step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_rollR:
'sertxd ("_rR")
rollto =rollC +rollby
for Spulse=rollat to rollto step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_iStand:
'initialise with feet in mid position
for spulse=0 to 10
pulsout servopace,paceC 'pulse servo paceC
pulsout servoroll,rollC 'pulse servo rollC
pause 70 'pause 70ms - do it slowly
next spulse
rollat =rollC
paceat =paceC
return
'-----------------------------------------
badkey:
high eyeLedR_
pause 100
low eyeLedR_
high eyeLedL_
pause 100
low eyeLedL_
return
beep50:
sound VoiceLed_,(50,10)
return
beep150:
sound VoiceLed_,(150,10)
return
EyesOFF:
high eyeLedR_
high eyeLedL_
return
EyesON:
low eyeLedR_
low eyeLedL_
return
IRgetAct_cmnd:
irin iIRin,cmnd 'key1 - key8 => 0-7
if cmnd<8 then _IRgetActEnd
gosub badkey
goto IRgetAct_cmnd 'repeat until valid act
_IRgetActEnd:
gosub beep50
return
nokey:
irin [50,_nokeyend],iIRin,cmnd 'irin timeout =>return
goto nokey
_nokeyend:
return
'=================================================================
'Bambino-25
Sertxd("B25",cr) 'report program number @4800
#PicAxe 20M2
#no_data
'PICAXE IC Memory ext I/O Outputs Inputs ADC Memory Starts Polled Resonator
' £ Type pins bytes slot pins Vars. RAM Spad Data Table* Int. def. opt.
'2.28 PICAXE-20M2 20 2k 18 1-16 1-17 4 28 512 256 512 8 Yes 4 -32
'PICAXE-20M2 circuit board with LEDs off takes 1mA
'PICAXE-20M2 circuit board with LEDs off and servos connected takes 10mA
'Bambino-01 'Test eyeLEDs, whiskerLEDs and speaker
'Bambino-02 'Test InfraRed input
'Bambino-02a'Test Eye light values
'Bambino-02b'Test Whisker light values
'Bambino-03 'Play the inbuilt tunes using keys 1 to 4 and beep on 5
'Bambino-04 'Set servos to mid position
'Bambino-05 'Calibrate servo mid positions and put values in EEPROM.
'Bambino-06 'Introduce _iStand:- initialise with feet in mid position
'Bambino-07 'Set rollR
'Bambino-08 'Set rollL
'Bambino-09 'Check rollR, rollL
'Bambino-10 'Introduction of _Stand
'Bambino-11 'Investigate effect of rollspeed; watch roll for all three speeds
'Bambino-12 'Investigate effect of rollspeed; watch Roll and Stand for all three speeds
'Bambino-13 'Check paceFL paceFR; Investigate effect of pacespeed
'Bambino-14 'Check Fd
'Bambino-15 'Test Rt, Lt
'Bambino-15a'Test T2L Turn to Light, T2D Turn to Dark
'Bambino-16 'Test Bk
'Bambino-17 'Creaton of sections ACTIONS, BEHAVIOURS, ACTS;
'Introduction of ACT parameter 'Ado'
'Bambino-17a'Demo routine
'Bambino-18 'Walk Fd with obstacle avoidance using eyes from 02a
'Bambino-18a 'Walk Fd with drop-off avoidance using whiskers values from 02b
'Bambino-18b 'rewritten with autocalibration of down whiskers and reading of whiskers as subroutines
'Bambino-19 'If IR command then do it otherwise walk and avoid
'Bambino-20 'rewrite to incorporate rollC and paceC in EEPROM 254,255
'Bambino-21 'rewrite to clearer code
'Bambino-22 'remember a sequence of keys presses
'Bambino-23 'remember up to 8 sequence of keys presses in RAM
'Bambino-24 'remember up to 8 sequence of keys presses in EEPROM
'Bambino-25 'obstacle map made deeper and put in RAM for better obstacle avoidance
'-----------------------------------------------------------------
'modified
'--------
'Walk: on obstacle gosub Fd,Lt,Rt,Bk etc
'moved to Walkabout:
'EwhiskerR:
'EwhiskerL:
'New
'---
'Qwalk 'Query, walk
'symbol obstacleR =32 'RAM obstacle memory
'symbol obstacleL =33 'RAM obstacle memory
'symbol obs =4 'increment for obstacle
'=================================================================
'[KEY_BAR] enters learn mode
'[KEY_BAR] has to be followed by a number key 1-8
' = the Act to be remembered
'up to 8 Acts can be learned
'learned Acts can call coded Acts
'a learned Act which chains itself repeats forever, eg #1 = Fd,1
'Acts can chain to other Acts, eg Fd,Bk,2 - chain to Act2
'[KEY_POWER] stops the playing Act.
'[KEY_TENT] selects coded Acts = subroutines,
'[KEY_TENT] has to be followed by a number key 1-8
' [key1]=>RockAdo
'coded Acts play until the end.
'
'[KEY_XCROSS] 'Dump EEPROM DATA to PC
'When recording an Act,
' after [IRkey1],[IRkey2],[IRkey3],[IRkey4],[IRkey5],[IRkey6],[IRkey7],[IRkey8]
' is used to chain another Act there is no point in recording more moves
' because they will never be replayed since control is transfered to the new Act,
' just press [KEY_POWER] to end recording.
'NOTE do not record more than 30 moves for Act8 otherwise it will overwrite the servo calibration of RollC and PaceC
'=================================================================
'TVR010 PicAxe IR-controller
'---------------------------
'Before use, the transmitter must be programmed with the Sony transmit code.
'1. Insert 2 AAA size batteries, preferably alkaline.
'2. Press S and B at the same time. S is in the centre of the arrows.
' The top left red LED should light.
'3. Press 0. The LED should flash.
'4. Press 1. The LED should flash.
'5. Press 3. The LED should go out.
'6. Press the red power button (top right).
'-------------------------------------------
'IRin cmnds PicAxe controller
'DO NOT PRESS OTHER KEYS
'ie [A] [B] [C] [D] [E] [F] [G]
'They change the Mode and [B] has to be pressed to change back.
'[square] [triangle [()] [L] [X] [backwards F] have no effect
Symbol KEY_POWER = 21 'Sleep
Symbol KEY_UP = 16 'Step Forward
Symbol KEY_DOWN = 17 'Step Backward
Symbol KEY_RIGHT = 18 'Turn Right
Symbol KEY_LEFT = 19 'Turn Left
Symbol KEY_BAR = 96 'learn an Act, next [key] selects a Act
Symbol KEY_TENT = 54 'next [key] selects a Coded-Act
Symbol KEY_VERT_CROSS = 37 'use synonym for easier coding
Symbol KEY_VCROSS = 37
Symbol KEY_DIAG_CROSS = 20 'use synonym for easier coding
Symbol KEY_XCROSS = 20 'transfer EEPROM to PC for including in programs '
'Coded Acts
symbol IRkey1 = 0 ' RockADo
symbol IRkey2 = 1
symbol IRkey3 = 2
symbol IRkey4 = 3
symbol IRkey5 = 4
symbol IRkey6 = 5
symbol IRkey7 = 6
symbol IRkey8 = 7
symbol IRkey9 = 8
Symbol KEY_MINUS = 98
Symbol KEY_0 = 9 'QUIT command mode
Symbol KEY_PLUS = 11
'=================================================================
symbol servopace =c.0 'left connector
symbol servoroll =c.4 'right connector
symbol VoiceLed_ =c.5 'low =>LED on
symbol eyeLedL_ =c.2 'low =>LED on
symbol eyeLedR_ =b.1 'low =>LED on
symbol whiskerLedL_ =c.3 'low =>whisker LED on
symbol whiskerLedR_ =b.3 'low =>whisker LED on
symbol eyeR =c.7
symbol eyeL =c.1
symbol iIRin =c.6
symbol oIRout =b.2
'symbol general =b0
symbol flags =w1
symbol B_flags =b3
'symbol f_doIRcmnds =bit29
symbol f_play =bit28
symbol f_record =bit29
symbol f_direction =bit30 '1=forwards, 0=backwards
symbol f_defaultB =bit31 'defaultBehaviour 1=use default
symbol servosAt =w2
symbol rollat =b4
symbol paceat =b5
symbol ServosTo =w3
symbol rollTo =b6
symbol paceTo =b7
symbol Smoveby =w4
symbol rollby =b8
symbol paceby =b9
symbol Scentre =w5
symbol rollC =b10
symbol paceC =b11
symbol Sspeed =w6
symbol rollspeed =b12 '4 is too fast, 0 won't move
symbol pacespeed =b13 '6 is about max for servos to keep up
symbol counters =w7
symbol spulse =b14
symbol iA =b15
symbol temp =w8
symbol tempLo =b16
symbol tempHi =b17
symbol sframe =22 'time between servo pulses
symbol Ado =b18 'parameter for ACTs
symbol obsmap =b19 '%11 bitmap of obstacles %LeftRight
symbol lightL =b20 'light level Left
symbol lightR =b21 'light level Right
symbol objthresh =70 'light/dark whisker threshold for obstacle
symbol cmnd =b22 'cmnd from IRremote
symbol Act =b23
symbol Aend =b24 'end of record slot
symbol eptr =b25 'pointer to EEPROM
symbol EEholedetectR =252
symbol EEholedetectL =253
symbol EErollC =254
symbol EEpaceC =255
'EEPROM Acts
symbol act0 =0
symbol act1 =32
symbol act2 =32 *2
symbol act3 =32 *3
symbol act4 =32 *4
symbol act5 =32 *5
symbol act6 =32 *6
symbol act7 =32 *7
symbol act8 =32 *8
'for Act=act1 to act8
' poke Act,255 'set stop markers
' next Act
symbol obstaclesR =32 'RAM
symbol obstaclesL =33 'RAM
symbol obs =6'8 'increment for obstacle
'=================================================================
initialise:
rollby =15 '+ve right
paceby =20 '+ve Left foot forward
rollspeed =1 '4 is too fast, 0 won't move
pacespeed =2 '6 is about max for servos to keep up
rollC =150 'Default, 100 is roll to the left
paceC =150 'Default, 100 is left foot back
read EErollC,temp 'set in prog5
if temp>130 and temp<170 then 'so servo is always between 100,200
rollC =temp
endif
read EEpaceC,temp 'set in prog5
if temp>130 and temp<170 then 'so servo is always between 100,200
paceC =temp
endif
sertxd("rollC=",#rollC," paceC=",#paceC,cr)
low eyeLedR_ 'make output LED on
low eyeLedL_ 'make output LED on
gosub _iStand
f_defaultB =1 'defaultBehaviour On
f_record =0
start:
sertxd("S")
Ado =4 'for RockAdo
irin [50,Walkabout],iIRin,cmnd'irin with timeout, no IR =>Walkabout
gosub beep50 'so we know IR received
goto DoCmnd
'=================================================================
'Activities
'----------
IRacty:
sertxd("IR")
irin iIRin,cmnd 'Get cmnd
gosub beep50 'so we know IR received
DoCmnd:
sertxd(cr,#cmnd," @",#eptr)
sertxd(" f_p",#f_play," f_r",#f_record,",")
select cmnd
case KEY_POWER
if f_record=0 and f_play=0 then
gosub rest
gosub EyesON
goto DoCmnd 'have already got IRcmnd in rest:
else
f_play =0
if f_record=1 then
f_record =0
poke eptr,255 'end marker
endif
endif
case KEY_UP
gosub Fd
case KEY_DOWN
gosub Bk
case KEY_RIGHT
gosub Rt
case KEY_LEFT
gosub Lt
case KEY_0
goto Start 'QUIT and Wander
case <IRkey9 'Act keys 1-8 => Acts 0-7
if f_record<>1 then
f_play=1 'play
eptr =32 *cmnd 'set to start
sertxd(" play@",#eptr,cr)
endif
case KEY_BAR 'record
f_play =0
f_record =1
gosub IRgetAct_cmnd
eptr =32 *cmnd
Aend =eptr +31
gosub nokey
sertxd("rec@",#eptr,cr)
goto IRacty 'get cmnds
case KEY_TENT 'coded acts
gosub IRgetAct_cmnd
cmnd =cmnd +128 'set topbit for coded Acts
sertxd(" Act",#cmnd,cr)
goto DoCmnd
case KEY_XCROSS 'Dump DATA to PC
for Act=0 to 7
sertxd(cr,lf,"'Act ",#Act,cr,lf,"DATA ")
for eptr=0 to 30
tempLo =Act *32 +eptr
read tempLo,cmnd
sertxd(#cmnd,",")
next eptr
tempLo =Act *32 +31
read tempLo,cmnd
sertxd(#cmnd)
next Act
sertxd(cr,lf)
case >127 'do Coded Act subroutines
sertxd("case >127",cr)
Act =cmnd -128
on Act gosub RockAdo 'add others
end select
'_record
if f_record=1 then
if eptr<Aend then
write eptr,cmnd
eptr =eptr +1
else 'end of slot
gosub beep150
cmnd =KEY_POWER
goto DoCmnd
endif
endif
'_play:
if f_play=1 then
irin [50,_playon],iIRin,cmnd
goto Start 'if IR received =>break
_playon:
read eptr,cmnd
eptr =eptr +1
if cmnd<>255 then DoCmnd '255=end
f_play =0
endif
goto IRacty 'get IR
'-----------------------------------------
Walkabout:
sertxd("W")
peek obstaclesR,tempLo 'read memory
peek obstaclesL,tempHi 'read memory
tempLo =tempLo min 1 -1 'decay memory
tempHi =tempHi min 1 -1 'decay memory
if tempLo>0 then 'create short term memory map
obsmap =obsmap or %1
endif
if tempHi>0 then
obsmap =obsmap or %10
endif
poke obstaclesR,tempLo 'save
poke obstaclesL,tempHi 'save
sertxd ("mem",#tempHi," ",#tempLo,cr)
gosub B_fast
'alter LEDs so we can tell what Bambino is doing
b0 =obsmap 'to use bits
if bit0=0 then
low eyeLedR_
endif
if bit1=0 then
low eyeLedL_
endif
'take avoiding action if necessary
on obsmap gosub Fd,Lt,Rt,Bk
obsmap =0
gosub EyesOFF
EwhiskerR:
readadc c.7,lightR
low eyeLedR_ 'eyeR on
readadc c.7,tempLo
high eyeLedR_ 'eyeR off
if lightR>tempLo then 'why this happens I don't know
tempLo =lightR
endif
tempLo =tempLo -lightR *256 /tempLo 'scale
sertxd("eR",#tempLo)
if tempLo<objthresh then EwhiskerL 'ignore
'now do memory
peek obstaclesR,tempLo
tempLo =tempLo +obs max obs
poke obstaclesR,tempLo 'update memory
EwhiskerL:
readadc c.1,lightL 'withLEDoff
low eyeLedL_ 'eyeL on
readadc c.1,tempHi 'withLEDon
high eyeLedL_ 'eyeL off
if lightL>tempHi then 'why this happens I don't know
tempHi =lightL
endif
tempHi =tempHi -lightL *256 /tempHi 'scale
sertxd("eL",#tempHi,cr)
if tempHi<objthresh then Qwalk 'ignore
'now do memory
peek obstaclesL,tempHi
tempHi =tempHi +obs max obs
poke obstaclesL,tempHi 'update memory
Qwalk:
irin [50,Walkabout],iIRin,cmnd 'irin with timeout, no IR =>Walkabout
goto start 'QUIT if IRin
'=================================================================
'Behaviours
'----------
B_fast:
rollspeed =3
pacespeed =6
return
B_turn:
rollspeed =1 'slow so foot doesn't bounce
pacespeed =5
return
'=================================================================
'Acts
'----
RockAdo: '#128
if f_defaultB=1 then gosub B_fast
for iA=1 to Ado
gosub _rollR
gosub _rollL
next iA
gosub Stand
return
FdAdo:
for iA=1 to Ado
gosub Fd
next iA
return
BkAdo:
for iA=1 to Ado
gosub Bk
next iA
return
Rest:
gosub _rollL
gosub _iStand
pwmout eyeLedR_,100,400 'active low so high Dutycycle for dim
pwmout eyeLedL_,100,400 'active low so high Dutycycle for dim
_RestIRwait:
high VoiceLed_
irin iIRin,cmnd 'irin with no timeout
gosub beep50 'so we know IR received
if cmnd=KEY_POWER then _RestIRwait 'wait until different IRcmnd
pwmout eyeLedR_,off
pwmout eyeLedL_,off
return
'=================================================================
'Actions
'-------
Fd:
sertxd ("Fd")
f_direction =1
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _FdL 'else _FdL
_FdR:
'sertxd ("_FdR")
gosub _rollL
gosub _RF
gosub Stand
return
_FdL:
'sertxd ("_FdL")
gosub _rollR
gosub _LF
gosub Stand
return
'-----------------------------------------
Bk:
sertxd ("Bk")
f_direction =0
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _BkR 'else _BkL
_BkL:
gosub _rollR
gosub _RF
gosub Stand
return
_BkR:
gosub _rollL
gosub _LF
gosub Stand
return
'-----------------------------------------
Rt:
sertxd ("Rt")
if paceat<paceC and f_direction=1 then gosub Fd 'need left foot forward
if paceat<paceC and f_direction=0 then gosub Bk 'need left foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _RF
return
'-----------------------------------------
Lt:
sertxd ("Lt")
if paceat>paceC and f_direction=1 then gosub Fd 'need right foot forward
if paceat>paceC and f_direction=0 then gosub Bk 'need right foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _LF
return
'=================================================================
_RF:
'sertxd ("_RF")
paceto =paceC -paceby
for spulse=paceat to paceto step -pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
_LF:
'sertxd ("_LF")
paceto =paceC +paceby
for spulse=paceat to paceto step pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
'-----------------------------------------
Stand: 'stand with both feet flat
'sertxd (" Sd")
if rollat<rollC then _StandR 'else _StandL
_StandL:
'sertxd ("_SL")
for spulse=rollat to rollC step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_StandR:
'sertxd ("_SR")
for spulse=rollat to rollC step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_rollL:
'sertxd ("_rL")
rollto =rollC -rollby
for spulse=rollat to rollto step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_rollR:
'sertxd ("_rR")
rollto =rollC +rollby
for Spulse=rollat to rollto step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_iStand:
'initialise with feet in mid position
for spulse=0 to 10
pulsout servopace,paceC 'pulse servo paceC
pulsout servoroll,rollC 'pulse servo rollC
pause 70 'pause 70ms - do it slowly
next spulse
rollat =rollC
paceat =paceC
return
'-----------------------------------------
badkey:
high eyeLedR_
pause 100
low eyeLedR_
high eyeLedL_
pause 100
low eyeLedL_
return
beep50:
sound VoiceLed_,(50,10)
return
beep150:
sound VoiceLed_,(150,10)
return
EyesOFF:
high eyeLedR_
high eyeLedL_
return
EyesON:
low eyeLedR_
low eyeLedL_
return
IRgetAct_cmnd:
irin iIRin,cmnd 'key1 - key8 => 0-7
if cmnd<8 then _IRgetActEnd
gosub badkey
goto IRgetAct_cmnd 'repeat until valid act
_IRgetActEnd:
gosub beep50
return
nokey:
irin [50,_nokeyend],iIRin,cmnd 'irin timeout =>reurn
goto nokey
_nokeyend:
return
'=================================================================
'Bambino-26
Sertxd("B26",cr) 'report program number @4800
#PicAxe 20M2
#no_data
'1573 bytes used
'PICAXE IC Memory ext I/O Outputs Inputs ADC Memory Starts Polled Resonator
' £ Type pins bytes slot pins Vars. RAM Spad Data Table* Int. def. opt.
'2.28 PICAXE-20M2 20 2k 18 1-16 1-17 4 28 512 256 512 8 Yes 4 -32
'PICAXE-20M2 circuit board with LEDs off takes 1mA
'PICAXE-20M2 circuit board with LEDs off and servos connected takes 10mA
'Bambino-01 'Test eyeLEDs, whiskerLEDs and speaker
'Bambino-02 'Test InfraRed input
'Bambino-02a 'Test Eye light values
'Bambino-02b 'Test Whisker light values
'Bambino-03 'Play the inbuilt tunes using keys 1 to 4 and beep on 5
'Bambino-04 'Set servos to mid position
'Bambino-05 'Calibrate servo mid positions and put values in EEPROM.
'Bambino-06 'Introduce _iStand:- initialise with feet in mid position
'Bambino-07 'Set rollR
'Bambino-08 'Set rollL
'Bambino-09 'Check rollR, rollL
'Bambino-10 'Introduction of _Stand
'Bambino-11 'Investigate effect of rollspeed; watch roll for all three speeds
'Bambino-12 'Investigate effect of rollspeed; watch Roll and Stand for all three speeds
'Bambino-13 'Check paceFL paceFR; Investigate effect of pacespeed
'Bambino-14 'Check Fd
'Bambino-15 'Test Rt, Lt
'Bambino-15a 'Test T2L Turn to Light, T2D Turn to Dark
'Bambino-16 'Test Bk
'Bambino-17 'Creaton of sections ACTIONS, BEHAVIOURS, ACTS;
'Introduction of ACT parameter 'Ado'
'Bambino-17a 'Demo routine
'Bambino-18 'Walk Fd with obstacle avoidance using eyes from 02a
'Bambino-18a 'Walk Fd with drop-off avoidance using whiskers values from 02b
'Bambino-18b 'rewritten with autocalibration of down whiskers and reading of whiskers as subroutines
'Bambino-19 'If IR command then do it otherwise walk and avoid
'Bambino-20 'rewrite to incorporate rollC and paceC in EEPROM 254,255
'Bambino-21 'rewrite to clearer code
'Bambino-22 'remember a sequence of keys presses
'Bambino-23 'remember up to 8 sequence of keys presses in RAM
'Bambino-24 'remember up to 8 sequence of keys presses in EEPROM
'Bambino-25 'obstacle map made deeper and put in RAM for better obstacle avoidance
'Bambino-26 'incorporate drop-off avoidance from 18b
'-----------------------------------------------------------------
'modified
'--------
'Walkabout:
'obs changed to mobs 'memory increment for obstacle
'QEwhiskerL:
'QEwhiskerR:
'
'New
'---
'tempHi_wL
'tempLo_wR
'mob 'memory increment for obstacle
'mobs 'memory max for obstacle
'mhole 'memory increment for hole
'mholes 'memory max for hole
'QGwhiskerL: Query Ground whisker Left
'QGwhiskerR: Query Ground whisker Right
'whiskerL renamed GwhiskerL for Ground whisker Left
'whiskerR renamed GwhiskerR for Ground whisker Right
'=================================================================
'[KEY_BAR] enters learn mode
'[KEY_BAR] has to be followed by a number key 1-8
' = the Act to be remembered
'up to 8 Acts can be learned
'learned Acts can call coded Acts
'a learned Act which chains itself repeats forever, eg #1 = Fd,1
'Acts can chain to other Acts, eg Fd,Bk,2 - chain to Act2
'[KEY_POWER] stops the playing Act.
'[KEY_TENT] selects coded Acts = subroutines,
'[KEY_TENT] has to be followed by a number key 1-8
' [key1]=>RockAdo
'coded Acts play until the end.
'
'[KEY_XCROSS] 'Dump EEPROM DATA to PC
'When recording an Act,
' after [IRkey1],[IRkey2],[IRkey3],[IRkey4],[IRkey5],[IRkey6],[IRkey7],[IRkey8]
' is used to chain another Act there is no point in recording more moves
' because they will never be replayed since control is transfered to the new Act,
' just press [KEY_POWER] to end recording.
'NOTE do not record more than 30 moves for Act8 otherwise it will overwrite the servo calibration of RollC and PaceC
'=================================================================
'TVR010 PicAxe IR-controller
'---------------------------
'Before use, the transmitter must be programmed with the Sony transmit code.
'1. Insert 2 AAA size batteries, preferably alkaline.
'2. Press S and B at the same time. S is in the centre of the arrows.
' The top left red LED should light.
'3. Press 0. The LED should flash.
'4. Press 1. The LED should flash.
'5. Press 3. The LED should go out.
'6. Press the red power button (top right).
'-------------------------------------------
'IRin cmnds PicAxe controller
'DO NOT PRESS OTHER KEYS
'ie [A] [B] [C] [D] [E] [F] [G]
'They change the Mode and [B] has to be pressed to change back.
'[square] [triangle [()] [L] [X] [backwards F] have no effect
Symbol KEY_POWER = 21 'Sleep
Symbol KEY_UP = 16 'Step Forward
Symbol KEY_DOWN = 17 'Step Backward
Symbol KEY_RIGHT = 18 'Turn Right
Symbol KEY_LEFT = 19 'Turn Left
Symbol KEY_BAR = 96 'learn an Act, next [key] selects a Act
Symbol KEY_TENT = 54 'next [key] selects a Coded-Act
Symbol KEY_VERT_CROSS = 37 'use synonym for easier coding
Symbol KEY_VCROSS = 37
Symbol KEY_DIAG_CROSS = 20 'use synonym for easier coding
Symbol KEY_XCROSS = 20 'transfer EEPROM to PC for including in programs '
'Coded Acts
symbol IRkey1 = 0 ' RockADo
symbol IRkey2 = 1
symbol IRkey3 = 2
symbol IRkey4 = 3
symbol IRkey5 = 4
symbol IRkey6 = 5
symbol IRkey7 = 6
symbol IRkey8 = 7
symbol IRkey9 = 8
Symbol KEY_MINUS = 98
Symbol KEY_0 = 9 'QUIT command mode
Symbol KEY_PLUS = 11
'=================================================================
symbol servopace =c.0 'left connector
symbol servoroll =c.4 'right connector
symbol VoiceLed_ =c.5 'low =>LED on
symbol eyeLedL_ =c.2 'low =>LED on
symbol eyeLedR_ =b.1 'low =>LED on
symbol eyeR =c.7
symbol eyeL =c.1
symbol GwhiskerLedL_=c.3 'low =>whisker LED on
symbol GwhiskerLedR_=b.3 'low =>whisker LED on
symbol GwhiskerL =b.6 'adc whisker Down Left
symbol GwhiskerR =b.0 'adc whisker Down Right
symbol iIRin =c.6
symbol oIRout =b.2
symbol general =b0
symbol temp0 =b0
symbol flags =w1
symbol B_flags =b3
'symbol f_doIRcmnds =bit29
symbol f_play =bit28
symbol f_record =bit29
symbol f_direction =bit30 '1=forwards, 0=backwards
symbol f_defaultB =bit31 'defaultBehaviour 1=use default
symbol servosAt =w2
symbol rollat =b4
symbol paceat =b5
symbol ServosTo =w3
symbol rollTo =b6
symbol paceTo =b7
symbol Smoveby =w4
symbol rollby =b8
symbol paceby =b9
symbol Scentre =w5
symbol rollC =b10
symbol paceC =b11
symbol Sspeed =w6
symbol rollspeed =b12 '4 is too fast, 0 won't move
symbol pacespeed =b13 '6 is about max for servos to keep up
symbol counters =w7
symbol spulse =b14
symbol iA =b15
symbol i =b15 'calibrateholewhiskers:
symbol tempw =w8
symbol tempLo =b16
symbol tempLo_wR =b16 'whisker Right
symbol tempLo_wRg =b16 'whisker Right Ground
symbol tempHi =b17
symbol tempHi_wL =b17 'whisker Left
symbol tempHi_wLg =b17 'whisker Left Ground
symbol sframe =22 'time between servo pulses
symbol Ado =b18 'parameter for ACTs
symbol obsmap =b19 '%11 bitmap of obstacles %LeftRight
symbol lightL =b20 'light level Left
symbol lightR =b21 'light level Right
symbol objthresh =70 'light/dark whisker threshold for obstacle
symbol cmnd =b22 'cmnd from IRremote
symbol Act =b23
symbol Aend =b24 'end of record slot
symbol eptr =b25 'pointer to EEPROM
'depending on the sensors obsdetectL and obsdetectR may need to be different
symbol obsdetectL =120 'scaled light level difference for obstacle
symbol obsdetectR =120 'scaled light level difference for obstacle
'if set in Program#18a then those values will be used, otherwise these values
'depending on the sensors holedetectL and holedetectR may need to be different
'default if not set in prog #18a, values so Bambino can see table edges
symbol holedetectL=120 'scaled light level difference for holes
symbol holedetectR=120 'scaled light level difference for holes
symbol EEholedetectR =252
symbol EEholedetectL =253
symbol EErollC =254
symbol EEpaceC =255
'EEPROM Acts
symbol act0 =0
symbol act1 =32
symbol act2 =32 *2
symbol act3 =32 *3
symbol act4 =32 *4
symbol act5 =32 *5
symbol act6 =32 *6
symbol act7 =32 *7
symbol act8 =32 *8
'for Act=act1 to act8
' poke Act,255 'set stop markers
' next Act
symbol obstaclesR =32 'RAM
symbol obstaclesL =33 'RAM
symbol mob =6'8 'memory increment for obstacle
symbol mobs =8 'memory increment for obstacle
symbol mhole =4 'memory increment for hole
symbol mholes =8 'memory max for hole
'=================================================================
initialise:
rollby =15 '+ve right
paceby =20 '+ve Left foot forward
rollspeed =1 '4 is too fast, 0 won't move
pacespeed =2 '6 is about max for servos to keep up
rollC =150 'Default, 100 is roll to the left
paceC =150 'Default, 100 is left foot back
'get values from EEPROM if set by program #5
read EErollC,temp0
if temp0>130 and temp0<170 then 'so servo is always between 100,200
rollC =temp0
endif
read EEpaceC,temp0
if temp0>130 and temp0<170 then 'so servo is always between 100,200
paceC =temp0
endif
sertxd("rollC=",#rollC," paceC=",#paceC,cr)
' 'get hole detect values from EEPROM if set by program #18a
' read EEholedetectL,temp0
' if temp0=255 then
' write EEholedetectL,holedetectL
' endif
' read EEholedetectR,temp0
' if temp0=255 then
' write EEholedetectR,holedetectR
' endif
gosub calibrateholewhiskers
low eyeLedR_ 'make output LED on
low eyeLedL_ 'make output LED on
gosub _iStand
f_defaultB =1 'defaultBehaviour On
f_record =0
start:
sertxd("S")
Ado =4 'for RockAdo
irin [50,Walkabout],iIRin,cmnd'irin with timeout, no IR =>Walkabout
gosub beep50 'so we know IR received
goto DoCmnd
'=================================================================
'Activities
'----------
IRacty:
sertxd("IR")
irin iIRin,cmnd 'Get cmnd
gosub beep50 'so we know IR received
DoCmnd:
sertxd(cr,#cmnd," @",#eptr)
sertxd(" f_p",#f_play," f_r",#f_record,",")
select cmnd
case KEY_POWER
if f_record=0 and f_play=0 then
gosub rest
goto DoCmnd 'have already got IRcmnd in rest:
else
f_play =0
if f_record=1 then
f_record =0
poke eptr,255 'end marker
endif
endif
case KEY_UP
gosub Fd
case KEY_DOWN
gosub Bk
case KEY_RIGHT
gosub Rt
case KEY_LEFT
gosub Lt
case KEY_0
goto Start 'QUIT and Wander
case <IRkey9 'Act keys 1-8 => Acts 0-7
if f_record<>1 then
f_play=1 'play
eptr =32 *cmnd 'set to start
sertxd(" play@",#eptr,cr)
endif
case KEY_BAR 'record
f_play =0
f_record =1
gosub IRgetAct_cmnd
eptr =32 *cmnd
Aend =eptr +31
gosub nokey
sertxd("rec@",#eptr,cr)
goto IRacty 'get cmnds
case KEY_TENT 'coded acts
gosub IRgetAct_cmnd
cmnd =cmnd +128 'set topbit for coded Acts
sertxd(" Act",#cmnd,cr)
goto DoCmnd
case KEY_XCROSS 'Dump DATA to PC
for Act=0 to 7
sertxd(cr,lf,"'Act ",#Act,cr,lf,"DATA ")
for eptr=0 to 30
tempLo =Act *32 +eptr
read tempLo,cmnd
sertxd(#cmnd,",")
next eptr
tempLo =Act *32 +31
read tempLo,cmnd
sertxd(#cmnd)
next Act
sertxd(cr,lf)
case >127 'do Coded Act subroutines
sertxd("case >127",cr)
Act =cmnd -128
on Act gosub RockAdo 'add others
end select
'_record
if f_record=1 then
if eptr<Aend then
write eptr,cmnd
eptr =eptr +1
else 'end of slot
gosub beep150
cmnd =KEY_POWER
goto DoCmnd
endif
endif
'_play:
if f_play=1 then
irin [50,_playon],iIRin,cmnd
goto Start 'if IR received =>break
_playon:
read eptr,cmnd
eptr =eptr +1
if cmnd<>255 then DoCmnd '255=end
f_play =0
endif
goto IRacty 'get IR
'-----------------------------------------
Walkabout:
sertxd(cr,"W")
peek obstaclesR,tempLo 'read memory
peek obstaclesL,tempHi 'read memory
tempLo =tempLo min 1 -1 'decay memory
tempHi =tempHi min 1 -1 'decay memory
poke obstaclesR,tempLo 'save
poke obstaclesL,tempHi 'save
sertxd ("mem",#tempHi," ",#tempLo," ")
obsmap =0
if tempLo>0 then 'create short term memory map
obsmap =obsmap or %1
endif
if tempHi>0 then
obsmap =obsmap or %10
endif
gosub B_fast
'alter LEDs so we can tell what Bambino is doing
b0 =obsmap 'to use bits
if bit0=0 then
' low eyeLedR_
pwmout eyeLedR_,110,400 'active low so high Dutycycle for dim
endif
if bit1=0 then
' low eyeLedL_
pwmout eyeLedL_,110,400 'active low so high Dutycycle for dim
endif
'take avoiding action if necessary
on obsmap gosub Fd,Lt,Rt,Bk
'otherwise fall through and test whiskers
pwmout eyeLedR_,off
pwmout eyeLedL_,off
' gosub EyesOFF
gosub QEwhiskerL
gosub QEwhiskerR
gosub QGwhiskerL
gosub QGwhiskerR
Qwalk:
irin [50,Walkabout],iIRin,cmnd 'irin with timeout, no IR =>Walkabout
goto start 'QUIT if IRin
'=================================================================
'Behaviours
'----------
B_fast:
rollspeed =3
pacespeed =6
return
B_turn:
rollspeed =1 'slow so foot doesn't bounce
pacespeed =5
return
'=================================================================
'Acts
'----
RockAdo: '#128
if f_defaultB=1 then gosub B_fast
for iA=1 to Ado
gosub _rollR
gosub _rollL
next iA
gosub Stand
return
FdAdo:
for iA=1 to Ado
gosub Fd
next iA
return
BkAdo:
for iA=1 to Ado
gosub Bk
next iA
return
Rest:
gosub _rollL
gosub _iStand
pwmout eyeLedR_,100,400 'active low so high Dutycycle for dim
pwmout eyeLedL_,100,400 'active low so high Dutycycle for dim
_RestIRwait:
high VoiceLed_
irin iIRin,cmnd 'irin with no timeout
gosub beep50 'so we know IR received
if cmnd=KEY_POWER then _RestIRwait 'wait until different IRcmnd
pwmout eyeLedR_,off
pwmout eyeLedL_,off
gosub EyesOFF
return
'=================================================================
'Actions
'-------
Fd:
sertxd ("Fd")
f_direction =1
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _FdL 'else _FdL
_FdR:
'sertxd ("_FdR")
gosub _rollL
gosub _RF
gosub Stand
return
_FdL:
'sertxd ("_FdL")
gosub _rollR
gosub _LF
gosub Stand
return
'-----------------------------------------
Bk:
sertxd ("Bk")
f_direction =0
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _BkR 'else _BkL
_BkL:
gosub _rollR
gosub _RF
gosub Stand
return
_BkR:
gosub _rollL
gosub _LF
gosub Stand
return
'-----------------------------------------
Rt:
sertxd ("Rt")
if paceat<paceC and f_direction=1 then gosub Fd 'need left foot forward
if paceat<paceC and f_direction=0 then gosub Bk 'need left foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _RF
return
'-----------------------------------------
Lt:
sertxd ("Lt")
if paceat>paceC and f_direction=1 then gosub Fd 'need right foot forward
if paceat>paceC and f_direction=0 then gosub Bk 'need right foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _LF
return
'=================================================================
_RF:
'sertxd ("_RF")
paceto =paceC -paceby
for spulse=paceat to paceto step -pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
_LF:
'sertxd ("_LF")
paceto =paceC +paceby
for spulse=paceat to paceto step pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
'-----------------------------------------
Stand: 'stand with both feet flat
'sertxd (" Sd")
if rollat<rollC then _StandR 'else _StandL
_StandL:
'sertxd ("_SL")
for spulse=rollat to rollC step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_StandR:
'sertxd ("_SR")
for spulse=rollat to rollC step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_rollL:
'sertxd ("_rL")
rollto =rollC -rollby
for spulse=rollat to rollto step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_rollR:
'sertxd ("_rR")
rollto =rollC +rollby
for Spulse=rollat to rollto step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_iStand:
'initialise with feet in mid position
for spulse=0 to 10
pulsout servopace,paceC 'pulse servo paceC
pulsout servoroll,rollC 'pulse servo rollC
pause 70 'pause 70ms - do it slowly
next spulse
rollat =rollC
paceat =paceC
return
'-----------------------------------------
'Sense
'-----
calibrateholewhiskers:
'take averages of 8 readings per whisker
w8 =0 'clear tempHi,tempLo
low GwhiskerLedL_ 'eyeL on
for i=0 to 7
' low whiskerLedL_ 'eyeL on
readadc GwhiskerL,temp0
' high whiskerLedL_ 'eyeL off
sertxd("L",#temp0)
temp0 =temp0 /8
tempHi_wLg =tempHi_wLg +temp0
sertxd(" ",#tempHi_wLg,cr)
next i
high GwhiskerLedL_ 'eyeL off
low GwhiskerLedR_ 'eyeL on
for i=0 to 7
' low whiskerLedR_ 'eyeL on
readadc GwhiskerR,temp0
' high whiskerLedR_ 'eyeL off
sertxd("R",#temp0)
temp0 =temp0 /8
tempLo_wRg =tempLo_wRg +temp0
sertxd(" ",#tempLo_wRg,cr)
next i
high GwhiskerLedR_ 'eyeL off
'set threshold at 60%
tempHi_wLg =tempHi_wLg *3 /5
tempLo_wRg =tempLo_wRg *3 /5
sertxd("holethresh L",#tempHi_wLg," R",#tempLo_wRg,cr)
write EEholedetectL,tempHi_wLg
write EEholedetectR,tempLo_wRg
return
QEwhiskerL:
low eyeLedL_ 'LeyeLED on
readadc c.1,tempHi_wL 'withLEDon
high eyeLedL_ 'LeyeLED off
readadc c.1,lightL 'ambient light
if lightL>tempHi_wL then 'why this happens I don't know
lightL =tempHi_wL
endif
tempHi_wL =tempHi_wL -lightL *256 /tempHi_wL 'scale
sertxd(cr,"eL",#tempHi_wL)
if tempHi_wL>objthresh then 'obstacle so update obstacles memory
peek obstaclesL,temp0
temp0 =temp0 +mob max mobs
poke obstaclesL,temp0
endif
return
QEwhiskerR:
low eyeLedR_ 'ReyeLED on
readadc c.7,tempLo_wR 'withLEDon
high eyeLedR_ 'ReyeLED off
readadc c.7,lightR 'ambient light
if lightR>tempLo_wR then 'why this happens I don't know
lightR =tempLo_wR
endif
tempLo_wR =tempLo_wR -lightR *256 /tempLo_wR 'scale
sertxd(" eR",#tempLo_wR)
if tempLo_wR>objthresh then 'obstacle so update obstacles memory
peek obstaclesR,temp0
temp0 =temp0 +mob max mobs
poke obstaclesR,temp0
endif
return
QGwhiskerL:
low GwhiskerLedL_ 'LwLED on
readadc GwhiskerL,tempHi_wLg 'withLEDon
high GwhiskerLedL_ 'LwLED off
readadc GwhiskerL,lightL 'ambient light
if lightL>tempHi_wLg then 'why this happens I don't know
lightL =tempHi_wLg
endif
read EEholedetectL,temp0
if tempHi_wLg<temp0 then 'a hole, no ground detected so update obstacles memory
peek obstaclesL,temp0
temp0 =temp0 +mhole max mholes
poke obstaclesL,temp0
endif
sertxd(cr,"wL",#tempHi_wLg)
return
QGwhiskerR:
low GwhiskerLedR_ 'RwLED on
readadc GwhiskerR,tempLo_wRg 'withLEDon
high GwhiskerLedR_ 'RwLED off
readadc GwhiskerR,lightR 'ambient light
if lightR>tempLo_wRg then 'why this happens I don't know
lightL =tempLo_wRg
endif
read EEholedetectR,temp0
if tempLo_wRg<temp0 then 'a hole, no ground detected so update obstacles memory
peek obstaclesR,temp0
temp0 =temp0 +mhole max mholes
poke obstaclesR,temp0
endif
sertxd(" wR",#tempLo_wRg)
return
'-----------------------------------------
badkey:
high eyeLedR_
pause 100
low eyeLedR_
high eyeLedL_
pause 100
low eyeLedL_
return
beep50:
sound VoiceLed_,(50,10)
return
beep150:
sound VoiceLed_,(150,10)
return
EyesOFF:
high eyeLedR_
high eyeLedL_
return
EyesON:
low eyeLedR_
low eyeLedL_
return
IRgetAct_cmnd:
irin iIRin,cmnd 'key1 - key8 => 0-7
if cmnd<8 then _IRgetActEnd
gosub badkey
goto IRgetAct_cmnd 'repeat until valid act
_IRgetActEnd:
gosub beep50
return
nokey:
irin [50,_nokeyend],iIRin,cmnd'irin timeout =>return
goto nokey
_nokeyend:
return
'=================================================================
'Bambino-27
Sertxd("B27",cr) 'report program number @4800
#PicAxe 20M2
#no_data
'1599 bytes used
'PICAXE IC Memory ext I/O Outputs Inputs ADC Memory Starts Polled Resonator
' £ Type pins bytes slot pins Vars. RAM Spad Data Table* Int. def. opt.
'2.28 PICAXE-20M2 20 2k 18 1-16 1-17 4 28 512 256 512 8 Yes 4 -32
'PICAXE-20M2 circuit board with LEDs off takes 1mA
'PICAXE-20M2 circuit board with LEDs off and servos connected takes 10mA
'Bambino-01 'Test eyeLEDs, whiskerLEDs and speaker
'Bambino-02 'Test InfraRed input
'Bambino-02a 'Test Eye light values
'Bambino-02b 'Test Whisker light values
'Bambino-03 'Play the inbuilt tunes using keys 1 to 4 and beep on 5
'Bambino-04 'Set servos to mid position
'Bambino-05 'Calibrate servo mid positions and put values in EEPROM.
'Bambino-06 'Introduce _iStand:- initialise with feet in mid position
'Bambino-07 'Set rollR
'Bambino-08 'Set rollL
'Bambino-09 'Check rollR, rollL
'Bambino-10 'Introduction of _Stand
'Bambino-11 'Investigate effect of rollspeed; watch roll for all three speeds
'Bambino-12 'Investigate effect of rollspeed; watch Roll and Stand for all three speeds
'Bambino-13 'Check paceFL paceFR; Investigate effect of pacespeed
'Bambino-14 'Check Fd
'Bambino-15 'Test Rt, Lt
'Bambino-15a 'Test T2L Turn to Light, T2D Turn to Dark
'Bambino-16 'Test Bk
'Bambino-17 'Creaton of sections ACTIONS, BEHAVIOURS, ACTS;
'Introduction of ACT parameter 'Ado'
'Bambino-17a 'Demo routine
'Bambino-18 'Walk Fd with obstacle avoidance using eyes from 02a
'Bambino-18a 'Walk Fd with drop-off avoidance using whiskers values from 02b
'Bambino-18b 'rewritten with autocalibration of down whiskers and reading of whiskers as subroutines
'Bambino-19 'If IR command then do it otherwise walk and avoid
'Bambino-20 'rewrite to incorporate rollC and paceC in EEPROM 254,255
'Bambino-21 'rewrite to clearer code
'Bambino-22 'remember a sequence of keys presses
'Bambino-23 'remember up to 8 sequence of keys presses in RAM
'Bambino-24 'remember up to 8 sequence of keys presses in EEPROM
'Bambino-25 'obstacle map made deeper and put in RAM for better obstacle avoidance
'Bambino-26 'incorporate drop-off avoidance from 18b
'Bambino-27 'map increment on hole split into mholeB & mholeT to enable backup & Turn
'otherwise Bambino turns and falls sideways off an edge.
'-----------------------------------------------------------------
'modified
'--------
'QGwhiskerL:
'QGwhiskerR:
'
'New
'---
'mholeT 'memory increment for hole turn
'mholeB 'memory increment for hole back
'=================================================================
'[KEY_BAR] enters learn mode
'[KEY_BAR] has to be followed by a number key 1-8
' = the Act to be remembered
'up to 8 Acts can be learned
'learned Acts can call coded Acts
'a learned Act which chains itself repeats forever, eg #1 = Fd,1
'Acts can chain to other Acts, eg Fd,Bk,2 - chain to Act2
'[KEY_POWER] stops the playing Act.
'[KEY_TENT] selects coded Acts = subroutines,
'[KEY_TENT] has to be followed by a number key 1-8
' [key1]=>RockAdo
'coded Acts play until the end.
'
'[KEY_XCROSS] 'Dump EEPROM DATA to PC
'When recording an Act,
' after [IRkey1],[IRkey2],[IRkey3],[IRkey4],[IRkey5],[IRkey6],[IRkey7],[IRkey8]
' is used to chain another Act there is no point in recording more moves
' because they will never be replayed since control is transfered to the new Act,
' just press [KEY_POWER] to end recording.
'NOTE do not record more than 30 moves for Act8 otherwise it will overwrite the servo calibration of RollC and PaceC
'=================================================================
'TVR010 PicAxe IR-controller
'---------------------------
'Before use, the transmitter must be programmed with the Sony transmit code.
'1. Insert 2 AAA size batteries, preferably alkaline.
'2. Press S and B at the same time. S is in the centre of the arrows.
' The top left red LED should light.
'3. Press 0. The LED should flash.
'4. Press 1. The LED should flash.
'5. Press 3. The LED should go out.
'6. Press the red power button (top right).
'-------------------------------------------
'IRin cmnds PicAxe controller
'DO NOT PRESS OTHER KEYS
'ie [A] [B] [C] [D] [E] [F] [G]
'They change the Mode and [B] has to be pressed to change back.
'[square] [triangle [()] [L] [X] [backwards F] have no effect
Symbol KEY_POWER = 21 'Sleep
Symbol KEY_UP = 16 'Step Forward
Symbol KEY_DOWN = 17 'Step Backward
Symbol KEY_RIGHT = 18 'Turn Right
Symbol KEY_LEFT = 19 'Turn Left
Symbol KEY_BAR = 96 'learn an Act, next [key] selects a Act
Symbol KEY_TENT = 54 'next [key] selects a Coded-Act
Symbol KEY_VERT_CROSS = 37 'use synonym for easier coding
Symbol KEY_VCROSS = 37
Symbol KEY_DIAG_CROSS = 20 'use synonym for easier coding
Symbol KEY_XCROSS = 20 'transfer EEPROM to PC for including in programs '
'Coded Acts
symbol IRkey1 = 0 ' RockADo
symbol IRkey2 = 1
symbol IRkey3 = 2
symbol IRkey4 = 3
symbol IRkey5 = 4
symbol IRkey6 = 5
symbol IRkey7 = 6
symbol IRkey8 = 7
symbol IRkey9 = 8
Symbol KEY_MINUS = 98
Symbol KEY_0 = 9 'QUIT command mode
Symbol KEY_PLUS = 11
'=================================================================
symbol servopace =c.0 'left connector
symbol servoroll =c.4 'right connector
symbol VoiceLed_ =c.5 'low =>LED on
symbol eyeLedL_ =c.2 'low =>LED on
symbol eyeLedR_ =b.1 'low =>LED on
symbol eyeR =c.7
symbol eyeL =c.1
symbol GwhiskerLedL_=c.3 'low =>whisker LED on
symbol GwhiskerLedR_=b.3 'low =>whisker LED on
symbol GwhiskerL =b.6 'adc whisker Down Left
symbol GwhiskerR =b.0 'adc whisker Down Right
symbol iIRin =c.6
symbol oIRout =b.2
symbol general =b0
symbol temp0 =b0
symbol flags =w1
symbol B_flags =b3
'symbol f_doIRcmnds =bit29
symbol f_play =bit28
symbol f_record =bit29
symbol f_direction =bit30 '1=forwards, 0=backwards
symbol f_defaultB =bit31 'defaultBehaviour 1=use default
symbol servosAt =w2
symbol rollat =b4
symbol paceat =b5
symbol ServosTo =w3
symbol rollTo =b6
symbol paceTo =b7
symbol Smoveby =w4
symbol rollby =b8
symbol paceby =b9
symbol Scentre =w5
symbol rollC =b10
symbol paceC =b11
symbol Sspeed =w6
symbol rollspeed =b12 '4 is too fast, 0 won't move
symbol pacespeed =b13 '6 is about max for servos to keep up
symbol counters =w7
symbol spulse =b14
symbol iA =b15
symbol i =b15 'calibrateholewhiskers:
symbol tempw =w8
symbol tempLo =b16
symbol tempLo_wR =b16 'whisker Right
symbol tempLo_wRg =b16 'whisker Right Ground
symbol tempHi =b17
symbol tempHi_wL =b17 'whisker Left
symbol tempHi_wLg =b17 'whisker Left Ground
symbol sframe =22 'time between servo pulses
symbol Ado =b18 'parameter for ACTs
symbol obsmap =b19 '%11 bitmap of obstacles %LeftRight
symbol lightL =b20 'light level Left
symbol lightR =b21 'light level Right
symbol objthresh =70 'light/dark whisker threshold for obstacle
symbol cmnd =b22 'cmnd from IRremote
symbol Act =b23
symbol Aend =b24 'end of record slot
symbol eptr =b25 'pointer to EEPROM
'depending on the sensors obsdetectL and obsdetectR may need to be different
symbol obsdetectL =120 'scaled light level difference for obstacle
symbol obsdetectR =120 'scaled light level difference for obstacle
'if set in Program#18a then those values will be used, otherwise these values
'depending on the sensors holedetectL and holedetectR may need to be different
'default if not set in prog #18a, values so Bambino can see table edges
symbol holedetectL=120 'scaled light level difference for holes
symbol holedetectR=120 'scaled light level difference for holes
symbol EEholedetectR =252
symbol EEholedetectL =253
symbol EErollC =254
symbol EEpaceC =255
'EEPROM Acts
symbol act0 =0
symbol act1 =32
symbol act2 =32 *2
symbol act3 =32 *3
symbol act4 =32 *4
symbol act5 =32 *5
symbol act6 =32 *6
symbol act7 =32 *7
symbol act8 =32 *8
'for Act=act1 to act8
' poke Act,255 'set stop markers
' next Act
symbol obstaclesR =32 'RAM
symbol obstaclesL =33 'RAM
symbol mob =6'8 'memory increment for obstacle
symbol mobs =8 'memory increment for obstacle
symbol mholeT =4 'memory increment for hole turn
symbol mholeB =2 'memory increment for hole back
symbol mholes =8 'memory max for hole
'=================================================================
initialise:
rollby =15 '+ve right
paceby =20 '+ve Left foot forward
rollspeed =1 '4 is too fast, 0 won't move
pacespeed =2 '6 is about max for servos to keep up
rollC =150 'Default, 100 is roll to the left
paceC =150 'Default, 100 is left foot back
'get values from EEPROM if set by program #5
read EErollC,temp0
if temp0>130 and temp0<170 then 'so servo is always between 100,200
rollC =temp0
endif
read EEpaceC,temp0
if temp0>130 and temp0<170 then 'so servo is always between 100,200
paceC =temp0
endif
sertxd("rollC=",#rollC," paceC=",#paceC,cr)
' 'get hole detect values from EEPROM if set by program #18a
' read EEholedetectL,temp0
' if temp0=255 then
' write EEholedetectL,holedetectL
' endif
' read EEholedetectR,temp0
' if temp0=255 then
' write EEholedetectR,holedetectR
' endif
gosub calibrateholewhiskers
low eyeLedR_ 'make output LED on
low eyeLedL_ 'make output LED on
gosub _iStand
f_defaultB =1 'defaultBehaviour On
f_record =0
start:
sertxd("S")
Ado =4 'for RockAdo
irin [50,Walkabout],iIRin,cmnd'irin with timeout, no IR =>Walkabout
gosub beep50 'so we know IR received
goto DoCmnd
'=================================================================
'Activities
'----------
IRacty:
sertxd("IR")
irin iIRin,cmnd 'Get cmnd
gosub beep50 'so we know IR received
DoCmnd:
sertxd(cr,#cmnd," @",#eptr)
sertxd(" f_p",#f_play," f_r",#f_record,",")
select cmnd
case KEY_POWER
if f_record=0 and f_play=0 then
gosub rest
goto DoCmnd 'have already got IRcmnd in rest:
else
f_play =0
if f_record=1 then
f_record =0
poke eptr,255 'end marker
endif
endif
case KEY_UP
gosub Fd
case KEY_DOWN
gosub Bk
case KEY_RIGHT
gosub Rt
case KEY_LEFT
gosub Lt
case KEY_0
goto Start 'QUIT and Wander
case <IRkey9 'Act keys 1-8 => Acts 0-7
if f_record<>1 then
f_play=1 'play
eptr =32 *cmnd 'set to start
sertxd(" play@",#eptr,cr)
endif
case KEY_BAR 'record
f_play =0
f_record =1
gosub IRgetAct_cmnd
eptr =32 *cmnd
Aend =eptr +31
gosub nokey
sertxd("rec@",#eptr,cr)
goto IRacty 'get cmnds
case KEY_TENT 'coded acts
gosub IRgetAct_cmnd
cmnd =cmnd +128 'set topbit for coded Acts
sertxd(" Act",#cmnd,cr)
goto DoCmnd
case KEY_XCROSS 'Dump DATA to PC
for Act=0 to 7
sertxd(cr,lf,"'Act ",#Act,cr,lf,"DATA ")
for eptr=0 to 30
tempLo =Act *32 +eptr
read tempLo,cmnd
sertxd(#cmnd,",")
next eptr
tempLo =Act *32 +31
read tempLo,cmnd
sertxd(#cmnd)
next Act
sertxd(cr,lf)
case >127 'do Coded Act subroutines
sertxd("case >127",cr)
Act =cmnd -128
on Act gosub RockAdo 'add others
end select
'_record
if f_record=1 then
if eptr<Aend then
write eptr,cmnd
eptr =eptr +1
else 'end of slot
gosub beep150
cmnd =KEY_POWER
goto DoCmnd
endif
endif
'_play:
if f_play=1 then
irin [50,_playon],iIRin,cmnd
goto Start 'if IR received =>break
_playon:
read eptr,cmnd
eptr =eptr +1
if cmnd<>255 then DoCmnd '255=end
f_play =0
endif
goto IRacty 'get IR
'-----------------------------------------
Walkabout:
sertxd(cr,"W")
peek obstaclesR,tempLo 'read memory
peek obstaclesL,tempHi 'read memory
tempLo =tempLo min 1 -1 'decay memory
tempHi =tempHi min 1 -1 'decay memory
poke obstaclesR,tempLo 'save
poke obstaclesL,tempHi 'save
sertxd ("mem",#tempHi," ",#tempLo," ")
obsmap =0
if tempLo>0 then 'create short term memory map
obsmap =obsmap or %1
endif
if tempHi>0 then
obsmap =obsmap or %10
endif
gosub B_fast
'alter LEDs so we can tell what Bambino is doing
b0 =obsmap 'to use bits
if bit0=0 then
' low eyeLedR_
pwmout eyeLedR_,110,400 'active low so high Dutycycle for dim
endif
if bit1=0 then
' low eyeLedL_
pwmout eyeLedL_,110,400 'active low so high Dutycycle for dim
endif
'take avoiding action if necessary
on obsmap gosub Fd,Lt,Rt,Bk
'otherwise fall through and test whiskers
pwmout eyeLedR_,off
pwmout eyeLedL_,off
' gosub EyesOFF
gosub QEwhiskerL
gosub QEwhiskerR
gosub QGwhiskerL
gosub QGwhiskerR
Qwalk:
irin [50,Walkabout],iIRin,cmnd 'irin with timeout, no IR =>Walkabout
goto start 'QUIT if IRin
'=================================================================
'Behaviours
'----------
B_fast:
rollspeed =3
pacespeed =6
return
B_turn:
rollspeed =1 'slow so foot doesn't bounce
pacespeed =5
return
'=================================================================
'Acts
'----
RockAdo: '#128
if f_defaultB=1 then gosub B_fast
for iA=1 to Ado
gosub _rollR
gosub _rollL
next iA
gosub Stand
return
FdAdo:
for iA=1 to Ado
gosub Fd
next iA
return
BkAdo:
for iA=1 to Ado
gosub Bk
next iA
return
Rest:
gosub _rollL
gosub _iStand
pwmout eyeLedR_,100,400 'active low so high Dutycycle for dim
pwmout eyeLedL_,100,400 'active low so high Dutycycle for dim
_RestIRwait:
high VoiceLed_
irin iIRin,cmnd 'irin with no timeout
gosub beep50 'so we know IR received
if cmnd=KEY_POWER then _RestIRwait 'wait until different IRcmnd
pwmout eyeLedR_,off
pwmout eyeLedL_,off
gosub EyesOFF
return
'=================================================================
'Actions
'-------
Fd:
sertxd ("Fd")
f_direction =1
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _FdL 'else _FdL
_FdR:
'sertxd ("_FdR")
gosub _rollL
gosub _RF
gosub Stand
return
_FdL:
'sertxd ("_FdL")
gosub _rollR
gosub _LF
gosub Stand
return
'-----------------------------------------
Bk:
sertxd ("Bk")
f_direction =0
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _BkR 'else _BkL
_BkL:
gosub _rollR
gosub _RF
gosub Stand
return
_BkR:
gosub _rollL
gosub _LF
gosub Stand
return
'-----------------------------------------
Rt:
sertxd ("Rt")
if paceat<paceC and f_direction=1 then gosub Fd 'need left foot forward
if paceat<paceC and f_direction=0 then gosub Bk 'need left foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _RF
return
'-----------------------------------------
Lt:
sertxd ("Lt")
if paceat>paceC and f_direction=1 then gosub Fd 'need right foot forward
if paceat>paceC and f_direction=0 then gosub Bk 'need right foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _LF
return
'=================================================================
_RF:
'sertxd ("_RF")
paceto =paceC -paceby
for spulse=paceat to paceto step -pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
_LF:
'sertxd ("_LF")
paceto =paceC +paceby
for spulse=paceat to paceto step pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
'-----------------------------------------
Stand: 'stand with both feet flat
'sertxd (" Sd")
if rollat<rollC then _StandR 'else _StandL
_StandL:
'sertxd ("_SL")
for spulse=rollat to rollC step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_StandR:
'sertxd ("_SR")
for spulse=rollat to rollC step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_rollL:
'sertxd ("_rL")
rollto =rollC -rollby
for spulse=rollat to rollto step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_rollR:
'sertxd ("_rR")
rollto =rollC +rollby
for Spulse=rollat to rollto step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_iStand:
'initialise with feet in mid position
for spulse=0 to 10
pulsout servopace,paceC 'pulse servo paceC
pulsout servoroll,rollC 'pulse servo rollC
pause 70 'pause 70ms - do it slowly
next spulse
rollat =rollC
paceat =paceC
return
'-----------------------------------------
'Sense
'-----
calibrateholewhiskers:
'take averages of 8 readings per whisker
w8 =0 'clear tempHi,tempLo
low GwhiskerLedL_ 'eyeL on
for i=0 to 7
' low whiskerLedL_ 'eyeL on
readadc GwhiskerL,temp0
' high whiskerLedL_ 'eyeL off
sertxd("L",#temp0)
temp0 =temp0 /8
tempHi_wLg =tempHi_wLg +temp0
sertxd(" ",#tempHi_wLg,cr)
next i
high GwhiskerLedL_ 'eyeL off
low GwhiskerLedR_ 'eyeL on
for i=0 to 7
' low whiskerLedR_ 'eyeL on
readadc GwhiskerR,temp0
' high whiskerLedR_ 'eyeL off
sertxd("R",#temp0)
temp0 =temp0 /8
tempLo_wRg =tempLo_wRg +temp0
sertxd(" ",#tempLo_wRg,cr)
next i
high GwhiskerLedR_ 'eyeL off
'set threshold at 60%
tempHi_wLg =tempHi_wLg *3 /5
tempLo_wRg =tempLo_wRg *3 /5
sertxd("holethresh L",#tempHi_wLg," R",#tempLo_wRg,cr)
write EEholedetectL,tempHi_wLg
write EEholedetectR,tempLo_wRg
return
QEwhiskerL:
low eyeLedL_ 'LeyeLED on
readadc c.1,tempHi_wL 'withLEDon
high eyeLedL_ 'LeyeLED off
readadc c.1,lightL 'ambient light
if lightL>tempHi_wL then 'why this happens I don't know
lightL =tempHi_wL
endif
tempHi_wL =tempHi_wL -lightL *256 /tempHi_wL 'scale
sertxd(cr,"eL",#tempHi_wL)
if tempHi_wL>objthresh then 'obstacle so update obstacles memory
peek obstaclesL,temp0
temp0 =temp0 +mob max mobs
poke obstaclesL,temp0
endif
return
QEwhiskerR:
low eyeLedR_ 'ReyeLED on
readadc c.7,tempLo_wR 'withLEDon
high eyeLedR_ 'ReyeLED off
readadc c.7,lightR 'ambient light
if lightR>tempLo_wR then 'why this happens I don't know
lightR =tempLo_wR
endif
tempLo_wR =tempLo_wR -lightR *256 /tempLo_wR 'scale
sertxd(" eR",#tempLo_wR)
if tempLo_wR>objthresh then 'obstacle so update obstacles memory
peek obstaclesR,temp0
temp0 =temp0 +mob max mobs
poke obstaclesR,temp0
endif
return
QGwhiskerL:
low GwhiskerLedL_ 'LwLED on
readadc GwhiskerL,tempHi_wLg 'withLEDon
high GwhiskerLedL_ 'LwLED off
readadc GwhiskerL,lightL 'ambient light
if lightL>tempHi_wLg then 'why this happens I don't know
lightL =tempHi_wLg
endif
read EEholedetectL,temp0
if tempHi_wLg<temp0 then 'a hole, no ground detected so update obstacles memory
peek obstaclesL,temp0
temp0 =temp0 +mholeB +mholeT max mholes
poke obstaclesL,temp0
peek obstaclesR,temp0
temp0 =temp0 +mholeB max mholes 'so back and turn
poke obstaclesR,temp0
endif
sertxd(cr,"wL",#tempHi_wLg)
return
QGwhiskerR:
low GwhiskerLedR_ 'RwLED on
readadc GwhiskerR,tempLo_wRg 'withLEDon
high GwhiskerLedR_ 'RwLED off
readadc GwhiskerR,lightR 'ambient light
if lightR>tempLo_wRg then 'why this happens I don't know
lightL =tempLo_wRg
endif
read EEholedetectR,temp0
if tempLo_wRg<temp0 then 'a hole, no ground detected so update obstacles memory
peek obstaclesR,temp0
temp0 =temp0 +mholeB +mholeT max mholes
poke obstaclesR,temp0
peek obstaclesL,temp0
temp0 =temp0 +mholeB max mholes 'so back and turn
poke obstaclesL,temp0
endif
sertxd(" wR",#tempLo_wRg)
return
'-----------------------------------------
badkey:
high eyeLedR_
pause 100
low eyeLedR_
high eyeLedL_
pause 100
low eyeLedL_
return
beep50:
sound VoiceLed_,(50,10)
return
beep150:
sound VoiceLed_,(150,10)
return
EyesOFF:
high eyeLedR_
high eyeLedL_
return
EyesON:
low eyeLedR_
low eyeLedL_
return
IRgetAct_cmnd:
irin iIRin,cmnd 'key1 - key8 => 0-7
if cmnd<8 then _IRgetActEnd
gosub badkey
goto IRgetAct_cmnd 'repeat until valid act
_IRgetActEnd:
gosub beep50
return
nokey:
irin [50,_nokeyend],iIRin,cmnd'irin timeout =>return
goto nokey
_nokeyend:
return
'=================================================================
[page top]
'Bambino-28
Sertxd("B28",cr) 'report program number @4800
#PicAxe 20M2
#no_data
'1781 bytes used
'PICAXE IC Memory ext I/O Outputs Inputs ADC Memory Starts Polled Resonator
' £ Type pins bytes slot pins Vars. RAM Spad Data Table* Int. def. opt.
'2.28 PICAXE-20M2 20 2k 18 1-16 1-17 4 28 512 256 512 8 Yes 4 -32
'PICAXE-20M2 circuit board with LEDs off takes 1mA
'PICAXE-20M2 circuit board with LEDs off and servos connected takes 10mA
'Bambino-01 'Test eyeLEDs, whiskerLEDs and speaker
'Bambino-02 'Test InfraRed input
'Bambino-02a 'Test Eye light values
'Bambino-02b 'Test Whisker light values
'Bambino-03 'Play the inbuilt tunes using keys 1 to 4 and beep on 5
'Bambino-04 'Set servos to mid position
'Bambino-05 'Calibrate servo mid positions and put values in EEPROM.
'Bambino-06 'Introduce _iStand:- initialise with feet in mid position
'Bambino-07 'Set rollR
'Bambino-08 'Set rollL
'Bambino-09 'Check rollR, rollL
'Bambino-10 'Introduction of _Stand
'Bambino-11 'Investigate effect of rollspeed; watch roll for all three speeds
'Bambino-12 'Investigate effect of rollspeed; watch Roll and Stand for all three speeds
'Bambino-13 'Check paceFL paceFR; Investigate effect of pacespeed
'Bambino-14 'Check Fd
'Bambino-15 'Test Rt, Lt
'Bambino-15a 'Test T2L Turn to Light, T2D Turn to Dark
'Bambino-16 'Test Bk
'Bambino-17 'Creaton of sections ACTIONS, BEHAVIOURS, ACTS;
'Introduction of ACT parameter 'Ado'
'Bambino-17a 'Demo routine
'Bambino-18 'Walk Fd with obstacle avoidance using eyes from 02a
'Bambino-18a 'Walk Fd with drop-off avoidance using whiskers values from 02b
'Bambino-18b 'rewritten with autocalibration of down whiskers and reading of whiskers as subroutines
'Bambino-19 'If IR command then do it otherwise walk and avoid
'Bambino-20 'rewrite to incorporate rollC and paceC in EEPROM 254,255
'Bambino-21 'rewrite to clearer code
'Bambino-22 'remember a sequence of keys presses
'Bambino-23 'remember up to 8 sequence of keys presses in RAM
'Bambino-24 'remember up to 8 sequence of keys presses in EEPROM
'Bambino-25 'obstacle map made deeper and put in RAM for better obstacle avoidance
'Bambino-26 'incorporate drop-off avoidance from 18b
'Bambino-27 'map increment on hole split into mholeB & mholeT to enable backup & Turn
'otherwise Bambino turns and falls sideways off an edge.
'Bambino-28 'Adjustment of Servo centres rollC and paceC from handset
'-----------------------------------------------------------------
'modified
'--------
'IRacty: moved to end of cmnd section
'nokey: renamed waitnokey:
'badkey: reordered to leave LEDs off
'gosub
'New
'---
'WalkaboutInit: gosub calibrateholewhiskers moved from initialise:
'temp0_EE =b0
'adjustrollC:
'adjustpaceC:
'_adjustC:
'_IRupdw:
'=================================================================
'[KEY_UP] (exit wander) direct contol
'[KEY_DOWN] (exit wander) direct contol
'[KEY_RIGHT] (exit wander) direct contol
'[KEY_LEFT] (exit wander) direct contol
'
'[KEY_BAR] enters learn mode
'[KEY_BAR] has to be followed by a number key 1-8
' = the Act to be remembered
'up to 8 Acts can be learned
'learned Acts can call coded Acts
'a learned Act which chains itself repeats forever, eg #1 = Fd,1
'Acts can chain to other Acts, eg Fd,Bk,2 - chain to Act2
'[KEY_POWER] stops the playing Act.
'
'[KEY_TENT] selects coded Acts = subroutines,
'[KEY_TENT] has to be followed by a number key 1-8
' [key1]=>RockAdo
'coded Acts play until the end.
'
'[KEY_VCROSS] enters modify mode
'[KEY_VCROSS] has to be followed by [KEY_UP],[KEY_DOWN],[KEY_RIGHT],[KEY_LEFT] or [KEY_POWER] to quit
'[KEY_UP],[KEY_DOWN] select the Pace servo
'[KEY_RIGHT],[KEY_LEFT] select the Roll servo
'[KEY_MINUS] adjusts the centre position one way
'[KEY_PLUS] adjusts the centre position the other way
'
'[KEY_XCROSS] 'Dump EEPROM DATA to PC, format to past into programs
'
'When recording an Act,
' after [IRkey1],[IRkey2],[IRkey3],[IRkey4],[IRkey5],[IRkey6],[IRkey7],[IRkey8]
' is used to chain another Act there is no point in recording more moves
' because they will never be replayed since control is transfered to the new Act,
' just press [KEY_POWER] to end recording.
'NOTE do not record more than 30 moves for Act8 otherwise it will overwrite the servo calibration of RollC and PaceC
'=================================================================
'TVR010 PicAxe IR-controller
'---------------------------
'Before use, the transmitter must be programmed with the Sony transmit code.
'1. Insert 2 AAA size batteries, preferably alkaline.
'2. Press S and B at the same time. S is in the centre of the arrows.
' The top left red LED should light.
'3. Press 0. The LED should flash.
'4. Press 1. The LED should flash.
'5. Press 3. The LED should go out.
'6. Press the red power button (top right).
'-------------------------------------------
'IRin cmnds PicAxe controller
'DO NOT PRESS OTHER KEYS
'ie [A] [B] [C] [D] [E] [F] [G]
'They change the Mode and [B] has to be pressed to change back.
'[square] [triangle [()] [L] [X] [backwards F] have no effect
Symbol KEY_POWER = 21 'Sleep
Symbol KEY_UP = 16 'Step Forward
Symbol KEY_DOWN = 17 'Step Backward
Symbol KEY_RIGHT = 18 'Turn Right
Symbol KEY_LEFT = 19 'Turn Left
Symbol KEY_BAR = 96 'learn an Act, next [key] selects a Act
Symbol KEY_TENT = 54 'next [key] selects a Coded-Act
Symbol KEY_VERT_CROSS = 37 'use synonym for easier coding
Symbol KEY_VCROSS = 37 'add mode - modify mode
Symbol KEY_DIAG_CROSS = 20 'use synonym for easier coding
Symbol KEY_XCROSS = 20 'transfer EEPROM to PC for including in programs '
'Coded Acts
symbol IRkey1 = 0 ' RockADo
symbol IRkey2 = 1
symbol IRkey3 = 2
symbol IRkey4 = 3
symbol IRkey5 = 4
symbol IRkey6 = 5
symbol IRkey7 = 6
symbol IRkey8 = 7
symbol IRkey9 = 8
Symbol KEY_MINUS = 98
Symbol KEY_0 = 9 'QUIT command mode
Symbol KEY_PLUS = 11
'=================================================================
symbol servopace =c.0 'left connector
symbol servoroll =c.4 'right connector
symbol VoiceLed_ =c.5 'low =>LED on
symbol eyeLedL_ =c.2 'low =>LED on
symbol eyeLedR_ =b.1 'low =>LED on
symbol eyeR =c.7
symbol eyeL =c.1
symbol GwhiskerLedL_=c.3 'low =>whisker LED on
symbol GwhiskerLedR_=b.3 'low =>whisker LED on
symbol GwhiskerL =b.6 'adc whisker Down Left
symbol GwhiskerR =b.0 'adc whisker Down Right
symbol iIRin =c.6
symbol oIRout =b.2
symbol general =b0
symbol temp0 =b0
symbol temp0_EE =b0
symbol flags =w1
symbol B_flags =b3
'symbol f_doIRcmnds =bit29
symbol f_play =bit28
symbol f_record =bit29
symbol f_direction =bit30 '1=forwards, 0=backwards
symbol f_defaultB =bit31 'defaultBehaviour 1=use default
symbol servosAt =w2
symbol rollat =b4
symbol paceat =b5
symbol ServosTo =w3
symbol rollTo =b6
symbol paceTo =b7
symbol Smoveby =w4
symbol rollby =b8
symbol paceby =b9
symbol Scentre =w5
symbol rollC =b10
symbol paceC =b11
symbol Sspeed =w6
symbol rollspeed =b12 '4 is too fast, 0 won't move
symbol pacespeed =b13 '6 is about max for servos to keep up
symbol counters =w7
symbol spulse =b14
symbol iA =b15
symbol i =b15 'calibrateholewhiskers:
symbol tempw =w8
symbol tempLo =b16
symbol tempLo_wR =b16 'whisker Right
symbol tempLo_wRg =b16 'whisker Right Ground
symbol tempHi =b17
symbol tempHi_wL =b17 'whisker Left
symbol tempHi_wLg =b17 'whisker Left Ground
symbol sframe =22 'time between servo pulses
symbol Ado =b18 'parameter for ACTs
symbol obsmap =b19 '%11 bitmap of obstacles %LeftRight
symbol lightL =b20 'light level Left
symbol lightR =b21 'light level Right
symbol objthresh =70 'light/dark whisker threshold for obstacle
symbol cmnd =b22 'cmnd from IRremote
symbol Act =b23
symbol Aend =b24 'end of record slot
symbol eptr =b25 'pointer to EEPROM
'depending on the sensors obsdetectL and obsdetectR may need to be different
symbol obsdetectL =120 'scaled light level difference for obstacle
symbol obsdetectR =120 'scaled light level difference for obstacle
'if set in Program#18a then those values will be used, otherwise these values
'depending on the sensors holedetectL and holedetectR may need to be different
'default if not set in prog #18a, values so Bambino can see table edges
symbol holedetectL=120 'scaled light level difference for holes
symbol holedetectR=120 'scaled light level difference for holes
symbol EEholedetectR =252
symbol EEholedetectL =253
symbol EErollC =254
symbol EEpaceC =255
'EEPROM Acts
symbol act0 =0
symbol act1 =32
symbol act2 =32 *2
symbol act3 =32 *3
symbol act4 =32 *4
symbol act5 =32 *5
symbol act6 =32 *6
symbol act7 =32 *7
symbol act8 =32 *8
'for Act=act1 to act8
' poke Act,255 'set stop markers
' next Act
symbol obstaclesR =32 'RAM
symbol obstaclesL =33 'RAM
symbol mob =6'8 'memory increment for obstacle
symbol mobs =8 'memory increment for obstacle
symbol mholeT =4 'memory increment for hole turn
symbol mholeB =2 'memory increment for hole back
symbol mholes =8 'memory max for hole
'=================================================================
initialise:
rollby =15 '+ve right
paceby =20 '+ve Left foot forward
rollspeed =1 '4 is too fast, 0 won't move
pacespeed =2 '6 is about max for servos to keep up
rollC =150 'Default, 100 is roll to the left
paceC =150 'Default, 100 is left foot back
'get values from EEPROM if set by program #5
read EErollC,temp0
if temp0>130 and temp0<170 then 'so servo is always between 100,200
rollC =temp0
endif
read EEpaceC,temp0
if temp0>130 and temp0<170 then 'so servo is always between 100,200
paceC =temp0
endif
sertxd("rollC=",#rollC," paceC=",#paceC,cr)
low eyeLedR_ 'make output LED on
low eyeLedL_ 'make output LED on
gosub _iStand
f_defaultB =1 'defaultBehaviour On
f_record =0
start:
sertxd("S")
Ado =4 'for RockAdo
irin [50,WalkaboutInit],iIRin,cmnd'irin with timeout, no IR =>WalkaboutInit
gosub beep50 'so we know IR received
goto DoCmnd
'=================================================================
'Activities
'----------
'rest - from [KEY_POWER]
'Wander - from [KEY_0]
'direct IRcmnds
DoCmnd:
sertxd(cr,#cmnd," @",#eptr)
sertxd(" f_p",#f_play," f_r",#f_record,",")
select cmnd
case KEY_POWER
if f_record=0 and f_play=0 then
gosub rest
goto DoCmnd 'have already got IRcmnd in rest:
else
f_play =0
if f_record=1 then
f_record =0
poke eptr,255 'end marker
endif
endif
case KEY_UP
gosub Fd
case KEY_DOWN
gosub Bk
case KEY_RIGHT
gosub Rt
case KEY_LEFT
gosub Lt
case KEY_0
goto Start 'QUIT and Wander
'key Acts
case <IRkey9 'Act keys 1-8 => Acts 0-7
if f_record<>1 then
f_play=1 'play
eptr =32 *cmnd 'set to start
sertxd(" play@",#eptr,cr)
endif
case KEY_BAR 'record
f_play =0
f_record =1
gosub IRgetAct_cmnd 'wait for key 1 - 8 only
eptr =32 *cmnd
Aend =eptr +31
gosub waitnokey
sertxd("rec@",#eptr,cr)
goto IRcmnd 'get cmnds
'coded Acts
case KEY_TENT 'coded acts
gosub IRgetAct_cmnd 'wait for key 1 - 8 only
cmnd =cmnd +128 'set topbit for coded Acts, ie cmnd>127
sertxd(" Act",#cmnd,cr)
goto DoCmnd
case KEY_XCROSS 'Dump DATA to PC
for Act=0 to 7
sertxd(cr,lf,"'Act ",#Act,cr,lf,"DATA ")
for eptr=0 to 30
tempLo =Act *32 +eptr
read tempLo,cmnd
sertxd(#cmnd,",")
next eptr
tempLo =Act *32 +31
read tempLo,cmnd
sertxd(#cmnd)
next Act
sertxd(cr,lf)
case >127 'do Coded Act subroutines
sertxd("case >127",cr)
Act =cmnd -128
on Act gosub RockAdo 'add others
case KEY_VCROSS 'modify rollC, paceC
_case_VCROSS:
irin iIRin,cmnd 'Get cmnd
if cmnd>15 and cmnd<20 then '16,17,18,19
gosub beep50 'so we know valid IR received
else
gosub badkey
goto _case_VCROSS
endif
if cmnd=16 or cmnd=17 then
gosub adjustpaceC
else '18,19
gosub adjustrollC
endif
endselect
'_record
if f_record=1 then
if eptr<Aend then
write eptr,cmnd
eptr =eptr +1
else 'end of slot
gosub beep150
cmnd =KEY_POWER 'indicate end of slot by resting
goto DoCmnd
endif
endif
'_play:
if f_play=1 then
irin [50,_playon],iIRin,cmnd
goto DoCmnd 'if IR received do cmnd
_playon:
read eptr,cmnd
eptr =eptr +1
if cmnd<>255 then DoCmnd '255=end
f_play =0
endif
IRcmnd: 'get IRcmnd
sertxd("IR")
irin iIRin,cmnd 'Get cmnd
gosub beep50 'so we know IR received
goto DoCmnd
'-----------------------------------------
WalkaboutInit:
gosub calibrateholewhiskers
Walkabout:
sertxd(cr,"W")
peek obstaclesR,tempLo 'read memory
peek obstaclesL,tempHi 'read memory
tempLo =tempLo min 1 -1 'decay memory
tempHi =tempHi min 1 -1 'decay memory
poke obstaclesR,tempLo 'save
poke obstaclesL,tempHi 'save
sertxd ("mem",#tempHi," ",#tempLo," ")
obsmap =0
if tempLo>0 then 'create short term memory map
obsmap =obsmap or %1
endif
if tempHi>0 then
obsmap =obsmap or %10
endif
gosub B_fast
'alter LEDs so we can tell what Bambino is doing
b0 =obsmap 'to use bits
if bit0=0 then
' low eyeLedR_
pwmout eyeLedR_,110,400 'active low so high Dutycycle for dim
endif
if bit1=0 then
' low eyeLedL_
pwmout eyeLedL_,110,400 'active low so high Dutycycle for dim
endif
'take avoiding action if necessary
on obsmap gosub Fd,Lt,Rt,Bk
'otherwise fall through and test whiskers
pwmout eyeLedR_,off
pwmout eyeLedL_,off
' gosub EyesOFF
gosub QEwhiskerL
gosub QEwhiskerR
gosub QGwhiskerL
gosub QGwhiskerR
Qwalk:
irin [50,Walkabout],iIRin,cmnd 'irin with timeout, no IR =>Walkabout
goto start 'QUIT if IRin
'=================================================================
'Behaviours
'----------
B_fast:
rollspeed =3
pacespeed =6
return
B_turn:
rollspeed =1 'slow so foot doesn't bounce
pacespeed =5
return
'=================================================================
'Acts
'----
RockAdo: '#128
if f_defaultB=1 then gosub B_fast
for iA=1 to Ado
gosub _rollR
gosub _rollL
next iA
gosub Stand
return
FdAdo:
for iA=1 to Ado
gosub Fd
next iA
return
BkAdo:
for iA=1 to Ado
gosub Bk
next iA
return
Rest:
gosub _rollL
gosub _iStand
pwmout eyeLedR_,100,400 'active low so high Dutycycle for dim
pwmout eyeLedL_,100,400 'active low so high Dutycycle for dim
_RestIRwait:
high VoiceLed_ 'LED off
irin iIRin,cmnd 'irin with no timeout
gosub beep50 'so we know IR received
if cmnd=KEY_POWER then _RestIRwait 'wait until different IRcmnd
pwmout eyeLedR_,off
pwmout eyeLedL_,off
gosub EyesOFF
return
'=================================================================
'Actions
'-------
Fd:
sertxd ("Fd")
f_direction =1
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _FdL 'else _FdL
_FdR:
'sertxd ("_FdR")
gosub _rollL
gosub _RF
gosub Stand
return
_FdL:
'sertxd ("_FdL")
gosub _rollR
gosub _LF
gosub Stand
return
'-----------------------------------------
Bk:
sertxd ("Bk")
f_direction =0
if f_defaultB=1 then gosub B_fast
if paceat<paceC then _BkR 'else _BkL
_BkL:
gosub _rollR
gosub _RF
gosub Stand
return
_BkR:
gosub _rollL
gosub _LF
gosub Stand
return
'-----------------------------------------
Rt:
sertxd ("Rt")
if paceat<paceC and f_direction=1 then gosub Fd 'need left foot forward
if paceat<paceC and f_direction=0 then gosub Bk 'need left foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _RF
return
'-----------------------------------------
Lt:
sertxd ("Lt")
if paceat>paceC and f_direction=1 then gosub Fd 'need right foot forward
if paceat>paceC and f_direction=0 then gosub Bk 'need right foot forward
if f_defaultB=1 then gosub beep150
if f_defaultB=1 then gosub B_turn
gosub _LF
return
'=================================================================
_RF:
'sertxd ("_RF")
paceto =paceC -paceby
for spulse=paceat to paceto step -pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
_LF:
'sertxd ("_LF")
paceto =paceC +paceby
for spulse=paceat to paceto step pacespeed
paceat =spulse
pulsout servoroll,rollat 'pulse servo hold in position
pulsout servopace,paceat 'pulse servo
pause sframe
next spulse
return
'-----------------------------------------
Stand: 'stand with both feet flat
'sertxd (" Sd")
if rollat<rollC then _StandR 'else _StandL
_StandL:
'sertxd ("_SL")
for spulse=rollat to rollC step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_StandR:
'sertxd ("_SR")
for spulse=rollat to rollC step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_rollL:
'sertxd ("_rL")
rollto =rollC -rollby
for spulse=rollat to rollto step -rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
_rollR:
'sertxd ("_rR")
rollto =rollC +rollby
for Spulse=rollat to rollto step rollspeed
rollat =spulse
pulsout servoroll,rollat 'pulse servo
pulsout servopace,paceat 'pulse servo hold in position
pause sframe
next spulse
return
'-----------------------------------------
_iStand:
'initialise with feet in mid position
for spulse=0 to 10
pulsout servopace,paceC 'pulse servo paceC
pulsout servoroll,rollC 'pulse servo rollC
pause 70 'pause 70ms - do it slowly
next spulse
rollat =rollC
paceat =paceC
return
'-----------------------------------------
'Sense
'-----
calibrateholewhiskers:
'take averages of 8 readings per whisker
w8 =0 'clear tempHi,tempLo
low GwhiskerLedL_ 'eyeL on
for i=0 to 7
' low whiskerLedL_ 'eyeL on
readadc GwhiskerL,temp0
' high whiskerLedL_ 'eyeL off
sertxd("L",#temp0)
temp0 =temp0 /8
tempHi_wLg =tempHi_wLg +temp0
sertxd(" ",#tempHi_wLg,cr)
next i
high GwhiskerLedL_ 'eyeL off
low GwhiskerLedR_ 'eyeL on
for i=0 to 7
' low whiskerLedR_ 'eyeL on
readadc GwhiskerR,temp0
' high whiskerLedR_ 'eyeL off
sertxd("R",#temp0)
temp0 =temp0 /8
tempLo_wRg =tempLo_wRg +temp0
sertxd(" ",#tempLo_wRg,cr)
next i
high GwhiskerLedR_ 'eyeL off
'set threshold at 60%
tempHi_wLg =tempHi_wLg *3 /5
tempLo_wRg =tempLo_wRg *3 /5
sertxd("holethresh L",#tempHi_wLg," R",#tempLo_wRg,cr)
write EEholedetectL,tempHi_wLg
write EEholedetectR,tempLo_wRg
return
QEwhiskerL:
low eyeLedL_ 'LeyeLED on
readadc c.1,tempHi_wL 'withLEDon
high eyeLedL_ 'LeyeLED off
readadc c.1,lightL 'ambient light
if lightL>tempHi_wL then 'why this happens I don't know
lightL =tempHi_wL
endif
tempHi_wL =tempHi_wL -lightL *256 /tempHi_wL 'scale
sertxd(cr,"eL",#tempHi_wL)
if tempHi_wL>objthresh then 'obstacle so update obstacles memory
peek obstaclesL,temp0
temp0 =temp0 +mob max mobs
poke obstaclesL,temp0
endif
return
QEwhiskerR:
low eyeLedR_ 'ReyeLED on
readadc c.7,tempLo_wR 'withLEDon
high eyeLedR_ 'ReyeLED off
readadc c.7,lightR 'ambient light
if lightR>tempLo_wR then 'why this happens I don't know
lightR =tempLo_wR
endif
tempLo_wR =tempLo_wR -lightR *256 /tempLo_wR 'scale
sertxd(" eR",#tempLo_wR)
if tempLo_wR>objthresh then 'obstacle so update obstacles memory
peek obstaclesR,temp0
temp0 =temp0 +mob max mobs
poke obstaclesR,temp0
endif
return
QGwhiskerL:
low GwhiskerLedL_ 'LwLED on
readadc GwhiskerL,tempHi_wLg 'withLEDon
high GwhiskerLedL_ 'LwLED off
readadc GwhiskerL,lightL 'ambient light
if lightL>tempHi_wLg then 'why this happens I don't know
lightL =tempHi_wLg
endif
read EEholedetectL,temp0
if tempHi_wLg<temp0 then 'a hole, no ground detected so update obstacles memory
peek obstaclesL,temp0
temp0 =temp0 +mholeB +mholeT max mholes
poke obstaclesL,temp0
peek obstaclesR,temp0
temp0 =temp0 +mholeB max mholes 'so back and turn
poke obstaclesR,temp0
endif
sertxd(cr,"wL",#tempHi_wLg)
return
QGwhiskerR:
low GwhiskerLedR_ 'RwLED on
readadc GwhiskerR,tempLo_wRg 'withLEDon
high GwhiskerLedR_ 'RwLED off
readadc GwhiskerR,lightR 'ambient light
if lightR>tempLo_wRg then 'why this happens I don't know
lightL =tempLo_wRg
endif
read EEholedetectR,temp0
if tempLo_wRg<temp0 then 'a hole, no ground detected so update obstacles memory
peek obstaclesR,temp0
temp0 =temp0 +mholeB +mholeT max mholes
poke obstaclesR,temp0
peek obstaclesL,temp0
temp0 =temp0 +mholeB max mholes 'so back and turn
poke obstaclesL,temp0
endif
sertxd(" wR",#tempLo_wRg)
return
'-----------------------------------------
badkey:
low eyeLedR_
pause 100
high eyeLedR_
low eyeLedL_
pause 100
high eyeLedL_
return
beep50:
sound VoiceLed_,(50,10)
return
beep150:
sound VoiceLed_,(150,10)
return
EyesOFF:
high eyeLedR_
high eyeLedL_
return
EyesON:
low eyeLedR_
low eyeLedL_
return
IRgetAct_cmnd:
irin iIRin,cmnd 'key1 - key8 => 0-7
if cmnd<8 then _IRgetActEnd
gosub badkey
goto IRgetAct_cmnd 'repeat until valid act
_IRgetActEnd:
gosub beep50
return
waitnokey:
irin [50,_nokeyend],iIRin,cmnd'irin timeout =>return
goto waitnokey
_nokeyend:
return
adjustrollC:
temp0_EE =EErollC
low GwhiskerLedR_ 'LED on, Right servo is Roll
goto _adjustC
adjustpaceC:
temp0_EE =EEpaceC
low GwhiskerLedL_ 'LED on, Left servo is Pace
_adjustC:
tempw =Smoveby 'save Smoveby
Smoveby =0
_IRupdw:
if cmnd = KEY_POWER then 'finished
write EErollC,rollC
write EEpaceC,paceC
Smoveby =tempw 'restore moveby
high GwhiskerLedL_
high GwhiskerLedR_
return
endif
if temp0_EE=EErollC then 'do rollC
select cmnd
case KEY_MINUS
rollC =rollC -1
case KEY_PLUS
rollC =rollC +1
else
gosub badkey
endselect
else 'do paceC
select cmnd
case KEY_MINUS
paceC =paceC -1
case KEY_PLUS
paceC =paceC +1
else
gosub badkey
endselect
endif
gosub _iStand
irin iIRin,cmnd
gosub beep50
goto _IRupdw
'=================================================================
[page top]
Revisions