Kaip tai veikia, „Arduino“ sąsaja, kodas, schema

Š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ą.

REKOMENDUOJAMAS
8 geriausi „Arduino“ pradedančiųjų rinkiniai pradedantiesiems 2019 m
Apžvalga


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

NRF24L01 siųstuvo-imtuvo modulis

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.

Kanalų ir adresų darbo principai

Š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ų.

NRF24L01 siųstuvo-imtuvo modulio kištukų jungtys

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.

Įvairūs moduliai, pagrįsti lustu NRF24L01

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.

NRF24L01 Pinout ir NRF24L01 + PA LNA .png

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

NRF24L01 ir „Arduino“ pamokos grandinių schema

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.

„Arduino“ SPI kaiščiai

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

NRF24L01 Trikčių šalinimas - atjungti kondensatorių ir išorinį maitinimo šaltinį

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:

„Arduino“ belaidžio ryšio NRF24L01 grandinės schemos pamoka

Š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 …

Parašykite komentarą