avatar_Burak

-ÇİZGİ İZLEYEN ROBOT TASARIMI-

Başlatan Burak, 30 Mart 2013, 22:50:54

Burak

Hocam merhaba ;

Çizgi izleyen robot tasarlıyoruz pistimiz biraz eğimli , robotumuzda biraz kütleli olduğu için :) küçük mini servo motorlar yardımıyla sürüyoruz aracımızı fakat çok garip bir problemle karşılaştım yazdığım kodda ... Robotumuz 3 sensörlüdür .. Ortadaki sensör siyah çizgiyi diğer sensörler beyazı gördüğü sürece araç düz gitmekte fakat kodun diğer bölümlerinde örneğin sola dönemeçli bir virajda sol sensörün siyahı , orta ve sağ sensörlerin beyazı gördüğü durumdaki kod için aracın çizgiden ayrılmasını engellemek amacıyla yazdığım kod aşağıdaki gibi iç içe iki "IF" ve "WHILE-WEND" döngülerinden oluşmaktadır . Ayrıca kod bu haliyle çok iyi çalışmakta olup tek bir enteresan (kendimce enteresa bulduğum) bir problemle karşılaşmaktayım ... programda görmüş olduğunuz "GOTO control" komutlarını endif komutlarından sonra koyup pic'e yüklediğimde robot sadece "orta sensör siyahta sağ ve sol sensörün beyaz"daki durum için çalışıyo ... diğer durumlar için çalışmıyor motorlar .. sensörler çalışıyor yani güç var fakat program oralara ulaşmıyor ve "goto control" komutlarını endif'lerden önce yazınca robot tıkır tıkır çalışıyor ...  :-\ .... Lütfen yardım ... Robotumun çalışıyor olması tatmin etmiyor , bu program öbeğindeki bu komutun yazıldığı yerin işleyişi böylesine değiştirmesi benim kafamı çok kurcaladı ... kesinlikle göremedğim bişi var ama ne ?

Şimdiden teşekkürler ..



' L. BURAK GÜNAY
' The logic circuit design of the line follower robot called "BusBus"


#config
__config _XT_OSC & _WDT_OFF & _BODEN_OFF & _LVP_OFF & _CP_OFF & _PWRTE_ON
#ENDCONFIG
DEFINE OSC 4

CMCON=%00000111          'Comparators off
OPTION_REG.7=0  'WEAK PULL-UPS OF PORTB ARE ENABLED .
ADCON1=7 'ANALOG PINS ARE OFF AND ALL DIGITAL NOW

TRISA=%000000 : PORTA=%000000
TRISB=%00001110 : PORTB=%00000000
TRISC=%00000000 : PORTC=%00000000
TRISD=%00000100 : PORTD=%00000000
TRISE=%000 : PORTE=%000


'PIN DEFINITIONS                 

rightwheel var portb.7
leftwheel var portb.6

left var portb.1
center var portb.2
right var portb.3

clear

CONTROL:

'************
IF center=1 and left=0 and right=0 THEN  ' center at black , right and left are at white
       
    WHILE center=1 and left=0 and right=0
   
    'Both servos are driven forward'
    HIGH rightwheel : low leftwheel
    PAUSEus 0
    LOW rightwheel : high leftwheel
    PAUSEus 3000
    'Both servos are driven forward'
   
    WEND

    goto control

endif
'************

   
'************
IF center=0 and left=0 and right=0 THEN  ' ALL at white
       
    WHILE center=0 and left=0 and right=0
   
    'Both servos are driven forward'
    HIGH rightwheel : low leftwheel
    PAUSEus 0
    LOW rightwheel : high leftwheel
    PAUSEus 3000
    'Both servos are driven forward'
   
    WEND
   
    goto control
   
endif
'************


'************       
IF left=1 and center=0 and right=0 THEN  ' left sensor at black , center and right are at white
       
    WHILE left=1 and center=0 and right=0
   
    'Only right servo is driven'
    HIGH rightwheel
    PAUSEus 0
    LOW rightwheel
    PAUSEus 3000
    'Only right servo is driven'
         
    WEND
   
        IF center=0 and left=0 and right=0 THEN  ' ALL at white
       
        while center=0 and left=0 and right=0
       
        'Only right servo is driven'
        HIGH rightwheel
        PAUSEus 0
        LOW rightwheel
        PAUSEus 3000
        'Only right servo is driven'
       
        wend
       
        goto control
       
        endif

endif

'************


'************       
IF right=1 and center=0 and left=0 THEN
       
    WHILE right=1 and center=0 and left=0   
   
    'Only left servo is driven'
    low leftwheel
    PAUSEus 0
    high leftwheel
    PAUSEus 3000
    'Only left servo is driven'
   
    WEND
   
        If center=0 and right=0 and left=0 then
               
        while center=0 and right=0 and left=0
       
        'Only left servo is driven'
        low leftwheel
        PAUSEus 0
        high leftwheel
        PAUSEus 3000
        'Only left servo is driven'
   
        wend
       
        goto control
           
        endif
       
endIF


pause 20
   
goto control               
Ω Gens Una Sumus Ω

ete

Sebebi gayet açık. 3 adet kontrol program parçan var. Birinciyi geçtikten sonra kısa devre yapıp diğerlerine baktırmadan kontrola yolluyorsun. Kendin yapıyorsun bunu böylece programda yalnızca bir kontrolü icra ediyor.
Ama Goto komutunu Endif içine alınca  Goto komutu ancak o şart yerine gelirse çalışıyor gelmiyorsa zaten diğer kontrollara geçiyor. Goto kontrol yazmanız gerekmiyor bence. Çünki birinci kontrol şartı yerine geldikten sonra hemenikinci kontrol şartı yerine gelebilir yada bir sonraki şart geçerli olabilir. Bütün kontrol işlemleri tamamlandıktan sonra 1 adet goto kontrol yazmanız yeterli.
Programın hızlı tepki vermesini istiyorsanız o zaman Goto kontrol komutlarını endiflerden önce yazınız.

Ete

Burak

#2
Büyük gaf yapmışım hocam kusuruma bakmayın hocam çok teşekkürler , iyi geceler ...  :-[
Ω Gens Una Sumus Ω

Burak

#3
Hocam bide kafama sürekli takılmış bir soru sorucam umarım yine gaf yapmış olmam  :)

Hani mesela TRISB=%00001101 şeklinde bir komut veripte ardından PORTB=%00000000 şeklinde bir komut verdiğimizde giriş olarak ayarlanmış bir pini PORT(X).pin şeklinde komut verip ona çıkış'mış gibi davranmış oluyoruz ya , acaba bu durumda bir sakınca varmıdır ? yoksa sadece çıkış olarak atanmış pinler için sırasıyla yukarıdaki örnek için

PORTB.1=0
PORTB.4=0
PORTB.5=0
PORTB.6=0
PORTB.7=0

şeklinde verip giriş olarak atanmış pinlere dokunmamak mı daha iyidir ?
Ω Gens Una Sumus Ω

ete

Her ikiside aynı. Bazı pinleri giriş yapıp ( TRISB=%10011000) sonra PORTB=0 demek yalnıca çıkış olan pinleri sıfırlamak anlamına gelir. Giriş olan pinlere bşr etkisi olmaz komutun.
Ete

Burak

Peki hocam prensip olarak hangi komutun once verilmesi uygundur program akisinda ?? Port komutumu tris komutu mu ?
Ω Gens Una Sumus Ω

ete

İşk açılışta port pinleri rastgele değer alabilir. Önce portu sıfırlayıp sonra tris vermek daha uygun olur.
Ete

Burak

Cok tesekkurler hocam iyi calismalar iyi pazarlar !
Ω Gens Una Sumus Ω

Powered by EzPortal