Arduino Kablosuz Haberleşme

Arduino projelerinde kullanılan kablosuz iletişim seçeneklerinden biri olan Radyo Frekansları ile haberleşme sisteminde kullanılan basit ve ucuz araçlardan biri olan 433Mhz’lik alıcı verici modülünün kullanımından bahsedeceğim bu yazımda. Ürünü Türkiye’den temin edebileceğiniz gibi daha ucuz ve ücretsiz kargo seçenekleriyle Çin’den de sipariş edebilirsiniz.

Konumuza dönecek olursak bu yazıda bu modülün arduino ile kullanımı ve haberleşme konusunda verilerin hangi türde nasıl gönderildikleri ile ilgili bilgiler de yazımızda yer alacak.

Arduino ile modül arasındaki bağlantı örneği aşağıda verilmiştir. Alıcı-Verici devrelerinin data pinlerinin yerleri kullanıcının isteğine bağlı olarak değiştirilebilir.

Alıcı-Verici modülü hakkında genel donanımsal özellikler ise şu şekildedir;
Alıcı – Transmitter :
Çalışma Voltajı: 3V – 12V max
Çalışma Voltajı: 40mA max ,  min 9mA
Rezonans Modu: (SAW)
Modulasyon Modu: ASK
Çalışma Frekansı: 315MHz ya da433MHz
Transmission power: 25mW (315MHz  12V’da)
Frekans hatası: +150kHz (max)
Hızı: 10Kbps’den az
Modül açık alanda 90m mesefede haberleşme sağlayabiliyor.
Verici – Receiver :
Çalışma Voltajı: 5.0VDC +0.5V
Çalışma Akımı: ≤ 5.5mA max
Çalışma Yöntemi: OOK/ASK
Çalışma Frekansı: 315MHz – 433.92MHz
Band Genişliği: 2MHz
Hassasiyet: excel –100dBm (50Ω)
Okuma hızı: -<9.6Kbps (at 315MHz and -95dBm)-
Anten bağlantısı kablosusz bağlantı verimi artıracaktır.
Bu modül için hazırlanmış olan VirtualWire Kütüphanesini buradan indirebilirsiniz. Modülün Arduino yazılımı şekilde örneklendirilebilir.
Verici-Transmitter kısmında kullanılan arduino kodları şu şekildedir.

Yukarıda verici sistemde yer alan arduino kodlarında mesaj char değişkeni üzerine yazılan Hello World ! mesajı beş saniyelik periyotla ile gönderilmektedir. Modül bu mesajı baştan sona her bir karakterini teker teker gönderir ve alıcı sistem de mesajı bu şekilde alır. Gelin şimdi alıcı sistem için gerekli kodları inceleyelim.

Alıcı – Receiver kısmında kullanılan arduino kodları şu şekildedir.

Yukarıdaki kodda ise; gelen verinin her bir karekteri/elemanı  buf[] adlı diziye yazılır. Buf dizisinin eleman sayısı olan buflen gönderilen verinin toplam karakter sayısı kadardır.Gönderdiğimiz “Hello World !” mesajında boşluklar da dahil 13 tane karakter bulunur. Ve  buf[0]’dan  buf[12]’ye kadar toplam 13 elemanlı dizi oluşur. Gönderilen mesajın baştan sona her bir karakteri bu dizinin elemanlarına yazılır. Biz bu mesajı Serial monitör üzerinde görüntülemek için birçok yöntem kullanabiliriz. Yukarıdaki kodda olduğu gibi yalnızca Serial monitöre yazma işlemi için gelen mesajın her bir karakterinin sırasıyla yan yana print edilerek yazıldığı bir döngü kullanılabilir. Nitekim yukarıdaki kodda gelen mesajın toplam karakter sayısına göre sonlanacak olan bir for döngüsü oluşturulmuştur. Bu döngünün her adımında ise gelen mesajın bir karakteri ekrana yazılmıştır. Bu işlem çok hızlı gerçekleştiği için biz bunu sanki mesaj direk ekrana yazılmış gibi görebiliriz. Ama böyle olmayacaktır. İsterseniz Serial.print komutundan sonra 1 saniyelik bekleme kodu koyarak bu işlemi gözlemleyebilirsiniz. Bu işlem bize sadece gelen veriyi görüntülemekte yardımcı olur.
Peki ! Eğer gelen veri bir komut sisteminde kullanılacak ya da gelen mesaj bir if/else yapısında bir kontrol işlemine sokulacaksa ne yapmamız gerekir. Bu durumda gelen mesajı komut amaçlı kullanacağımız başka bir değişken üzerinde birleştirir ve tek bir karaktere dönüştürmüş oluruz. Bunu da şu şekilde yapalım. Farz edelim ki; verici sistemden alıcı sisteme bir ledi yakmak için LedON komutu gönderilsin. Alıcı sistem de bu komutu aldığında ilgili ledi yaksın yada bir motoru çalıştırsın. Örnekler çoğaltılabilir. İlk Verici kodunu LedON mesajı gönderecek ve bu işlemi sadece bir kez yapacak şekilde değiştirelim. Aşağıdaki gibi…
Verici Sistem LedON komutu gönderen Arduino kodu

Alıcı Sistem LedON Komutu Yorumlayan Arduino Kodu 



Yukarıdaki kodda verici üzerinden karakterler halinde gönderilen bir komutun karakterlerinin birleştirilip bütün bir komut haline dönüştürülmesi işlemi yapılmıştır.  İlk örnekte gönderilen mesaj için elimizde bir dizi halinde sadece mesajların sırasıyla karakterleri bulunmaktaydı ve bu karakterler sırasıyla  ayrı ayrı  serial monitöre yazılmasıyla gelen mesaj görünür hale getirilmişti. Bu örnekte ise gelen mesajın alıcı sistemde bir eyleme dönüşmesi için birleştirilme işlemi uygulanmıştır. Bu yapabilmek için STRING veri tiplerinin birbiri ile toplanması ya da ilk değere başka bir değer eklenmesi özelliği kullanılarak verici sistem üzerinden gelen karakterler bir bütün haline getirilir. Bu işlemde önce gelen mesajın/komutun karakterlerinden oluşan  buf[] dizisinin her terimi sırasıyla  char veri tipine dönüştürülür. Hemen ardından ilgili karakter char veri tipinden  string veri tipine dönüştürülür. Bu string veriler  “mesaj” adlı değişkende toplanarak bir bütün haline getirilir. Sonra bu komut herhangi bir koşul operatöründe kullanılabilir. Yukarıda da görüldüğü gibi vericiden gelen LedON komutu alıcı sistem kısmında bir ledi aktif hale getirmişti. Bu başka sistemlerde motor ya da başka bir çevre elemanı olabilir.
Son uygulama örneği ise RF üzerinden integer değer göndererek bir çevre elemanının durumunu anlık olarak değiştirecek bir program olsun. Böyle bir sistemde bir motorun hızını, bir step ya da servo motorun açısını değiştirebilir ve yahut bir lambanın parlaklığını değiştirebilirsiniz. Ya da başka sayısal işlemler için kullanabilirisiniz. GPS bilgileri, sıcaklık değeri vs. vs.. gibi örneklerle çoğaltılabilir..
Aynı verici sistem Arduino kodunda bir değişiklik yapalım daha doğrusu bir mesaj yerine sayı gönderelim. Yeniden yazmıyorum. Yukarıdakilerden birinden değiştirebilirsiniz. Gelen bu sayısal değeri alıp bir sayısal işlemde kullanan bir program da alıcı sistem için yazalım. Burada alınan veri daha önce de bahsettiğimiz gibi sayısal değer gereken tüm uygulamalarda kullanabiliriz.
Bu farklı bit dönüştürücü işlemleri ile de yapılabilir.Bu da farklı bir yöntemdir.
Öncelikle rakamların karakter kodlarını yani ASCIIkodlarını öğrenelim.
i =0 — 48
i =1 — 49
i =2 — 50
i =3 — 51
i =4 — 52
i =5 — 53
i =6 — 54
i =7 — 55
i =8 — 56
i =9 — 57
Şöyle basite indirgeyecek olursak bizler serialden 0 komutu gönderirken aslında 48 sayısını göndeririz. Diğerleri için de karşılarındaki kodlar geçerlidir. Gönderdiğimiz bu değerler gönderdiğimiz sistemlerde yorumların ve dönüştürülür.  İlk örnekteki uygulamanın verici kısmında gönderdiğimiz komut  const char olarak 0123456789 olsun. Gönderdiğimiz bu değer alıcı sistemde her bir hanesi/karakteri sırasıyla integer yani tam sayı olarak Serial monitöre yazdırılırsa karşımıza çıkacak olan değer 48495051525354555657  şeklinde olacaktır. Bizler sayısal işlem yapabilmek için bu değerleri uygun dönüşüm ile istediğimiz değerlere çevirmeliyiz. Bunun için yapmamız gereken işlem bir önceki örnekteki mantıkla aynıdır. Aşağıda bunun ile ilgili bir program paylaşıp üzerinden
anlatmaya devam edelim.

Bu örnekte yaptığımız dönüşüm aslında matematikten bildiğimiz taban dönüşümü işlemidir. Sadece bunu yazmış olduğumuz programa ve gelen veriye göre yeniden oluşturduk. Biraz vaktimi aldı bu işlem. Sayılar ve değerleri tablosundan dikkat ederseniz sayılar ve değerleri arasında 48 sayılık bir fark var. Bu ayrıntıyı kullanarak gelen char verisini integer sayıya dönüştürme işlemi yapılır. Gelen her bir karakter değeri önce kendi sayı değerine dönüştürülür bu çıkarma işlemi ile sonra da bir sayı dizisine tam sayı olarak kaydedilir. Sonra bu tam sayı dizisindeki elemanlar gelen değeri verecek şekilde bir matematiksel işlemden geçirilir ve sub toplam ifadesine eklenir. Gelen verinin kaç basamaklı olduğu buflen değişkenine yazıldığı için basamak işlemlerinde bu değer kullanılır. Lakin en yüksek basamaklı haneyi hesaplarken anlam veremediğim şekilde sürekli 1 sayı eksik değer veriyor. Bunun için de elde ettiğimiz tam sayı sub değerine her zaman +1 ekleyerek işlem yapıyoruz.

Bir örnek işlem yapacak olursak işlem adımları şu şekilde olur.

Önce ilk örnekteki verici kodunu düzenleyerek bir sayı değeri gönderelim. Bu işlemi verici kısmında sürekli ya da sadece bir kez gönderecek şekilde ayarlayabilirsiniz. Loop kısmındaki kodu setup kısmına yapıştırarak programın sadece bir kez çalışmasını sağlayabilirsiniz. Örnek olarak 53624 sayısını gönderelim. Verici sistem bu sayıyı her hanedeki rakamı ASCII kodlarıyla teker teker gönderir. Bu verileri alan alıcı sistemdeki kodlarda şu işlemler yapılır.

Char buf[] dizisinin 0’ıncı elemanına 5 karakteri yazılır. Bu karakter için ASCII kodu tamsayı olarak 53’tür. Yazdığımız kodda bu değer şu şekilde asıl değerine çevrilir,

sayi[0] = (int(buf[0])-48);
sayi[0] = (int(53)-48);

sayi[0] = 5;

Ardından bu sayının ilk hanesini taban işleminden geçirip her bir tabanın toplandığı sub toplam değerine eklenir.

          sub+ = (sayi[i])*pow(10,(buflen-(1+i)));

          sub+ = (sayi[0])*pow(10,(buflen-(1+0)));

          sub+ = (5)*pow(10,(5-(1+0)));

          sub+ = (5)*pow(10,4);

sub+ = 50000;

Olması gereken ama nedense 49999 değerini alıyor sadece en büyük basamak için..

Aynı işlemler diğer basamaklardaki rakamlar için tekrarlanır ve sub toplam değeri böylece;

Sub=50000

Sub=53000

Sub=53600

Sub=53620

Sub=53624

Şeklinde son haline almış olur teorik olarak ama işlemlerde bu değer Sub=53623 olarak sonuçlanıyor bu yüzden son işlemde sub değerine 1 eklenir.

Gönderdiğimiz sayı değerini elde ettikten sonra bu değeri gerekli sayısal işlemlerde kullanabiliriz. Mesela bir servo motora açı değeri göndererek hangi yöne dönmesini sağlayabiliriz.

RF 433MHZ Alıcı-Verici Modül ile yapmış olduğum uygulamaları sizler için düzenleyip anlatmaya çalıştım. Herkese iyi çalışmalar.

Yer işareti koy Kalıcı Bağlantı.

Bir cevap yazın

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