14
Ağu
2020

Arduino ve 433Mhz alıcı-verici ile joystick eksen bilgilerini gönderme

Arduino ile kablosuz haberleşme yapmak için en ucuz ve basit yöntem 433 Mhz alıcı verici seti kullanmaktır. Bu setin ülkemizde internet satış fiyatı 1 dolar civarındadır. Set iki parçadan oluşmaktadır. Aşağıdaki görseldeki 433 Mhz setin sol taraftaki modül verici veya transmitter (TX) modülü, sağ taraftaki modül alıcı veya receiver (RX) modülüdür.

Adlarından da anlaşıldığı üzere modülün birisi veri gönderir, diğeri de alır. Yani haberleşme tek yönlüdür. Bu modül; uzaktan garaj kapısı açma, bir motoru çalıştırma, bir lambayı açıp kapatma gibi basit uygulamalardan, bir robot koluna koordinat gönderme gibi karmaşık uygulamalara kadar geniş bir spektrumda kullanılabilir.

Modül, antensiz olarak kullanıldığında 20 metre çekim mesafesine sahiptir. Bazı kaynaklarda kapalı alanda ideal şartlarda 50 metreye ulaşabildiğinden bahsedilmektedir. Çekim mesafesini uzatmak için, anten bağlantı kısmına bakır bir teli yay şekline getirerek lehimlemek yeterli olacaktır. Ancak bu modülün bazı firmalarda antenli versiyonunun da satıldığını söylemekte yarar var.

Hem alıcı hem de verici modüller 5V giriş gerilimi ve çalışmakta ve 4mA akım çekmektedir. Düşük enerji tüketimi sayesinde, Arduino kartının 5V çıkışından beslemekte hiçbir sakınca yoktur. Ayrıca 1 saniyede 4Kb (Kilobit) veri gönderim hızına ulaşabilir.

Bu yazıda, bir joystickten alınan x, y koordinat bilgilerinin Arduino ile kablosuz olarak karşı tarafa gönderilmesi anlatılmaktadır.

Malzemeler

  • 2 adet Arduino
  • 1 adet 433 Mhz verici (TX)
  • 1 adet 433 Mhz alıcı (RX)
  • 1 adet Joystick

Bağlantı şeması

Aşağıdaki görsel, gönderici (TX) şemasını göstermektedir. Burada TX modülü Arduino’ nun 5V ve GND pinlerinden beslenmektedir ve veri haberleşmesi için 11 numaralı dijital pine bağlanmıştır. Josytick de Arduino’ nun 5V ve GND pinlerinden beslenmekte ve koordinat bilgileri A3 ve A4 analog pinlerinden okunmaktadır.

Aşağıdaki görselde alıcı (RX) şeması gösterilmiştir. Alıcıdan okunan veri Arduino’ nun 11 numaralı dijital pininden okunmaktadır. Hem alıcı hem de vericide 11 numaralı pinin seçilme nedeni bu pinin bir PWM pini olmasıdır.

Kaynak kod

433Mhz modül kullanmak için çeşitli kütüphaneler bulunmaktadır ancak bu yazıda VirtualWire.h kütüphanesi kullanılmaktadır. Kütüphaneyi indirmek için buraya tıklayabilirsiniz. 

Gönderim işlemini yapmak için TX modülü ve joystick bağlı olan Arduino’ ya aşağıdaki kodu yüklemek gerekmektedir.

#include <VirtualWire.h> 

int TX_PIN = 11; 
int TX_ID = 3; 

typedef struct UzakVeri    
{
  int    TX_ID;      
  int    JoystickX; 
  int    JoystickY;  
};

void setup() 
{
  vw_setup(2000);
  vw_set_tx_pin(TX_PIN);
  pinMode(A3,INPUT);
  pinMode(A4,INPUT);
}
void loop()
{
  struct UzakVeri Gonderi; 
  Gonderi.TX_ID = TX_ID; 
  Gonderi.JoystickX = analogRead(A3); 
  Gonderi.JoystickY = analogRead(A4); 
  vw_send((uint8_t *)&Gonderi, sizeof(Gonderi)); 
  vw_wait_tx();
}

Gönderilecek olan veri iki farklı koordinat bilgisini tutan iki tamsayı veridir. typedef struct UzakVeri komutu ile bu iki veriyi aynı anda göndermek için UzakVeri adında yeni bir veri tipi tanımlanmıştır. Loop fonksiyonu içinde her defasında bu veri tipinde, Gonderi adında yeni bir değişken oluşturmak için struct UzakVeri Gonderi komutu kullanılmıştır. Gonderi.TX_ID değişkenin verinin radyo adresini tutan kısmıdır ve vw_send((uint8_t *)&Gonderi, sizeof(Gonderi))komutunda bu adresteki veri gönderilmektedir. Setup fonksiyonu içindeki vw_setup(2000) komutu haberleşme hızının kaç Kbps (saniyede kaç kilobit) olacağını ifade eder. Bu değer hem alıcı hem göndericide aynı girilmek zorundadır. 433Mhz modül, 1000 ile 4000 Kbps arasında haberleşme yapabilir.

Aşağıda alıcı (RX) taraftaki Arduino kodu verilmiştir.

#include <VirtualWire.h>  

int RX_PIN = 11;
int RX_ID = 3; 
int TX_ID;

typedef struct UzakVeri 
{
  int    TX_ID;     
  int    JoystickX; 
  int    JoystickY;
};

void setup() 
{
  Serial.begin(9600);
  vw_setup(2000); 
  vw_set_rx_pin(RX_PIN);
  vw_rx_start();                 
}  

void loop()
{
  struct UzakVeri AlinanVeri;
  uint8_t AlinanVeriBoyutu = sizeof(AlinanVeri);
  vw_wait_rx();

  if (vw_get_message((uint8_t *)&AlinanVeri, &AlinanVeriBoyutu)) 
  {
    if (AlinanVeri.TX_ID == RX_ID) 
    {
      Serial.println("-------------------------------------------");      
      Serial.print("TX ID:");
      Serial.println(TX_ID);
      Serial.print("1.Veri:");
      Serial.println(AlinanVeri.JoystickX);
      Serial.print("2.Veri:");
      Serial.println(AlinanVeri.JoystickY);
      Serial.println("-------------------------------------------");
      } 
    else
    { 
      Serial.println(" Gönderici kimliği uyumsuz. Sıradaki veri bekleniyor... ");
    } 
  } 
  else 
    Serial.println("Veriye ulaşılamıyor...");
}

Alıcı tarafta yine UzakVeri adlı veri tipi tanımlanmıştır. Gelen X ve Y ekseni bilgileri bu veri içinde iki tamsayı değerdir. Kablosuz sinyalden anlamlı bir veri okumak için, alınan her verinin sinyalin neresinde başlayıp neresinde bittiğini bilmek gerekir. Bunun için gelen veri paketlerinin boyutu bilinmelidir. Burada veri paketi boyutu AlinanVeriBoyutu değişkeni ile tutulmaktadır. Okunan her verinin gönderici kimliği if (AlinanVeri.TX_ID == RX_ID) koşul ifadesi ile kontrol edilir ve gönderici kimliği alıcı kimliği ile tutuyorsa veriler SerialPort ekranına aşağıdaki şekilde yazdırılır.