hallo,
ik heb een robot gemaakt met 2 bumperswitches.. alleen als ie nu een hoek van de kamer in rijdt dan blijft ie naar links en rechts draaien en zit ie vast in die hoek.
nu had ik in gedachten om de laatste 4 botsingen te onthouden, en als hij dan bvb links, rechts, links, rechts rijdt dat ie dat dan merkt en 180 graden draait
nu heb ik de volgende code, maar die werkt niet helemaal:
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, BODEN_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
DECLARE CCP1_PIN portb.3 ' Select HPWM port and bit for CCP1 module. i.e. channel 1
HPWM 1, 200, 23000 ; was hiervoor 10000 ;CCP1, Dutcycle 127 (= 50%), 25.000Hz
; switches:
SYMBOL sl = PORTa.0 ;Poort a.0 heeft nu de naam Sl
SYMBOL sr = PORTa.1 ;Poort a.1 heeft nu de naam Sr
; h-bruggen:
SYMBOL linksvoor = PORTb.4
SYMBOL linksachter = PORTb.5
SYMBOL rechtsvoor = PORTb.6
SYMBOL rechtsachter = PORTb.7
dim teller as byte
dim raak as byte
dim hit1 as bit
dim hit2 as bit
dim hit3 as bit
dim hit4 as bit
; 76543210 <<<Een hulpregeltje
TRISA = %00000011
TRISB = %00000000
goto hoofdprogramma
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
subvooruit:
;-------------------------------------------------------
low linksachter
low rechtsachter
high linksvoor
high rechtsvoor
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
subachteruit:
;-------------------------------------------------------
low linksvoor
low rechtsvoor
high linksachter
high rechtsachter
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sublinksom:
;-------------------------------------------------------
low linksvoor
low rechtsachter
high linksachter
high rechtsvoor
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
subrechtsom:
;-------------------------------------------------------
low linksachter
low rechtsvoor
high linksvoor
high rechtsachter
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
substop:
;-------------------------------------------------------
low linksvoor
low rechtsvoor
low linksachter
low rechtsachter
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hoekdetectie:
;-------------------------------------------------------
teller = teller + 1
if teller = 0 then
hit1 = raak ; pic onthoudt welke kant er geraakt is
end if
if teller = 1 then
hit2 = raak ; pic onthoudt welke kant er geraakt is
endif
if teller = 2 then
if hit1 == hit2 then goto nul ; 2x dezelfde kant op, dus opnieuw beginnen
hit3 = raak ; pic onthoudt welke kant er geraakt is
end if
if teller = 3 then
hit4 = raak ; pic onthoudt welke kant er geraakt is
end if
if teller = 4 then
if hit1 == hit3 and hit2 == hit4 and hit1 <> hit2 then
; robot zit nu dus vast!!!!
gosub subachteruit
delayms 150
gosub subrechtsom
delayms 1000
end if
end if
nul:
teller = 0
hit1 = 0
hit2 = 0
hit3 = 0
hit4 = 0
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLEAR ;Wis alle RAM geheugen
teller = 0
hoofdprogramma:
if sl = 1 then
raak = 0 ; links wat geraaks dus..
gosub hoekdetectie ; ...kijken of we vastzitten in een hoek
gosub subachteruit ; stukje achteruit rijden
delayms 150
gosub subrechtsom ; stukje rechtsom draaien
delayms 500
gosub subvooruit ; en weer vooruit
endif
if sr = 1 then
raak = 1 ; rechts wat geraaks dus..
gosub hoekdetectie ; ...kijken of we vastzitten in een hoek
gosub subachteruit ; stukje achteruit rijden
delayms 150
gosub sublinksom ; stukje rechtsom draaien
delayms 500
gosub subvooruit ; en weer vooruit
endif
goto hoofdprogramma ; begin hoofdprogramma opnieuw
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END ;Einde programma
nu werkt het niet en blijft ie alsnog in de hoek hangen, echter als ik de regel
if hit1 == hit2 then goto nul ; 2x dezelfde kant op, dus opnieuw beginnen
weg haal dan werkt het alleen de eerste keer nadat ik de robot aan zet, en dan niet meer
ben ik zo goed bezig? of is er nog een slimmere manier?
Danny
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
laatste vier botsingen onthouden zou ik anders doen,
(links -> 0, rechts -> 1)
hit1 hit 2 hit3 hit4
(0) start: 0 0 0 0
(1) rechts: 1 0 0 0
(2) links: 0 1 0 0
(3) rechts: 1 0 1 0
(4) links: 0 1 0 1
(5) links: 0 0 1 0
(6) links: 0 0 0 1
(7) rechts: 1 0 0 0
schuiven dus met die bitjes
[Bericht gewijzigd door roelvh op ]
doutsje
vroeger was ik een twijfelaar maar plots weet ik het niet meer zo goed.
hier staat een hele pagina volgeschreven over bumper logica:
http://wiki.robotmc.org/index.php?title=Bumperlogica
AC/DrieC
Den Dries www.hulens.be
je kan je robotje ook eerst even achteruit laten rijden nadat hij gebotst is en daarna draaien. Groetjes
ik wou even laten weten dat het nu perfect werkt!
dat met die bits schuiven was een prima tip!
enne @ AC/DrieC: eerst een stukje achteruit deed ik al.. toch een goede tip.
misschien dat ik straks nog wel even m'n code post.
Danny
EDIT:
hier de werkende code van m'n robot:
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, BODEN_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
DECLARE CCP1_PIN portb.3 ' Select HPWM port and bit for CCP1 module. i.e. channel 1
HPWM 1, 200, 23000 ;CCP1, Dutcycle 127 (= 50%), 23.000Hz
; switches:
SYMBOL sl = PORTa.0 ;Poort a.0 heeft nu de naam Sl
SYMBOL sr = PORTa.1 ;Poort a.1 heeft nu de naam Sr
; h-bruggen:
SYMBOL linksvoor = PORTb.4
SYMBOL linksachter = PORTb.5
SYMBOL rechtsvoor = PORTb.6
SYMBOL rechtsachter = PORTb.7
dim selectiebyte as byte
dim HoekDetectieByte as byte
dim gedetecteerd as byte
; 76543210 <<<Een hulpregeltje
TRISA = %00000011
TRISB = %00000000
CLEAR ;Wis alle RAM geheugen
HoekDetectieByte = %00000000
goto hoofdprogramma
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
subvooruit:
;-------------------------------------------------------
low linksachter
low rechtsachter
high linksvoor
high rechtsvoor
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
subachteruit:
;-------------------------------------------------------
low linksvoor
low rechtsvoor
high linksachter
high rechtsachter
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sublinksom:
;-------------------------------------------------------
low linksvoor
low rechtsachter
high linksachter
high rechtsvoor
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
subrechtsom:
;-------------------------------------------------------
low linksachter
low rechtsvoor
high linksvoor
high rechtsachter
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
substop:
;-------------------------------------------------------
low linksvoor
low rechtsvoor
low linksachter
low rechtsachter
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hoekdetectie:
;-------------------------------------------------------
selectiebyte = %00001111
gedetecteerd = HoekDetectieByte & selectiebyte
if gedetecteerd = %00001010 then
HoekDetectieByte = 0
gosub subachteruit
delayms 1000
gosub subrechtsom
delayms 1000
end if
;return
goto hoofdprogramma
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hoofdprogramma:
if sl = 1 then
HoekDetectieByte = HoekDetectieByte << 1 ; 1 bit naar links schuiven
; door het schuiven komt er vanzelf een 0 voor. (0 = links, 1 = rechts)
gosub hoekdetectie ; ...kijken of we vastzitten in een hoek
gosub subachteruit ; stukje achteruit rijden
delayms 150
gosub subrechtsom ; stukje rechtsom draaien
delayms 500
gosub subvooruit ; en weer vooruit
endif
if sr = 1 then
HoekDetectieByte = HoekDetectieByte << 1 ; 1 bit naar links schuiven
HoekDetectieByte = HoekDetectieByte + %00000001
; door het schuiven komt er vanzelf een 0 achter, daar maken we een 1 van, (0 = links, 1 = rechts)
gosub hoekdetectie ; ...kijken of we vastzitten in een hoek
gosub subachteruit ; stukje achteruit rijden
delayms 150
gosub sublinksom ; stukje rechtsom draaien
delayms 500
gosub subvooruit ; en weer vooruit
endif
goto hoofdprogramma ; begin hoofdprogramma opnieuw
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END ;Einde programma
duidelijk te zien dat het nu korter en overzichtelijker is 
[Bericht gewijzigd door Danny op ]