433 Mhz RF ASK hata giderme

Erdem⁣

Paylaşımcı üye
Katılım
14 Ocak 2013
Mesajlar
713
Puanları
106
Daha önceden haftalarca uğraşarak bu işaretleri elle çözmüştüm.

Hatta hiç kütüphane kullanmadan uzaktan kumandalı prizleri kontrol edebiliyordum. Sonra yazdığım yazılım uçmuş bir şekilde.

Biz o kadar uğraştık. Arkadaşın bir tanesi bir kütüphane yazmış saniyesinde işaretleri çözüyor. Hatta elle çözdüğüm işaretlerle karşılaştırdım. Aynısı ..

https://github.com/sui77/rc-switch/

Merak ediyorsanız kütüphaneyi kimin yazdığına bakabilirsiniz.

Daha sonra VirtualWire ve RadioHead kütüphanelerini kullandım.

Ama sorun şu ki sırayla "bir" "iki" "üç" verilerini gönderiyorum. Alıcı tarafında bir süre gösteriliyor ama anlaşıldığına göre bazı veriler iletilmiyor. Yani alıcı tarafında bazen "bir" "üç" diye bir çıktı alıyorum.

Anten uzunluğunu 17.3 santim olarak ayarladım. Daha önce yaptığım antene baktım. Kalın bir bakır telden sarmal olarak yapmışım. Uzunluğunu da hatırlayamadım.

Çözüm olarak aklıma, bir çift alıcı verici daha eklemek geldi.
sound-card-oscilloscope-probe-schematics.png

Emektar devreyi kurdum. Audacity ile işaretler.

audacity.png


Bu da Digilent'in Waveforms yazılımı ile RF ASK işaretleri.
waveforms1.png


waveforms2.png

Bu Spectrogram olayını çözemedim. Çok ilginç.
 
Spektogramla bir işin yok zaten. Bilginin.transfer bitleri.cikmis o onemli
 
sinyalask.png

Denemek için tam bir sinyali aldım.

sinyal2.png

Bu tam sallama oldu. Ama sanki 0'lar belli gibi.

sinyal3.png

Spektogram çıktısından da veri bitleri okunabiliyor mu?
 
Henüz ayrıntılı test etmedim. Ama herhalde bu sefer sağlıklı bir şekilde haberleşme sağlanıyor.

askekran.png

Robot
C++:
#include <RHReliableDatagram.h>
#include <RH_ASK.h>
#include <SPI.h>

#define SUNUCU_ADRESI 1
#define ROBOT_ADRESI 2

unsigned int vericiUcu = 10;
unsigned int aliciUcu = 12;

RH_ASK robotVerici(2000, aliciUcu, vericiUcu, 0);

RHReliableDatagram radyoIletisimi(robotVerici, ROBOT_ADRESI);


void setup()
{
    Serial.begin(9600);
    if (!radyoIletisimi.init())
        Serial.println("Radyo haberleşmesi başarısız oldu");
}

uint8_t veri[] = "Ne yaptın be yaa!";

uint8_t bellek[RH_ASK_MAX_MESSAGE_LEN];

void loop()
{
    Serial.println("Sunucuya bilgileri gönderiyorum");

    // Sunucuya bir veri gönder
    if (radyoIletisimi.sendtoWait(veri, sizeof(veri), SUNUCU_ADRESI))
    {
        // Şimdi sunucudan yanıt bekle
        uint8_t uzunluk = sizeof(bellek);
        uint8_t kimden;
        if (radyoIletisimi.recvfromAckTimeout(bellek, &uzunluk, 2000, &kimden))
        {
            Serial.print("Adresi ");
            Serial.print("0x");
            Serial.print(kimden, HEX);
            Serial.print(" olan sunucudan yanıt aldım : ");
            Serial.println((char*) bellek);
        }
        else
        {
            Serial.println("Yanıt yok. Sunucu çalışıyor mu?");
        }
    }
    else
        Serial.println("Veriyi tekrar tekrar gönderme denemesi başarısız oldu");
    delay(500);
}

Sunucu
C++:
#include <RHReliableDatagram.h>
#include <RH_ASK.h>
#include <SPI.h>

#define SUNUCU_ADRESI 1
#define ROBOT_ADRESI 2

unsigned int aliciUcu = 2;
unsigned int vericiUcu = 12;

RH_ASK sunucuVerici(2000, aliciUcu, vericiUcu, 0);

RHReliableDatagram radyoIletisimi(sunucuVerici, SUNUCU_ADRESI);


void setup()
{
  Serial.begin(9600);
  if (!radyoIletisimi.init())
    Serial.println("Radyo haberleşmesi başarısız oldu");
}

uint8_t veri[] = "Aynı be yaa. Sen ne yaptın be yaa?";


uint8_t bellek[RH_ASK_MAX_MESSAGE_LEN];

void loop()
{
    if (radyoIletisimi.available())
    {
        uint8_t uzunluk = sizeof(bellek);
        uint8_t kimden;
        if (radyoIletisimi.recvfromAck(bellek, &uzunluk, &kimden))
        {
            Serial.print("Adresi ");
            Serial.print("0x");
            Serial.print(kimden, HEX);
            Serial.print(" olan robottan yanıt aldım : ");
            Serial.println((char*) bellek);
        }
        // Yanıtı alıcıya tekrar gönder
        if (!radyoIletisimi.sendtoWait(veri, sizeof(veri), kimden))
            Serial.println("Veriyi tekrar tekrar gönderme denemesi başarısız oldu");
    }
}
 
Daha önce tek taraflı örneğin bir sıcaklık ölçerden gelen verileri sunucuya aktaran bir uygulama yazmıştım.

Şimdi iki taraflı radyo iletişimi düşündüğümden biraz daha zor oldu. Ama biraz da yardım alarak Allah'ın izniyle başarılı oldu.

Sunucu ve robotun üzerinde hem alıcı hem verici var. Bu yazılımı kendi yaptığınız uygulamalarda serbestçe kullanabilirsiniz.

C++:
#include <RHReliableDatagram.h>
#include <RH_ASK.h>
#include <SPI.h>

#define SUNUCU_ADRESI 1
#define ROBOT_ADRESI 2
#define SAGA_GIT "Sağa git"
#define SOLA_GIT "Sola git"
#define ILERI_GIT "İleri git"
#define GERI_GIT "Geri git"
#define DUR "Dur"
#define SAG_ISIGI 4
#define SOL_ISIGI 7
#define ILERI_ISIGI 8

unsigned int aliciUcu = 2;
unsigned int vericiUcu = 12;
bool hareketEdiyor = false;

RH_ASK robotVerici(2000, aliciUcu, vericiUcu, 0);
RHReliableDatagram radyoIletisimi(robotVerici, ROBOT_ADRESI);

void setup()
{
    Serial.begin(9600);
    pinMode(SAG_ISIGI, OUTPUT);
    pinMode(SOL_ISIGI, OUTPUT);
    pinMode(ILERI_ISIGI, OUTPUT);

    if (!radyoIletisimi.init())
        Serial.println("Radyo haberleşmesi başarısız oldu");
}

uint8_t bellek[RH_ASK_MAX_MESSAGE_LEN];
uint8_t komut[RH_ASK_MAX_MESSAGE_LEN];

bool durumaGoreBekle(unsigned long sure)
{
    unsigned long bitis = millis() + sure;
    while (millis() < bitis)
    {
        if (radyoIletisimi.available())
        {
            return true;
        }
        delay(10); /*  duruma göre değişebilir */
    }
    return false;
}

void sagaHareketEt()
{
    Serial.println("------------");
    Serial.println("Sağa gidiyorum");
    Serial.println("------------");

    for (int i = 0; i < 3; ++i)
    {
        digitalWrite(SAG_ISIGI, HIGH);
        durumaGoreBekle(1000);
        digitalWrite(SAG_ISIGI, LOW);
        durumaGoreBekle(1000);
    }
}

void solaHareketEt()
{
    Serial.println("------------");
    Serial.println("Sola gidiyorum");
    Serial.println("------------");

    for (int i = 0; i < 3; ++i)
    {
        digitalWrite(SOL_ISIGI, HIGH);
        durumaGoreBekle(1000);
        digitalWrite(SOL_ISIGI, LOW);
        durumaGoreBekle(1000);
    }
}

void komutuIsle(char* komut)
{
    if (strcmp(komut, SAGA_GIT) == 0)
    {
        sagaHareketEt();
    }
    else if (strcmp(komut, SOLA_GIT) == 0)
    {
        solaHareketEt();
    }
}

void loop()
{
    uint8_t veri[] = "Aynı be yaa. Sen ne yaptın be yaa?";
    if (radyoIletisimi.available())
    {
        uint8_t uzunluk = sizeof(bellek);
        uint8_t kimden;
        if (radyoIletisimi.recvfromAck(bellek, &uzunluk, &kimden))
        {
            Serial.print("Adresi ");
            Serial.print("0x");
            Serial.print(kimden, HEX);
            Serial.print(" olan sunucudan komut aldım : ");
            Serial.println((char*) bellek);
        }
        // Yanıtı sunucuya tekrar gönder
        if (!radyoIletisimi.sendtoWait(veri, sizeof(veri), kimden))
            Serial.println("Veriyi tekrar tekrar gönderme denemesi başarısız oldu");
        strncpy(komut, bellek, sizeof(komut));
        komutuIsle(komut);
    }
}

Sunucu uygulaması da şu şekilde :

C++:
#include <RHReliableDatagram.h>
#include <RH_ASK.h>
#include <SPI.h>

#define SUNUCU_ADRESI 1
#define ROBOT_ADRESI 2
#define SAGA_GIT "Sağa git"
#define SOLA_GIT "Sola git"
#define ILERI_GIT "İleri git"
#define GERI_GIT "Geri git"
#define DUR "Dur"
#define SUNUCU_GECIKMESI 500

unsigned int vericiUcu = 10;
unsigned int aliciUcu = 12;

RH_ASK sunucuVerici(2000, aliciUcu, vericiUcu, 0);
RHReliableDatagram radyoIletisimi(sunucuVerici, SUNUCU_ADRESI);

void setup()
{
    Serial.begin(9600);
    if (!radyoIletisimi.init())
        Serial.println("Radyo haberleşmesi başarısız oldu");
}

uint8_t bellek[RH_ASK_MAX_MESSAGE_LEN];

void veriGonder(uint8_t * veri, uint8_t uzunluk)
{
    Serial.println("Robota komutları gönderiyorum");

    // Robota bir komut gönder
    if (radyoIletisimi.sendtoWait(veri, uzunluk, ROBOT_ADRESI))
    {
        // Şimdi robottan yanıt bekle
        uint8_t kimden;
        if (radyoIletisimi.recvfromAckTimeout(bellek, &uzunluk, 2000, &kimden))
        {
            Serial.print("Adresi ");
            Serial.print("0x");
            Serial.print(kimden, HEX);
            Serial.print(" olan robottan yanıt aldım : ");
            Serial.println((char*) bellek);
        }
        else
        {
            Serial.println("Yanıt yok. Robot çalışıyor mu?");
        }
    }
    else
        Serial.println("Veriyi tekrar tekrar gönderme denemesi başarısız oldu");
    delay(SUNUCU_GECIKMESI);
}

void loop()
{
    veriGonder(SAGA_GIT, sizeof(SAGA_GIT));
    veriGonder(SOLA_GIT, sizeof(SOLA_GIT));
    veriGonder(ILERI_GIT, sizeof(ILERI_GIT));
    veriGonder(DUR, sizeof(DUR));
    veriGonder(GERI_GIT, sizeof(GERI_GIT));
    veriGonder(DUR, sizeof(DUR));
}

Uygulama çalışırken robotun seri iletişim çıktısı da şu şekilde :

rfask.png
 
Şu an elimde sadece 433 Mhz RF ASK alıcı ve verici var.
 

Forum istatistikleri

Konular
129,811
Mesajlar
930,342
Kullanıcılar
452,618
Son üye
mberber

Yeni konular

Geri
Üst