Soru sorMATLAB-Arduino Haberleşmesi ile Servo Kontrolü
Tesmilci tarafından 3 yıl önce soruldu

Merhaba arkadaşlar MATLAB'ın hazır arduino kütüphanesini kullanmadan Arduino IDE'si ve MATLAB App Designer seri haberleşmesi ile Servo motor kontrolü yapmak istiyorum kodlar aşağıdaki gibidir. MATLAB üzerinden çalıştırdığımda Servo'ya güç gidiyor fakat hep aynı derecede dönüyor. Nerelerde hata yaptım görebiliyorsanız bilgilendirirseniz çok sevinirim.
Programın App Designerdaki Knob İmlecini çevirmesiyle Servo Motorun 0-180 arasında bir açıyla dönmesi gerekmekte.

 

// MATLAB-Arduino Servo Motor Kontrolü
#include <Servo.h> 
Servo servomotor;
int aci;

void setup() {
Serial.begin(9600);
servomotor.attach(3);
}
void loop() {
if(Serial.available()) {
aci=Serial.read();
servomotor.write(aci);
}
}
 
% MATLAB App Designer Kodları
function startupFcn(app)
clear all;
global port;
port=serial('COM7','BaudRate',9600);
fopen(port);
end
function KnobValueChanged(app, event)
value = app.Knob.Value;
global port
fprintf(port,value);
end
function KapatButtonPushed(app, event)
global port;
fclose(port);
delete port;
clear port;
close;
app.delete;
end
 
11 Cevap
sayginer Yönetici tarafından 3 yıl önce cevaplandı

Gerçek zamanlı kontrol ediyorsunuz ve motor yavaş mı dönüyor?

Tesmilci tarafından 3 yıl önce cevaplandı

Motor 0 dereceye geliyor program başladığında fakat knob'da herhangi bir açı değerine (value) aldığımda hep aynı derecede dönüyor. Örneğin 60 derece döndü diyelim, yeniden knob'u oynattığımda 60 derece etrafında maximum 1-2 derece oynuyor diğer derecelere gitmiyor. 

Özgür Yönetici tarafından 3 yıl önce cevaplandı
String text;
int aci=0;  


if(Serial.available()){
    
    text = Serial.readStringUntil('\n');
    aci= text.toInt(); 
    servomotor.write(aci);
    Serial.flush();

      }

Arduino kodunuzda bulunan if döngüsünü verdiğim kodlar ile değiştirerek dener misiniz?

Tesmilci tarafından 3 yıl önce cevaplandı

Yok hocam bu sefer hiç bir şey olmadı malesef.

Özgür Yönetici tarafından 3 yıl önce cevaplandı

Bu tarz seri haberleşme uygulamalarında sorun verinin doğru olarak iletip iletilmediğidir. MATLAB üzerinden gelen verinin Arduino'ya doğru şekilde ve doğru değerde ulaşıp ulaşmadığını kontrol etmeniz gerekiyor. Bunun için Serial.println(aci); komutunu kullanarak Seri Port Ekranını açarak kontrol edebilirsiniz.


String text;
int aci=0;  


if(Serial.available()){
    
    text = Serial.readString();
    aci= text.toInt(); 
    servomotor.write(aci);
    Serial.flush();

      }

Bu kodu tekrar dener misiniz?

Tesmilci tarafından 3 yıl önce cevaplandı

Yok hocam yine olmadı. Fakat programa dediğiniz gibi seri port ekranı için aşağıdaki kodları yazdığımda hep 40-55 arası ve arada da 101 ve 10  değerlerini alıyorum. Diğer derece değerlerini alamadım.
// Arduino Kodu
int aci=0;
String text;
if(Serial.available()) {
text=Serial.read();
aci=text.toInt();
servomotor.write(aci);
Serial.println(text);
}
% Matlab Kodu
function KnobValueChanged(app, event)
value = app.Knob.Value;
global port
fprintf(port,value);
app.Label.Text=fscanf(port,'%s');
end
 

Özgür Yönetici tarafından 3 yıl önce cevaplandı

O zaman MATLAB tarafını kontrol edin araya disp(value) ekleyerek command window kısmından kontrol edin

Tesmilci tarafından 3 yıl önce cevaplandı

Command window kısmından da denedim hocam dediğim gibi 40-55 arası değerler geliyor nedense. Büyük ihtimal seri haberleşmede bir sıkıntı var. Acaba 9600 dışında başka bir seri iletişim hızı denesem olurmu ? Yoksa bu seri haberleşme kısmındaki sorun nasıl düzeltilir

Özgür Yönetici tarafından 3 yıl önce cevaplandı

MATLAB kısmında command window kısmında da 40-55 arası değerler alıyorsanız sorun App Designer ile ilgilidir haberleşmede sorun yoktur. Knob yerine başka itemlar deneyebilirsiniz.

Tesmilci tarafından 3 yıl önce cevaplandı

Yok hocam dediğim gibi haberleşme esnasındaki veriyi matlaba okuttugumda hep aynı değerler alıyorum. Slider gibi farklı itemlerde denedim lakin durum aynı

Tesmilci tarafından 3 yıl önce cevaplandı

Hocam uygulamayı Matlab'ın kendi arduino kütüphanesi ile yapmaya karar verdim. O zaman sıkıntı olmuyor. Arduino'da daha önce Serial.flush() komutunu kullanmıştınız. Sanırım seri haberleşme tamamlanana kadar bekliyor. Aynı komutu MATLAB'da nasıl kullanabilirim. Command Window kısmına ' a=arduino('COM7','Uno','Libraries','Servo'); ' yazdığımda bağlanmak için biraz bekliyor. Bağlantı tamamlandığında programı bilgilendirmek istiyorum. Bu konu hakkında bilginiz var mıdır ?