En robot..
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
En robot..
Jag byggde en liten robot (den som synns som min bild). Jag använder SRF04 som avsåndsmätare och kontrollerar den med en Sont-tv-fjärr. Satte dit en LCD som visar batterspänning, avstånd och vilken mod den befinner sig i. kan även visa hjälpmenyer om man så önskar. Den har ett antal olika program i sig som man kan välja med fjärren. Drivningen sköter jag med larvband ifrån Robotshop och motorerna är vanliga servon modifierade för rotation. Lägger programmet under texten här om någon är intresserad av några tips och se lite slarvig programering. Tänkte bara visa det eftersom några har frågat vad det är för skumt jag har som bild.
Jag vet att programet går att effektivisera då det är påbyggt i omgångar och därför lite klumpigt...
CPU = 16F876A
MHZ = 20
CONFIG 16250
; För Pic16f876, robotprogram för robot med ultraljudsmätare och tvåradig lcd-display
; Fjärrkontroll Sony-tv fjärr.
; Tvåradig LCD-kopplad på port B
; Servon utan stopplägen på A0 och A1
; IR-mottagarmodul för 38kHz på C5
; SRF04 ultraljudsmodul på C6 och C7
; Av Bengt Rehnström, rov@chello.se
trisc=$FF ;port C ingångar för ir-sensor och SRF04
trisa=%00111100 ;A0 och A1 utgångar
trisb=$00 ;port B utgångar för LCD
AN2 con 2 ;AN2
clk con 2 ;Hastigheten för A/D-omvandlaren 1/16 clk
adsetup con %10000000 ;port a analog
dsetup con %10000110 ;port a digital
seg var byte ;räknare
volt var word ;Matningsspänningen
i var byte ;räknare
i1 var byte ;räknare
i2 var byte ;räknare
i3 var nib ;räknare
temp var word
time var word(12) ;tiden för pulserna vid ir-mottagning
test var word
index var nib
kod var word ;Fjärrkontrollkoden
kod2 var byte
mellan var bit(12) ;Mellanlargrar resultatet vid ir-mottagning
range var word ;avstånd ifrån SRF04
leta var word
letalåg var word
letai var byte
prog var byte(11) ;programet för minneskörning
low a0
low a1
low a2
lcdwrite b7\b5\b6,portb.nib0,[initlcd1,initlcd2,twoline,clear,home,scr]
pause 100
lcdwrite b7\b5\b6,portb.nib0,["Sonarbot. ver9.4"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["By:rov@chello.se"]
pause 1500
main
seg=0
adin an2,clk,adsetup,volt ; Läser in matningsspänningen
adcon1=dsetup ; Kopplar tillbaka till digitalmode
volt=volt/5 ;omvandlar spänningen till decivolt
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Beordra mig !"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Kraft:",dec volt,"dV"]
repeat
pulsin c5,0,test
seg=seg+1
if seg>50 then
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Mer info:"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Tryck MENU"]
pause 700
goto main
ENDIF
until test>2100
pulsin c5,0,time(0) ;läser in de elva bitarna i RC5-koden
pulsin c5,0,time(1)
pulsin c5,0,time(2)
pulsin c5,0,time(3)
pulsin c5,0,time(4)
pulsin c5,0,time(5)
pulsin c5,0,time(6)
pulsin c5,0,time(7)
;pulsin c5,0,time(8)
;pulsin c5,0,time(9)
;pulsin c5,0,time(10)
;pulsin c5,0,time(11)
kod=0 ;avkodar pulslängden till ettor och nollor
for i =0 to 7
if time(i)>550 and time(i)<750 then
mellan(i)=0
else
mellan(i)=1
endif
if time(i)<550 or time(i)>1500 then main
next
kod.bit0=mellan(0) ;sätter de åtta lsb av koden till variabeln kod
kod.bit1=mellan(1)
kod.bit2=mellan(2)
kod.bit3=mellan(3)
kod.bit4=mellan(4)
kod.bit5=mellan(5)
kod.bit6=mellan(6)
kod.bit7=mellan(7)
if kod=129 then gosub fram ;2
if kod=135 then gosub back ;8
if kod=133 then gosub höger ;6
if kod=131 then gosub vänster ;4
if kod=130 then gosub mjukhöger ;3
if kod=128 then gosub mjukvänster ;1
if kod=132 then goto sonar ;5
if kod=139 then goto race ;Enter
if kod=227 then goto öppen ;Exit
if kod=134 then gosub backvänster ;7
if kod=136 then gosub backhöger ;9
if kod=137 then gosub wee ;0
if kod=149 then goto program ;Power
if kod=144 then goto prog3 ;ch+
if kod=224 then goto menu ;menu
goto main
program ;Power på fjärren, låter dig programera 10 rörelser
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Programeringmode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg 1"]
i2=1
prog1
repeat
pulsin c5,0,test
until test>2100
pulsin c5,0,time(0) ;läser in de elva bitarna i RC5-koden
pulsin c5,0,time(1)
pulsin c5,0,time(2)
pulsin c5,0,time(3)
pulsin c5,0,time(4)
pulsin c5,0,time(5)
pulsin c5,0,time(6)
pulsin c5,0,time(7)
pulsin c5,0,time(8)
pulsin c5,0,time(9)
pulsin c5,0,time(10)
pulsin c5,0,time(11)
kod=0
for i =0 to 11
if time(i)>550 and time(i)<750 then
mellan(i)=0
else
mellan(i)=1
endif
if time(i)<550 or time(i)>1500 then prog1
next
kod.bit0=mellan(0)
kod.bit1=mellan(1)
kod.bit2=mellan(2)
kod.bit3=mellan(3)
kod.bit4=mellan(4)
kod.bit5=mellan(5)
kod.bit6=mellan(6)
kod.bit7=mellan(7)
prog(i2)=kod
;gosub wee ; Roboten hoppar till för att visa att programeringen "tagit"
pause 100 ; Väntar så att man inte dubbeltrycker kommandon
i2=i2+1
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Programeringmode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg:",dec (i2-1),"/10"]
if i2>9 then goto prog3
goto prog1
prog3
for i2=1 to 10
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Utfor program"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg:",dec i2,"/10"]
for i1=1 to 5
if prog(i2)=129 then gosub fram ;2 på fjärren
if prog(i2)=135 then gosub back ;8 på fjärren
if prog(i2)=133 then gosub höger ;6 på fjärren
if prog(i2)=131 then gosub vänster ;4 på fjärren
if prog(i2)=130 then gosub mjukhöger ;3 på fjärren
if prog(i2)=128 then gosub mjukvänster ;1 på fjärren
if prog(i2)=134 then gosub backvänster ;7 på fjärren
if prog(i2)=136 then gosub backhöger ;9 på fjärren
if prog(i2)=137 then gosub wee ;0 på fjärren
next
next
goto main
race ;ENTER på fjärren
pulsout c6,20
pulsin c7,1,range
range=range/60 ;Ger avståndet i cm
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Racemode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Avstand:",dec range,"cm"]
pause 6
if range<30 then
gosub back
gosub vänster
gosub vänster
gosub vänster
gosub vänster
gosub vänster
gosub back
gosub vänster
gosub vänster
gosub fram
gosub mjukvänster
gosub mjukvänster
gosub fram
gosub mjukvänster
endif
if range<35 then gosub vänster
if range<100 and range>90 then gosub mjukvänster
if range<120 and range>110 then gosub mjukhöger
gosub fram
gosub fram
pause 20
pulsin c5,0,test
if test>2100 and test<3000 then goto main
goto race
öppen ; EXIT på fjärren, letar efter öppna ytor
range=100
leta=0
letai=0
for i2=1 to 30
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Rundletar:",dec range]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["steg:",dec i2,"/30"]
pulsout c6,20 ; trigga SRF04
pulsin c7,1,range ; Läsa avståndet
pause 7
gosub höger
if portc.bit5=0 then main
range=range/60
if range>leta then
leta=range
letai=i2
endif
if range>250 then goto öppen2
if range<20 then ;back om varvet inte är fritt
gosub back
gosub back
endif
next
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Snurra tillbaka"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,[dec (30-letai)," steg"]
for i2=1 to (30-letai) ; snurra tillbaka till det stället där avståndet var störst
gosub vänster
if portc.bit5=0 then main
;pulsin c5,0,test
;if test>2100 and test<3000 then goto main
next
öppen2
repeat
gosub fram2
pulsout c6,20
pulsin c7,1,range
range=range/60
pulsout a0,2000
pause 6
pulsout a1,1000
if portc.bit5=0 then main
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Lallar fram"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Range:",dec range,"cm"]
until range<35
;pulsin c5,0,test
;if test>2100 and test<3000 then goto main
goto öppen
sonar ; 5 an på fjärren
pulsout c6,20 ; Triggar SRF04
pulsin c7,1,range ; Läser in avståndet
range=range/60 ; Omvandlar avståndet till cm
pause 17
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Letar mig runt"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Avstand:",dec range,"cm"]
if range<10 then
gosub back
gosub back
gosub backvänster
gosub vänster
endif
if range<15 and range>9 then gosub backvänster
if range<20 and range>14 then gosub vänster
if range<30 and range>19 then gosub fram
if range<50 and range>29 then gosub mjukvänster
if range<60 and range>49 then gosub fram
if range<70 and range>59 then gosub mjukhöger
if range>69 then gosub fram
if range>150 and range<160 then gosub mjukvänster
pause 30
pulsin c5,0,test
if test>2100 and test<3000 then ; återvända till main om någon knapp trycks in på fjärren
goto main
endif
goto sonar
menu
seg=0
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["1=Sensor 2=IR"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["3=Info om komandon"]
repeat
pulsin c5,0,test
seg=seg+1
if seg>40 then goto menu2
until test>2100
pulsin c5,0,time(0) ;läser in de elva bitarna i RC5-koden
pulsin c5,0,time(1)
pulsin c5,0,time(2)
pulsin c5,0,time(3)
pulsin c5,0,time(4)
pulsin c5,0,time(5)
pulsin c5,0,time(6)
pulsin c5,0,time(7)
pulsin c5,0,time(8)
pulsin c5,0,time(9)
pulsin c5,0,time(10)
pulsin c5,0,time(11)
kod=0
for i =0 to 11
if time(i)>550 and time(i)<750 then
mellan(i)=0
else
mellan(i)=1
endif
if time(i)<550 or time(i)>1500 then prog1
next
kod.bit0=mellan(0)
kod.bit1=mellan(1)
kod.bit2=mellan(2)
kod.bit3=mellan(3)
kod.bit4=mellan(4)
kod.bit5=mellan(5)
kod.bit6=mellan(6)
kod.bit7=mellan(7)
if kod=128 then gosub sensor
if kod=129 then gosub irtest
if kod=130 then gosub info
if kod=227 then
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,[" Vi ses !"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,[">-----MAIN-----<"]
pause 200
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["->----MAIN----<-"]
pause 200
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["-->---MAIN---<--"]
pause 200
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["--->--MAIN--<---"]
pause 200
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["---->-MAIN-<----"]
pause 200
goto main
endif
goto menu
menu2
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Avsluta med"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["EXIT-knappen"]
pause 500
goto menu
info
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["2=Fram 8=Back"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["6=Hoger "]
pause 2000
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["4=Vanster"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["1,3,4,7,9=Mjuk"]
pause 2000
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["EXIT=Rundleta"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["ENTER=Racemode"]
pause 2000
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["POWER=Program"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["CH+=Repeter prog"]
pause 2000
return
irtest
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Startpuls:",dec test,"uS"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Data:",dec time(0)," ",dec time(1),"uS"]
pause 1600
return
sensor
adin an2,clk,adsetup,volt ; Läser in matningsspänningen
adcon1=dsetup ; Kopplar tillbaka till digitalmode
volt=volt/5 ;omvandlar spänningen till decivolt
pulsout c6,20 ; Triggar SRF04
pulsin c7,1,range ; Läser in avståndet
range=range/60 ; Omvandlar avståndet till cm
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Avstand:",dec range]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Kraft:",dec volt,"dV"]
pause 1500
return
;---RÖRELSESUBRUTINER---
;-----------------------
wee ; 0 an på fjärren, får robboten att hoppa till lite
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Hoppsan !"]
pause 6
for i=1 to 5
pulsout a0,2000
pause 5
pulsout a1,1000
pause 5
next
for i=1 to 5
pulsout a0,1000
pause 5
pulsout a1,2000
pause 5
next
return
stanna ; Stå still bara
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,1515
pause 6
next
return
back ; kör rakt bakåt
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,2000
pause 6
next
return
fram ; Kör framåt
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,1000
pause 6
next
return
fram2 ; Kör framåt
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,1000
pause 6
next
return
vänster ; sväng vänster med "saxade" motorer
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,1000
pause 6
next
return
höger ; sväng höger med "saxade" motorer
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,2000
pause 6
next
return
mjukhöger ; sväng höger med en stoppad motor
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,1515
pause 6
next
return
mjukvänster ; sväng vänster med en stoppad motor
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,1000
pause 6
next
return
backvänster ; backa vänster med en stoppad motor
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,1515
pause 6
next
return
backhöger ; backa höger med en stoppad motor
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,2000
pause 6
next
return
End
Jag vet att programet går att effektivisera då det är påbyggt i omgångar och därför lite klumpigt...
CPU = 16F876A
MHZ = 20
CONFIG 16250
; För Pic16f876, robotprogram för robot med ultraljudsmätare och tvåradig lcd-display
; Fjärrkontroll Sony-tv fjärr.
; Tvåradig LCD-kopplad på port B
; Servon utan stopplägen på A0 och A1
; IR-mottagarmodul för 38kHz på C5
; SRF04 ultraljudsmodul på C6 och C7
; Av Bengt Rehnström, rov@chello.se
trisc=$FF ;port C ingångar för ir-sensor och SRF04
trisa=%00111100 ;A0 och A1 utgångar
trisb=$00 ;port B utgångar för LCD
AN2 con 2 ;AN2
clk con 2 ;Hastigheten för A/D-omvandlaren 1/16 clk
adsetup con %10000000 ;port a analog
dsetup con %10000110 ;port a digital
seg var byte ;räknare
volt var word ;Matningsspänningen
i var byte ;räknare
i1 var byte ;räknare
i2 var byte ;räknare
i3 var nib ;räknare
temp var word
time var word(12) ;tiden för pulserna vid ir-mottagning
test var word
index var nib
kod var word ;Fjärrkontrollkoden
kod2 var byte
mellan var bit(12) ;Mellanlargrar resultatet vid ir-mottagning
range var word ;avstånd ifrån SRF04
leta var word
letalåg var word
letai var byte
prog var byte(11) ;programet för minneskörning
low a0
low a1
low a2
lcdwrite b7\b5\b6,portb.nib0,[initlcd1,initlcd2,twoline,clear,home,scr]
pause 100
lcdwrite b7\b5\b6,portb.nib0,["Sonarbot. ver9.4"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["By:rov@chello.se"]
pause 1500
main
seg=0
adin an2,clk,adsetup,volt ; Läser in matningsspänningen
adcon1=dsetup ; Kopplar tillbaka till digitalmode
volt=volt/5 ;omvandlar spänningen till decivolt
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Beordra mig !"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Kraft:",dec volt,"dV"]
repeat
pulsin c5,0,test
seg=seg+1
if seg>50 then
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Mer info:"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Tryck MENU"]
pause 700
goto main
ENDIF
until test>2100
pulsin c5,0,time(0) ;läser in de elva bitarna i RC5-koden
pulsin c5,0,time(1)
pulsin c5,0,time(2)
pulsin c5,0,time(3)
pulsin c5,0,time(4)
pulsin c5,0,time(5)
pulsin c5,0,time(6)
pulsin c5,0,time(7)
;pulsin c5,0,time(8)
;pulsin c5,0,time(9)
;pulsin c5,0,time(10)
;pulsin c5,0,time(11)
kod=0 ;avkodar pulslängden till ettor och nollor
for i =0 to 7
if time(i)>550 and time(i)<750 then
mellan(i)=0
else
mellan(i)=1
endif
if time(i)<550 or time(i)>1500 then main
next
kod.bit0=mellan(0) ;sätter de åtta lsb av koden till variabeln kod
kod.bit1=mellan(1)
kod.bit2=mellan(2)
kod.bit3=mellan(3)
kod.bit4=mellan(4)
kod.bit5=mellan(5)
kod.bit6=mellan(6)
kod.bit7=mellan(7)
if kod=129 then gosub fram ;2
if kod=135 then gosub back ;8
if kod=133 then gosub höger ;6
if kod=131 then gosub vänster ;4
if kod=130 then gosub mjukhöger ;3
if kod=128 then gosub mjukvänster ;1
if kod=132 then goto sonar ;5
if kod=139 then goto race ;Enter
if kod=227 then goto öppen ;Exit
if kod=134 then gosub backvänster ;7
if kod=136 then gosub backhöger ;9
if kod=137 then gosub wee ;0
if kod=149 then goto program ;Power
if kod=144 then goto prog3 ;ch+
if kod=224 then goto menu ;menu
goto main
program ;Power på fjärren, låter dig programera 10 rörelser
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Programeringmode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg 1"]
i2=1
prog1
repeat
pulsin c5,0,test
until test>2100
pulsin c5,0,time(0) ;läser in de elva bitarna i RC5-koden
pulsin c5,0,time(1)
pulsin c5,0,time(2)
pulsin c5,0,time(3)
pulsin c5,0,time(4)
pulsin c5,0,time(5)
pulsin c5,0,time(6)
pulsin c5,0,time(7)
pulsin c5,0,time(8)
pulsin c5,0,time(9)
pulsin c5,0,time(10)
pulsin c5,0,time(11)
kod=0
for i =0 to 11
if time(i)>550 and time(i)<750 then
mellan(i)=0
else
mellan(i)=1
endif
if time(i)<550 or time(i)>1500 then prog1
next
kod.bit0=mellan(0)
kod.bit1=mellan(1)
kod.bit2=mellan(2)
kod.bit3=mellan(3)
kod.bit4=mellan(4)
kod.bit5=mellan(5)
kod.bit6=mellan(6)
kod.bit7=mellan(7)
prog(i2)=kod
;gosub wee ; Roboten hoppar till för att visa att programeringen "tagit"
pause 100 ; Väntar så att man inte dubbeltrycker kommandon
i2=i2+1
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Programeringmode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg:",dec (i2-1),"/10"]
if i2>9 then goto prog3
goto prog1
prog3
for i2=1 to 10
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Utfor program"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg:",dec i2,"/10"]
for i1=1 to 5
if prog(i2)=129 then gosub fram ;2 på fjärren
if prog(i2)=135 then gosub back ;8 på fjärren
if prog(i2)=133 then gosub höger ;6 på fjärren
if prog(i2)=131 then gosub vänster ;4 på fjärren
if prog(i2)=130 then gosub mjukhöger ;3 på fjärren
if prog(i2)=128 then gosub mjukvänster ;1 på fjärren
if prog(i2)=134 then gosub backvänster ;7 på fjärren
if prog(i2)=136 then gosub backhöger ;9 på fjärren
if prog(i2)=137 then gosub wee ;0 på fjärren
next
next
goto main
race ;ENTER på fjärren
pulsout c6,20
pulsin c7,1,range
range=range/60 ;Ger avståndet i cm
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Racemode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Avstand:",dec range,"cm"]
pause 6
if range<30 then
gosub back
gosub vänster
gosub vänster
gosub vänster
gosub vänster
gosub vänster
gosub back
gosub vänster
gosub vänster
gosub fram
gosub mjukvänster
gosub mjukvänster
gosub fram
gosub mjukvänster
endif
if range<35 then gosub vänster
if range<100 and range>90 then gosub mjukvänster
if range<120 and range>110 then gosub mjukhöger
gosub fram
gosub fram
pause 20
pulsin c5,0,test
if test>2100 and test<3000 then goto main
goto race
öppen ; EXIT på fjärren, letar efter öppna ytor
range=100
leta=0
letai=0
for i2=1 to 30
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Rundletar:",dec range]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["steg:",dec i2,"/30"]
pulsout c6,20 ; trigga SRF04
pulsin c7,1,range ; Läsa avståndet
pause 7
gosub höger
if portc.bit5=0 then main
range=range/60
if range>leta then
leta=range
letai=i2
endif
if range>250 then goto öppen2
if range<20 then ;back om varvet inte är fritt
gosub back
gosub back
endif
next
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Snurra tillbaka"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,[dec (30-letai)," steg"]
for i2=1 to (30-letai) ; snurra tillbaka till det stället där avståndet var störst
gosub vänster
if portc.bit5=0 then main
;pulsin c5,0,test
;if test>2100 and test<3000 then goto main
next
öppen2
repeat
gosub fram2
pulsout c6,20
pulsin c7,1,range
range=range/60
pulsout a0,2000
pause 6
pulsout a1,1000
if portc.bit5=0 then main
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Lallar fram"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Range:",dec range,"cm"]
until range<35
;pulsin c5,0,test
;if test>2100 and test<3000 then goto main
goto öppen
sonar ; 5 an på fjärren
pulsout c6,20 ; Triggar SRF04
pulsin c7,1,range ; Läser in avståndet
range=range/60 ; Omvandlar avståndet till cm
pause 17
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Letar mig runt"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Avstand:",dec range,"cm"]
if range<10 then
gosub back
gosub back
gosub backvänster
gosub vänster
endif
if range<15 and range>9 then gosub backvänster
if range<20 and range>14 then gosub vänster
if range<30 and range>19 then gosub fram
if range<50 and range>29 then gosub mjukvänster
if range<60 and range>49 then gosub fram
if range<70 and range>59 then gosub mjukhöger
if range>69 then gosub fram
if range>150 and range<160 then gosub mjukvänster
pause 30
pulsin c5,0,test
if test>2100 and test<3000 then ; återvända till main om någon knapp trycks in på fjärren
goto main
endif
goto sonar
menu
seg=0
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["1=Sensor 2=IR"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["3=Info om komandon"]
repeat
pulsin c5,0,test
seg=seg+1
if seg>40 then goto menu2
until test>2100
pulsin c5,0,time(0) ;läser in de elva bitarna i RC5-koden
pulsin c5,0,time(1)
pulsin c5,0,time(2)
pulsin c5,0,time(3)
pulsin c5,0,time(4)
pulsin c5,0,time(5)
pulsin c5,0,time(6)
pulsin c5,0,time(7)
pulsin c5,0,time(8)
pulsin c5,0,time(9)
pulsin c5,0,time(10)
pulsin c5,0,time(11)
kod=0
for i =0 to 11
if time(i)>550 and time(i)<750 then
mellan(i)=0
else
mellan(i)=1
endif
if time(i)<550 or time(i)>1500 then prog1
next
kod.bit0=mellan(0)
kod.bit1=mellan(1)
kod.bit2=mellan(2)
kod.bit3=mellan(3)
kod.bit4=mellan(4)
kod.bit5=mellan(5)
kod.bit6=mellan(6)
kod.bit7=mellan(7)
if kod=128 then gosub sensor
if kod=129 then gosub irtest
if kod=130 then gosub info
if kod=227 then
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,[" Vi ses !"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,[">-----MAIN-----<"]
pause 200
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["->----MAIN----<-"]
pause 200
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["-->---MAIN---<--"]
pause 200
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["--->--MAIN--<---"]
pause 200
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["---->-MAIN-<----"]
pause 200
goto main
endif
goto menu
menu2
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Avsluta med"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["EXIT-knappen"]
pause 500
goto menu
info
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["2=Fram 8=Back"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["6=Hoger "]
pause 2000
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["4=Vanster"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["1,3,4,7,9=Mjuk"]
pause 2000
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["EXIT=Rundleta"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["ENTER=Racemode"]
pause 2000
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["POWER=Program"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["CH+=Repeter prog"]
pause 2000
return
irtest
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Startpuls:",dec test,"uS"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Data:",dec time(0)," ",dec time(1),"uS"]
pause 1600
return
sensor
adin an2,clk,adsetup,volt ; Läser in matningsspänningen
adcon1=dsetup ; Kopplar tillbaka till digitalmode
volt=volt/5 ;omvandlar spänningen till decivolt
pulsout c6,20 ; Triggar SRF04
pulsin c7,1,range ; Läser in avståndet
range=range/60 ; Omvandlar avståndet till cm
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Avstand:",dec range]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Kraft:",dec volt,"dV"]
pause 1500
return
;---RÖRELSESUBRUTINER---
;-----------------------
wee ; 0 an på fjärren, får robboten att hoppa till lite
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Hoppsan !"]
pause 6
for i=1 to 5
pulsout a0,2000
pause 5
pulsout a1,1000
pause 5
next
for i=1 to 5
pulsout a0,1000
pause 5
pulsout a1,2000
pause 5
next
return
stanna ; Stå still bara
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,1515
pause 6
next
return
back ; kör rakt bakåt
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,2000
pause 6
next
return
fram ; Kör framåt
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,1000
pause 6
next
return
fram2 ; Kör framåt
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,1000
pause 6
next
return
vänster ; sväng vänster med "saxade" motorer
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,1000
pause 6
next
return
höger ; sväng höger med "saxade" motorer
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,2000
pause 6
next
return
mjukhöger ; sväng höger med en stoppad motor
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,1515
pause 6
next
return
mjukvänster ; sväng vänster med en stoppad motor
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,1000
pause 6
next
return
backvänster ; backa vänster med en stoppad motor
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,1515
pause 6
next
return
backhöger ; backa höger med en stoppad motor
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,2000
pause 6
next
return
End
- EagleSpirit
- Inlägg: 1288
- Blev medlem: 27 maj 2003, 23:15:48
- Ort: Västerås
- Kontakt:
ja vi vill gärna se bilder och kanske tom film... verkar ju häftigt..
lite idéer om du vill utveckla är att använda EEPROM som jag tror finns i 16F876A för att spara rörelser... tror det ligger på 256byte.. Dessutom skulle du ju kunna använda interruptfunktionen för att känna av fjärren och avståndet... då har du mycket mer tid till att göra annat.
lite idéer om du vill utveckla är att använda EEPROM som jag tror finns i 16F876A för att spara rörelser... tror det ligger på 256byte.. Dessutom skulle du ju kunna använda interruptfunktionen för att känna av fjärren och avståndet... då har du mycket mer tid till att göra annat.
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
SÅ sant, så sant..
Byggde den från början när jag var hemma och var pappaledig för att ha något att roa sonen med.... Och för att hålla igång skallen mellan matningarna, blöjbytena och lekandet... Använde som ett exempel för mina elever när de körde microdatorkurs här för att få något roligt att testa sin program på. Har picen i ZIP-hållare, så går fort att testa sina idéer på något som kör in i väggen bokstavligt om de misslyckas... 

Var sa du att du fick tag på de larvfötterna??? inte på robotshop.se eller? Eller köppte du dendära för BOE-Bot larvfötterna?
Vill se lite bilder och filmer på den dära saken
Om jag skulle göra en sådan så skulle jag programera den att åka å hämta cola från köket
Vill se lite bilder och filmer på den dära saken

Om jag skulle göra en sådan så skulle jag programera den att åka å hämta cola från köket

Senast redigerad av Logan 12 april 2005, 17:35:39, redigerad totalt 1 gång.
Bilder hade varit jätteskoj att se.
Helt rätt att lära ut genom att leka. Iaf. jag lär mig så mycket lättare när det lyser/blinkar låter eller rör sig.
Ett tips kan dessutom vara att använda [code] och avsluta med [/code] för att delvis få formatering rätt och för att få ner storleken på kod när man postar inlägg.
Helt rätt att lära ut genom att leka. Iaf. jag lär mig så mycket lättare när det lyser/blinkar låter eller rör sig.
Ett tips kan dessutom vara att använda [code] och avsluta med [/code] för att delvis få formatering rätt och för att få ner storleken på kod när man postar inlägg.
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
Japp
det är bot-larvfötterna, fast jag kör ju med pic och vill bygga min robot själv, så därför gjorde jag en egen robot och skrev programet själv och lödde ihop ett sunkigt kretskort på expementplatta. LCD, var ELFAS billigaste - funnkar bra. Dock så är både displayen och ir sanmt srf-korten seriöst byggda. Har ritat ett fint kort till själva moderkortet också, men inte ids etsa något.
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
Nja, det blev mest som det blev..
Den hade sittunderlägg som hjul från början, men trist att den inte klarade av trösklar, så det fick lite tuffare framdrivning. Försöker fixa fler bilder under morgondagen
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
Tja, tyngdpukten..
har lite inverkan. Lämpligen placera tyndpunkten strax bakom främre ledhjulet och låt främsta brythjulet hanmna en 20-35 mm framför själva kroppen.