Robotik ve Kodlama

Arduino

SoftwareSerial Kütüphanesiyle Haberleşme

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Cansu Uludağ

Bilgisayarla seri haberleşme yaptığımız gibi, diğer elektronik elemanlarla da seri haberleşme yapabiliriz. Bunun için haberleşilecek elemanların Tx ve Rx uçlarını çapraz bir şekilde Arduino'nun Tx ve Rx pinlerine takmalıyız. Arduino UNO'da sadece bir çift Tx ve Rx (1. ve 0. pinler) bulunur. Bu pinler aynı zamanda USB üzerinden bilgisayarla haberleşmemizi sağlayan pinlerdir. Yani bilgisayarla haberleşme halinde bulunan Arduino'nun 0 ve 1. pinler kullanılamaz.

Arduino MEGA gibi gelişmiş kartlarda birden fazla Tx Rx çifti bulunduğu için bu cihazlar, hem harici olarak başka modüllerle seri haberleşebilirken hem de bilgisayara veri yollayabilir. "SoftwareSerial" kütüphanesi Arduino Uno gibi sadece bir çift Tx Rx pini bulunan kartlar için geliştirilmiştir. Bu kütüphane yardımıyla Arduino'nun diğer pinleri de Tx ve Rx olarak kullanılabilmektedir.

Dikkat! "SoftwareSerial" kütüphanesiyle tanımlanacak Rx pinlerinin OnChange kesmesini (interrupt) sağlamaları gerekmektedir.

"SoftwareSerial" kütüphanesi kullanabilmek için öncelikle bu kütüphaneyi projemize eklemeliyiz. Bu kütüphane Arduino IDE'si kurulduğunda otomatik olarak oluşturulmaktadır. Eğer Arduino'nun yüklü olduğu dizindeki "libraries" dosyasında "SoftwareSerial" kütüphanesi bulunmuyor ise, kütüphaneyi internetten indirip bu dizine atabilirsiniz.

Hatırlatma: "Libraries" dosyasına yeni kütüphane yüklediğinizde, açık olan Arduino programlarını kapatıp tekrar açmayı unutmayınız.

"#include <SoftwareSerial.h>" komutuyla kütüphaneyi kodumuza ekledikten sonra seçeceğimiz iki pini Rx ve Tx olarak tanımlayabiliriz. Bunun için;

SoftwareSerial seriHaberlesmeNesnesi(10, 11);

Komutu kullanılır. Burada "seriHaberlesmeNesnesi" yerine farklı bir değişken ismi verilebilir. Bu değişken seri haberleşme fonksiyonlarını çağırabilmek için kullanacağımız nesnedir. Nesne kurulumuna yazılan 10 ve 11 numaraları pin sayılarını göstermektedir. Örneğin burada 10. pin Rx olarak, 11. pin ise Tx olarak tanımlanmıştır.

Hatırlatma: Rx pininin kullandığınız Arduino türünde onChange Interrupt'ını desteklediğinden emin olunuz. Aksi taktirde bu porttan veri alınamaz.

Rx ve Tx pinleri tanımlandığına göre bu portlar üzerinde işlem yapabiliriz. Öncelikle donanımsal serialda yapıldığı gibi "seriHaberlesmeNesnesi.begin(9600)" komutuyla haberleşme başlatılmalıdır. Bu komutun bir kere kullanılması yeterli olduğu için setup fonksiyonu içerisine yazılması yeterlidir. Normal Serial nesnesinin sahip olduğu diğer fonksiyonlar da bu kütüphaneyle oluşturulacak nesnelerde mevcuttur.

Aşağıdaki kodla 10 ve 11. pinlere seri haberleşmeyi destekleyen cihaz bağlayarak haberleşebilirsiniz.

#include <SoftwareSerial.h>

SoftwareSerial yeniSeriPort(10, 11);
/*
Arduino -> Diğer Cihaz
10(Rx)  ->   Tx
11(Tx)  ->   Rx
*/

void setup()  
{
  Serial.begin(9600); /* bilgisayarla haberleşmeyi başlatıyoruz */
 
  yeniSeriPort.begin(9600); /* Yeni oluşturduğumuz haberleşme portunu açıyoruz */
  yeniSeriPort.println("Merhaba Dunya"); /* Yeni porta mesaj yolluyoruz */
}

void loop()
{
  while(yeniSeriPort.available()){ /* Yeni porta gelen bir mesaj var mı */
    Serial.write(yeniSeriPort.read()); /* Yeni porta gelen mesaj var ise mesaj bilgisayara yollanıyor */
    delay(1);  
  }
  yeniSeriPort.println("selam"); /* Yeni porta "selam" mesajı yollanıyor */
  delay(100);
}

İlerleyen konularımızda seri haberleşme portu olarak tanımladığımız 10 ve 11. pinlere, Bluetooth gibi seri haberleşme yapabilen cihazlar bağlayacağız.

 

Birden fazla Software Serial nesnesi

"SoftwareSerial" kütüphanesi kullanılarak birden fazla seri port aynı anda açılabilir. Bunun için her bir port için yeni bir nesne oluşturmalıyız. Bu nesnelere de Rx ve Tx için farklı pinler atamalıyız. Arduino donanımsal haberleşme portları için hafızasında buffer denilen özel alanlar bulunur. Porttan gelen mesajlar otomatik olarak bu alanlara kaydedilir. Software Serial kütüphanesi yazılımsal haberleşme oluşturduğu için donanımsal haberleşme kadar başarılı olmamaktadır.

Aynı anda iki Software Serial portu dinlenemediği için, portlar arasında geçiş yapmak için listen() fonksiyonu kullanılır. Bu fonksiyon tanımlandığında, tanımlanan nesnenin portu dinlenmeye başlanır. Porta gelen mesajlar otomatik olarak kaydedilir. Dinlenme işlemi bittiğinde listen() fonksiyonu diğer nesneler için kullanılabilir. Böylece tüm Software Serial portları sırayla dinlenir.

Aşağıdaki kodda bilgisayar bağlantısı için donanımsal seri haberleşme portu açılmıştır. Arduino'ya seri haberleşme destekleyen iki farklı cihaz bağlanabilmesi için iki adet yazılımsal seri haberleşme portu açılmıştır. Bu portlara gelen mesajlar sırasıyla dinlenmiş ve gelen mesajlar bilgisayara aktarılmıştır.

#include <SoftwareSerial.h>

SoftwareSerial portbir(10,11);
/*
Port Bir:
Arduino -> Diğer Cihaz
10(Rx)  ->   TX
11(Tx)  ->   RX
*/

SoftwareSerial portiki(8,9);
/*
Port İki:
Arduino -> Diğer Cihaz
8(Rx)  ->   TX
9(Tx)  ->   RX
*/

void setup()
{
 
  Serial.begin(9600); /* Bilgisayar ile haberleşmeyi başlatıyoruz */

  portbir.begin(9600); /* birinci yazılımsal haberleşme portu başlatılıyor */
  portiki.begin(9600); /* ikinci yazılımsal haberleşme portu başlatılıyor */
}

void loop()
{
  /* portbir dinleniyor */
  portbir.listen(); 
  Serial.println("Birinci porttan gelen mesaj:");
  while (portbir.available() > 0) {
    char karakter = portbir.read();
    Serial.write(karakter);
  }

  Serial.println();

  /* portiki dinleniyor */
  portiki.listen();  
  Serial.println("ikinci porttan gelen mesaj:");
  while (portiki.available() > 0) {
    char karakter = portiki.read();
    Serial.write(karakter);
  }

  Serial.println();
}

Böylece Arduino'da donanımsal ve yazılımsal olarak seri haberleşme nasıl yapılır öğrenmiş olduk. Bu haberleşme türünü ilerleyen konularda tekrar kullanacağız.