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.

RFM12B-Arduino-Board

 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.

Şekil1. Dijital Sinyal ve FSK sinyal arasındaki ilişki

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.

Şekil2.RFM12B ve Arduino Bağlantısı

 

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 &amp; 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

 

 

 

Yücel Çetin

İstanbul Üniversitesi Elektrik-Elektronik Mühendisliği'nde öğrenci, Arduino sevdalısı, python meraklısı bir canlı...

10 comments

  1. Hamza Erturan dedi ki:

    E ama bu örnek Arduino Cookbook’dan (ç)alıntı.. Belirtmeniz gerekmezmiydi.. Resmi aynen kopyalamışsınız. Kodu’da türkçe commentlemiÅŸsiniz..

  2. KaÄŸan AyanoÄŸlu dedi ki:

    Alıntısız bilgi paylaşımı olmaz. Alıp türkçeleştiren arkadaşa ingilizce eksiği olanlar adına teşekkür ediyorum. Lütfen hata aramayın paylaşım yapın. 🙂

  3. Ä°lker dedi ki:

    Merhabalar,
    arduino mega ile DRF7020D27 kullanmak istiyorum.
    2 arduino + 2 DRF7020D27 alarak aralarında sürekli veri aktaracak bir bağlantı kurmak istiyorum. Amacım telemetri sistemi yapmak.
    RF’in datasheeti: http://mkpochtoi.narod.ru/Dorji_DRF7020D27_ds.pdf
    sizce kullanabilir miyim ? işime yarar mı ?
    Çekim alanı önemli olduğu için bunu seçtim.

    İyi çalışmalar.

    • Ömer Koman dedi ki:

      27db çıkışı olan modülle açık alan 60-100mt civarı haberleşebilirsin sanırım.

  4. murat dedi ki:

    Çooooooook Teşekkürler emeğinize sağlık.

  5. OÄŸuzhan dedi ki:

    Merhaba, bu rfm12b arduino modülünü nereden bulabilirim ? kolay gelsin.

  6. ibrahim dedi ki:

    merhaba haberleşme 1. sınıf öğrencisiyim bir süredir rfid teknolojileri alanında ürün takip,bilgi toplama vb sistemlerin araştırmasını yapıyorum arduino ile rfid ürün takip sistemleri yapılması mümkünmüdür ?

  7. serdar polat dedi ki:

    Merhaba RF alıcı verici ve mega kart ile yapmak istediğim şeyler hakkında yol gösterebilirmisiniz.

    Bir pc harici kameramdaki görüntüyü kablosuz olarak bir pc ye aktarmak. (abarttım galiba)
    İkincisi ise yine RF ile bir kumandanın kapama düğmesi vs. kodunu öğrenip ben aurdino ile nasıl kapatabilirim mümkünmü?

    • Ömer Koman dedi ki:

      foruma gelin inceleyin orada benzer sorulara cevap verilmişti daha önce. proje sorularına forumda daha hızlı cevap bulabilirsiniz.

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal AÄŸlar