Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Diğer => Konuyu başlatan: a.ser20 - 18 Temmuz 2023, 09:51:42

Başlık: Haberleşme
Gönderen: a.ser20 - 18 Temmuz 2023, 09:51:42
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?
Başlık: Ynt: Haberleşme
Gönderen: elektronikhobi - 18 Temmuz 2023, 11:01:29
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 :

(https://elektronik.vercel.app/resim/rfask.png)