Šioje „Arduino“ pamokoje sužinosime, kaip užmegzti belaidį ryšį tarp dviejų „Arduino“ plokščių naudojant NRF24L01 siųstuvo-imtuvo modulį. Galite žiūrėti šį vaizdo įrašą arba perskaityti toliau pateiktą rašytinę pamoką.
Norėdami paaiškinti belaidį ryšį, pateiksime du pavyzdžius: pirmasis išsiųs paprastą „Hello World“ pranešimą iš vieno „Arduino“ į kitą, o antrame pavyzdyje turėsime dvikryptį ryšį tarp „Arduino“ plokščių, kur naudojant pirmojo „Arduino“ vairasvirtę valdysime servo variklį antrame „Arduino“, ir atvirkščiai, naudodamiesi mygtuku prie antrojo „Arduino“, mes valdysime šviesos diodą prie pirmojo „Arduino“.
NRF24L01 siųstuvo-imtuvo modulis – kaip jis veikia
Pažvelkime atidžiau į NRF24L01 siųstuvo-imtuvo modulį. Jis naudoja 2,4 GHz juostą ir gali veikti su perdavimo sparta nuo 250 kbps iki 2 Mbps. Naudojant atviroje erdvėje ir esant mažesnei perdavimo spartai, jo diapazonas gali siekti iki 100 metrų.
Modulis gali naudoti 125 skirtingus kanalus, o tai suteikia galimybę vienoje vietoje turėti 125 savarankiškai veikiančių modemų tinklą. Kiekvienas kanalas gali turėti iki 6 adresų arba kiekvienas įrenginys vienu metu gali bendrauti su dar 6 kitais vienetais.
Šio modulio energijos suvartojimas perdavimo metu yra apie 12mA, o tai yra net mažesnė nei vieno šviesos diodo. Darbinė modulio įtampa yra nuo 1,9 iki 3,6 V, tačiau gerai tai, kad kiti kaiščiai toleruoja 5 V logiką, todėl mes galime lengvai jį prijungti prie „Arduino“ nenaudodami jokių loginių lygių keitiklių.
Trys iš šių kaiščių skirti SPI ryšiui ir juos reikia prijungti prie „Arduino“ SPI kaiščių, tačiau atkreipkite dėmesį, kad kiekvienoje „Arduino“ plokštėje yra skirtingi SPI kaiščiai. Kaiščiai CSN ir CE gali būti prijungti prie bet kurio „Arduino“ plokštės skaitmeninio kaiščio ir naudojami modulio nustatymui budėjimo ar aktyviajame režime, taip pat perjungimui tarp perdavimo ar komandų režimo. Paskutinis kaištis yra pertraukimo kaištis, kurio nereikia naudoti.
Yra keletas NRF24L01 modulių variantų. Populiariausias yra su antena įmontuota. Tai daro modulį kompaktiškesnį, tačiau, kita vertus, sumažina perdavimo diapazoną iki maždaug 100 metrų atstumo.
Antrasis variantas, vietoj borto antenos, turi SMA jungtį ir kurį galime pritvirtinti anties anteną, kad būtų užtikrintas geresnis perdavimo diapazonas.
Trečiasis variantas, parodytas čia, be anties antenos, turi RFX2401C lustą, kuris apima PA (Galios stiprintuvas) ir LNA (Mažo triukšmo stiprintuvas). Tai sustiprina NRF24L01 signalą ir leidžia dar geresnį perdavimo diapazoną iki 1000 metrų atviroje erdvėje.
NRF24L01 modulio kištukas
Čia pateikiama išsami NRF24L01 kištuko apžvalga, taip pat NRF24L01 + PA / LNA modulis.
Abu moduliai, NRF24L01 ir NRF24L01 + PA / LNA, turi tą patį kištuką, todėl mes galime juos prijungti savo grandinėje tuo pačiu būdu.
Grandinės schema
Štai kaip mes turime prijungti NRF24L01 modulius prie „Arduino“ plokščių.
Kaip jau minėjau, kiekviena „Arduino“ plokštė turi skirtingus SPI kaiščius, todėl turėkite tai omenyje jungdami modulius prie „Arduino“ plokštės.
Šiai „Arduino“ mokymo programai reikalingus komponentus galite gauti iš toliau pateiktų nuorodų:
Atskleidimas: tai yra filialų nuorodos. Kaip „Amazon“ partneris uždirbu iš kvalifikuotų pirkimų.
„Arduino“ ir NRF24L01 kodas
Prijungę NRF24L01 modulius prie „Arduino“ plokščių, esame pasirengę sudaryti tiek siųstuvo, tiek imtuvo kodus.
Pirmiausia turime atsisiųsti ir įdiegti RF24 biblioteką, o tai palengvina programavimą.
Čia yra du belaidžio ryšio kodai, o žemiau pateikiamas jų aprašymas.
Siųstuvo kodas
/* * Arduino Wireless Communication Tutorial * Example 1 - Transmitter Code * * by Dejan Nedelkovski, www.HowToMechatronics.com * * Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); // CE, CSN const byte address[6] = "00001"; void setup() { radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); } void loop() { const char text[] = "Hello World"; radio.write(&text, sizeof(text)); delay(1000); }
Imtuvo kodas
/* * Arduino Wireless Communication Tutorial * Example 1 - Receiver Code * * by Dejan Nedelkovski, www.HowToMechatronics.com * * Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); // CE, CSN const byte address[6] = "00001"; void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()) { char text[32] = ""; radio.read(&text, sizeof(text)); Serial.println(text); } }
Apibūdinimas:
Taigi turime įtraukti pagrindinę SPI ir naujai įdiegtas RF24 bibliotekas ir sukurti RF24 objektą. Du argumentai yra CSN ir CE kontaktai.
RF24 radio(7, 8); // CE, CSN
Tada turime sukurti baitų masyvą, kuris atspindės adresą, arba vadinamąjį vamzdį, per kurį du moduliai susisieks.
const byte address[6] = "00001";
Mes galime pakeisti šio adreso vertę į bet kurią 5 raidžių eilutę ir tai leidžia pasirinkti, su kuriuo imtuvu kalbėsime, todėl mūsų atveju mes turėsime tą patį adresą tiek imtuve, tiek siųstuve.
Sąrankos skyriuje turime inicijuoti radijo objektą ir naudodamiesi radio.openWritingPipe () funkcija, nustatome imtuvo adresą, į kurį siųsime duomenis, anksčiau nustatytą 5 raidžių eilutę.
radio.openWritingPipe(address);
Kita vertus, imtuve, naudodamiesi radio.setReadingPipe () funkcija, nustatome tą patį adresą ir tokiu būdu įgaliname ryšį tarp dviejų modulių.
radio.openReadingPipe(0, address);
Tada naudodamiesi radio.setPALevel () funkcija nustatome galios stiprintuvo lygį, mūsų atveju jį nustatysiu iki minimumo, nes mano moduliai yra labai arti vienas kito.
radio.setPALevel(RF24_PA_MIN);
Atkreipkite dėmesį, kad naudojant aukštesnį lygį, rekomenduojama naudoti apeinamuosius kondensatorius visame GND ir 3,3 V moduliuose, kad veikiant jie turėtų stabilesnę įtampą.
Toliau turime funkciją „radio.stopListening ()“, kuri nustato modulį kaip siųstuvą, o iš kitos pusės – funkciją „radio.startListening ()“, kuri nustato modulį kaip imtuvą.
// at the Transmitter radio.stopListening();
// at the Receiver radio.startListening();
Ciklo skyriuje, prie siųstuvo, sukuriame simbolių masyvą, kuriam priskiriame pranešimą „Hello World“. Naudodamiesi radio.write () funkcija, mes išsiųsime tą pranešimą imtuvui. Pirmasis argumentas yra kintamasis, kurį norime išsiųsti.
void loop() { const char text[] = "Hello World"; radio.write(&text, sizeof(text)); delay(1000); }
Naudodami „&“ prieš kintamojo pavadinimą, mes iš tikrųjų nustatėme kintamojo, kuriame saugomi duomenys, kuriuos norime siųsti, indikaciją ir naudodami antrąjį argumentą nustatėme baitų skaičių, kurį norime paimti iš to kintamojo. Šiuo atveju funkcija sizeof () gauna visus eilučių „teksto“ baitus. Programos pabaigoje pridėsime 1 sekundės vėlavimą.
Kitoje pusėje ties imtuvu, kilpos skyriuje, naudodamiesi funkcija radio.available (), mes patikriname, ar yra duomenų, kuriuos reikia gauti. Jei tai tiesa, pirmiausia sukuriame 32 elementų masyvą, vadinamą „tekstu“, kuriame išsaugosime gaunamus duomenis.
void loop() { if (radio.available()) { char text[32] = ""; radio.read(&text, sizeof(text)); Serial.println(text); } }
Naudodami radion.read () funkciją, mes perskaitome ir saugome duomenis „text“ kintamajame. Pabaigoje mes tiesiog atspausdiname tekstą serijiniame monitoriuje. Taigi įkėlę abi programas, imtuve galime paleisti nuoseklųjį monitorių ir pastebėsime, kad kiekvieną sekundę bus spausdinamas pranešimas „Sveikas pasaulis“.
Problemų sprendimas
Verta tai pastebėti maitinimo šaltinio triukšmas yra viena iš dažniausiai pasitaikančių problemų, kurias žmonės patiria bandydami sėkmingai bendrauti su NRF24L01 moduliais. Paprastai RF grandinės arba radijo dažnio signalai yra jautrūs maitinimo šaltinio triukšmui. Todėl visuomet verta įjungti maitinimo linijoje atjungimo kondensatorių. Kondensatorius gali būti nuo 10uF iki 100uF.
Kita dažna problema yra ta, kad 3,3 V „Arduino“ plokščių kaištis ne visada gali tiekti pakankamai energijos NRF24L01 moduliui. Taigi, modulio maitinimas išoriniu maitinimo šaltiniu taip pat yra gera idėja.
„Arduino“ belaidis dvikryptis ryšys su dviem NRF24L01 moduliais
Pažiūrėkime antrąjį pavyzdį – dvikryptį belaidį ryšį tarp dviejų „Arduino“ plokščių. Štai grandinių schemos:
Šiam pavyzdžiui reikalingus komponentus galite gauti iš toliau pateiktų nuorodų:
Atskleidimas: tai yra filialų nuorodos. Kaip „Amazon“ partneris uždirbu iš kvalifikuotų pirkimų.
Pirminis kodas
Čia yra du kodai, o žemiau pateikiamas jų aprašymas.
Siųstuvo kodas
/* * Arduino Wireless Communication Tutorial * Example 2 - Transmitter Code * * by Dejan Nedelkovski, www.HowToMechatronics.com * * Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define led 12 RF24 radio(7, 8); // CE, CSN const byte addresses[][6] = {"00001", "00002"}; boolean buttonState = 0; void setup() { pinMode(12, OUTPUT); radio.begin(); radio.openWritingPipe(addresses[1]); // 00002 radio.openReadingPipe(1, addresses[0]); // 00001 radio.setPALevel(RF24_PA_MIN); } void loop() { delay(5); radio.stopListening(); int potValue = analogRead(A0); int angleValue = map(potValue, 0, 1023, 0, 180); radio.write(&angleValue, sizeof(angleValue)); delay(5); radio.startListening(); while (!radio.available()); radio.read(&buttonState, sizeof(buttonState)); if (buttonState == HIGH) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } }
Imtuvo kodas
/* * Arduino Wireless Communication Tutorial * Example 2 - Receiver Code * * by Dejan Nedelkovski, www.HowToMechatronics.com * * Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> #define button 4 RF24 radio(7, 8); // CE, CSN const byte addresses[][6] = {"00001", "00002"}; Servo myServo; boolean buttonState = 0; void setup() { pinMode(button, INPUT); myServo.attach(5); radio.begin(); radio.openWritingPipe(addresses[0]); // 00001 radio.openReadingPipe(1, addresses[1]); // 00002 radio.setPALevel(RF24_PA_MIN); } void loop() { delay(5); radio.startListening(); if ( radio.available()) { while (radio.available()) { int angleV = 0; radio.read(&angleV, sizeof(angleV)); myServo.write(angleV); } delay(5); radio.stopListening(); buttonState = digitalRead(button); radio.write(&buttonState, sizeof(buttonState)); } }
Čia skiriasi nuo ankstesnio pavyzdžio, kad mes turime sukurti du vamzdžius arba adresus dvikryptėms komunikacijoms.
const byte addresses[][6] = {"00001", "00002"};
Sąrankos skyriuje turime apibrėžti abu vamzdžius ir atkreipti dėmesį, kad pirmojo „Arduino“ rašymo adresas turi būti antrojo „Arduino“ skaitymo adresas, ir atvirkščiai, pirmojo „Arduino“ skaitymo adresas turi būti rašymo adresas antrasis Arduino.
// at the Transmitter radio.openWritingPipe(addresses[1]); // 00001 radio.openReadingPipe(1, addresses[0]); // 00002
// at the Receiver radio.openWritingPipe(addresses[0]); // 00002 radio.openReadingPipe(1, addresses[1]); // 00001
Ciklo skyriuje naudodamiesi funkcija radio.stopListening () mes nustatėme pirmąjį „Arduino“ kaip siųstuvą, nuskaityėme ir suskirstėme vairasvirtės vertę nuo 0 iki 180, o naudodamiesi funkcija radio.write () nusiųskite duomenis į imtuvą.
radio.stopListening(); int potValue = analogRead(A0); int angleValue = map(potValue, 0, 1023, 0, 180); radio.write(&angleValue, sizeof(angleValue));
Kita vertus, naudodamiesi radio.startListening () funkcija, mes nustatėme antrąjį „Arduino“ kaip imtuvą ir patikriname, ar yra duomenų. Nors yra duomenų, mes …