Bu yazımızda Arduino Serial Port Servo kontrolü yapacağız. Servo motorların ne olduğunu nasıl çalıştığını daha önceki yazımızda bahsetmiştik arkadaşlar ve arduino ide içinde bulunan örnek program ile kontrolünü gerçekleştirmiştik. Bu yazımızda ise serial port monitöründen istediğimiz servo’ya istediğimiz açı bilgisini göndereceğiz.
Arduino serial port servo kontrol programında dikkat etmemiz gereken bir nokta var. İstediğimiz servoya istediğimiz açı bilgisini göndereceğiz ama ilk önce bir gönderim formatı bir diğer değişle protokol oluşturmamız gerek yoksa gelen verinin hangisinin servo id hangisinin açı bilgisini program anlamaz.
Bu formatı ben kafama göre belirledim. Dedim ki; ilk önce servo numarası yazılsın sonra açı bilgisi yazılsın, bunlarında arasında noktalı virgül olsun ve komut bitimide p harfi ile olsun.
3;70p yazıp gönderdiğimizde 3.servo motora 70 dereceyi göndermiş olacağız arkadaşlar.
1;180p örneğinde ise 1.servo motor 180 dereceye gidecektir.
Aşağıdaki arduino serial port servo kontrol programını incelediğimizde 3 adet servonun tanımlandığını görmekteyiz. Eğer daha fazla siterseniz Servo myservo[3]; objesindeki 3 değerini arttırın. myservo[0].attach(9); komutlarıyla servolarınızın bağlı olduğu pinleri belirleyin, başka bir şey yapmanıza gerek yok.
Programı yükleyin serial monitörü açın ve yukarıdaki gibi bir formatta istediğiniz motor numarasını yazarak istediğiniz açı bilgisini gönderin. Servoları harici olarak beslemeyi unutmayın usb akımı yetmediği zaman arduino reset alabilir.
/* tarih: 06.09.2018 web : www.kaizen40.com yazan: Remzi ŞAHİNOĞLU board: UNO Arduino pin bağlantısı 9.pin : Kalem servosu, myservo[0] 10.pin : Sağ Kol servosu, myservo[1] 11.pin : Sol Kol servosu, myservo[2] */ #include <Servo.h> Servo myservo[3]; // istenilen adet kadar servo objesi oluştur int pos; int servo_id; boolean servo_pos_change = false; String inputString; String bilgi; void setup() { Serial.begin(19200); delay(500); // servoların bağlı olduğu pinler tanımlanıyor myservo[0].attach(9); // 1.servo, kalem servosu myservo[1].attach(10); // 2.servo, sağ kol myservo[2].attach(11); // 3.servo, sol kol delay(500); } void loop() { inputString = ""; delay(20); while(Serial.available()) { char inChar = (char)Serial.read(); if(inChar == 'p') // komut bitişi { servo_pos_change = true; for (int i = 0; i < inputString.length(); i++) { char ch = inputString[i]; if (ch == ';') // paketi ayır { servo_id = bilgi.toInt(); // servoyu tanımla bilgi = ""; // bufferı temizle } else { bilgi += ch; // paketi birleştir } } pos = bilgi.toInt(); // servo pozisyon bilgisini al bilgi = ""; inputString = ""; } else { inputString += inChar; // tüm komutu birleştir } } if(servo_pos_change == true) // komut geldiğinde servo pozisyon değiştir { servo_pos_change = false; myservo[servo_id].write(pos); // seçilen servoya istenilen açıyı gönder } }
Kodu inceleyin arkadaşlar, sizde kendi protokolünüzü yazabilirsiniz. A noktasından B noktasına gitmenin birden fazla yolu vardır. En iyi yol en az satır ve en esnek olandır. Bol kodlamalar.
2 yorum
Anonim · 12 Eylül 2018 10:47 tarihinde
güzel bir çalışma
Anonim · 24 Kasım 2018 20:15 tarihinde
teşekkürler