Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Haberleşme

Başlatan a.ser20, 18 Temmuz 2023, 09:51:42

a.ser20

Bir alıcı ve bir vericim var. Alıcı gelen veriye göre ledleri yakacak fakat program içinde sürekli haberleşmeyi sağlarken ledleri nasıl kontrol ederim?

elektronikhobi

RF ASK kullanarak iki taraflı radyo iletişimi yapan bir uygulama yazmıştık.

Sunucu ve robotun üzerinde hem alıcı hem verici var. Bu yazılımı geliştirdiğiniz uygulamalarda serbestçe kullanabilirsiniz.

#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 :

#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 (ya da arabanın) seri iletişim çıktısı da şu şekilde :