avatar_bilsisco

Robot araba yardım

Başlatan bilsisco, 29 Mart 2015, 16:02:27

bilsisco

Öncelikle Ultrasonik sensörlü, servo motorlu ve redüktörlü motorlu bir araba yapıyoruz
Amaç araba giderken önündeki engele 10cm mesafe kalınca sağa sola bakıp boş olan yere gidecek.
Alttaki videodaki araba gibi, aynen.
2 sorun var.
Pic motor beslemesiyle aynı kaynaktan mı elektrik alacak?
Bunun algoritması basitçe ne olur?
Yaptığım isis ve pbp dosyalarını paylaşıyorum
incelerseniz sevinirim

https://www.youtube.com/watch?v=gfEOJ4F91E8

bilsisco

arabayı yaptım, aynı kaynaktan tek regülatörden araba çalışıyor, algoritmasında da sorun yok.
yalnız tekerlerdeki motorlar çalışırken(iki motor da aynı) biri daha fazla dönüyor tam olarak düz gitmiyor
balansı bozuk yani. Bunu düzeltmek için bir yöntem var mı?

ete

Balans değil birinin devri biraz daha yüksek demekki. Düzeltmenin tek çaresi var oda devri yüksek olanı PWM ile besleyim düze gidecek kadar devir vermek . Tabiiki bir başka alternatif de motoru değiştirip aynı karekterde bir başka motor kullanmak.

Ete

bilsisco

Hocam kullandığım motorlarını ikiside bundan. redüktörlü,  tekerleri de aynı farkları yok

bilsisco

hazır kit olarak satılan parçalarda mavi çizgiyle belirttiğim parça ne işe yarıyor anlamadım
Motor devir yada açısını mı algılıyor? Bilgisayar farelerinin tekerleği mantığıyla mı anlamadım

ete

O parçalar encode diski. Sanırım motoru arka tarfında milin ucu encoder göbeğine göre yapılmış. Bu diski takarak puls kontrolü yada devir kontrolü yapabilirsin. Tabiiki ayrıca bir fotosel göz sistemi olması gerekir.

Motorlar aynı olabilir ama ya devirleri farklı yada teker çapları farklı bir şey varki bir tarafa çekiyor araç. Motorları yer değiştir bakalım bu seferde diğer tarafamı çekecek.
En azındanbunun sebebini bul. Bir ihtimalde ilk motorları çalıştırırken iki motorun çalışması arasında zaman farkı var ise o zamanda bir tarafa çekme yapar.

Ete

bilsisco

#6
Robotarabayı yaptım sayılır, pleksiglastan şase yaptım, mesafe için gösterge taktım, motor sürücü modülü taktım.
Arabanın bir tarafa çekmesi ağırlık merkezinin ortada olmamasındandı.
Hocam dediğin gibi encoder ve fotosel modülleri var hazır ama çok da gerek duymadım.
Sadece düz giderken ultrasonik sensörün (2-400cm) sınırından daha uzak mesafeyi gördüğünde
sıfır algılıyor (yada başka birşey) programa göre durup dönüyordu.
Programda belittiğim yer ile bunu çözdüm ama videodaki gibi duraklamalı gidiyor (45.sn gibi) sorun bu.
Şimdilik başka bir problem kalmadı.
https://www.youtube.com/watch?v=-JqO9zr4cJY


Include "modedefs.bas"         
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16f628A, BOD_OFF
@ DEVICE pic16f628A, LVP_OFF
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16f628A, MCLR_OFF
@ DEVICE pic16F628A, HS_OSC
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

DEFINE OSC 20

TRISA = %00100000           
TRISB = %00000000
PORTA=0
PORTB=0
CMCON=7

Lamba   var PortB.3
A1      var PortB.4 ' sağ motor
A2      var PortB.5 ' sağ motor
B1      var PortB.6 ' sol motor
B2      var PortB.7 ' sol motor
AB      var PortB   ' her iki motor
Servo   var PortA.2
D1      var PortA.3 ' 1. display
D2      var PortA.1 ' 2. display   
   
Tr      var PORTA.0 ' Trig pin
Ec      var PORTA.5 ' Echo pin     
W       var word
R       var word

Y       var word
U1      var byte
U2      var byte
U3      var byte
Toplam  var byte
Limit   var byte    ' Durma mesafesi
Disp1   var byte
Disp2   var byte
Sol     var word    ' Sol mesafesi
Sag     var word    ' Sağ mesafesi

w = 0
'hiz=1
limit=15   
low tr
low lamba


for y=5 to  0 step -1
    high    d1
    low     d2
    PortB=y         
    pause   1000 
next
gosub   EtrafaBak
'=============================================================
'------------------------ ANA PROGRAM ------------------------
'=============================================================                                 
BASLA:             
    gosub   mesafe
    gosub   Goster   
    gosub   Hareket   
GOTO BASLA
'--------------------------------------------------------------------
Hareket:
    if r>limit or r=0 then     '400cm den fazla görme problemi
        gosub   Duz_git
    else
        gosub   dur
        for y=1 to  5
            gosub   Goster   
        next
        gosub   EtrafaBak
         
        if sol>limit and sol>sag then
            gosub   sola_git
        else
            if  sag>limit then
                gosub   Saga_git
            else
                gosub   geri_git
            endif
        endif
CIK:
    endif
return
'-------------------------------- hareketleri yapılandır
Duz_git:
    for y=1 to  5                           
        high    A1
        low     A2
        pause   5
        low     A1
       
        low     B1
        high    B2
        pause   5
        low     b2
    next
return   
Sola_git:
    for y=1 to  15
        high    A1
        low     A2
        pause   10
        low     A1
       
        high    B1
        low     B2
        pause   10
        low     B1
    next
return   
Saga_git:
    for y=1 to  15
        low     A1
        high    A2
        pause   10
        low     A2
       
        low     B1
        high    B2
        pause   10
        low     B2
    next
return
Geri_git:
    for y=1 to  20
        low     A1
        high    A2
        pause   10
        low     A2
       
        high    B1
        low     B2
        pause   10
        low     B1
    next

    pause   300
    'saga dön devam et
    for y=1 to  15
        low     A1
        high    A2
        pause   10
        low     A2
       
        low     B1
        high    B2
        pause   10
        low     B2
    next               

return
Dur:
    low     A1
    low     A2
    low     b1
    low     b2
    pause   200    '300-->200 qqqqqqqqqqqqqqqqqq
return
'-----------------------EtrafaBak----------------
EtrafaBak:
    'Servo------------------160° için(sol) 
    for y=0 to  20         
        pulsout servo,1080
        pause   30     
    next
    gosub mesafe   
sol=r
    'Servo------------------20° için(sağ)       
    for y=0 to  20         
        pulsout servo,380   
        pause   30     
    next   
    gosub mesafe
sag=r
    'Servo------------------90° için(orta)       
    for y=0 to  20         
        pulsout servo,740   
        pause   30     
    next 
return
'------------------------Gösterge------------------             
Goster:
    disp1=r//10     'Bulunan değerin ilk basamağı ("//" bölümünden kalan)
    disp2=r/10      'Bulunan değerin ikinci basamağı ("/" bölüm)
     
    high    d1      '1.Display gösteriyor
    low     d2      '2.Display göstermiyor   
    PortB=disp1
    pause   10
   
    low     d1
    high    d2
    PortB=disp2
    pause   10
    low     d2
return       
'-------------------------Mesafe------------------
Mesafe:       
    high    tr   
    pauseus 10
    low     tr
    pulsin  ec,1,w
    if  w<29 then w=0
    r = w/29
    pause   10       
return

END


bilsisco


ete

Cevaplamak zor. Zira kafandan neler geçtiğini anlamak zor. Problemin kaynağı bol keseden kullandığın PAUSE ler olsa gerek.
Her yerde süreleri azar azarda olsa bolca pause kullanmışsın.
Yalnızca GOSTER isimli etiket altında 20 ms lik bir gecikme var. Ama Hareket bölümünde ne hikmetse ;
        for y=1 to  5
            gosub   Goster   
        next
şeklinde bir döngü kullanmışsın. Bu yaklaşık 100 ms lik bir gecikme yaratacaktır.
Tabiiki asıl sıkıntı araç düz gidemiyor ise duruyor. Çünki dur diyorsun. Durduğu yerde boşuna 200 ms bekliyor sonra yine bir sürü gecikme ile etrafına bakıyor.
Bence bu gecikmeleri kaldırıp yada mümkün olduğunca azaltıp aracın daha beklemesiz çalışmasını sağlamalısın.

Ete


bilsisco

#9
Hocam dediğiniz goster ve dur etiketleri düz gitmediğinde oluyor ve akabinde kesinlikle etrafa baktığından
orası sorunlu yer değil, sorun düz giderken duraklamalı gitmesi.
Ultrasonik sensörün iş görememesi(400cmden fazla mesafe yada yolladığı yankıyı alamaması vb.) sorunu var sanıyorum.
altta yeni yüklediğim kod ve videosu var yine aynı gidiyor(dediğiniz tüm gecikmeleri kaldırdım)
https://www.youtube.com/watch?v=Ek1nDETA8IA

'20mhz de harici kristal ile pals (pulsout komutu için)
'define osc'den bagımsız 2uS dir(pauseus 2)
'4mhz de (dahili osilatörde) 10uS dir
Include "modedefs.bas"         
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16f628A, BOD_OFF
@ DEVICE pic16f628A, LVP_OFF
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16f628A, MCLR_OFF
@ DEVICE pic16F628A, HS_OSC
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

DEFINE OSC 20

TRISA = %00100000           
TRISB = %00000000
PORTA=0
PORTB=0
CMCON=7

Lamba   var PortB.3
A1      var PortB.4 ' sağ motor
A2      var PortB.5 ' sağ motor
B1      var PortB.6 ' sol motor
B2      var PortB.7 ' sol motor
AB      var PortB   ' her iki motor
Servo   var PortA.2
D1      var PortA.3 ' 1. display
D2      var PortA.1 ' 2. display   
   
Tr      var PORTA.0 ' Trig pin
Ec      var PORTA.5 ' Echo pin     
W       var word
R       var word

Y       var word
U1      var byte
U2      var byte
U3      var byte
Toplam  var byte
Limit   var byte    ' Durma mesafesi
Disp1   var byte
Disp2   var byte
Sol     var word    ' Sol mesafesi
Sag     var word    ' Sağ mesafesi

w = 0
'hiz=1
limit=15   
low tr
low lamba


for y=5 to  0 step -1
    high    d1
    low     d2
    PortB=y         
    pause   1000 
next
gosub   EtrafaBak
'=============================================================
'------------------------ ANA PROGRAM ------------------------
'=============================================================                                 
BASLA:             
    gosub   mesafe
    gosub   Hareket   
GOTO BASLA
'--------------------------------------------------------------------
Hareket:
    if r>limit or r=0 then
        gosub   Duz_git
    else
        gosub   EtrafaBak
         
        if sol>limit and sol>sag then
            gosub   sola_git
        else
            if  sag>limit then
                gosub   Saga_git
            else
                gosub   geri_git
            endif
        endif
    endif
return
'-------------------------------- hareketleri yapılandır
Duz_git:
    for y=1 to  5                           
        high    A1
        low     A2
        pause   5
        low     A1
       
        low     B1
        high    B2
        pause   5
        low     b2
    next
return   
Sola_git:
    for y=1 to  15
        high    A1
        low     A2
        pause   10
        low     A1
       
        high    B1
        low     B2
        pause   10
        low     B1
    next
return   
Saga_git:
    for y=1 to  15
        low     A1
        high    A2
        pause   10
        low     A2
       
        low     B1
        high    B2
        pause   10
        low     B2
    next
return
Geri_git:
    for y=1 to  20
        low     A1
        high    A2
        pause   10
        low     A2
       
        high    B1
        low     B2
        pause   10
        low     B1
    next

    pause   300
    'saga dön devam et
    for y=1 to  15
        low     A1
        high    A2
        pause   10
        low     A2
       
        low     B1
        high    B2
        pause   10
        low     B2
    next               

return
'-----------------------EtrafaBak----------------
EtrafaBak:
    'Servo------------------160° için(sol) 
    for y=0 to  20         
        pulsout servo,1080
        pause   30     
    next
    gosub mesafe   
sol=r
    'Servo------------------20° için(sağ)       
    for y=0 to  20         
        pulsout servo,380   
        pause   30     
    next   
    gosub mesafe
sag=r
    'Servo------------------90° için(orta)       
    for y=0 to  20         
        pulsout servo,740   
        pause   30     
    next 
return 
'-------------------------Mesafe------------------
Mesafe:       
    high    tr   
    pauseus 10
    low     tr
    pulsin  ec,1,w
    if  w<29 then w=0
    r = w/29
    pause   10       
return

END

Powered by EzPortal