Arduino Arduino Dersleri Gömülü Sistemler

Arduino Ders#9: Seri Haberleşme Nedir ?

3 başlık altında İnceleyebilir:
1.Arduino nun bilgisayara veri göndermesi örnek: merhaba dünya yazısı veya led okundu, buton baslıldı bilgisi gibi
2.Bilgisayarın arduino’ya veri göndermesi, yani klavyeden veri girilmesi
3. Arduino’nun çeşitli diğer cihazlarla veri alışverişinde bulunması.

Bilgisayar ile Arduino nasıl haberleşir?

Bu sorunun cevabı Seri İletişim protokolu. (Serial communucation protokol). Buna göre veriler tek bir hat üzerinde sırayla karakter (bit) karakter yollanılıp alınabiliyor. Tabi buna bir saat sinyali (kare dalga) eşlik ediyor.

rt

Bilgisayardan Arduino’ya, Arduino’dan da Bilgisayara bilgiler bu yolla iletiliyor. Arduino’nun üzerinde bu iletişimi sağlayan pinler dijital 0 ve digital 1 pinleri. Bu pinler Tx (Transmitter-verici) ve Rx (Reciever-alıcı) pinleri. Bu pinler ile haberleşme yapılırken, ters bir bağlantı yapılıyor. Yanı Arduino’nun alıcısı, bilgisayarın vericisine, verici bağlantısı ise bilgisayarın alıcısına bağlanıyor. Bu şekilde iletişim sağlanıyor.

Seri Dönüştürücü
Arduino Pro Mini

Bu iletişimde  ilk bit başlangıç, 8 bit veri, sonraki bir parity ve son bit ise bitiş biti olarak kodlanır ve böylece tekrar eder. Bunların sırası saat sinyali ile kontrol edilir.

Ayrıca Arduino’nun üzerinde Tx ve Rx LED’leri kullanıldıklarında yanıyor. Yani Arduino veri yollarken Tx LED’i, veri alırken Rx LED’i yanıyor. Zaten Arduino üzerinde Tx ve Rx LED’lerinin dışında bir güç LED’i (arduinoya güç verildiğini gösteren, Arduino’nun çalıştığını gösteren) bir LED ile 13 numaralı dijital çıkışa bağlı olan toplam dört LED bulunmakta.

arduino-ledlerİ.png

Kod üzerinden haberleşmek için Arduinı IDE yazılımında sağ üst köşede bulunan Seri Haberleşme Portu kullanılıyor. (Araçlar menüsü üzerinden de ulaşılabilir). Ayrıca bu port açıldığında sanki Arduino’nun üzerindeki reset butonuna basılmış gibi tüm program baştan yürütülmeye başlar.

img_20190111_171311
img_20190111_171253

Haberleşme başlatmak için ilk yapılacak işlem Setup kısmına

Serial.begin(9600);

yazmak. bu kod ekranda seri port ile Arduino’nun haberleşmesini başlatıyor. 9600 sayısı’na boud rate deniyor. Bu sayı bir saniyede kaç bitlik verinin alınacağı ya da yollanacağını gösterir. (Birimi bps:bit per second). Default olarak seri port ekrano 9600 olduğu için koda da aynı değeri girdik. Seri port açıldığında bu diğer sayfanın altında görüntülenir. oradaki seçim ile koddaki değer aynı olmazsa seri port ekranında anlamsız karakterler gözükür.

Seri iletişimi başlattıktan sonra yapılacak şey Arduino’nun bize göndereceği yazıyı yazdırmak. Bunun için loop bölümüne yazacağımız kod:

Serial.print();

Burada parantez içine Arduino’nun seri porta ne yazacağını belirleriz. Sadece yazı yazılacaksa bu yazı çift tırnak ” “arasında olmalı ve Türkçe karakter kullanılmamalıdır. Ya da tanımlanan bir değişken tırnak işareti olmadan yazıldığında Arduino değişkenin içindeki değeri yazdırır.Değişkenler konusu programlamada başlı başına bir konudur ve ayrıca ilgilenilecektir. Ama kısaca bilinmesi gerekenler, değişken tanımları ya programın başında, ya da void loop içinde yapılmalıdır Bu örnekte iki değişken kullandık. İlki;          int a=3, a isimli bir tamsayı (integer) değişkeninin içine 3 değeri atandı. İkincisi ;char c. Bu c değişkenine değer atamadık, (atamak isteseydik: char b=’p’, b isimli karakter değişkenine p atadık). Bu değişken tek bitlik bir karakteri temsil eder. Neyse aşağıda birer örnek kod ve seri port ekranı görüntüsü inceleyelim:

Kod:

int a=3

char b=’p’

Serial.print(“MerhaBa”);

(Seri port ekranı :       MerhaBa)

Serial.print(a);

(Seri port ekranı :       3 )

Serial.print(b);

(Seri port ekranı :      p)

(Bu arada merhaBa’daki B özellikle büyük yazıldı. Tırnak içerisine ne yazarsanız aynısını çıktı olarak göreceksiniz anlamında)

Yukarıdaki Seri port ekranının birebir görüntüsü değil tek başlarına nasıl göründükleridir. Eğer kodun (loop içerisindeki) bir parçası olsalardı ekran şöyle gözükecekti:

MerhaBa3pMerhaBa3pMerhaBa3pMerhaBa3pMerhaBa3pMerhaBa3pMerhaBa3p

Alt alta yazdırmak için Serial.print () komutu Serial.println () şeklinde yazılırsa

MerhaBa

3

p

MerhaBa

şeklinde görüntülenir. Ancak loop içerisinde döngüde olduğundan sonsuza kadar yazdırılır ve bu çok hızlı olur. Eğer kodun bir kez çalıştırılması isteniyorsa bu kod setup bölümüne yazılmalıdır. Yani yukarıdaki kod void loop yerine void setup içine yazılsaydı, kod çalıştırıldığında sadece bir kez alt alta MerhaBa, 3 ve p yazdırılacaktı. Loop bölümünde tekrar edilen yazıları okuyabilmek için döngüyü yavaşlatmak gerekir. bunu yapmak için:

delay();

komutu kullanılır. Parantez içine milisaniye cinsinden zaman yazılır. Bu süre boyunca program durur, sonra alt satır derlenir. delay(1000); yazmak, o satıra geldiğinde programı 1 saniye durduracağından ekranda kayan yazıları okumak daha kolay olacaktır.her bir satır arasına bu komut yazılsaydı ekranda önce; MerhaBa, 1 saniye sonra;3, bir saniye sonra p yazılırdı.  Üç Serial.println satırından sonra yazılınca bir saniyede bir alt alta MerhaBa, 3 ve p aynı anda yazılacaktır.

2. Serial.available()>0

Karşılıklı haberleşmek istersek biz de Arduino’ya bir haber yollamalı, Arduino’da bu habere karşılık bize bir cevap yollamalıdır. Bu seri ekran üzerinden olabileceği gibi kendi çıkışları üzerinden (göz kırpma gibi) de olabilir. Böyle bir iletişimi sağlamanın yolu yine setup bölümünde seri haberleşmeyi başlattıktan sonra, void loop bölümünde:

if (Serial.available () > 0) { …..    }

kodunu yazmamız. burada seri porttan bir giriş olması halinde {} parantezleri arasındaki …. işlemlerinin yapılacağı belirtiliyor. . Bir de hazır yeri gelmişken istersek kodları yan yana da yazabiliriz.  Arduino her nopktalı virgülü(;) satır sonu  olarak işlem yapar. Bu da demektir ki her satır sonunda noktalı virgül olmalıdır! Ancak alt alta yazmak programın programcı tarafından takibini kolaylaştırdığı için genelde alt alta yazarız.  Hatta kontrol için satır girintileri bile (sadece) programcı için önemlidir. Bunu şunun için hatırlattım; ({) parantezi  if ile başlayan satırda da olabilir, bir alta da atılabilir. Şunu da hemen söyleyelim sadece ({ ya da } bulunan satırlar noktalı virgül ile bitmez. (bir satırda sadece { ya da } olabilir)

Kodumuza dönersek seri haberleşme mevcutsa artık Arduino’ya biz de bişeyler gönderebiliriz. Bunu yapmanın yolu seri porta istediğimiz şeyi yazmaktır. Arduino bu bilgiyi okur. Nasıl mı?

Serial.read();

komutuyla. Bu komutla seri port ekranına yazdığımız veri Arduino tarafından okunur. Bu değer bir değişkene atanmalıdır.

char c=Serial.read();

Bu kod ile okunan değer c isimli karakter(tek bit) türünde bir değişkene atandı. Şİmdi biraz işlem yaptıralım. Bu işlem okuduğu değere göre olacağından bir koşul sağlanmalı . bu da yine if komutu ile yapılacak.

if (c==’e’){ ….} ya da ;

if (c==’e’){

….

}

burada okunan değerin sadece (e) olması durumunda {} parantezleri arasında işlem yapılacaktır. Bu şartta derlenecek sadece tek bir komut satırı varsa { ve } parantezlerine gerek yoktur:

if (c==’e’)Serial.println(“e yazildi”);

gibi. Burada seri port ekranında e yazdığınız zaman Arduino da size “e yazildi” diye cevap verir. e dışında yazdığınız hiçbir şeye karşılık vermez.

digitalWrite(13, HIGH);

komutu ile 13.dijital pin HIGH yapılır. Ne demekse! bu komutta; parantez içinde önce hangi çıkış olduğu, sonra da durumunun ne olduğu yazılır. Biz burada 13 dedik ama setup’tan önce bu çıkışlara isim verip, burada parantez içinde ismi de kullanabilirdik. Virgülden sonraki HIGH ya da 1, Arduino’nun o dijital çıkışını +5 volt yapar. Tahmin edeceğiniz üzere LOW ya da 0 yazmak da çıkışı 0 volta çeker. Dolayısıyla;

if (c==’e’){Serial.println(“LED yandi”); digitalWrite (13,HIGH);}
if (c==’h’){Serial.println(“LED sondü”); digitalWrite (13,LOW);}

komutları; seri port ekranına e yazdığımız zaman, ekrana ” LED yandi “yazısı yollayıp, 13.pine bağlı olan LED’i yakar, h yazdığımız zaman, ekrana ” LED sondu ” yazısını yollayıp LED’, yakar.

Ancak digitalWrite (); kullanılmadan önce bu pinlerin çıkış modunda olduğu Arduino’ya void setup içerisinde tanıtılmalıdır (tahmin edeceksiniz ki digitalRead ();için de giriş modu)  Bunu yapmak için (setup içinde):

pinMode(13, OUTPUT);

yazılmalıdır. pinMode komutu parantez içerisine ilk yazılan pinin, virgülden sonra yazılan giriş ya da çıkış modunda olduğunu belirtir. Yine pin numarası yerine önceden atanmış pin isimleri kullanılabilir.

GirisPini = 8;

ataması yapılarak (unutulmasın void setup’tan önce!)

pinMode(GirisPini, INPUT);

Şeklinde tanımlama yapılabilir. Yukarıdaki örneklerde 13 numaralı pini çıkış pini, GirisPini isimli 8 numaralı pini ise giriş pini olarak tanımladık.

Özetlemek gerekirse bugün seri haberleşme hakkında biraz bilgi sahibi olduk. Seri port kullanımını, int ve char değişken tiplerini, bunlara değer atamayı öğrendik. gördüğümüz komutlar ise;

Serial.begin(9600);

Serial.print(); ve Serial.prinlnt();

delay();

if (Serial.available () > 0)

Serial.read();

digitalWrite(13, HIGH); digitalRead();

pinMode(13, OUTPUT);

SoftwareSerial Kütüphanesiyle Haberleşme

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.

“#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.

Aşağıdaki örnekte, 10. ve 11. pinleri yeni seri haberleşme kanallarımız olarak belirledik. ve bu kanallar üzerinden bilgisayar ekranına “merhaba dunya” yazdırdık

#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

Arduino’da birden fazla serial nesnesi de yapmak mümkündür. Bunun için iki farklı sortware pini tanımlamak gerekir. Ancak arduino, aynı anda iki tarafın haberleşmesini yapamaz. Bunun için listen() fonksiyonu kullanılır ve seri veri haberleşmesi sırayla yapılıp, ekranda yansıtılır. Ancak bizler çok fazla detay ve kafa karışıklığına sebeb olmamak için şimdilik burada bırakıcaz.

Kaynak:https://egitimsart.org/2019/01/11/arduino-seri-haberlesme/
turkcell, geleceği yazanlar

Seri haberleşme ile örnek uygulamalar için tık

https://www.mekinfo.net/wp-admin/post.php?post=670&action=edit

Similar Posts

Bir cevap yazın

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