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ı ?
https://www.thingiverse.com/thing:1241491 bu link işini görebilir. Matematiği biraz karışıktır ama uğraşırsan çözebilirsin.
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.
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.
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
(https://s1.postimg.cc/6oaex7cjzv/Proteus.jpg) (https://postimg.cc/image/6oaex7cjzv/)
(https://s1.postimg.cc/7kwf501luz/image.jpg) (https://postimg.cc/image/7kwf501luz/)
(https://s1.postimg.cc/1rrgvpel1n/Kod1.jpg) (https://postimg.cc/image/1rrgvpel1n/)
(https://s1.postimg.cc/2d14i09923/Kod2.jpg) (https://postimg.cc/image/2d14i09923/)
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.
Alıntı yapılan: kudretuzuner - 04 Kasım 2017, 14: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
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
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
Merhaba,
https://www.robotistan.com/ftdi-programlama-karti-33v-5v-secilebilir
Arkadaşlar hala seri port haberleşmede sıkıntı yaşıyorum yardımcı olabilecek varmı
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.
(https://s18.postimg.cc/ri7070151/image.jpg) (https://postimg.cc/image/ri7070151/)
(https://s18.postimg.cc/3r7mow8np/kod.jpg) (https://postimg.cc/image/3r7mow8np/)
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
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.
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.
#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
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
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
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;
vb6 tarafında ise mscomm1.output ile seri port üzerinden veri gönderdim.
Private Sub cmd_l_motor_Click()
Dim speed As Byte
Dim dir As Byte
Dim msg As String
speed = 97 - Slider_l.Value
If opt_l.Value = True Then dir = 1
If opt_r.Value = True Then dir = 2
msg = "ATL" & dir & Chr(speed)
MSComm1.Output = msg
End Sub
Private Sub cmd_lcd_yaz_Click()
Dim msg As String
If opt_line1.Value = True Then
If txt_line1.Text <> "" Then
msg = "AT1" & txt_line1.Text
Else
msg = "AT3"
End If
txt_line1.Text = ""
End If
If opt_line2.Value = True Then
If txt_line2.Text <> "" Then
msg = "AT2" & txt_line2.Text
Else
msg = "AT4"
End If
txt_line2.Text = ""
End If
MSComm1.Output = msg
End Sub
Private Sub cmd_led_Click(Index As Integer)
Dim msg As String
led(Index) = Not (led(Index))
If led(Index) = True Then
Shape1(Index).FillColor = &HC0&
cmd_led(Index).Caption = "Sondur"
If Index = 0 Then msg = "ATP22222221"
If Index = 1 Then msg = "ATP22222212"
If Index = 2 Then msg = "ATP22222122"
If Index = 3 Then msg = "ATP22221222"
If Index = 4 Then msg = "ATP22212222"
If Index = 5 Then msg = "ATP22122222"
If Index = 6 Then msg = "ATP21222222"
If Index = 7 Then msg = "ATP12222222"
MSComm1.Output = msg
Else
Shape1(Index).FillColor = &HC0C0C0
cmd_led(Index).Caption = "Yak"
If Index = 0 Then msg = "ATP22222220"
If Index = 1 Then msg = "ATP22222202"
If Index = 2 Then msg = "ATP22222022"
If Index = 3 Then msg = "ATP2222022"
If Index = 4 Then msg = "ATP22202222"
If Index = 5 Then msg = "ATP22022222"
If Index = 6 Then msg = "ATP20222222"
If Index = 7 Then msg = "ATP02222222"
MSComm1.Output = msg
End If
End Sub
Port açma işlemi
Private Sub cmd_ayarla_Click()
Dim port_nr As Byte
port_nr = Val(cmb_commport.Text)
If port_nr <> 0 Then
MSComm1.CommPort = port_nr
If MSComm1.PortOpen = True Then
MsgBox "Port zaten Açık"
Else
MSComm1.PortOpen = True
MsgBox "Commport " & port_nr & " olarak ayarlandı."
End If
MSComm1.Output = "ATP00000000"
For i = 0 To 7
cmd_led(i).Enabled = True
If i < 3 Then cmd_rgb(i).Enabled = True
Next i
cmd_buzzer.Enabled = True
Timer1.Enabled = True
cmd_lcd_yaz.Enabled = True
Else
MsgBox "Lütfen geçerli Port seçin!!!"
End If
End Sub