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#ENDCONFIGDEFINE OSC 4CMCON=%00000111          'Comparators offOPTION_REG.7=0  'WEAK PULL-UPS OF PORTB ARE ENABLED .ADCON1=7 'ANALOG PINS ARE OFF AND ALL DIGITAL NOWTRISA=%000000 : PORTA=%000000TRISB=%00001110 : PORTB=%00000000TRISC=%00000000 : PORTC=%00000000TRISD=%00000100 : PORTD=%00000000TRISE=%000 : PORTE=%000'PIN DEFINITIONS                 rightwheel var portb.7leftwheel var portb.6 left var portb.1center var portb.2right var portb.3 clearCONTROL:'************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 controlendif'************    '************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                endifendif'************'************        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        endIFpause 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