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

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 ]

hier staat een hele pagina volgeschreven over bumper logica:
http://wiki.robotmc.org/index.php?title=Bumperlogica

bedankt.. ik zal het eens proberen met dat schuiven. volgens picbasic.nl gaat dat met << en >>

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 ]