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
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.
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?
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?
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
O zaman MATLAB tarafını kontrol edin araya disp(value) ekleyerek command window kısmından kontrol edin
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
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.
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ı
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 ?