Arduino RF Haberleşme-2
Daha önceden “Arduino ile RF Haberleşme” diye bir yazı paylaşmıştık. Şimdi de yine RF ile birşeyler yapmak için kablosuz ileşim sağlayan, düşük maliyetli RFM12B modülünü kullanacağız.
RFM12B nedir, ne işe yarar, üstünlükleri nelerdir?
İlk önce RFM12B‘ yi biraz tanıyalım. Yaklaşık 15,9 x16,1mm boyutlarında. 2,2-3.8V aralığında rahatlıkla çalışabiliyor. Düşük maliyetli, yüksek performanslıdır. SPI uyumlu bir arayüze sahiptir. Ayrıca üzerinde analog ve dijital RSSI çıkışları bulunmaktadır. Otomatik anten ayarı yapar. Programlanabilir TX frekans sapması yaklaşık 15-240 kHz aralığındadır. Programlanabilir alıcı bant genişliği ise 67-400 kHz aralığındadır.

Peki RFM12B’yi nerelerde kullanırız?
RFM12B uzaktan kontrollü oyuncaklarda, wireless alarm sistemlerinde, wireless sensörlerde, wireless mouse ve klavyelerde, ev otomasyonlarında ve wireless veri toplamak için kullanılabilir.
Peki biz ne yapalım?
Görüldüğü üzere diğer ucuz RF modüllerden daha yüksek özelliklere sahip olan RFM12B modülleri veri yollama ve almak için ideal. RFM12B sayesinde iki tane Arduino’yu haberleştirebiliriz.
Şu özelliği de söyle biz diğerlerini kullanmayalım?
RF modüller, sinyal iletimini verimli şekilde yapabilmek için değişik modülasyon teknikleri kullanır. Bazı modüller genlik kaydırmalı anahtarlama (ASK) modülasyonunu kullanırken, bazıları da frekans kaydırmalı anahtarlama (FSK) modülasyonunu kullanır. Yapılacak uygulamanın tipine göre uygun modülasyon türünü seçmek gerekir. Örneğin, gürültülü ortamlarda FSK tip modülleri kullanmak daha iyi sonuç vermektedir.
Peki RFM12B?
RFM12B frekans kaydırmalı anahtarlama(FSK ) modülasyonunu kullanır.

FSK modülatörler LM566 VCO kullanır. Bununla ilgili yani VCO (Voltage Controlled Oscillator-Gerilim Kontrollü Osilatör) yazsını bir iki güne Arduino Türkiye farkı ile bulacaksınız. VCO ile yaptığım bir çalışmanın sonuçlarını da ayrıca bu yazı da paylaşacağım… Şimdi konumuza dönelim.
Peki Arduino İle Nasıl Kullanacağız?
RFM12B ile iki adet Arduino’yu haberleştirebiliriz RFM12B ‘de bir çift değerleri okur ve gönderir ve diğeri alınan değeri görüntüler . Her iki çifti aynı şekilde bağlanır. RFM12B’yi Şekil2’deki gibi bağlayalım.

Verici tarafı kod:
//Analog input değerlerini 4 interger değer.
#include <RF12.h>; /*https://github.com/jcw/jeelib/blob/master/RF12.h
adresinden indirebilirsiniz*/
#include <Ports.h>;
// RF12B sabitlerini tanımlayalım:
const byte network = 100; /* network grup ( 1-255 aralığında olabilir).
Modüllerin kendi aralarında haberleşebilmeleri
için alıcı ve verici değerleri aynı olmalı. Yani burada ikisi de 100
olacak alıcı tarafında da 100 değerrini kullanacağız*/
const byte myNodeID = 1; // alıcıya özel benzersiz ID 1- 30 aralığında
//RF12B frekansı ; RF12_433MHZ, RF12_868MHZ veya RF12_915MHZ olabilir.
const byte freq = RF12_433MHZ; // Frekans modüllerle eşleştirilmeli
const byte RF12_NORMAL_SENDWAIT= 0;
void setup()
{
rf12_initialize(myNodeID, freq, network); /* RFM12'yi başlangıç
durumuna getirelim yukarıda nodeID frekans
ve network değerlerini girmiştik*/
}
const int payloadCount = 3; //"payload" içindeki int numaraları
int payload[payloadCount];
void loop()
{
for( int i= 0; i < payloadCount; i++)
{
payload[i] = analogRead(i);
}
while (!rf12_canSend()) // driver yollama için hazırmı?
rf12_recvDone(); //
rf12_sendStart(rf12_hdr, payload, payloadCount*sizeof(int));
rf12_sendWait(RF12_NORMAL_SENDWAIT); // gönderme tamamlandığında bekle
delay(1000); //
}
Alıcı Taraf Kodu:
/*
RFM12B alıcı tarafında 4 adet payload adlı analog değeri serial
monitorden göreceğiz.Hadi bakalım görelim
*/
#include <RF12.h>;
#include <Ports.h>;
const byte network = 100; //evet verici tarafında söylediğimiz 100 değeri
const byte myNodeID = 2; //alıcı için node ID(1-30 arası olabilir)
const byte freq = RF12_433MHZ;
void setup()
{
rf12_initialize(myNodeID,freq,network);
Serial.begin(9600); //Serial iletişimi başladı
Serial.println("RFM12B Alıcı Hazır");
Serial.println(network,DEC); // network değerini göster bize (100)
Serial.println(myNodeID,DEC); // nodeID'yi de göster zahmet olmaz ise (1)
}
const int payloadCount = 3;
void loop()
{
if (rf12_recvDone() &&a rf12_crc == 0 && (rf12_hdr & RF12_HDR_CTL) == 0)
/* bunlarda ne demeyelim ve
RF12.h dosyasına zahmet olmazsa bir göz atalım*/
{
int *payload = (int*)rf12_data; /* rf12 veri tamponunda
int'lere bir dizi olarak eriş*/
for( int i= 0; i < payloadCount; i++)
{
Serial.print(payload[i]);
Serial.print("Değerler");
}
Serial.println();
}
}
UYARI: Eğer RF12.h dosyasını indirip arduino lib içerisine atmazsanız “RF12_433MHZ was not declared in this scope “diye bir uyarı alırsınız.
Evet kod kısmını da tamamladık . Biz burada loop içerisinde payload isimli diziyi gönderiyoruz ve alıcı tarafından görüyoruz…
Bağlantıları hallettik peki ya anten?
3 farklı ISM [1] bant frekansından; 915 Mhz için 78 mm, 868 Mhz için 82 mm ve 433 Mhz için 165 mm anten boyları kullanılabilir. Eğer 3.3 voltluk Fio veya Arduino Pro kullanacaksanız dirençleri devreden çıkarın ve Arduino’nun 10, 11 ve 13’üncü pinleri ile RFM12B ilgili pinlerine bağlayın.
RFM12B bu kadar üstün özelliğini saydık peki ya Fiyatı?
RFM12B gerçekten bu kadar özelliği olmasına rağmen ucuz bir modül. Yaklaşık 19TL ‘ye sizde bir RFM12B sahibi olabilirsiniz.
Sonuç
Yazı içerisinde dediğim gibi ileriki günlerde VCO konusu hakkında bir yazı yayınlayacağım. Arduino Türkiye’de takipte kalın. Bazen gerçekten herkesin istediği bir konu bulmak zor oluyor. Eğer yazı altına yorum olarak istediğiniz konuları ve yazı hakkında görüşlerinizi yazarsanız iyi olur. Herkese iyi çalışmalar diliyorum. Sağlıkla ve Arduino ile kalın ….
[1] ISM: industrial, scientific and medical (ISM) radio bands
Kaynaklar
[1] Jeelib, “Wireless Communication” ,2012, https://github.com/jcw/jeelib/blob/master/RF12.h