![]() |
|
|
Hobi Servo Sürelim (Bilgisayar Kontrollü) / 27 Ekim 2008
Hobi servolar girişine uyguladığımız darbenin genişliğine göre 0-180 derece arasında dönme açısını değiştirilebildiğimiz motorlardır. Model uçakların kanat açıları, uzaktan kumandalı arabaların direksiyon sistemleri, el-kol hamleleri-adım atma-tutma-bırakma gibi hareketler gerektiren ve çok yüksek tork gerektirmeyen robotlar için ideal motorlardır. Bu motorlar çeşitli boy ve torklarda olabiliyor: Büyük resimden görüldüğü üzere servolarımızın üç girişi var, ikisi besleme üçüncüsü data(veya pwm) girişi yani darbe genişliği uyguladığımız giriştir. Hobi servomuzu kontrol etmek için bir kare dalga işaretinin darbe genişliğini belirli sınırlar içerisinde değiştiririz, yani ismini koymak gerekirse darbe-genişlik modülasyonu yaparız. Renklerden hangi pin ne işe yarıyor görebiliyoruz. Nitekim bizim servomuzda kahverengi:toprak, kırmızı:+, turuncu:data. Diğer hobi servolarda renkler nasıl bilmiyorum ama kırmızı(+) ve siyah(toprak) kablolar varsa kalan girişin pwm girişi olduğunu söyleyebiliriz. Communication: Pulse Width Modulation (PWM) Bu bilgileri bulma işine girmeden önce servomuza bir hareket verelim, bakalım çalışıyor mu! Servomuza 1ms darbe genişliği uygulayarak konumlandığı açıya bakalım. Besleme gerilimi olarak servonuzun teknik bilgilerine bakabilirsiniz. Bizim servomuz için “Operating voltage 4.2-6V” denilmiş. Genel olarak 6V uygulanabilir, ben 5V uyguluyorum. Servomuzun data girişine b0 pinini bağlayacak olursak bunun için bizim yazacağımız temel kod: while(1){ output_high(pin_b0); delay_us(1000); output_low(pin_b0); delay_us(19000); } olacaktır. long b0=600; while(1){ output_high(pin_b0); delay_us(b0); output_low(pin_b0); delay_us(20000-b0); } yazarsak servomuzun pozisyonunu b0 değişkeniyle kontrol edebiliriz. Hobi servo sürmek bu kadar basit:) long b0=1000; while(1){ if(!input(pin_b3)){ //dugmeye basildi b0+=50; delay_ms(200); deger=b0/10; putc(deger); //8 bitlik sayıyı bilgisayara gönder } if(!input(pin_b4)){ //dugmeye basildi b0-=50; delay_ms(200); deger=b0/10; putc(deger); } output_high(pin_b0); //surmeye devam delay_us(b0); output_low(pin_b0); delay_us(20000-b0); }//while Bilgisayara göndermek şart değil b0 ın ilk değerini programınızda 1000us gibi sabit bir sayıya eşitleyin sonra düğmeye kaç defa bastıysanız o kadar 50 us ekleyerek(veya çıkararak) servonuzun sınır darbe genişliklerini tespit edebilirsiniz. Her düğmeye bastığınızda “toggle” eden bir led olursa adım kaçırmazsınız. Sınır değerleri de bulduysak artık servomuzu istediğimiz açıya getirebiliriz. Peki ne kadar bir hassasiyetle? Devre düzeneğinizi bozmadan düğmelerle değiştirdiğiniz b0 değerini 50 us değil de daha az yapın, bakalım tepki veriyor mu? Bizim servomuz için bu hassasiyet “Dead band width =10 us” olarak verilmiş. Bu da yaklaşık 1 dereceye tekabül ediyor. Peki bu yöntemle aynı anda kaç servoyu sürebiliriz? long s1=650,s2=650,s3=650; while(1){ output_high(pin_b0); delay_us(s1); output_low(pin_b0); output_high(pin_b3); delay_us(s2); output_low(pin_b3); output_high(pin_b4); delay_us(s3); output_low(pin_b4); delay_us(20000-s1-s2-s3); }//while Gelelim bu bilgilerimizi güzel bir uygulamada kullanma kısmına: while(1){ output_high(pin_b0); delay_us(s1); output_low(pin_b0); output_high(pin_b3); delay_us(s2); output_low(pin_b3); output_high(pin_b4); delay_us(s3); output_low(pin_b4); delay_us(20000-s1-s2-s3); }//while }//main #INT_RDA void seri_data_geldi(){ bx=getc(); // bx de long türünden if(bx==200){ //sira ilk motorun sira=1; } if(bx==220){//sira ikinci motorun sira=2; } if(bx==240){//sira ucuncu motorun sira=3; } if(bx<200){ //gelen veri motorlara if(sira==1){ s1=10*bx+540; } if(sira==2){ s2=10*bx+540; } if(sira==3){ s3=10*bx+540; } } output_toggle(pin_a1); //kesme geldi belirteci } Peki elimizde servo yoksa bu uygulamayı Proteusta simüle edebilir miyiz? Evet. Bunun için öncelikle “eltima virtual serial port” programı gibi bilgisayarımızda virtual serial port oluşturabilecek bir programa ihtiyacımız var. Çünkü “virtual port” oluşturamazsak visual studio.net ile açtığımız porta proteus bağlanamayacak, proteusla açtığımız porta vs.net bağlanamayacak. Bahsettiğim virtual serial port programı bilgisayarımızda birbirine bağlanmış sanal port çifti oluşturuyor, örn com1 ve com2 olarak. Proteustan com1 e bağlanıp başka programlardan com2 ye bağlanarak iki program arasında iletişimi sağlayabiliyoruz. Dikkat etmemiz gereken bir diğer nokta proteusta kullandığımız servonun sağ tık menüsüyle açılan özelliklerinin kendi servomuzla uyuşuyor olmasıdır.
“Hobi Servo Sürelim (Bilgisayar Kontrollü)” için 11 YorumYorum Yapın |
|
| |
29 Ocak 2009, 21:48
Selam.ben devreyi butonla kontrol edecem bilgisayarla değil.Devreyi yaptım servoya pals gidiyo ama servo dönmüyo.birde çalışınca sürekli titreme yapıyo.Elimle pals ucuna değince normal dönüyo.Yardım edin…
31 Ocak 2009, 22:24
Ahmet servoyu hangi PIC in hangi piniyle sürüyorsun? Bu bilgilerle sana yardım edebilmemiz biraz zor. İyi çalışmalar.
18 Mart 2009, 22:57
selamlar… ben bu uygulamada birşey sormak istiyorum. öncelikle ben pic16f877 kullanmak istiyorum. RS232 ile bilgisayar bağlantısında araya max 232 entegre kullanmamız gerekirmi? direk bilgisayara bağlama, gerilim farklılıkları sorunu yaratırmı?
19 Mart 2009, 00:37
http://antrak.org.tr/index.php?option=com_content&task=view&id=1192 adresinde seviye dönüştürücü kullanmaksızın 22k direnci üzerinden seri porttan PIC e direkt bağlantı yapılmış. Ancak yazının sonunda riskli bir uygulama olduğu notu da düşülmüş. Seriport ile PIC arasında gerilim seviyeleri açısından çok fark var, dolayısıyla max232 gibi bu iş için tasarlanmış bir seviye dönüştürücü kullanmamız daha uygun olacaktır.
20 Temmuz 2009, 03:36
Dostum kralsın valla kitaplarda vay efendim pwm miş timermış onlarla bi sürü hesaplamaymış en iyi çözüm en basit olanıdır tebrik ederim. Saygılarla…
Ben de delaylerle oynamayı düşünmüştüm senin gibi ama baya bi düşünmem gerekiyomuş paylaşım için teşekkürler çok iş görecek bu
24 Temmuz 2009, 17:52
En üstteki resimde rc servonun yanına 1 ytl bozuk para koyman dikkatimi çekti yabancı sitelerde dolarşırken onlarda da cent ya da peny görüyordum. Hoşuma gitti. Teşekkürler.
31 Temmuz 2009, 04:19
Teşekkürler hocam C# ile seri port uygulaması için harika bir ornek olmuş…
06 Ocak 2010, 19:52
ben 16f84 kullanarak buton ile kontrol etmek istiyorum nasıl yapabilirim. aslında rs232 ile de kontrol etmek istiyorum da onu yetiştiremeyebilirim. bitirme projem için lazım acil yardımcı olursanız sevinirim.
21 Ocak 2010, 10:15
öncelikle yaptıgınız örnek harika C# için harika bır örnek benim şöyle bir sorunum var usb ile bilgisayarın iletişimini bilgisyayardan görmek istiyorum acaba böyle direk bir elektronik devre varmıdır acaba yoksa nasıl bu devreyı oluşturablırıım şimdiden yardımlarınız için çok teşekküreler…
14 Mayıs 2010, 00:49
Dostum eline koluna sağlık çok güzel bir anlatım. Ben bir öğretmenim ve bunu iznin olursa bu şekilde öğrencilerime anlatmak istiyorum. Tabii ki senin isminle.. Teşekkürler
18 Temmuz 2010, 01:53
cok gusel bır uygulama paylaşım için çok teşekkurler…Ancak benım yapacagım uygulamada virtual thermınalden c# da kı program kontrolu ıslemı yapmak ıstıyorum. c # da kı yapılmıs arabanın kontrolu acaba nasıl bır yol ızlemelıyım yardımcı olabılırmısınız??