pwm kullanarak 12 rc servo sürme yardım...

Başlatan mustafa_60, 20 Ekim 2011, 00:30:11

mustafa_60

öncelikle herkese iyi akşamlar ;

arkadaşlar ben bi proje olarak örümcek robot tasarlıyacagım.bunun için 12 servoyu kontrol edebilmem gerekiyor,yani her servoyu tek tek farklı konumlara götürebilmek de diyedebiliriz.proje mantıgı olarak 1 kaç yol war kafamda fakat nasıl uygulayacagımı bilmiyorum bunun için sizden yardım istiyorum.ilk olarak her servoyu yazılımsal pwm ile kontrol etmek.2. yol ise ı2c kullarak merkezi bir işlemciyle başka bir işlemciyi kontrol etme(pca9626,ıcl5949 vb..) yani sanki bir rgb led sürüyormuşum gibi kullanmak,aklıma gelen başka bir fikirde gene 2. yoldaki gibi merkezi bir işlemciyle birbirinden bagımsız entegrelere sadece pwm oranlarını göndererek o entegrelerin içinde bulunan yazılımla gönderilen pwm oranı kadar baglı oldugu servoyu sürmesi gibi... tabi sizinde bu gibi projelerden deneyiminiz warsa ve bilgi werirseniz çok memnun olurum.

mustafa_60

böyle bi pic yazılım sistemi ücretli olarak kurabilecek biri warsa mesaj atabilirmi veya
0531-032-83-86 numaralı telefondan bana ulaşabilirmi.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

Ben yapacak olsam, işi karıştırmadan tek işlemci üzerinde bitirmek için buna uygun bir işlemci seçerdim. Microchipde 8 bitlik 12 PWM çıkışı olan bir chip yok. 16 bitlik 24f ve dsPIC lerde var. Ayrıca birde hardware PWM çıkışlarının 50Hz 'e kadar inmesi gerekiyor. Bu durumda microchip de bunu karşılayabilen 16 bitlik bir iki işlemci var diye biliyorum. Soft PWM ile de yapılabilir. Timer kullanıp, timer başına 5-6 ya kadar PWM'i kesme ile oluşturmak da mümkün. Tamamen timer kesmeleri ile yapılırsa,  maliyeti saniye de yaklaşık olarak 1200 kesme olur.
Benim önerim ya üst seviye bir işelmci kullanmanız yada olabildiğince çok hardware PWM çıkışı olan  bir işlemci kullanıp eksikleri timer kesmesi ile tamamlamak yönünde.

Eğer dsPIC kullanmak sizin için sorun olmazsa projenize başlayacak kadar ön setuplar ve PWM konfigürasyonları konusunda yardımcı olurum.


Alıntı yapılan: bunalmis - 22 Ekim 2011, 15:28:37
STM32F407 ile yapsak olurmu?

Şimdi gönder deyince gördüm. 

ARM de diğer seçenek..

32F4 ile aslında çok güzel bir robot kol yapılabilir.
Hafızam beni yanıltmıyorsa bir robot kol ve kamera kullanarak SMD dizgi üzerine bir konu vardı. Kit üzerindeki değilde, bir üst model işlemci de kamera interface de vardı.
Yakın gözlüklerimi kullanmaya başladığımdan beri "kamera interface" duydukça konu aklıma geliyor.

teknikelektronikci

Alıntı yapılan: mustafa_60 - 22 Ekim 2011, 15:01:44
böyle bi pic yazılım sistemi ücretli olarak kurabilecek biri warsa mesaj atabilirmi veya
0531-032-83-86 numaralı telefondan bana ulaşabilirmi.

niye kendiniz yapmiyorsunuz, yazmiyorsunuz
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

shark27

walla arkadaşım ben 18 servoyu anı anda kontrol ettim bende örümcek yapıcaktım baktım yürüme algoritması filan çok zor hazırını aldım.....:)      lynxmotion.com sitesinden bakabilrsin

Digimensch

Su Projeye bir bak istersen.Ben burda 5 Servoyu USB üzerinden kontrol etmistim.
Saniyorum Kodlarda degisiklik yapilarak 12 servoda kontrol edilebilinir.
http://www.uguryalcin.de/elektronik/pic-programlama-elektronik/334

mustafa_60

@shark27  eger o projeyi bi üniversiteye tez olarak werdiysen projeni gördüm lynxmotion sitesinden alınmış.robotunuda bizzat gördüm hoca bi çocugun eline wermiş oynuyordu öyle. bizim hoca vasıtasıyla inceleme fırsatım oldu.:d aslında robotu yaptırmayı düşünüyordum çok yerede başwurdum fakat olumsuz tepkiler alınca kendim yapmaya karar werdim. we bitmek üzere....fakat bazı problemler war örnegin entegreye enerji verdigimde direk olarak servolar ileri konumdan dönmeye başlıyor.ve  diger problem ise servolar dönerken bir kaç kere dönüyor we hepsi birden çok kısa bi süre bekleme yapıyolar program aşagıdaki gibidir.yardım edebilecek biri warsa sevinirim program micro c de yazılmıştır.




char srv1=100,srv2=100,srv3=100,srv4=100;
char srv5=100,srv6=100,srv7=100,srv8=100;
char srv9=100,srv10=100,srv11=100,srv12=100;

#define servo1  PORTC.F0
#define servo2  PORTC.F1
#define servo3  PORTC.F2
#define servo4  PORTC.F3
#define servo5  PORTC.F4
#define servo6  PORTC.F5
#define servo7  PORTC.F6
#define servo8  PORTC.F7
#define servo9  PORTD.F0
#define servo10  PORTD.F1
#define servo11  PORTD.F2
#define servo12  PORTD.F3




void rc_servo_1(char x ){  // 1 tane RC servo kotrol etmek için
char i,j,k;
for (j=1;j<=x;j++){
   for (i=1;i<=10;i++){
               servo1 = 1;
               for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;
         delay_ms(15);
       }
  }
}

void rc_servo_2(char x ){  // 1 tane RC servo kotrol etmek için
char i,j,k;
for (j=1;j<=x;j++)
  for (i=1;i<=10;i++){
               servo1 = 1;
         for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;

               servo2 = 1;
         for(k=0;k<srv2;k++) delay_us(3);
         servo2 = 0;
         delay_ms(15);
      }
}

void rc_servo_3(char x ){  // 1 tane RC servo kotrol etmek için
char i,j,k;
for (j=1;j<=x;j++)
  for (i=1;i<=10;i++){
               servo1 = 1;
         for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;

               servo2 = 1;
         for(k=0;k<srv2;k++) delay_us(3);
         servo2 = 0;

               servo3 = 1;
         for(k=0;k<srv3;k++) delay_us(3);
         servo3 = 0;

         delay_ms(14);
      }
}

void rc_servo_6(char x ){  // 1 tane RC servo kotrol etmek için
char i,j,k;

for (i=1;i<=x;i++){
               servo1 = 1;
         for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;

               servo2 = 1;
         for(k=0;k<srv2;k++) delay_us(3);
         servo2 = 0;

               servo3 = 1;
         for(k=0;k<srv3;k++) delay_us(3);
         servo3 = 0;

               servo4 = 1;
         for(k=0;k<srv4;k++) delay_us(3);
         servo4 = 0;

               servo5 = 1;
         for(k=0;k<srv5;k++) delay_us(3);
         servo5 = 0;

               servo6 = 1;
         for(k=0;k<srv6;k++) delay_us(3);
         servo6 = 0;

         delay_ms(10);
      }
}

void rc_servo_8(char x ){  // 1 tane RC servo kotrol etmek için
char i,j,k;

for (i=1;i<=x;i++){
               servo1 = 1;
         for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;

               servo2 = 1;
         for(k=0;k<srv2;k++) delay_us(3);
         servo2 = 0;

               servo3 = 1;
         for(k=0;k<srv3;k++) delay_us(3);
         servo3 = 0;

               servo4 = 1;
         for(k=0;k<srv4;k++) delay_us(3);
         servo4 = 0;

               servo5 = 1;
         for(k=0;k<srv5;k++) delay_us(3);
         servo5 = 0;

               servo6 = 1;
         for(k=0;k<srv6;k++) delay_us(3);
         servo6 = 0;

               servo7 = 1;
         for(k=0;k<srv7;k++) delay_us(3);
         servo7 = 0;

               servo8 = 1;
         for(k=0;k<srv8;k++) delay_us(3);
         servo8 = 0;

         delay_ms(10);
      }
}


void rc_servo_12(char x ){  // 1 tane RC servo kotrol etmek için
char i,j,k;

for (i=1;i<=x;i++){
               servo1 = 1;
         for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;

               servo2 = 1;
         for(k=0;k<srv2;k++) delay_us(3);
         servo2 = 0;

               servo3 = 1;
         for(k=0;k<srv3;k++) delay_us(3);
         servo3 = 0;

               servo4 = 1;
         for(k=0;k<srv4;k++) delay_us(3);
         servo4 = 0;

               servo5 = 1;
         for(k=0;k<srv5;k++) delay_us(3);
         servo5 = 0;

               servo6 = 1;
         for(k=0;k<srv6;k++) delay_us(3);
         servo6 = 0;

          servo7 = 1;
         for(k=0;k<srv7;k++) delay_us(3);
         servo7 = 0;

               servo8 = 1;
         for(k=0;k<srv8;k++) delay_us(3);
         servo8 = 0;

               servo9 = 1;
         for(k=0;k<srv9;k++) delay_us(3);
         servo9 = 0;

               servo10 = 1;
         for(k=0;k<srv10;k++) delay_us(3);
         servo10 = 0;

               servo11 = 1;
         for(k=0;k<srv11;k++) delay_us(3);
         servo11 = 0;

               servo12 = 1;
         for(k=0;k<srv12;k++) delay_us(3);
         servo12 = 0;

         delay_ms(10);
      }
}


char txt[4];
char srv = 100,i;                  // char tipinde mod ve i değişkenleri tanımlanır

void Bekle_20ms(char x){           // Servolara konumları devamlı
  rc_servo_12(x);                   // gönderilerek 20ms beklenir
}

void Servo(char s,char p){         // S değişkeni ile ifade edilen
  if (s == 1) srv1 = p;             // servoya p değişkeni ile ifade
  if (s == 2) srv2 = p;             // edilen konumları aktarılır
  if (s == 3) srv3 = p;
  if (s == 4) srv4 = p;
  if (s == 5) srv5 = p;
  if (s == 6) srv6 = p;
  if (s == 7) srv7 = p;
  if (s == 8) srv8 = p;
  if (s == 9) srv9 = p;             // servoya p değişkeni ile ifade
  if (s == 10) srv10 = p;             // edilen konumları aktarılır
  if (s == 11) srv11 = p;
  if (s == 12) srv12 = p;
  rc_servo_12(1);
}


void ileri(){
    bekle_20ms ( 1 ); // 1.Adım    // servolara konumları gönderilir

   servo (1,70);
   servo (2,70);
   servo (3,70);
   servo (4,70);
   servo (5,70);
   servo (6,70);
   servo (7,70);
   servo (8,70);
   servo (9,70);
   servo (10,70);
   servo (11,70);
   servo (12,70);                // Robot ileri gidecek şekilde
             bekle_20ms ( 1 ); // 1.Adım    // servolara konumları gönderilir
   servo (7,110);
   servo (9,110);
   servo (11,110);
   servo (1,140);
   servo (3,140);
   servo (5,140);
   servo (7,148);
   servo (9,148);
   servo (11,148);
   servo (8,110);
   servo (10,110);
   servo (12,110);
   servo (2,130);
   servo (4,160);
   servo (6,176);
   servo (8,148);
   servo (10,148);
   servo (12,148);





     }

void geri(){
bekle_20ms ( 1 ); // 1.Adım    // servolara konumları gönderilir

   servo (1,70);
   servo (2,70);
   servo (3,70);
   servo (4,70);
   servo (5,70);
   servo (6,70);
   servo (7,70);
   servo (8,70);
   servo (9,70);
   servo (10,70);
   servo (11,70);
   servo (12,70);                // Robot ileri gidecek şekilde                      // Robot geri gidecek şekilde
   bekle_20ms ( 10 ); // 1. Adım    // servolara konumları gönderilir
   servo (12,148);
   servo (10,148);
   servo (8,148);
   servo (6,160);
   servo (4,70);
   servo (2,130);
   servo (12,110);
   servo (10,110);
   servo (8,110);
   servo (11,70);
   servo (9,148);
   servo (7,148);
   servo (5,140);
   servo (3,140);
   servo (1,140);
   servo (11,110);
   servo (9,110);
   servo (7,110);
   servo (1,140);
   servo (3,140);
   servo (5,140);
   servo (7,110);
   servo (9,110);
   servo (11,110);

}

void sag(){                                // Robot sağa dönecek şekilde
    bekle_20ms ( 10 ); // 1.Adım           // servolara konumları gönderilir

}

void sol(){                                // Robot sola dönecek şekilde
    bekle_20ms ( 10 ); // 1.Adım           // servolara konumları gönderilir

}

void main(){
  TRISC    = 0X00;      //C PORTU ÇIKIŞ
  PORTC    = 0X00;     //C PORTU SİLİNİR
  TRISD    = 0X00;     // D portu çıkış yapılır
  PORTD    = 0X00;     // D portu silinir
  TRISE    = 0X00;     // E portun çıkış yapılır

  ADCON1   = 7;        // ADC kapatılır
  TRISA.F0 = 1;        // sağ engel algılayıcı giriş yapılır
  TRISA.F1 = 1;        // sol engel algılayıcı giriş yapılır
  TRISA.F2 = 1;       // ileri
  TRISA.F3 = 1;       //GERİ
  TRISA.F4 = 1;      // SAG
  TRISA.F5 = 1;       //SOL
      bekle_20ms ( 1 ); // 4.Adım
  while(1){
        PORTE.F0 = ~PORTA.F0; // sağ engel algılayıcısının değeri E0 LED'inde görünür
        PORTE.F1 = ~PORTA.F1; // sol engel algılayıcısının değeri E0 LED'inde görünür
        if((PORTA.F2 ==0) )  ileri();

       if((PORTA.F3 ==0) )  geri();

       if((PORTA.F4 ==0) )  sag();

       if((PORTA.F5 ==0) )  sol();


        if ((PORTA.F0 == 0)&&(PORTA.F1 == 0)) ileri();
        // Engel yok , engel olmadığı sürece ileri gidilir

        if ((PORTA.F0 == 1)&&(PORTA.F1 == 0)) sol();
        // Sağda engel var , engele çarpmamak için sola dönülür

        if ((PORTA.F0 == 0)&&(PORTA.F1 == 1)) sag();
        // Solda engel var , engele çarpmamak için sağa dönülür

        if ((PORTA.F0 == 1)&&(PORTA.F1 == 1)){         // Karşıda engel var
             for (i = 1;i<=6;i++) geri();            // 6 adım geri gidilir
             for (i = 1;i<=6;i++) sag();             // 6 adım sağa dönülür
       }
   }                                                 // Tekrar başa döner
}

mustafa_60

bide shark27 o yazdıgın kodlar duruyormu duruyorsa bi kodları yazabilirmisin...

aslan_korhan

Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

mustafa_60

@aslan_korhan
biliyorum kardeşim tcl 5940- veya pca9626 entegreleri ile 16 yı bırak 40 servo bie sürebilirim fakat bunlar için ı2c iletişim protokolünü bilmek gerekiyor we ben bunu bilmiyorum.2 entegreyi haberleştirme

aslan_korhan

I2C değil, SPI haberleşmesi var. Net'te birçok örneği var. Çok zor değil bu protokolü çözmek...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

mustafa_60

hepinize teşekkür ederim ilginiz için programlama kısmını bitirdim.bi tek alıcı ve verici devresi kaldı.benim takıldıgım nokta entegre kısmını 5 v ile besleyebiliriz pil vasıtasıyla flan,fakat 12 servoyu nasıl beselyecegim 2 tane 9v luk pili parelel bagladım ama yetmedi servoları enerjilemedi bunun iiçin ne yapmam gerekiyor sürekli kablolu olarak dıışarıdan 5 v mu verecegim servolara.buna bi çzüm bulabilirmisiniz.

Kabil ATICI

Pilleri paralel bağladım derken doğrudan uçları birbirine değdirerek yapmamışsındır.
(En azından iki diyot kullanarak bağladığını varsayım)

Aslında elinde pil haricinde besleme imkanın varsa önce onunla dene. Çekilen akımı incele. Pille beslemede güç aşımı varsa gerilimde çöker.

Başka bir çözüm olarak Tüm motorları aynı anda çalıştırma. Muhtemeler sisteminde hepsi aynı anda çalışmayacak. Bazılarıı ikinci bir sistemmiş gibi ötemeli bir zaman aralığında çalıştır. Böylece hepsi birden besleme sistemine yüklenmez.
İki grubu birbirine göre diyelimki faz farkı oluşturacak şekilde çalıştırma gerekibilir.

Motorlar çalıştığı zaman sistemdeki regülatörün akım sınırını aşıyor olabilirsin? eğer işlemci de bu regülatörden besleniyorsa sistem çalışmayabilir! (işlemci için bağımsız regülatör olabilir)
kolay gelsin...
ambar7

mustafa_60

devreye güç kaynagı ile 5 v verdigimde (genellikle servolar 6 lı şekilde çalışır)devrenin çektigi akımın en yüksek degeri 0.75 amper, muhtemelen bu degerde 10 servo flan çalışıyor. fakat normal bi şekilde 0.45  amper flan akım çekiyor.pilleri bagladıgımda diyot kullanmamıştım fakat ondan olacagını pek sanmıyorum.
not:piyasada satılan panasonic 9v pillerle 1 servo 2-3 kere ileri geri gitti sonra durdu.2 tane parelel 9v luk pil bagladıgımda 2 servo çalıştı ve durdu.tabi 9v luk gerilim 7805 vasıtası ile 5 v a düşürüp uyguladım. bugun piyasada satılan sarı kaplı 6 lı pil aldım 15 liraya 1200 amh 7.3v bi ihtimal bi süre kaldırır diye düşünüyorum bi onu deniyecegim sizin bi fikriniz warsa,we paylaşırsanız memnun olurum...