3 Eksenli Robot Kol

Başlatan Proself, 19 Ekim 2017, 01:34:15

Proself

Araştırma projem olan usb aracılığıyla bilgisayardan kontrollü robot kol yapmak istiyorum.Araştırdığım kadarıyla 3 adet step motoru ileri geri kontrolünü yapmam gerekiyor ama 3 motorun aynı anda nasıl kontrol edileceğini bilmiyorum ve hangi entegreyi kullanacağımıda bilemiyorum ekstradan motor sürücü entegresi gibi bir şey de kullanmam gerekir mi her motor için ayrı bir entegre + sürücü entegresi kullanmam gerekir mi pic değil ardunio ile yapmaya çalışsam tam  olarak nasıl bir değişiklik olur tüm işlemler tamamlandığında bilgisayardan kontrolü visual ile mi sağlayacağım yoksa başka bir yolla mı ?

ehliseyf

https://www.thingiverse.com/thing:1241491 bu link işini görebilir. Matematiği biraz karışıktır ama uğraşırsan çözebilirsin.
Code'm mu oturturum !

Tagli

Step motor kullanacaksan, en basit yöntem "Stepstick" isimli motor sürücüyü kullanmandır. Elbette her motor için birer tane gerekecek. Bu sürücü özellikle 3B yazıcılarda kullanıldığı için popüler oldu ve pek çok yerden uygun fiyata temin edilebiliyor. Yurtiçi alışveriş sitelerinde "DRV8825" diye aratırsan çıkar (ki aslında bu sürücünün değil, kullandığı çipin adıdır.). Sürücü yön ve adım olmak üzere iki dijital sinyal ile yönetilir. Arduino veya PIC fark etmez, kullanım mantığı aynıdır.
Gökçe Tağlıoğlu

sigmoid

DRV8825 kadar iyi olmasada easydriver da iyi iş görüyor.

A- A+ B- B+ uçlarını step motora bağlıyorsun. 12volt beslemeyi easydrivera veriyorsun. Geriye Dır pini ile step motorun yönünü belirlemek ve step pininden de kara dalga vermek kalıyor.

Proself

Arkadaşlar merhaba projemde katettiğim yollar şöyle pic olarak 16f877 yi belirledim 3 eksen için 4 motor olmasına kanaat getirdim ve 4 motor için 3 adet uln2003 entegresi belirledim gövdedeki iki motoru bir uln2003'e verdim yanlız motorlarda kod kısmında bir sıkıntı yaşıyorum ileri butonundan sonra geriye bastığımda bir kez daha ileri gidip bir sonraki bastığımda geri gitmeye başlıyor bu sorunu kodda çözdüm bu seferde motor 0 konumunda yani dikken geriye gidince - değer alma sorunundan dolayı çalışmayıp kitleniyor motorları c# ekranından kontrol etmeyi düşünüyorum seri port aracılığıyla yapmamı önerdiler ama nasıl yapacağımı bilmiyorum yardımcı olur musunuz?Şimdiden teşekkürler









kudretuzuner

04 Kasım 2017, 17:58:09 #5 Son düzenlenme: 04 Kasım 2017, 18:00:27 kudretuzuner
Merhaba,
Proteus'ta butonlarla çalıştırdığınız projenizi PIC'in Rx ve TX pinlerini kullanarak PC ile haberleştireceksiniz.Bunun için de yazılımınızı da ona göre tasarlamanız lazım.Ayrıca USB ara entegresi olan FT232R kullanmanız gerekecek.CCS C bilmediğim için kodlarınıza yardımcı olamayacağım.Prensip olarak PC'den yollayacağınız bir byte'lık data ile butonun yaptığı işi gelen data yapacaktır.Kolay gelsin.
Not :C# bilmiyorum ama VB.Net 2010 express edition kullanmaktayım.Göndereceğiniz dataları bilirsem prensip kodları da VB.Net olarak paylaşırım.
Amatör

Proself

04 Kasım 2017, 19:06:08 #6 Son düzenlenme: 04 Kasım 2017, 19:09:16 Proself
Alıntı yapılan: kudretuzuner - 04 Kasım 2017, 17:58:09
Merhaba,
Proteus'ta butonlarla çalıştırdığınız projenizi PIC'in Rx ve TX pinlerini kullanarak PC ile haberleştireceksiniz.Bunun için de yazılımınızı da ona göre tasarlamanız lazım.Ayrıca USB ara entegresi olan FT232R kullanmanız gerekecek.CCS C bilmediğim için kodlarınıza yardımcı olamayacağım.Prensip olarak PC'den yollayacağınız bir byte'lık data ile butonun yaptığı işi gelen data yapacaktır.Kolay gelsin.
Not :C# bilmiyorum ama VB.Net 2010 express edition kullanmaktayım.Göndereceğiniz dataları bilirsem prensip kodları da VB.Net olarak paylaşırım.


Çok teşekkürler kullanmam gereken ft232r hakkında biraz bilgi verir misiniz peki ve isis şemasına eklemem gereken başka bir şey varmı konu hakkında baya acemiyim yardımlarınız için şimdiden teşekkür ederim ve öğrenci olduğum için projeyi en az maliyet ve en basit haliyle tamamlamak istiyorum

mir_as82

Sene 2007 ben bitirme projemde iki adet robot kolun bilgisayar ile kontrolü Ve simülasyonu bitirme projesini yapmıştım
Owi 007 robot kolu vardı.
İçinde DC motor vardı, eksenlerine analog pot vardı.
DC motor sürücü entegre-PIC16F877 ile yapmıştım.
Projenizi Web servis ile entegre edip yapmaya çalışın. Bundan 10 sene sonra ne olur bilemiyorum ama 5 sene Web servis işleri ön planda olacak. Okulu bitirince sizin için faydalı olması için öneri olsun diye yazdım




Proself

05 Kasım 2017, 00:29:29 #8 Son düzenlenme: 05 Kasım 2017, 01:56:02 Proself
Hocam şuan C# ekranında atıyorum sağ butonuna bastığımda isiste motorun sağa dönmesini istiyorum kısacası bunuda seri port aracılığıyla yapmak istiyorum bana visual studio ve pic ccs programlarında yardımcı olacak birisine ihtiyacım var

kudretuzuner

Amatör

Proself

Arkadaşlar hala seri port haberleşmede sıkıntı yaşıyorum yardımcı olabilecek varmı

kudretuzuner

13 Kasım 2017, 13:27:12 #11 Son düzenlenme: 13 Kasım 2017, 13:29:31 kudretuzuner
Merhaba,
Nasıl bir problem var? PC arayüz yazılımınız var mı? Var ise ne yolluyorsunuz PIC'te bunu nasıl işliyorsunuz?PC'den gönderilen ve PIC'ten gelen datalar nelerdir?PIC yazılımınızda bu gönderilen ve de alınan datalara uygun mu? vs....
Hatırladığım kadarı ile USB'den data yollamaktasınız o da ayrı bir işlev.Hangi dönüştürücüyü ve hangi veri hızında yollamaktasınız?Yanıtlara göre problem daha kolay çözülür.Kolay gelsin.
Amatör

Proself

21 Kasım 2017, 20:00:01 #12 Son düzenlenme: 22 Kasım 2017, 00:51:26 Proself




Arkadaşlar step motorlarla simülasyonda döndürme kısmında şemadaki gibi eklemem gereken ya da düzeltmem gereken bir şey var mı, biraz araştırmalarımın sonunda seri haberleşmede kod kısmında biraz ilerleme kaydettim onlarıda c# ve ccs kodu olarak yazdım(çok az biçimde) ancak ileriki aşamada ne yapmam gerekiyor c# ekranından proteusu kontrol edebilmek için

fide

Merhaba. Hala aciliyeti var mı bilmiyorum ama yine de yazayım. Bilgisayardan arayüzle motor, led, buzzer, lcd ekrana yazı, rgb led kontrol eden bir arayüz yazdım. Pot ve bıtonları da bilgisayara aktarıyor. Şimdi bilg açık değil aöa en kısa zamanda hem vb6 kodlarını hem de ccs c kodlarını paylaşabilirim.


Step sürücü olarak en 5-6 uçlu motorlar için en basit uln2803 yada 2804 kullan. Het motor için dört pin, toplam 12 pin yapar.


Aslında hazır satılan ğlastik robot kollarını servo ile sürmen daha basit olur. Bilg, usb seri çevirici, pic kısmı aynı kalır, sürücü kalkar, motor kısmı servo olur.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Seri porttan gelen verileri işlemek için aşağıdaki gibi bir mantık kullanmışım. Kullanmışım diyorum çünkü 2.5 sene önce yaptığım bir projeydi. Sonra da üzerine düşmedim bir daha. İnterrupt içinde veri almak dışında işlem yapmamak gerekir ama karşılaştırmalar sadece 1-2 eşitlik üzerinden yapıldığından hız konusunda sıkıntı yok.
main.c içeriğidir.
Kod Seç

#include <main.h>
#include <def.h>
#include <regs.h>
#include <lcd2x16.c>
#include <func.c>

#int_RDA
void  RDA_isr(void
{
  
   
buzzer_on;
   
char dummy_resp;
   
   
u32 temp_counter=0;
   
u8 data_counter=0;
   
   for (
temp_counter=0;temp_counter<max_rda_data;temp_counter++)
   {
       
my_text.rda[temp_counter]='\0';
   
   }
   
  
  
data_counter=0;
  
temp_counter=0;
  
  do{
       
      
      if(
kbhit(Comm1))
      {
         
         
dummy_resp=fgetc(Comm1);
        
        if(
data_counter<max_rda_data)
        {
             
my_text.rda[data_counter]=dummy_resp;
             
data_counter++;
                
         
        }
         
temp_counter=0;
        
      
      }
      
temp_counter++;
   }while(
temp_counter<10000);
  
my_text.rda[data_counter]='\0';
  
fprintf(comm1,"RDA: %s"my_text.rda);
  
buzzer_off;
  
  if ((
my_text.rda[0]=='A')&&(my_text.rda[1]=='T'))
  {
      switch(
my_text.rda[2])
      {
         case 
'B':
               if(
my_text.rda[3]=='1')
                  {
buzzer_on;}
               if(
my_text.rda[3]=='0')
                  {
buzzer_off;}
         
         break;
         case 
'P':
               if(
my_text.rda[10]=='1'
               {
led0(1);}
               if(
my_text.rda[10]=='0')
               {
led0(0);}
               if(
my_text.rda[9]=='1')
               {
led1(1);}
               if(
my_text.rda[9]=='0')
               {
led1(0);}
               if(
my_text.rda[8]=='1')
               {
led2(1);}
               if(
my_text.rda[8]=='0')
               {
led2(0);}
               if(
my_text.rda[7]=='1')
               {
led3(1);}
               if(
my_text.rda[7]=='0')
               {
led3(0);}
               if(
my_text.rda[6]=='1')
               {
led4(1);}
               if(
my_text.rda[6]=='0')
               {
led4(0);}
               if(
my_text.rda[5]=='1')
               {
led5(1);}
               if(
my_text.rda[5]=='0')
               {
led5(0);}
               if(
my_text.rda[4]=='1')
               {
led6(1);}
               if(
my_text.rda[4]=='0')
               {
led6(0);}
               if(
my_text.rda[3]=='1')
               {
led7(1);}
               if(
my_text.rda[3]=='0')
               {
led7(0);}    
         break;
         
         case 
'L':
            
my_text.counter1=my_text.rda[3]-48;
            
my_text.counter2=my_text.rda[4]-65;
            
l_motor(my_text.counter1,my_text.counter2);
         break;
         
         case 
'R':
            
my_text.counter1=my_text.rda[3]-48;
            
my_text.counter2=my_text.rda[4]-65;
            
r_motor(my_text.counter1,my_text.counter2);
         break;
         
         case 
'C':
            
my_text.counter1=my_text.rda[3]-48;
            
my_text.counter2=my_text.rda[4]-48;
            
my_text.counter3=my_text.rda[5]-48;
            
            if((
my_text.counter1)==0)
            {
               
hi_x(rgb_r);
            }
            if((
my_text.counter1)==1)
            {
               
lo_x(rgb_r);
            }
            
             if((
my_text.counter2)==0)
            {
               
hi_x(rgb_g);
            }
            if((
my_text.counter2)==1)
            {
               
lo_x(rgb_g);
            }
             if((
my_text.counter3)==0)
            {
               
hi_x(rgb_b);
            }
            if((
my_text.counter3)==1)
            {
               
lo_x(rgb_b);
            }
   
         break;
         
         case 
'1':
           
line1=1;
           
temp_counter=0;
           do{
my_text.rda[temp_counter+3];
               if ((
my_text.rda[temp_counter+3]>40)&&(my_text.rda[temp_counter+3]<123))
               {
                  
my_text.dummy_str[temp_counter]=my_text.rda[temp_counter+3];
               }
               else
               {
               
my_text.dummy_str[temp_counter]=32;
               }
               
temp_counter++;
            }while (
my_text.rda[temp_counter+3]!=0);
            
            
my_text.dummy_str[temp_counter]='\0';
            
            
         break;
         
         case 
'2':
         
line2=1;
           
temp_counter=0;
           do{
my_text.rda[temp_counter+3];
               if ((
my_text.rda[temp_counter+3]>40)&&(my_text.rda[temp_counter+3]<123))
               {
                  
my_text.dummy_str[temp_counter]=my_text.rda[temp_counter+3];
               }
               else
               {
               
my_text.dummy_str[temp_counter]=32;
               }
               
temp_counter++;
            }while (
my_text.rda[temp_counter+3]!=0);
            
            
my_text.dummy_str[temp_counter]='\0';
            
            
         break;
         case 
'3':
            
line3=1;
         break;
         case 
'4':
            
line4=1;
         break;
         
         default:
            
fprintf(Comm1,"check");
         break;
      
      }
  
  
  
  }
   
   
   
}



void main()
{
   
setup_adc(ADC_CLOCK_DIV_32); //configure analog to digiral converter
   
setup_adc_ports(AN0); 
   
   
buzzer_off;
  
   
enable_interrupts(INT_RDA);
   
enable_interrupts(GLOBAL);
   
setup_timer_2(T2_DIV_BY_1,32,1);
   
   
setup_ccp1(CCP_PWM); 
   
setup_ccp2(CCP_PWM);

   
l_motor_pwm(0);
   
r_motor_pwm(0);
   
   
// sw için ayarlama
   
output_float(sw0);
   
output_float(sw1);
   
output_float(sw2);
   
output_float(sw3);
   
//buzzeriçin ayarlama
   
   
output_drive(buzzer);
   
   
output_drive(r_motor_cw);
   
output_drive(r_motor_ccw);
   
output_drive(l_motor_cw);
   
output_drive(l_motor_ccw);
   
   
output_drive(e);
   
output_drive(rs);
   
output_drive(d4);
   
output_drive(d5);
   
output_drive(d6);
   
output_drive(d7);
   
   
//lcd ayarlama
   
lcd_ayarla();
   
bekle(t_medium);
   
   
lcd_sil();
   
adres(1,1);
   
printf(lcd_yaz,"FiDeNet");
   
bekle(t_long);
   
lcd_sil();
   
adres(1,1);
   
printf(lcd_yaz,"dev: %s "my_device[dev_id].str);
   
adres(1,2);
   
printf(lcd_yaz,"hw:%s sw:%s"my_device[hw_ver].str,my_device[sw_ver].str);
   
   
fprintf(Comm1,"\r\nFiDeNet");
   
bekle(t_long);
   
set_adc_channel(0);//set the pic to read from analog pins
   
bekle(t_mini);
   
pot_value=read_adc();
   
bekle(25);
   
prev_pot_value=pot_value;
   
fprintf(Comm1,"\r\npot:%lu"pot_value);
         
   
    
//Example blinking LED program
    
while(true){
     
      
enable_interrupts(INT_RDA);
      
      
      
      
set_adc_channel(0);//set the pic to read from analog pins
      
bekle(t_mini);
      
//once değerleri eşitle sonra yeni değeri oku
      
prev_pot_value=pot_value;
      
      
pot_value=read_adc();
      
bekle(25);
      
      
      
prev_sw[0]=sw[0]; 
      
prev_sw[1]=sw[1]; 
      
prev_sw[2]=sw[2];     
      
prev_sw[3]=sw[3];
      
      
sw[0]=!(input(sw0));
      
sw[1]=!(input(sw1));
      
sw[2]=!(input(sw2));
      
sw[3]=!(input(sw3));
      
      
      
//if((prev_sw[0]==0)&&(sw[0]==1)||(prev_sw[1]==0)&&(sw[1]==1)||(prev_sw[2]==0)&&(sw[2]==1)||(prev_sw[3]==0)&&(sw[3]==1))
      
if((prev_sw[0]!=sw[0])||(prev_sw[1]!=sw[1])||(prev_sw[2]!=sw[2])||(prev_sw[3]!=sw[3]))
    
      {
         
fprintf(Comm1,"\r\nsw:%u%u%u%u"sw[0],sw[1],sw[2],sw[3]);
         
//bekle(t_medium);
         
lcd_sil();
         
adres(1,1);
         
printf(lcd_yaz,"sw %u %u %u %u  "sw[0],sw[1],sw[2],sw[3]);
         
      
     
      
      }
      if(
prev_pot_value!=pot_value)
      {
         
fprintf(Comm1,"\r\npot:%lu"pot_value);
         
lcd_sil();
         
adres(1,1);
         
printf(lcd_yaz,"Pot %lu    "pot_value);
      }
      
      if (
line1==1)
      {
            
buzzer_on;
            
line1=0;
            
adres(1,1);
            
printf(lcd_yaz,"                  ");
            
adres(1,1);
            
printf(lcd_yaz,"%s"my_text.dummy_str);
            
buzzer_off;
      
      }
      if (
line2==1)
      {
            
buzzer_on;
            
line2=0;
            
adres(1,2);
            
printf(lcd_yaz,"                   ");
            
adres(1,2);
            
printf(lcd_yaz,"%s"my_text.dummy_str);
            
buzzer_off;
      
      }
      if (
line3==1)
      {
            
buzzer_on;
            
line3=0;
            
adres(1,1);
            
printf(lcd_yaz,"                  ");
            
buzzer_off;
      }
      if (
line4==1)
      {
            
buzzer_on;
            
line4=0;
            
adres(1,2);
            
printf(lcd_yaz,"                  ");
            
buzzer_off;
      }
     
     
/*
      if (sw[0]==1)
      {
         l_motor(1,pot_value);
         r_motor(1,pot_value);
      }
      if (sw[1]==1)
      {
         l_motor(2,pot_value);
         r_motor(2,pot_value);
      }
      if (sw[2]==1)
      {
         l_motor(1,0);
         r_motor(1,0);
      }
      if (sw[3]==1)
      {
         l_motor(1,pot_value);
         r_motor(2,pot_value);
      }
      
      
      
      /*
      r_motor_pwm(35);
      l_motor_pwm(35);
      
      hi_x(Pin_d0);
      lo_x(Pin_d1);
      hi_x(Pin_d2);
      lo_x(pin_d3);
      
      bekle(t_long);
      
      
      hi_x(Pin_d0);
      hi_x(Pin_d1);
      hi_x(Pin_d2);
      hi_x(Pin_d3);
      bekle(t_medium);
      
      
      r_motor_pwm(35);
      l_motor_pwm(35);
      
      hi_x(Pin_d1);
      lo_x(Pin_d0);
      hi_x(Pin_d3);
      lo_x(pin_d2);
      
      bekle(t_long);
   
      hi_x(Pin_d0);
      hi_x(Pin_d1);
      hi_x(Pin_d2);
      hi_x(Pin_d3);
      bekle(t_medium);
      */
    
}
    

}


def.h içeriği
Kod Seç

typedef  int1 u1
;
typedef  unsigned int8 u8;
typedef  unsigned int16 u16;
typedef  unsigned int32 u32;

//Uart ayarları
//#use rs232(UART1,baud=9600,parity=N,bits=8,stream=rf_modul)
#use rs232(baud=57600,parity=N,bits=8, xmit=PIN_C6,rcv=PIN_C7,stream=Comm1)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=rf_comm)
//#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_B7)



//Fonksiyon Pin eşleştirme
#define led0(x) output_bit(Pin_B0,x)
#define led1(x) output_bit(Pin_B1,x)
#define led2(x) output_bit(Pin_B2,x)
#define led3(x) output_bit(Pin_B3,x)
#define led4(x) output_bit(Pin_B4,x)
#define led5(x) output_bit(Pin_B5,x)
#define led6(x) output_bit(Pin_B6,x)
#define led7(x) output_bit(Pin_B7,x)



#define bekle(x) delay_ms(x)
#define bekle_ss(x) delay_ms(x)
#define bekle_us(x) delay_us(x)


#define hi_x(x) output_high(x)
#define lo_x(x) output_low(x)
#define x_to(x,y) output_bit(x,y)

const u8 t_mini=5;
const 
u8  t_short=50;
const 
u8  t_medium=250;
const 
u16  t_long=1000;

#define rgb_B Pin_E0
#define rgb_G Pin_E1
#define rgb_R Pin_E2
#define buzzer Pin_A5

#define buzzer_on hi_x(buzzer)
#define buzzer_off lo_x(buzzer)

#define sw0 Pin_A1
#define sw1 Pin_A2
#define sw2 Pin_A3
#define sw3 Pin_A4

             
#define r_motor_pwm(x) set_pwm1_duty(x)
#define r_motor_cw Pin_D0
#define r_motor_ccw Pin_D1

#define l_motor_pwm(x) set_pwm2_duty(x)
#define l_motor_cw Pin_D3
#define l_motor_ccw Pin_D2


func.c içeriği
Kod Seç

void r_motor
(u8 dir,u8 pwm)
{
   if(
dir==1)
   {
      
hi_x(r_motor_cw);
      
lo_x(r_motor_ccw);
      
r_motor_pwm(pwm);
   }
   if(
dir==2)
   {
      
hi_x(r_motor_ccw);
      
lo_x(r_motor_cw);
      
r_motor_pwm(pwm);
   
   }
   


}

void l_motor(u8 dir,u8 pwm)
{
   if(
dir==1)
   {
      
hi_x(l_motor_cw);
      
lo_x(l_motor_ccw);
      
l_motor_pwm(pwm);
   }
   if(
dir==2)
   {
      
hi_x(l_motor_ccw);
      
lo_x(l_motor_cw);
      
l_motor_pwm(pwm);
   
   }
   


}


regs.h içeriği
Kod Seç

enum dev_inf
{
      
dev_id,
      
hw_ver,
      
sw_ver,
};

typedef struct dev_data{
   
u8 type;
   
char str[10];

}
my_dev_data;

  
my_dev_data const my_device[4]={
      
dev_id,{"FDautom1"},
      
hw_ver,{"1.00"},
      
sw_ver,{"1.01"},
};



u8 sw[4];
//onceki değerleri saklamak için 
u8 prev_sw[4];

u16 pot_value;
//onceki pot değeri saklamak için 
u16 prev_pot_value;


u1 line1=0;
u1 line2=0;
u1 line3=0;
u1 line4=0;

const 
u8 max_rda_data=30;
/*
typedef struct motor{
u8 direction;
u8 pwm;
}my_motor;

struct controls{


my_motor l_motor;
my_motor r_motor;
u8 beeper;
u8 led_rgb;
u8 led_port_b;

}my_controls;


*/
struct text_proc{

char rda[max_rda_data];
u8 counter1;
u8 counter2;
u8 counter3;
u8 counter4;
char dummy_str[17];
}
my_text;


Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com