Robot Programlama – Arduino Tümleşik Geliştirme Ortamında Seri Haberleşme

12. Arduino Tümleşik Geliştirme Ortamında Seri Haberleşme

Arduino kartlarında seri iletişim TX / RX pinleri ve USB aracılığıyla gerçekleştirilir.

Seri bağlantı Arduino kartı ile bir bilgisayar veya diğer cihazlar arasındaki iletişim için kullanılır. Tüm Arduino kartları, en az bir seri porta (aynı zamanda UART veya USART olarak da bilinir) sahiptir. Dijital pin 0 (RX) ve 1 (TX) üzerinden ve ayrıca bilgisayar üzerinden (USB) aracılığıyla iletişim kurulabilir. Bu nedenle USB kullanıldığı sürece, dijital giriş veya çıkış için 0 ve 1 numaralı pimler kullanılamazlar. Bir Arduino kartıyla iletişim kurmak için Arduino ortamının dahili seri monitörü de kullanılabilir. Bu amaçla araç çubuğundaki seri monitör düğmesi tıklanarak ve “begin()” çağrısında kullanılan aynı baud hızı seçilmelidir. Birçok seri haberleşme fonksiyonu bulunmaktadır. Burada temel olanlara yer verilmiştir.

Serial.begin()

Bilgisayar ile Arduino arasında seri iletişimi başlatmak için kullanılır. Seri veri iletimi için veri hızı saniyedeki bit sayısı (baud) cinsinden ayarlanır. Veri kaybı yaşanmaması için Arduino üzerinde ayarlanan baud oranı ile bilgisayar üzerinde ayarlanan baud oranı aynı olmalıdır. 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, ve 115200 baud oranlarından biri alınan ve gönderilen verileri hızı olarak seçilebilir.



if (Serial): Belirtilen seri portun hazır olup olmadığını gösterir.

Serial.available(): Seri bağlantı noktasından okumak için kullanılabilir bayt (karakter) sayısını öğrenmeyi sağlar.

Serial.availableForWrite(): Yazma işlemini engellemeden seri arabelleğe yazılabilecek bayt (karakter) sayısını öğrenmek için kullanılır.

ifSerialve Serial.begin kullanım şekli

Serial.available Serial.read Serial.print ve Serial.printIn kullanım örneği

Serial.begin(): Seri veri iletimi için veri hızını saniyedeki bit sayısı (baud) cinsinden ayarlamak için kullanılır.

Serial.end(): Seri haberleşmeyi devre dışı bırakmak için kullanılır. Fakat genel giriş ve çıkış işlemleri için RX ve TX pinlerinin kullanılmasına izin verir.

Serial.findUntil(): Verilen uzunluktaki hedef dizgi bulunana kadar seri arabelleğinden veri okumak için kullanılır.

Serial.flush(): Giden seri iletim verilerinin tamamlanmasını beklemek için kullanılır.

Serial.parseFloat(): ilk geçerli kayan nokta sayısını seri arabelleğinde döndürmek için kullanılır.

Serial.parseInt(): Gelen seri akıştan bir sonraki geçerli tam sayıyı aramak için kullanılır.

Serial.peek(): Gelen seri verilerin bir sonraki baytını (karakterini) dahili seri arabelleğinden kaldırmadan döndürmek için kullanılır.



Serial.print(): Veriyi seri porta okunabilir ASCII metni olarak yazdırmak için kullanılır.

Serial.println(): Veriyi seri porta okunabilir ASCII metni olarak yazdırmak için kullanılır. Fakat sonuna satır sonu ekleyerek alt satıra geçmesi sağlanır.

Serial.read(): Gelen seri iletim verilerini okumak için kullanılır.

Serial.readBytes(): Karakterleri seri porttan bir arabelleğe okumak için kullanılır. Arabelleğe yerleştirilen karakter sayısını döndürür.

Serial.readBytesUntil(): Seri arabellekteki karakterleri bir diziye okumak için kullanılır. Arabelleğe okunan karakter sayısını döndürür.

Serial.readString(): Seri arabellekteki karakterleri bir dizeye okumak için kullanılır.

Serial.readStringUntil(): Seri arabellekteki karakterleri bir dizeye okumak için kullanılır.

Serial.setTimeout(): Serial.readBytesUntil (), Serial.readBytes (), Serial.parseInt () veya  Serial.parseFloat () işlevlerini kullanırken seri veri beklenecek maksimum milisaniye değerini ayarlamak için kullanılır. Varsayılan süre 1000 milisaniyedir.

Serial.write(): İkili verileri seri bağlantı noktasına yazmak için kullanılır. Bu veriler bir bayt veya bayt serisi olarak gönderilir.

Serial.write kullanım şekli

serialEvent(): Veri mevcut olduğunda çağrılması için kullanılır. Bu verileri okumak için Serial. read() kullanılır.

13. Arduino Tümleşik Geliştirme Ortamında Seri Haberleşme Protokolleri

Dijital sistemlerde kablolu seri haberleşme ile ilgili birçok standart protokol bulunmaktadır. SPI ve I2C protokolleri bunlara örnek olarak verilebilir. Arduino kartı, diğer Arduino kartlarla veya algılayıcılarla (sensörlerle) haberleşmek için bu haberleşme protokollerini kullanmaktadır. Bu protokollerin kullandıkları uç sayıları, ulaşabilecekleri maksimum hızları ve kullanım şekilleri birbirinden farklıdır.

I2C Veri Yolu

I2C (Inter-Integrated Circuit), oldukça hızlı veri aktarımına olanak tanıyan seri haberleşme türlerindendir. Bir arada çalışan, belirli aralıklarla birbiriyle haberleşen, çeşitli çevresel cihazların çok az harici donanım gereksinimiyle haberleşmelerini sağlar. Uzun mesafeli haberleşmelerde tercih edilmez. Genellikle kısa mesafeli ve düşük veri aktarım hızının yeterli olduğu yerlerde kullanılır. Haberleşme senkron (eş zamanlı) olarak gerçekleştirilir. Haberleşme için toprak hattı dışında SDA (SerialDAta) ve SCL (SerialCLock) olmak üzere iki hat bulunmaktadır. Haberleşme hızı 400kbps’ye kadar çıkabilmektedir. I2C ile birden fazla cihaz adresleme planı içerisinde bulunduğu için kolayca haberleşebilmektedir. SDA ve SCL pinleri, kullanılan Arduino türüne göre değişiklik göstermektedir. Arduino türlerine göre SDA ve SCL pinleri aşağıdaki tabloda gösterilmiştir.

Arduino türlerine göre SDA ve SCL pinleri

I2C haberleşmesinde, haberleşmeyi kontrol eden master cihazı bulunmalıdır. Haberleşmenin gerçekleşebilmesi için haberleşme hattına en az bir adet de slave (köle) cihaz bağlanmalıdır. Hatta bağlanan birden fazla slave cihazlardan hangisinin veri aktaracağına, master cihaz karar vermektedir. Böylece hat sayısında bir değişiklik olmadan birden fazla cihazla haberleşmenin yapılması sağlanır. Bağlantı şekilleri aşağıdaki tabloda gösterilmiştir. Haberleşme için #include ile <Wire.h> kütüphanesinin eklenmesi gereklidir. Haberleşmenin tüm hat boyunca hatasız bir şekilde sağlanabilmesi için SDA ve SCL hatları, pull-up dirençlerle VCC hattına bağlanmalıdır.

I2C veri yolu bağlantı şekilleri

Aşağıdaki örnekte, robotik uygulamalarda yaygın olarak kullanılan MPU6050 3 eksenli gyro ve 3 eksen açısal ivme ölçer sensörünün I2C bağlantısı yapılarak test edilmesi sağlanmaktadır. Arduino Uno’da sda ve scl I2C pinleri sırayla A4 ve A5 pini olduğundan, sensör üzerindeki sda ve scl bağlantılarının o pinlere yapılması gerekmektedir. Bunların dışında güç pinlerinin bağlanması yeterlidir.

I2C veri yolu uygulama örneği

SPI Veri Yolu

SPI  (Seri  Çevresel  Arayüz   Serial  Peripheral Interface), Arduino’nun desteklediği senkron (veri alma ve gönderme işleminin eş zamanlı olarak gerçekleştirildiği) seri haberleşme protokolüdür. Veri iletimi tek yönlü olarak sağlanmaktadır. Özellik ve kullanım olarak I2C ile oldukça benzerlik göstermektedir. Bir Arduino’nun diğer Arduino veya sensörlerle kısa mesafede haberleşmesini sağlamak için kullanılmaktadır. SPI protokolünde de I2C’de olduğu gibi bir adet Master cihaz bulunmaktadır. Bu cihaz hatta bağlı diğer çevresel cihazları kontrol etmektedir. SPI bağlantısı için 4 adet pin kullanılmaktadır.

SPI veri yolu bağlantı şekilleri

Master ve çevresel cihazlara bağlanan MOSI (Master Out Slave In), MISO (Master In Slave Out) ve SCLK (Serial Clock) olmak üzere üç adet SPI hattı bulunmaktadır. MOSI: Master cihazdan yollanan verilerin çevresel cihazlara aktarıldığı hattır. MISO: Çevresel cihazlardan (slave) yollanan verilerin master cihaza aktarıldığı hattır. SCLK: SPI haberleşmesinde senkronu sağlayan saat sinyalinin bulunduğu hattır. Saat sinyali master cihaz tarafından üretilmektedir.



SPI protokolünde I2C’den farklı olarak veri hatları tek yönlüdür. Ayrıca çevresel cihazların (slave) adreslerinin olmasına gerek yoktur. Her çevresel cihazın seçim pini bulunur. Bu pine, SS (Slave Select) denir. Bu hattın sayısı kullanılan çevresel cihazların sayısı kadardır. Her cihaz için master cihazından ayrı  SS  hattı  çıkar.  SS  hattı  LOW  (0  volt)  düzeyinde  olan  çevresel  cihaz,  master  cihaz  ile  iletişime başlar. Verilerin gönderilmesi ve alınması clock sinyali ile senkronize bir şekilde gerçekleşir. Veriler byte’lar halinde gönderilir / alınır. Yukarıdaki tabloda 3 adet slave çevresel aygıtın yer aldığı örnek bir SPI haberleşme hattı gösterilmiştir. Bu hatların bağlandığı SPI pinleri Arduino türüne göre değişiklik göstermektedir. Arduino türlerine göre değişen bu pinler aşağıdaki tabloda verilmiştir.

Arduino türlerine göre kullanılan pinler

SPI veri yolu kullanarak haberleşmek için #include ile <SPI.h> kütüphanesinin uygulamaya eklenmesi gereklidir. Kütüphanenin uygulamaya eklenmesiyle kullanılabilecek fonksiyonlardan bazıları şunlardır:

SPI.begin(): SPI veri yolu haberleşmesini başlatmak için kullanılır.

SPI.end (): SPI veri yolunu devre dışı bırakmak için kullanılır.

SPI.beginTransaction(): Tanımlanan SPI ayarlarını kullanarak SPI veri yolunu başlatmak için kullanılır.

SPI.endTransaction(): Diğer kitaplıkların SPI veri yolunu kullanmasına izin vermek amacıyla mevcut kitaplığın SPI veri yolunu kullanmasını durdurmak için kullanılır.

SPI.usingInterrupt(): Program bir kesme işlemi içinde SPI işlemlerini gerçekleştirecekse, kesme numarası veya adını SPI kitaplığına kaydetmek için kullanılır.

SPI.setClockDivider(): SPI veri yolu haberleşmesinin saatini sistem saatine göre ayarlamak için kullanılır. Standart SPI saati “SPI_CLOCK_DIV4” olarak ayarlanmıştır. Fonksiyonun alabileceği diğer değişkenler; SPI_CLOCK_DIV8, SPI_CLOCK_DIV16, SPI_CLOCK_DIV32, SPI_CLOCK_ DIV64, SPI_CLOCK_DIV128’dir.

SPI.transfer(): SPI hattına eş zamanlı olarak veri göndermek veya veri almak için kullanılır.

Aşağıdaki örnekte birbirine SPI pinleri ile bağlı 2 Arduino UNO arasından SPI protokolü ile yapılan veri alışverişinin master ve slav kodları yer almaktadır.

Master Kodu

SPI veri yolu uygulaması master örneği

Slave Kodu

SPI veri yolu uygulaması slave örneği

Bir cevap yazın

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