433 Mhz RF ASK hata giderme

Erdem⁣

Katılımcı Üye
Katılım
14 Ocak 2013
Mesajlar
586
Puanları
58
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.

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ç.
 

Ekli dosyalar

silvestir

Profesyonel Üye
Katılım
10 Ağu 2011
Mesajlar
1,873
Puanları
283
Spektogramla bir işin yok zaten. Bilginin.transfer bitleri.cikmis o onemli
 
Konu Sah
Erdem⁣

Erdem⁣

Katılımcı Üye
Katılım
14 Ocak 2013
Mesajlar
586
Puanları
58
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?
 

Ekli dosyalar

Konu Sah
Erdem⁣

Erdem⁣

Katılımcı Üye
Katılım
14 Ocak 2013
Mesajlar
586
Puanları
58
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");
    }
}
 

Ekli dosyalar

Konu Sah
Erdem⁣

Erdem⁣

Katılımcı Üye
Katılım
14 Ocak 2013
Mesajlar
586
Puanları
58
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
 

Ekli dosyalar

Sponsor Bağlantı

Forum istatistikleri

Konular
113,112
Mesajlar
796,026
Kullanıcılar
415,227
Son üye
akondra

Yeni konular

Üst