avatar_ewreka

mini sumo robot algoritması

Başlatan ewreka, 20 Ekim 2017, 16:14:08

ewreka

Merhaba sayın ete hocam ve sayın arkadaşlar.

sonunda bir sumo robot yaptım ama istediğim gibi çalışmıyor, cny70 leri 74hc14 ile pic' e sürdüm, mesafe sensörü olarak mz80 kullanıyorum.Cny 70 ler şu an çalışmıyor gözüküyor ama kamerayla baktığımda ledler parlak gözüküyor.
'Beyaz = 0 ,Siyah= 5 Volt CNY ler için 74hc14 ters ceviriyor
hemen kodları veriyorum


'****************************************************************
'*  Name    : MINI_SUMO_ROBOT.PBP                               *
'*  Author  : EWREKA                                            *
'*  Notice  : Copyright (c) 2016 EWREKA10                       *
'*          : All Rights Reserved                               *
'*  Date    : 28.04.2016                                        *
'*  Version : 0.95                                              *
'*  Notes   : VERSION 0.95                                      *
'*          :                                                   *
'****************************************************************
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF
'mclr 10k ile +5V 'a bağlı
DEFINE OSC 4 '16f628a Dahili
OPTION_REG.7=0 'Dahili pull-up lar AKTIF yapıldı ayrıca pull-up direncine gerek yok
CMCON = 7
VRCON = 0

TRISA = 0
TRISB = 1
                                                         '-- Sensorler --
input PORTB.0                                           'SOL mz80
input PORTB.1                                           'ON mz80
input PORTB.2                                           'SAG mz80
input PORTB.3                                           'SOL CNY70
input PORTB.4                                           'SAG CNY70
input PORTB.5                                           'ORTA CNY70
                                                        '-- Motorlar --
output PORTA.0                                         
output PORTA.1                                             
Output PORTA.2                                         
output PORTA.3                                         

SYMBOL On_MZ80  = PORTB.1
symbol Sol_MZ80 = PORTB.0
SYMBOL Sag_MZ80 = PORTB.2
symbol Sag_Motor_Ileri = PORTA.0
symbol Sag_Motor_Geri = PORTA.1
symbol Sol_Motor_Ileri = PORTA.2
symbol Sol_Motor_Geri = PORTA.3
symbol Sag_CNY70 = PORTB.4
symbol Sol_CNY70 = PORTB.3
symbol Orta_CNY70 =PORTB.5       

GOSUB DUR_dur ;YARIŞMA KURALINA GÖRE EN BAŞTA BEKLENMESİ GEREKEN
PAUSE 5000 ;5 SANİYELİK SÜRE
GOSUB Saga_git ;SAAT YÖNÜNDE DÖNEREK YARIŞA BAŞLAMA


MAIN:

low on_mz80
low saG_Mz80
LOW SOL_MZ80

do

    IF ((On_MZ80 = 0) and (Sag_MZ80 = 0) and (Sol_MZ80 = 0)) THEN ara_bul
    IF (Sag_MZ80 = 1 and (On_MZ80 = 0 and Sol_MZ80 = 0)) THEN sagda_yakaladi
    IF (On_MZ80 = 1 and (Sag_MZ80 = 0  and Sol_MZ80 = 0)) THEN onde_yakaladi
    IF (Sol_MZ80 = 1 and (On_MZ80 = 0 and Sag_MZ80 = 0)) THEN solda_Yakaladi
    if (sag_cny70 = 0) then sag_gerigit 
    if (sol_cny70 = 0) then sol_gerigit
    if (sag_cny70 = 0) and (sol_cny70 = 0) then geri_git

loop

goto main

end

Solda_Yakaladi:
        GOTO sola_git                                                                                                     
GOTO main

Onde_Yakaladi:
    GOTO ileri_git
GOTO main

Sagda_Yakaladi:
    GOTO saga_git
GOTO main

Ara_Bul:
    'bu durum yokolana kadar saga don
    GOTO saga_git
GOTO main

Ileri_Git:
    LOW sag_Motor_Geri
    LOW sol_Motor_Geri
    high sag_Motor_Ileri
    high sol_Motor_Ileri   
return

Geri_Git:
    low sag_Motor_Ileri
    low sol_Motor_Ileri   
    high sag_Motor_Geri
    high sol_Motor_Geri
return   

Saga_Git:
    LOW sag_Motor_Geri
    LOW sol_Motor_Ileri
    LOW sol_Motor_Geri   
    high sag_Motor_Ileri
return

Sola_Git:
    LOW sag_Motor_Geri
    LOW sol_Motor_Geri   
    low sag_Motor_Ileri
    high sol_Motor_Ileri
return

Sag_GeriGit:
    LOW sag_Motor_Ileri
    LOW sol_Motor_Ileri
    LOW sol_Motor_Geri
    high sag_Motor_Geri
return

Sol_GeriGit:
    LOW sag_Motor_Ileri
    LOW sol_Motor_Ileri
    low sag_Motor_Geri
    high sol_Motor_Geri
return

Dur_Dur:
    LOW sag_Motor_Ileri
    LOW sag_Motor_Geri
    LOW sol_Motor_Ileri
    LOW sol_Motor_Geri
return

ete

#1
Bana kalırsa MZ80 lerin çalışmıyor sebebide aşağıda açıkladım.
Otada şema olmayınca hacımsal olarak olayı kavramakta insan zorlanıyor.
Bu durumda yapılacak iş programda kusur aramak oluyor. Algoritma tam olarak nedir anlam çıkarmak zor ama şunları Programın başında PORTB.0- PORTB.5 aralığındaki pinler giriş yapılmış ve bunlara sanırım sensörler bağlanmış.
Peki şu komut dizisi ne anlama geliyor? Yada hangi amaçla buraya koyuldu ben bir anlam veremedim.
LOW_ON_Mz80
LOW SAG_Mz80
LOW SOL_MZ80

Belki bilmiyorsun ama LOW ON_MZ80 şeklindeki komut iki kademeli çalışır. Önce ON_MZ80 pini ÇIKIŞ yapılır ve O pine LOW verilir. Ama pin çıkış olarak kalır. Aksine bir komut yok ise tabiiki.
Bu noktada şunu söylemeliyim. Bir pinden LOW çıkartmak için iki komut var elimizde;
Pin=0 komutu o pini LOW yapar ama pin'in TRIS değerinde değişiklik yapmaz. Yani o pin zaten ÇIKIŞ pini olmalıdır.
LOW PIN komutu da aynı işi yapar ama bir farkla, Pin isimli pini önce çıkış yapar daha sonra o pine LOW verir. Yani sistem şu şekilde çalışır;
OUTPUT PIN
PIN=0
ama bu komut sonunda aksine bir başka komut yok ise aynı pin çıkış olarak kalır.
Şimdi senin programa dönelim.
Programın başında , ON_MZ80 , SAG_MZ80 ve SOL_MZ80 isimli pinleri çıkış yaptın hemen ardından gelen ilk satırda ise bu pinleri sanki giriş pini imiş gibi sorguluyorsun ;
"IF ((On_MZ80 = 0) and (Sag_MZ80 = 0) and (Sol_MZ80 = 0)) THEN ara_bul"
Sonraki satırlarda da benzer sorgulamalar varki  opinlerde artık sensörler aktif olmayacaktır. Programın çalışmıyorsa bu sebepten çalışmıyordur.
Sensör pinlerini önceden LOW a çekmek istiyorsanki bana göre gereksiz bir işlerm sistemin şöyle olmalı;
LOW ON_MZ80:INPUT ON_MZ80
LOW SAG_MZ80:INPUT SAG_MZ80
LOW SOL_MZ80:INPUT SOL_MZ80

bu şekilde pinleri tekrar giriş yaptıktan sonra artık sorgulama yapabilirsin.

Diğer taraftan hangi basic versiyonu kullanıyorsun bilmiyorum ama DO-LOOP komutu yok diye biliyorum.
PB3 de olabilir bakmadım ama program genel yazılışı 2.60 formatında gözüküyor.
DO-LOOP yerine,
BASLA:
..
GOTO BASLA yazmak yeterli olacaktır.
Ete

baktıkça başka şeyler görüyorum.
    GOTO saga_git
GOTO main
iki komut satırı var burada ama alttaki satıra program hiç bir zaman ulaşmaz boşuna yazılmış bir şey. Üstelik yukarı programı bu satıra yönledirecek olan GOTO ARABUL yada THEN ARA_BUL komut satırı yerine GOSUB SAGA_GIT yazmak daha doğru olurdu. Burada mevcut şekilde aslında birde stack taşması problemi olacak.
Zira yukarıda THEN ARA_BUL ile bu satıra gelen program GOTO SAGA_GIT komutu ile SAGA_GIT etiketine gidecek ama orada RETURN komutunu görüp şaşıracaktır. Nereye döneceğini bilmeden stack da o anda ne adres var ise oraya dönmeye çalışacak yada adres bulamaz ise program kilitlenecektir.
GOTO SAGA_GIT yerine oraya GOSUB SAGA_GIT yazıp altına GOTO MAIN demek daha doğru bence ki zaten ikinci bir etiket kullanma fikri mutlaka buradan doğmuş olması gerekir idi.
Diğerlerinde de benzer hatalar var. Bu programın en büyük sorunu bence stack taşması olması gerek.


ewreka

Sayın hocam Cevabınız için çok teşekkür ederim, kusura bakmayın hemen cevap yazamadım, hem robotla hemde bazı işlerim vardı onlarla uğraşıyordum.

Yazdığınız yanıt çok verimli oldu nerelerde hata yaptığımı anladım ve kodun çoğu kısmını düzelttim fakat mz80 lerin ikisi bozuldu dolayısı ile çalışmam da durmuş oldu!!! :(
mz80'nin biri hiç sönmüyor, diğeri ise ters çalışıyor.

tekrar teşekkür ediyorum.

ete

Bu MZ80 algılama sensörü benzer pek çok eşdeğeri gibi hem NPN hemde PNP çıkışa sahip olması gerekir. NPN çıkış cisim görünce LOW verir boşta HIGH da bekler, PNP çıkışı ise Boşta LOW da bekler ve cisim görünce HIGH verir.
Gerçi pek çok yerde çıkış NPN denmiş ama genelde iki türlü kablo bağlantısı vermişler renkler farklı. Akıllı uslu biride çıkıp izah etmemiş neden çift kablo rengi veriliyor diye. Bu mesajı yazdım çünki iki çıkışıda var ise sen ters olanı kullanıyor olabilirsin diye uyarayım istedim. Devamlı çıkış veren ise ayardan olabilir. Çünki sensör algılama mesafesi ayarlı olması gerekiyor. Açıklamalarda o yönde. Min mesafede bazıları sürekli çıkış verebiliyor.

Ete

ewreka

Merhaba dostlar.

Mini sumo robot projeme tam gaz devam etmekteyim, fakat projeyi iki alanda
parça parça yapmaya karar verdim;

1-CNY ler
2-MZ80 ler

1-Cnyler çalışıyor fakat ufak tefek elden geçmesi gerekecek.
2-MZ80 ler sonra...

Soruma gelince: Pic kendini resetliyor, fakat resetlenmesi bazen 2 bazen 30 saniye
kadar sürüyor Bu En Büyük Problem, Ayrıca bazen beyaz alanın dışına çıkıyor, mesela
5 kez beyaz alanla karşılaşmışsa 2 sinde beyaz alanı geçiyor.

Aşağıda kodu veriyorum;
a)_li-po pili yeni şarz ettim (yani düşük voltaj olmamaması lazım)
b)_mclr 10k ile (+5v) 'a bağlı
c)_16f628a ve 74hc14 kullanıyorum


@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _LVP_OFF & _CP_OFF & _BODEN_OFF
DEFINE OSC 4
OPTION_REG.7=0
CMCON = 7
VRCON = 0

TRISA = 0
TRISB = 1

input PORTB.0                                           'SOL mz80
input PORTB.1                                           'ON mz80
input PORTB.2                                           'SAG mz80
input PORTB.3                                           'SOL CNY70
input PORTB.4                                           'SAG CNY70
input PORTB.5                                           'ORTA CNY70
                                                        '-- Motorlar --
output PORTA.0                                          'in1    ILERI
output PORTA.1                                          'in2    GERI       
Output PORTA.2                                          'in3    ILERI
output PORTA.3

symbol SAG_ILERI_MOTOR = PORTA.3
symbol SOL_ILERI_MOTOR = PORTA.0
symbol SAG_GERI_MOTOR = PORTA.2
symbol SOL_GERI_MOTOR = PORTA.1
symbol Led = PORTA.7     

symbol SOL_CNY70 = PORTB.4
symbol SAG_CNY70 = PORTB.3
symbol ARKA_CNY70 = PORTB.5

BEYAZ VAR BIT
SIYAH VAR BIT
SIYAH = 1
BEYAZ = 0
COKLU_DONUS VAR BYTE

BEKLE:

low SAG_ILERI_MOTOR
LOW SOL_ILERI_MOTOR
LOW SAG_GERI_MOTOR
low SOL_GERI_MOTOR

low led
PAUSE 1000
high led
PAUSE 1000
low led
PAUSE 1000
high led
PAUSE 1000
low led
PAUSE 1000
high led
GOTO MAIN

MAIN:
    COKLU_DONUS=0
    if sol_cny70 = BEYAZ AND sag_cny70 = BEYAZ AND arka_cny70 = BEYAZ THEN
        GOTO ILERI_GIT
    ENDIF
    if sol_cny70 = SIYAH AND sag_cny70 = SIYAH AND arka_cny70 = SIYAH THEN
        GOTO ILERI_GIT
    ENDIF
    if sol_cny70 = BEYAZ AND sag_cny70 = SIYAH AND arka_cny70 = SIYAH THEN
        while sol_cny70 = SIYAH AND sag_cny70 = SIYAH AND arka_cny70 = SIYAH
            GOTO SolA_DON           
            COKLU_DONUS = COKLU_DONUS + 1
                if COKLU_DONUS = 5 THEN
                    GOTO ILERI_GIT
                ENDIF
        WEND
    ENDIF     
    if sol_cny70 = SIYAH AND sag_cny70 = BEYAZ AND arka_cny70 = SIYAH THEN
        while sol_cny70 = SIYAH AND sag_cny70 = SIYAH AND arka_cny70 = SIYAH
            GOTO SAGA_DON           
            COKLU_DONUS = COKLU_DONUS + 1
                if COKLU_DONUS = 5 THEN
                    GOTO ILERI_GIT
                ENDIF
        WEND
    ENDIF   
    if sol_cny70 = BEYAZ AND sag_cny70 = SIYAH AND arka_cny70 = BEYAZ THEN
        while sol_cny70 = SIYAH AND sag_cny70 = SIYAH AND arka_cny70 = SIYAH
            GOTO SolA_DON           
            COKLU_DONUS = COKLU_DONUS + 1
                if COKLU_DONUS = 5 THEN
                    GOTO ILERI_GIT
                ENDIF
        WEND
    ENDIF             
    if sol_cny70 = SIYAH AND sag_cny70 = BEYAZ AND arka_cny70 = BEYAZ THEN
        while sol_cny70 = SIYAH AND sag_cny70 = SIYAH AND arka_cny70 = SIYAH
            GOTO SAGA_DON           
            COKLU_DONUS = COKLU_DONUS + 1
                if COKLU_DONUS = 5 THEN
                    GOTO ILERI_GIT
                ENDIF
        WEND
    ENDIF   
    if sol_cny70 =  BEYAZ AND sag_cny70 = BEYAZ AND arka_cny70 = SIYAH THEN
        GOTO GERI_GIT
    ENDIF       
    if sol_cny70 =  SIYAH AND Sag_cny70 = SIYAH AND arka_cny70 = BEYAZ THEN
        GOTO GERI_GIT
    ENDIF   
goto MAIN

ILERI_GIT:
    LOW SAG_GERI_MOTOR
    LOW SOL_GERI_MOTOR
    high SAG_ILERI_MOTOR
    high SOL_ILERI_MOTOR   
goto main

DUR:
low SAG_ILERI_MOTOR
LOW SOL_ILERI_MOTOR
LOW SAG_GERI_MOTOR
low SOL_GERI_MOTOR
goto main

SAGA_DON:
LOW SOL_ILERI_MOTOR
LOW SAG_GERI_MOTOR
HIGH SAG_ILERI_MOTOR
HIGH SOL_GERI_MOTOR
goto main

SOLA_DON:
LOW SAG_ILERI_MOTOR
LOW SOL_GERI_MOTOR
HIGH SOL_ILERI_MOTOR
HIGH SAG_GERI_MOTOR
goto main

GERI_GIT:
    low SAG_ILERI_MOTOR
    low SOL_ILERI_MOTOR   
    high SAG_GERI_MOTOR
    high SOL_GERI_MOTOR
    PAUSE 500
goto main   

SAG_GERI_GIT:
    LOW SAG_ILERI_MOTOR
    LOW SOL_ILERI_MOTOR
    LOW SOL_GERI_MOTOR
    high SAG_GERI_MOTOR
goto main

SOL_GERI_GIT:
    LOW SAG_ILERI_MOTOR
    LOW SOL_ILERI_MOTOR
    low SAG_GERI_MOTOR
    high SOL_GERI_MOTOR
goto main

end


Powered by EzPortal