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

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.