uzaktan servo yönlendirme

Başlatan selvi, 04 Aralık 2012, 21:43:41

selvi

   
    Merhabalar,
  Uzun bir zamandır 12f675 ile alıcı-verici tarzı servo yönlendirme üzerine çalışmaktayım. Çalışma belli bir düzeyede geldi ama
program ISIS te bile vericinin potunu her çevirdiğimde servo düzenli hareket etmesi gerekirken potu sağa çevirdiğimde servo
bir sağa bir sola gitmektedir tabi sağa çevirdiğimde de aynısı olmaktadır.Ayrıca program pıratık devre üzerinde ise servo dönüşü
gerçekleşse bile her zaman bir titreme içindedir.
Acaba sorun programın neresinde kaynaklanıyor ben göremedim.
verci
Config CPD_OFF, CP_OFF, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF,INTRC_OSC_NOCLKOUT
Device=12F675
Xtal = 4
DEFINE OSC 4
define osccal_1k 1               
TRISIO =%00000001
ANSEL = %01000001          ' GPIO.0 Analog secildi, diğerleri digital       
ADCON0 =%10000001           ' GPIO.0 Analog secildi, diğerleri digital 
GPIO=0:IOC=0 
CMCON=7
OPTION_REG.7=1   	 ' pull up lar aktif
Symbol UYAN=GPIO.1
GPIO=0
Dim SURE  As Word
Dim SUREA  As Word
Dim HAM   As Word
Dim DEGER     As Word
Clear
DelayMS 200
Basla: 
GPIO.0=0:HAM=0        

   HAM=ADIn 0
PulsOut GPIO.2,SUREA
UYAN=1
DEGER=SUREA
GoSub GONDER
UYAN=0
SURE=SUREA*10
SURE=18000-SURE
DelayUS SURE     
SUREA=(HAM+1)*/200  
GoTo Basla
                             
GONDER:
SerOut GPIO.2,140,[Rep $AA\5,Rep $00\5,Rep $FF\5]'uyandirma sinyali preambl
SerOut GPIO.2,140,[Rep $AA\5,Rep $00\5,Rep $FF\5]'uyandirma sinyali preambl
SerOut GPIO.2,140,["D","E","M",DEGER]
SerOut GPIO.2,140,["D","E","M",DEGER]
SerOut GPIO.2,140,["D","E","M",DEGER]
Return
End

alıcı
Config CPD_OFF, CP_OFF, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF, INTRC_OSC_NOCLKOUT
Device=12F675
Xtal = 4
DEFINE OSC 4
define osccal_1k 1               
TRISIO =%00000001
GPIO=0:ANSEL=0:IOC=0
OPTION_REG=%10000101   	 'Pull up dirençleri IPTAL- Bolme oran? 1/64. 		 'Kesmeler aktif ve TMR0 kesmesi aktif
CMCON=7
Symbol motora= GPIO.2

'---------------------------------------------------------------------------------------------------------------------------------------
Dim SUREA     As   Byte
Dim SURE      As   Word
Dim DEGER     As   Word

Clear
 DelayMS   250
BASLA:
motora=0
SerIn GPIO.0,140,100,GIT,[Wait("DEM"),DEGER]
GIT:
SUREA=DEGER
 motora=0
PulsOut motora,SUREA
SURE=SUREA*10
SURE=18000-SURE
 motora=0
DelayUS SURE
GoTo BASLA                                                                         
Yaşam anlamlandırıldıkça kutsaldır....

isikyasar

2 sene önce mini kamera için hareket mekanizması yapmıştım.

verici kod------

Device 16F877
Xtal 4

Dim var1 As Word
Dim var2 As Word
Dim yas As Word
Dim sem As Word
Dim bol1 As Word
Dim bol2 As Dword
Declare LCD_ENPin PORTB.3
Declare LCD_RSPin PORTB.2
Declare LCD_DTPin PORTB.4

PORTA=0
TRISA=%00000111
PORTB=0
TRISB=%00000000


basla:
Print At 1,1, Dec5 yas, "      "
Print At 2,1, Dec5 sem, "      "

Print At 1,8, Dec5 var1, "      "
Print At 2,8, Dec5 var2, "      "

yas=ADIn 0
sem=ADIn 1

bol1=(yas/4)/ 11

bol2=(sem*2)/ 69


var1=660+bol1
var2=500+bol2


SerOut PORTC.7 , 16780 , [var1]
SerOut PORTC.7 , 16780 , [var2]

GoTo basla
End

alıcı kod----

Device 16F877
  Xtal 4
Dim var1 As Word
Dim var2 As Word


Declare LCD_ENPin PORTB.3
Declare LCD_RSPin PORTB.2
Declare LCD_DTPin PORTB.4

Declare serial_data 8

basla:
SerIn PORTC.6 , 16780 , [var1 , var2]

Print At 1,8, Dec5 var1, "      "
Print At 2,8, Dec5 var2, "      "


Servo PORTC.0, var1
Servo PORTC.1, var2

GoTo basla
End 

umarım faydalı olur.

selvi

isikyasar,
Gönderdiğin programa baktım ama 16f877'i fazla tanımıyorum ve yanımda bulunmayan bir pic tir.Ama yinede gösterdiğin ilgiden
dolayı teşekkürler.
Peki gönderdiğim programa ilişkin hata tespit eden yokmu?
Yaşam anlamlandırıldıkça kutsaldır....

isikyasar

GONDER:
SerOut GPIO.2,140,[Rep $AA\5,Rep $00\5,Rep $FF\5]'uyandirma sinyali preambl
SerOut GPIO.2,140,[Rep $AA\5,Rep $00\5,Rep $FF\5]'uyandirma sinyali preambl
SerOut GPIO.2,140,["D","E","M",DEGER]
SerOut GPIO.2,140,["D","E","M",DEGER]
SerOut GPIO.2,140,["D","E","M",DEGER]
Return


çok fazla serout kullanmışsın. 1 yada 2 adet serout kullan birde öyle dene.

birde serin veri almada biraz geçikme ver. delayms 20 gibi.

selvi

#4
isikyasar,
Belirttiğin noktaları düzelttim.Servodaki titreme geçti ama poto her sağa çevirdiğimde veya sola çevirdiğimde bunun servoda
kademe kademe gerçekleşmesi gerekirken bu durum tam gerçekleşmiyor.Mesala solla çevirdiğimde servonun hareketi sola doğru
kademe kademe giderken aniden servo ya geriye  doğru torunu bitiriyor yada sağa doğru torunu bitiriyor yani anlayacağınız
tam pottun hareketini dinlemiyor. Yani son durum bu sizce başka ne yapılabilinir.
Yaşam anlamlandırıldıkça kutsaldır....

isikyasar

basla:
Print At 1,1, Dec5 yas, "      "   ' pot değerini ekranda görme


Print At 1,8, Dec5 var1, "      "


yas=ADIn 0

bol1=(yas/4)/ 11
                                         ' servoyu konuma göre ayarlama hesabı
var1=660+bol1



SerOut PORTC.7 , 16780 , [var1]

GoTo basla

SERVOLARIN EN SOL VE EN SAĞ KONUM DEĞERLERİ HİÇ BİR ZAMAN AYNI DEĞİLDİR. GENELDE  500(EN SOL)-- 2500(EN SAĞ)  DİYE YAZAR HER YERDE...  SEN BUNA ALDANMA 
ÖNCELİKLE 1 ADET SERVOYU POT BAĞLI PİC İLE EN SOL VE EN SAĞ DEĞERLERİNİ BUL. YUKARIDA ÖRNEKTE VERDİM. 

ÖRNEĞİN;
EN SOL= 562
EN SAĞ= 2440
                      GİBİ OLABİLİYOR.
SERVONUN DEĞERİNİ BUL ÖNCELİKLE. ASIL SORUN BUNDAN KAYNAKLANIYOR GÖRECEKSİN.
BAŞARILAR....

selvi

isikyasar hocam
Belirtiğiniz noktalar banada mantıklı geldi .Üzerine çalıştıktan sonra sonucu bildiririm.
Yaşam anlamlandırıldıkça kutsaldır....

isikyasar


yusuffyk

bunu c kodlarıyla nasıl yazarız ?
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

isikyasar

C kodlarıyla hiç çalışmadım. ama çalışma mantığı konusunda yardımcı olurum.

selvi

Hocam
kosura bakmayin bazı sorunlardan kaynaklı uğraşamadım ve bir türlü sizi haberdar edemedim.Ama bugünden itibaren uğraşmaya başladım.
Henüz daha bir şey yapamadım sonra sizi bilgilendiririm.
Yaşam anlamlandırıldıkça kutsaldır....

selvi

isikyasar hocam
Alıntı YapÖRNEĞİN;
EN SOL= 562
EN SAĞ= 2440
                      GİBİ OLABİLİYOR.
SERVONUN DEĞERİNİ BUL ÖNCELİKLE. ASIL SORUN BUNDAN KAYNAKLANIYOR GÖRECEKSİN.
BAŞARILAR....
Herhalde çalışmadan uzak kaldığımdan olsa gerek tam olarak bu belirtiğiniz noktayı programa uyarlayamadım. Yardımcı olursanız sevinirim.
Yaşam anlamlandırıldıkça kutsaldır....

yusuffyk

hocam bende c koduyla yaptım bu olayı. analog bilgiyi aktarıp lcd de voltaj olarak gösterebiliyorum ama servoyu hareket ettiremiyorum. ilk başta servo motor titriyor pic durmadan reset atıyordu bu problemin voltajdan kaynaklı olduğunu anlayıp ek bir kaynakla servoları besledim artık pic reset atmıyor, lcd de voltaj bilgisini gösteriyorum ama onun altındaki servoyu hareket ettirecek kodlarım servoya hareket ettirmiyor. sebebi ne olabilir.

            adcbilgi=getc();        //gelen bilgiyi adcbilgi degiskenine aldım.
            }
            voltaj=0.019607843*adcbilgi;  //voltaj degeri 5/255=0.019607843 yapar bu adım voltajıdır. gelen bilgi bu degerle carpılarak voltaj bulunur.
            lcd_gotoxy(1,2);printf(lcd_putc,"VOLTAJ=%fV",voltaj);delay_ms(200); //lcd 2.satır 1.sütundan itibaren voltaj degerini yaz.
            //bundan sonrada servoyu hareket ettirmek için gerekli formülü ve kodlarımı yazıyorum.
            cikis=((adcbilgi*1.86)+600);
            bekle=(20000-cikis);
            output_high(pin_a2);
            delay_us(cikis);
            output_low(pin_a2);
            delay_us(bekle); 

bu hareket ettirecek kodlarda sıkıntı yok belirteyim onu öncelikle. 877a yı direk servo ve potla denediğimde bu formüllerle istediğim hareketi sağlıyorum. analog veriyide adcbilgi olarak alıyorum ama bunu servoda kullanamıyorum. bir önerisi olan veya c koduyla bu işlemi yapabileceğim alternatif bir şey var mı?
         
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

isikyasar

 device 16f877

dim yas as word     
dim var1 as vord
dim bol1 as word


basla:

Print At 1,1, Dec5 yas, "      "     'değerlerin hepsini ekranda görmen için bir tanımlama
Print At 2,1, Dec5 sem, "      "    'değerlerin hepsini ekranda görmen için bir tanımlama

Print At 1,8, Dec5 var1, "      "    'değerlerin hepsini ekranda görmen için bir tanımlama
Print At 2,8, Dec5 var2, "      "    'değerlerin hepsini ekranda görmen için bir tanımlama

yas=ADIn 0    'port A.0 daki pot değerini oku 

bol1=(yas/4)/ 11   'okunan analog değeri 4 e böl ve çıkan değeri 11e böl.

var1=660+bol1   'servoyu çalıştırmak için gereken kod.  servonun en sol değeri 660(sabit başlangıç değeri), en sağ ise pot değerindeki en yüksek ayarladığın değer. 


goto basla
end

bu kodlar her servo için aynı olmuyor. bazı servoların başlangıç değerleri değişiyor. örneğin bazı servoların en sol ve en sağ değerleri.

en sol         en sağ
660              2460
540              2537
520              2389

bu değerler örnektir. siz servonun değerini kendiniz bulun. başlangıç değerini 400'den başlatın en sol değeri bulun. en sol değeri benim yaptığım gibi (örneğin 660). en sol değeri bulduğunuzda değeri sabitleyin. örneğin 572 buldunuz servonun değerini.
var1=572+bol1    en sol değerinizi yazın.

sonrasında pot değerini yüksek tutun. en sol 572 ise nekadar daha eklemeliyim ki servo en sağ konuma gelsin. aşağı yukarı 2200 olsun en sağ pot ayar değeriniz. siz gerçek devrede denediğinizde en sol değer 572 olduğu için servo artık daha aşağı değere inemeyecektir.
servonun en sağ konumu ise 2105 değerinde en sağda olduğunu gördünüz.
demekki;
EN SOL = 572
EN SAĞ = 2667
 
sanırım anlatabildim.  kolay gelsin.