Starter Pack Page:
Packs
Wham pack PicOne pack 1 PicOne pack 2 Wham Drag raceDownloads
see Downloads pageSymbols
these are names for commonly used pins, data items, and numbers.
Choose the set suitable for your robot, and copy and paste the symbols into your program
ToyOta, Harvey and Alice
symbol leftsw = pinc.0 symbol rightsw = pinc.1 symbol leftLED = b.2 symbol rightLED = b.1 symbol piezo = b.0 symbol TVremote = c.7 symbol LMotorFWD = b.4 symbol LMotorBACK = b.5 symbol RMotorFWD = b.6 symbol RMotorBACK = b.7 symbol sensor = c.2 ; readadc line sensor
BOT115
symbol sensor = C.2 symbol LeftMotorFwd = B.4 symbol LeftMotorBack = B.5
WHAM 2
Topsymbol bswitch = pina.0 ; back switch symbol fswitch = pinc.3 ; front switch symbol rmotor = c.2 ; right motor symbol lmotor = c.1 ; left motor symbol LED1 = a.1 ; left LED symbol LED2 = a.2 ; middle LED symbol LED3 = a.3 ; right LED symbol Fsensor = 12 ; Front sensor (ADC) B.0 symbol Lsensor = 19 ; Left sensor (ADC) C.7 symbol Rsensor = 18 ; Right sensor (ADC) C.6 symbol tvremote = C.5
Wham starter Pack 2
Copy and paste the program below to start you off on line following. It includes code for Derivative to be added to the sensor reading.It also includes code forTV Remote setting of EEPROM data.
- or Download here
This should give extra stability.
'StarterStarter Pack FOR WHAM 2 '========================================================= ' 26/1/2020 'PORTS 'a.0 = Back pushbutton 'a.1 = Left LED 'a.2 = middle LED 'a.3 = right LED 3 ' 'b.0 = Front sensor ' 'c.0 = Odometry input 'c.1 = Left motor PWM output 'c.2 = Right motor PWM output 'c.3 = Front pushbutton 'c.4 = No connection 'c.5 = TV remote receiver 'c.6 = Right sensor 'c.7 = Left sensor ' 'DIRECTIVES #picaxe 28X2 #no_table 'No data download ' 'SYMBOLS FOR INPUTS/OUTPUTS symbol bswitch = pina.0 'back switch symbol fswitch = pinc.3 'front switch symbol rmotor = c.2 symbol lmotor = c.1 symbol LED1 = a.1 symbol LED2 = a.2 symbol LED3 = a.3 symbol TVR = C.5 ; symbols must use Channel numbers for readadc symbol Fsensor = 12 ; B.0 symbol Lsensor = 19 ; C.7 symbol Rsensor = 18 ; C.6 'SYMBOLS FOR Useful numbers symbol stopspeed = 490 ; PWM output to stop the motors symbol centre = 128 ; Line sensor centre reading symbol Kp =10 ; amount of Derivative. 'DECLARE SYMBOLS FOR VARIABLES symbol leftspeed = W1 symbol rightspeed = W2 symbol value = W3 symbol oldvalue = W4 symbol correction = W5 symbol corrected = W6 ; Sensor reading after Derivative applied '************************************************************************ ' INITIALISATION '************************************************************************ gosub setup ; loop to await front button, displaying sensor do readadc Fsensor,value ; line sensor value if value > centre then high LED2 ; middle else low LED2 endif debug ; debug takes about 500 ms! loop while fswitch = 1 ; loop while button not pressed gosub ronan low LED1,LED2,LED3 ; loop controlling motor speeds from sensor top: do oldvalue = value readadc Fsensor,value ; line sensor correction = value - oldvalue * Kp ; extra to add because of rate of change corrected = value + correction ; check for underflow if corrected > 32000 then corrected = 0 endif ; *******************Your program**************************** ; use "corrected" as your sensor reading, ; use "centre" as the line sensor reading for straight ; use "rightspeed" and "leftspeed" as your motorspeeds ; this just stops the motors... ;rightspeed = stopspeed ;leftspeed = stopspeed read 0,word leftspeed read 2,word rightspeed ; *********************************************** gosub checkspeeds ; check speed values gosub setmotors ; output speeds to motors loop ;====================SUBROUTINES=============== checkspeeds: if leftspeed > 32767 then ; check for underflow leftspeed = 0 endif leftspeed = leftspeed max 1023 ; limit max positive number if rightspeed > 32767 then ; check for underflow rightspeed = 0 endif rightspeed = rightspeed max 1023 ; limit max positive number return ;================ setmotors: pwmduty lmotor,leftspeed pwmduty rmotor,rightspeed return ;================ setup: setfreq em64 'run faster 'Configure ports B and C let dirsB = %11111110 let dirsC = %00000110 '1=output, 0=input ' stop motors pwmout pwmdiv4, rmotor, 255,stopspeed 'stop right motor pwmout pwmdiv4, lmotor, 255,stopspeed 'stop left motor sertxd("Wham_starter_pack 2.bas 26/1/2020",13,10) ' send message to Terminal window return ;================ '************************************************************************ symbol lastbutton = B55 symbol thisbutton = B54 ronan: if pinc.5=0 then return 'return if TV receiver powered down end if high LED1 ; fswitch - 0 on entry pause 2000 ; check for long press if fswitch = 1 then ; if button released in time return ; then return endif high LED2 w1 = 0 do irin TVR, thisbutton ' Wham! high LED3 pause 1000 low LED3 select thisbutton case <= 9 if lastbutton > 9 then w1 = 0 endif if thisbutton = 9 then thisbutton=0 else thisbutton = thisbutton+1 'on simulation, remove this line. on remote, include this line. endif w1 = w1 * 10 + thisbutton 'multiplies by 10 first case = 21 'if power button is pressed return ; from ronan case = 16 'CHA+ write 0,word w1 read 0, word w2 case = 17 'CHA- write 2,word w1 read 2, word w3 case = 18 'VOL+ write 4,word w1 read 4, word w4 case = 19 'VOL- write 6,word w1 read 6, word w5 case = 20 'MUTE write 8,word w1 read 8, word w6 case = 101 ' OK , reads all values and debugs. read 0, word w0 read 2, word w1 read 4, word w2 read 6, word w3 read 8, word w4 debug thisbutton = 101 endselect lastbutton = thisbutton loop ; end of program
PicOne starter Pack 1
TopCopy and paste the program below to start you off on very slow line following.
- or Download here
It includes code for Line following.
;PicOne Starter Pack.bas.txt '========================================================= ' 12/1/2020 ; updated for Pic One #rem LEDs ==== High 4 ; Right LED on Low 4 ; Right LED off High 6 ; centre LED on Low 6 ; centre LED off High 7 ; Left LED on Low 7 ; Left LED off Wall sensors ============ Readadc 0,b0 ; left wall sensor Readadc 1,b1 ; front wall sensor Readadc 2,b2 ; right sensor *sensor gets number between 0 and 255 depending on its distance from object sensed. Line sensor =========== Readadc 3,b3 ; line (...) sensor Reverse right motor ============== high 1 ; reverses right motor relay. It can only reverse the right motor meaning you can only spin right. If you do high 1 then the right motor will go backwards at the speed you programmed. If you do low 1 then it puts the right wheel back to going forward. Read wall Sensors: ================== high portc 5 ; turns on Infra red illumination readadc 0,b0 readadc 1,b1 readadc 2,b2 low portc 5 ; turns off Infra red illumination Motors: ======= low portc 1 ;right motor off high portc 2 ;left motor on pwmout 1,255,1023 ; right_motor full speed pwmout 1,255,512 ; right_motor half speed pwmout 1,255,0 ; right_motor stop pwmout 2,255,1023 ; left full speed pwmout 2,255,512 ; left half speed pwmout 2,255,0 ; left stop pwmout 2,255,left_motor Push buttons: ============= if pin6=0 then ; if start button pressed do while pin6 =1 : loop ; wait for start button Wheel Sensors: do while pin0 =1 : loop ; wait for left wheel counter do while pin3 =1 : loop ; wait for right wheel counter ; TV remote irin c.7,b0 ; wait for TV remote key #endrem ' 'DIRECTIVES #picaxe 28X1 #no_table 'No data download ' 'SYMBOLS FOR INPUTS/OUTPUTS symbol startbutton = pin6 'start button symbol rmotor = 1 symbol lmotor = 2 symbol LED1 = 7 ; left LED symbol LED2 = 6 ; centre LED symbol LED3 = 4 ; right LED ; symbols must use Channel numbers for readadc symbol Fsensor = 3 ; A.3 'SYMBOLS FOR Useful numbers symbol stopspeed = 0 ; PWM output to stop the motors symbol centre = 128 ; Line sensor centre reading symbol Kp =10 ; amount of Derivative. 'DECLARE SYMBOLS FOR VARIABLES symbol leftspeed = W1 symbol rightspeed = W2 symbol value = W3 symbol oldvalue = W4 symbol correction = W5 symbol corrected = W6 ; Sensor reading after Derivative applied symbol leftish = 80 symbol rightish = 160 '************************************************************************ ' INITIALISATION '************************************************************************ gosub setup ; loop to await front button, displaying sensor do readadc Fsensor,value ; line sensor value if value > centre then high LED2 ; middle else low LED2 endif debug ; debug takes about 500 ms! loop while startbutton = 1 ; loop while button not pressed ; loop controlling motor speeds from sensor top: do oldvalue = value readadc Fsensor,value ; line sensor correction = value - oldvalue * Kp ; extra to add because of rate of change corrected = value + correction ; check for underflow if corrected > 32000 then corrected = 0 endif ; *******************Your program**************************** ; use "corrected" as your sensor reading, ; use "centre" as the line sensor reading for straight ; use "rightspeed" and "leftspeed" as your motorspeeds if corrected > rightish then high LED3 low LED1,LED2 rightspeed = stopspeed +500 leftspeed = stopspeed else if corrected > leftish then high LED2 low LED1,LED3 rightspeed = stopspeed +500 leftspeed = stopspeed +500 else high LED1 low LED2,LED3 rightspeed = stopspeed leftspeed = stopspeed +500 endif endif ; this just stops the motors... ; rightspeed = stopspeed ; leftspeed = stopspeed ; *********************************************** gosub checkspeeds ; check speed values gosub setmotors ; output speeds to motors loop ;====================SUBROUTINES=============== checkspeeds: if leftspeed > 32767 then ; check for underflow leftspeed = 0 endif leftspeed = leftspeed max 1023 ; limit max positive number if rightspeed > 32767 then ; check for underflow rightspeed = 0 endif rightspeed = rightspeed max 1023 ; limit max positive number return setmotors: Pwmout 1 ,255,rightspeed Pwmout 2 ,255,leftspeed return setup: setfreq m8 'run faster ' stop motors Pwmout 1 ,255,0 Pwmout 2 ,255,0 sertxd("PicOne Starter Pack.bas.txt",13,10) ' send message to Terminal window return ; end of program
PicOne starter Pack 2
TopCopy and paste the program below to start you off on maze solving. It includes code for sensing walls and wheel counting.
It also includes code for TV Remote setting of EEPROM data.
- or Download here
This lets you test motor speeds and wheel counters and wall sensors.
;PicOne Starter Pack 2.bas '========================= ' 27/1/2020 ; updated for Pic One ; wheel counters #rem EXAMPLES OF CODE LEDs ==== High 4 ; Right LED on Low 4 ; Right LED off High 6 ; centre LED on Low 6 ; centre LED off High 7 ; Left LED on Low 7 ; Left LED off Wall sensors ============ Readadc 0,b0 ; left wall sensor Readadc 1,b1 ; front wall sensor Readadc 2,b2 ; right sensor *sensor gets number between 0 and 255 depending on its distance from object sensed. Line sensor =========== Readadc 3,b3 ; line (...) sensor Reverse right motor ============== high 1 ; reverses right motor relay. It can only reverse the right motor meaning you can only spin right. If you do high 1 then the right motor will go backwards at the speed you programmed. If you do low 1 then it puts the right wheel back to going forward. Read wall Sensors: ================== high portc 5 ; turns on Infra red illumination readadc 0,b0 readadc 1,b1 readadc 2,b2 low portc 5 ; turns off Infra red illumination Motors: ======= low portc 1 ;right motor off high portc 2 ;left motor on pwmout 1,255,1023 ; right_motor full speed pwmout 1,255,512 ; right_motor half speed pwmout 1,255,0 ; right_motor stop pwmout 2,255,1023 ; left full speed pwmout 2,255,512 ; left half speed pwmout 2,255,0 ; left stop pwmout 2,255,left_motor Push buttons: ============= if pin6=0 then ; if start button pressed do while pin6 =1 : loop ; wait for start button Wheel Sensors: do while pin0 =1 : loop ; wait for left wheel counter do while pin3 =1 : loop ; wait for right wheel counter ; TV remote irin c.7,b0 ; wait for TV remote key END OF EXAMPLES #endrem ' 'DIRECTIVES #picaxe 28X1 #no_table 'No data download ' 'SYMBOLS FOR INPUTS/OUTPUTS symbol startbutton = pin6 'start button symbol rmotor = 1 symbol lmotor = 2 symbol LED1 = 7 ; left LED symbol LED2 = 6 ; centre LED symbol LED3 = 4 ; right LED symbol Lwheel = pin0 ' left wheel state symbol Rwheel = pin3 ' right wheel state symbol TVR = 7 ; c.7 TV remote ; symbols must use Channel numbers for readadc symbol Fsensor = 3 ; A.3 'SYMBOLS FOR Useful numbers symbol stopspeed = 0 ; PWM output to stop the motors symbol centre = 128 ; Line sensor centre reading symbol Kp =10 ; amount of Derivative. symbol leftish = 80 symbol rightish = 160 'DECLARE SYMBOLS FOR VARIABLES symbol leftvalue = b0 ; left wall sensor symbol frontvalue = b1 ; front wall sensor symbol rightvalue = b2 ; right wall sensor symbol leftspeed = W4 symbol rightspeed = W5 symbol value = W6 symbol oldvalue = W7 symbol correction = W8 symbol corrected = W9 ; Sensor reading after Derivative applied symbol left_count = b24 symbol right_count = b25 symbol Lwheelstate = b26 symbol Rwheelstate = b27 symbol lastbutton = B26 symbol thisbutton = B27 '************************************************************************ ' INITIALISATION '************************************************************************ gosub setup ; loop to await start button, displaying sensor do gosub wallsensors if leftvalue > 43 then high LED1 ; left else low LED1 endif if b1 > 5 then high LED2 ; middle else low LED2 endif if b2 > 5 then high LED3 ; right else low LED3 endif debug ; debug takes about 500 ms! loop while startbutton = 1 ; loop while button not pressed gosub ronan ; loop counting wheel sensors top: Lwheelstate = 0 Rwheelstate = 0 read 0,word leftspeed ; = 200 read 2,word rightspeed ;= 200 read 4,word W0 left_count = W0 ; set with Vol + right_count = 0 do ; *******************Your program**************************** gosub Count_Right gosub Count_Left if left_count >200 then rightspeed = 0 leftspeed = 0 endif ; *********************************************** gosub checkspeeds ; check speed values gosub setmotors ; output speeds to motors loop ;====================SUBROUTINES=============== checkspeeds: if leftspeed > 32767 then ; check for underflow leftspeed = 0 endif leftspeed = leftspeed max 1023 ; limit max positive number if rightspeed > 32767 then ; check for underflow rightspeed = 0 endif rightspeed = rightspeed max 1023 ; limit max positive number return ;================= setmotors: Pwmout 1 ,255,rightspeed Pwmout 2 ,255,leftspeed return ;================= setup: setfreq m8 'run faster ' stop motors Pwmout 1 ,255,0 Pwmout 2 ,255,0 sertxd("PicOne Starter Pack 2 counts displ.bas.txt",13,10) ' send message to Terminal window return ;============== Count_Left: if pin0 = 1 then high 7 if Lwheelstate =1 then return endif Lwheelstate =1 else low 7 if Lwheelstate =0 then return endif Lwheelstate =0 inc left_count endif return ;============== Count_Right: if pin3 = 1 then high 4 if Rwheelstate =1 then return endif Rwheelstate =1 else low 4 if Rwheelstate =0 then return endif Rwheelstate =0 inc right_count endif return ;===================== ronan: if pinc.7=0 then return 'return if TV receiver powered down end if high LED1 ; startbutton - 0 on entry pause 1000 ; check for long press if startbutton = 1 then ; if button released in time return ; then return endif high LED2 w1 = 0 do irin TVR, thisbutton ' Wham! high LED3 pause 1000 low LED3 select thisbutton case <= 9 if lastbutton > 9 then w1 = 0 endif if thisbutton = 9 then thisbutton=0 else thisbutton = thisbutton+1 'on simulation, remove this line. on remote, include this line. endif w1 = w1 * 10 + thisbutton 'multiplies by 10 first case = 21 'if power button is pressed return ; from ronan case = 16 'CHA+ write 0,word w1 read 0, word w2 case = 17 'CHA- write 2,word w1 read 2, word w3 case = 18 'VOL+ write 4,word w1 read 4, word w4 case = 19 'VOL- write 6,word w1 read 6, word w5 case = 20 'MUTE write 8,word w1 read 8, word w6 case = 101 ' OK , reads all values and debugs. read 0, word w0 read 2, word w1 read 4, word w2 read 6, word w3 read 8, word w4 debug thisbutton = 101 endselect lastbutton = thisbutton loop wallsensors: high portc 5 'IR leds on readadc 0,leftvalue 'read left wall sensor readadc 1,frontvalue 'read front wall sensor readadc 2,rightvalue 'read right wall sensor low portc 5 'IR leds off return ; end of program
Wham Drag race starter
TopThe program below is the program for drag racing. It uses an "include file" for the complicated stuff.
Wham drag race starter pack Download
Wham drag race include file Download
Note: the downloaded file name must be changed to get it to work with the Picaxe Editor -
You must remove the ".txt" at the end
Wham drag race Student tasks
;Wham Drag race starter pack 8/2/2020. #include "Drag_race_include_V2.basinc" ; needed for all the symbols and subroutines myprog: #rem see the seperate file "Student Drag Race Tasks.txt" for student tasks to be done using this starter pack. This program will need changing for sensor start operation Data W0 - W8 are used by the Include file #endrem symbol Dist = W10 gosub setup ; needed at switch-on switches motors off high LED1 ; Left hand LED ON low LED2,LED3 ; other LEDs OFF ; loop to await front button, displaying sensor reading do readadc Fsensor,value ; line sensor value if value > 140 then high LED3 ; right low LED1,LED2 else if value > 80 then high LED2 ; middle low LED1,LED3 else high LED1 ; left low LED2,LED3 endif endif readadc Rsensor,rvalue ; paper sensor if rvalue >10 then ; if paper detected high LED1,LED2,LED3 gosub wait4paper ; wait till paper goes away ;goto race ; start race when paper goes away endif W9 = timer ; display timer in W9 debug ; debug takes about 500 ms! loop while fswitch = 1 ; loop while front button is not pressed gosub ronan ; input from TV remote on long press race: ;read tuning variables from EEPROM read CHPLUS , word speed ; read speed from EEPROM read CHMINUS , word Kp ; read Kp from EEPROM read VolPLUS , word Kd ; read Kd from EEPROM read VolMINUS , word Dist ; read distance from EEPROM ;debug timer = 0 ; set distance doen track = 0 do pause 10 readadc Fsensor,value ; line sensor value gosub MotorMaths ; calculate left and right speeds from sensor value ;debug gosub setmotors ; check, then set motor speeds ; check for end of track.... if timer > Dist then speed = stopspeed endif ; check for "start again" on back button if bswitch = 0 then myprog loop
© Copyright St Albans Robots