NRF24L01 rádiós kapcsolat

Már egy ideje foglalkoztat a gondolat, hogy egy aránylag megbízható kapcsolatot tudjak teremteni különböző egységekkel vezetékek nélkül. Erre talált orvosság számomra az olcsó árú nRF24L01-es ”Wifi” modul ami valójába 2.4GHz-es rádiós adó-vevő egység (a sima rf modulok nem igazán váltak be , rettenetesen nagy csomagvesztésük miatt) .


Tulajdonságai:
2,4GHz rádiós adatátvitel az ISM sávban (engedély kötelezettség mentes sáv)
GKSK moduláció
2Mbps adatátviteli sebesség
Alacsony fogyasztás 11-12mA Tx Rx üzemmódban, 900nA alvó üzemmódban
Bemeneti feszültség tartomány 1.9-3.6V-ig
Automatikus csomag kezelés
6db beállítható átmeneti csatorna
5V-os tolerancia a bemeneteken


Bekötéséről: próbapanelban nem használható 2x4-es tüskesorra miatt. Legideálisabb megoldása
a 2x4-es szalagkábel csatlakozóval aminek a másik vége egyes apa csatikkal van ellátva, de sima
mindenhol kapható Dupon kábel is jó, ennek mindkét vége (általába) egyes csatikkal szerelt.
Ahhoz, hogy működtetni tudjuk a kapcsolást kétszeresen kell elkészítenünk. Az egyik board a
rádiós modullal lesz az adó, a másik a vevő szerepét tölti be.


NRF24L01   Arduino   Jelőlése
  1                  gnd         gnd
  2                  3V3         Vcc
  3                    9            CE
  4                  10           CSN
  5                  13           SCK
  6                  11           MOSI
  7                  12           MISO
  8                    2           IRQ

A kapcsolás:


A könyvtár letölthető: https://github.com/maniacbug/RF24 oldalról.

A szokásos kicsomagolás, átnevezés RF24-re, bemásolás az Arduino/ Librarie könyvtárba.
A fájl/ Minták / RF24 / Getting Started mintaprogramját nyissuk meg és töltsük fel mindkét adó-vevő kapcsolásra.

/*
Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
*/

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"


// az SPI 9, 10 pinjét rendeli hozzá az nrf24L01-hez
// 9- CE pin engedélyezi a modult, 10 CSN , chip select
RF24 radio(9,10);

// 2db 40bites rádiós csatorna eltárolása konstansként
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

// Típus definició
typedef enum { role_ping_out = 1, role_pong_back } role_e;

// üzenet konstansok
const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"};

// role objektum értékadása
role_e role = role_pong_back;

void setup(void)

{
Serial.begin(57600);
printf_begin();
printf("\n\rRF24/examples/GettingStarted/\n\r");
printf("ROLE: %s\n\r",role_friendly_name[role]);
printf("*** Nyomd meg a 'T' betut hogy adokent mukodjon\n\r");

radio.begin();// rádió chip indítása

// késleltetés beállítása
radio.setRetries(15,15);

//hasznos adat méret beállítása, az átvitt bájtok száma
//radio.setPayloadSize(8);
{
//radio.openWritingPipe(pipes[0]); //csatorna megnyitása írásra
radio.openReadingPipe(1,pipes[1]);// egy csatorna megnyitása olvasásra
}
//else
{
//radio.openWritingPipe(pipes[1]);
//radio.openReadingPipe(1,pipes[0]);
}
//az olvasásra megnyitott csatorna figyelése(hallgatása)
radio.startListening();
radio.printDetails();// az adatátvitel részleteinek kiíratása
}


void loop(void)
{
if (role == role_ping_out)
{
// hallgatás leállítása .
radio.stopListening();

unsigned long time = millis();
printf("Now sending %lu...",time);
bool ok = radio.write( &time, sizeof(unsigned long) );//igazzá válik ha sikeres a küldés

if (ok)
printf("ok...");//sikeres adatküldés esetén
else
printf("failed.\n\r");//sikertelen küldés

// hallgatás újra inditása (vétel)
radio.startListening();


// várakozás amíg válasz nem érkezik vagy 200 ms le nem telik
unsigned long started_waiting_at = millis();
bool timeout = false;
while ( ! radio.available() && ! timeout )//a ciklus végrehajtódik míg nem érkezik adat
if (millis() - started_waiting_at > 200 ) // ha 200ms fölé ér a változó értéke át állítja a timeot-ot
timeout = true;

// Eredmények kiíratása
if ( timeout )
{
printf("Failed, response timed out.\n\r");//ha timeout igaz kiírja a sikertelen kapcsolatot
}
else
{
//különben fogja a választ és összehasonlítja a mért értékkel
unsigned long got_time;
radio.read( &got_time, sizeof(unsigned long) );

// kiírja az összehasonlítás eredményét (az időket hasonlítja)

printf("Got response %lu, round-trip delay: %lu\n\r",got_time,millis()-got_time);
}

// várakozás
delay(1000);
}
// vételi csomagok kimásolása és visszaküldése

if ( role == role_pong_back )
{
// ha változik valami
if ( radio.available() )
{
unsigned long got_time;
bool done = false;
while (!done)
{
// kiolvassa az adatokat és összehasonlítja a tároltakkal
done = radio.read( &got_time, sizeof(unsigned long) );

// adatok kiíratása (eltelt idő)
printf("Got payload %lu...",got_time);
delay(20);
}

// leállítja a hallgatást(vételt)
radio.stopListening();

// visszaküldi a kapott üzenetet
radio.write( &got_time, sizeof(unsigned long) );
printf("Sent response.\n\r");

// új csomag vételének inditása
radio.startListening();
}
}
// a soros monitor változásait figyeli
if ( Serial.available() )
{
char c = toupper(Serial.read());// érték beolvasás a soros monitorról
if ( c == 'T' && role == role_pong_back )// ha T betű van a c-ben és vételen van az egységünk
{
//akkor kiíratjuk a következő üzenetet( váltás adásra, vissza kapcsolás az R betűvel
printf("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK\n\r");

//elsődleges adó, pingelés kifelé
role = role_ping_out;
radio.openWritingPipe(pipes[0]);//egy kimeneti csatorna beállítása
radio.openReadingPipe(1,pipes[1]);// egy bemeneti csatorna beállít
}
else if ( c == 'R' && role == role_ping_out )//ha R betű van a c-ben és adáson van
{
//akkor kiíratjuk : váltás vételre, visszakapcsolás a T betűvel
printf("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK\n\r");

// elsődleges vevő , ping vétele
role = role_pong_back;
radio.openWritingPipe(pipes[1]);// csatornák cseréje
radio.openReadingPipe(1,pipes[0]);
}
}
}


Ha valaki az ide leírt programot akarja használni az először másolja át az Arduino IDE-be, mentse
el, majd a mentett könyvtárba egy fájlkezelővel másolja be a print_f.h fájlt. A progi csak evvel fog működni!

A használatáról csak annyit : mindkét egységre feltöltjük a programot. Megnyitjuk a soros monitort , beállítjuk a jobb alsó sarkában az 57600-as bit ráta értéket. Az adatok kiírása után, írjunk be a soros monitorba egy R betűt, ez lesz a vevőnk. A másik egység soros monitorát megnyitva azt állítsuk be adónak a nagy T betű beírásával. Ha minden ok, akkor a vevőnk folyamatosan fogadja az adat csomagokat.


A két egység soros monitora közti váltás a COM portok váltásával oldjuk meg, igazából nem is a soros monitort váltjuk csak a végén lévő eszközt.

Ez egy sima  pingelő program , csomagokat küld és fogad , az  NRF24L01 ennél sokkal többre képes de erről  majd a következő részben.

Folyt köv.