NRF24L01

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

NRF24L01

Příspěvek od martinius96 » 07 kvě 2018, 14:24

Ahoj, skúšal moduly NRF24l01 a nemôžem ich rozchodiť, žiadna komunikácia medzi nimi. Mal by niekto typ na knižnicu, ktorá je overená? Skúšal som RF24, RadioHead a ani pri jednej žiaden úspech. :-)
Wiring používam taký, aký je písaný pri knižnici podľa každej. Mávajú len iné piny pre CE a CSN. Vďaka!

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: NRF24L01

Příspěvek od Axamith » 07 kvě 2018, 15:40

V době, kdy jsem s těmito moduly blbnul mi šlapalo na první dobrou. Tady je návod a v textu link na knihovnu, zkus. http://navody.arduino-shop.cz/navody-k- ... 24l01.html

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: NRF24L01

Příspěvek od martinius96 » 07 kvě 2018, 21:25

funguje to! :-)
Mal som naopak + a -...

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: NRF24L01

Příspěvek od martinius96 » 07 kvě 2018, 23:57

Pokročil som trochu ďalej.. Chcel by som si z toho tutoriálu upraviť ten sketch pre obojsmernú komunikáciu ale mám taký problém..
Jedno Arduino mi na serial monitor nevypíše nič a druhé toto, nechápem prečo sú tam výpisy aj z tých sketchov z tutoriálu, keď tam taký sketch nahratý nemám...:
Obrázek
Rýchlosť bola nastavená dobre, skúšal som prepínať medzi 9600 a 1115200.
Používam vlastne obrátene kódy pre obe Arduina...

Kód: Vybrat vše

//uno old
#include <SPI.h>
#include "RF24.h"
#define CE 7
#define CS 8
RF24 nRF(CE, CS);
byte adresaunor3[]= "unor3";
byte adresaunoold[]= "unoold";
void setup() {
Serial.begin(115200);
nRF.begin();
nRF.setPALevel(RF24_PA_LOW);
nRF.openWritingPipe(adresaunoold);
nRF.openReadingPipe(1,adresaunor3);
}
void loop() {
delay(100);
  nRF.startListening();
  if ( nRF.available()) {
     String slovo;
  String prijem = "Bratislava";
    while (nRF.available()) {
      nRF.read(&slovo, sizeof(slovo));
       Serial.println("Prijal som: ");
      Serial.println(slovo);
    }
    delay(100);
    nRF.stopListening();
    nRF.write(&prijem, sizeof(prijem));
    Serial.println("Odoslal som: ");
    Serial.println(prijem);
    delay(100);
  }
}
Druhé Arduino:

Kód: Vybrat vše

//uno old
#include <SPI.h>
#include "RF24.h"
#define CE 7
#define CS 8
RF24 nRF(CE, CS);
byte adresaunor3[]= "unor3";
byte adresaunoold[]= "unoold";
void setup() {
Serial.begin(115200);
nRF.begin();
nRF.setPALevel(RF24_PA_LOW);
nRF.openWritingPipe(adresaunor3);
nRF.openReadingPipe(1,adresaunoold);
}
void loop() {
delay(100);
  nRF.startListening();
  if ( nRF.available()) {
     String slovo = "Praha";
  String prijem;
    while (nRF.available()) {
      nRF.read(&prijem, sizeof(prijem));
       Serial.println("Prijal som: ");
      Serial.println(prijem);
    }
    delay(100);
    nRF.stopListening();
    nRF.write(&slovo, sizeof(slovo));
    Serial.println("Odoslal som: ");
    Serial.println(slovo);
    delay(100);
  }
}
Napadá vás, kde by mohol byť problém? Ide mi vlastne o ovládanie systému oboma modulmi. (Oba moduly si budú vymieňať informácie ohľadom stlačení tlačidiel pri jednom i druhom Arduine a ak budú stlačené obe, tak chcem rozozvučiť buzzer...
Ďakujem za pomoc ;)

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: NRF24L01

Příspěvek od gilhad » 08 kvě 2018, 03:00

Pokud mas rychlos Serialu spravne, tak to vypada, ze to vypisuje pamet jen tak. Vis, ze kazdy retezec musi byt zakonceny znakem \0, aby se vedelo, ze konci? A ze kdyz ti u promennych adresaunor3 a adresaunoold ti ten znak chybi, takze pokus o jejich odeslani vede k poslani vseho od mista, kam kompilator ten retezec dal az po prvni nulovy byte (ktery muze byt kdekoliv)?

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: NRF24L01

Příspěvek od martinius96 » 14 kvě 2018, 04:51

Tak nakoniec som to dal na 2 NodeMCU dosky a funguje to OK :-)
Mal som obavy o tie moduly, či pôjdu, lebo podľa jedného profi "wiringu" som dal + a - naopak...
Ale fungujú, žiaden problém.

Rád by som sa pochválil s dosiahnutými výsledkami.
Včera som robil meranie pri vysielacom výkone HIGH na oboch doskách pri použití Base adaptéra, ktorý má regulátor na 3.3V a je ho možné napájať na 5-12V, čo umožňuje získať po prevedení celkom slušný prúd, ktorý utiahne aj HIGH výkon, MAX už nie :).
Obrázek
Použil som 5V z VUSB pinu a buzzer pre indikátor spojenia s periodickým bzučaním.
Wiring:
Obrázek
Nahral som do dosiek skoro pôvodné zdrojové kódy z Arduino návodov, pridal som riadok pre nastavenie prenosovej rýchlosti na 250kb/s.
Chcel som vyskúšať meranie, na akú vzdialenosť to bude fungovať, originálne by to malo byť 100 metrov. Umiestnil som teda jednu NodeMCU dosku s NRF modulom a s druhou som sa s powerbankou vzdiaľoval.

Správne periodické bzučanie vydržalo do vzdialenosti 72 metrov od vysielača, ďalej to už nebolo úplne periodické a s väčšou vzdialenosťou bolo potrebné mať správne natočený NRF modul, i keď niekedy pod uhlom fungoval lepšie ako priamo face-to-face oproti vysielaču. Maximálna vzdialenosť, ktorú som dosiahol bola 113 metrov.

Moduly neboli žiadnym spôsobom upravované a nenachádzal sa na nich ani kondenzátor, ktorý sa v mnohých prípadoch odporúča. Skúšal som aj napríklad umiestniť vysielač a prijímač naležalo oproti sebe, ale to fungovalo na 15 metrov max. Správne je to teda face-to-face. Nakoľko som si tieto moduly veľmi obľúbil, rozhodol som sa aj pre väčších "bratov" s anténami a mám otázku..
Funguje na ne rovnaký sketch? Čo som pozeral Pinout, tak by mal byť totožný. Zaujímavé by bolo sledovať i dosah, ak by sa moduly napájali na MAX výkon.
Kódy, ak by chcel niekto vyskúšať:
Vysielač:

Kód: Vybrat vše

// nRF24L01 vysílač

// připojení knihoven
#include <SPI.h>
#include "RF24.h"
// nastavení propojovacích pinů
#define CE 2
#define CS 15
// inicializace nRF s piny CE a CS
RF24 nRF(CE, CS);
// nastavení adres pro přijímač a vysílač,
// musí být nastaveny stejně v obou programech!
byte adresaPrijimac[]= "prijimac00";
byte adresaVysilac[]= "vysilac00";
void setup() {
  // komunikace přes sériovou linku rychlostí 9600 baud
  Serial.begin(9600);
  // zapnutí komunikace nRF modulu
  nRF.begin();
  nRF.setDataRate( RF24_250KBPS );
  // nastavení výkonu nRF modulu,
  // možnosti jsou RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX,
  // pro HIGH a MAX je nutný externí 3,3V zdroj
  nRF.setPALevel(RF24_PA_HIGH);
  // nastavení zapisovacího a čtecího kanálu
  nRF.openWritingPipe(adresaVysilac);
  nRF.openReadingPipe(1,adresaPrijimac);
  // začátek příjmu dat
  nRF.startListening();
}

void loop() {
  // for smyčka pro postupné odeslání
  // hodnot 0 až 3 pro načtení všech dat
  // z přijímače
  for (int i=0; i < 4; i++ ) {
    // ukončení příjmu dat
    nRF.stopListening();
    // vytisknutí aktuální volby po sériové lince
    Serial.print("Posilam volbu ");
    Serial.println(i);
    // uložení startovního času komunikace
    unsigned long casZacatek = micros();
    // odeslání aktuální volby, v případě selhání
    // vytištění chybové hlášky na sériovou linku
    if (!nRF.write( &i, sizeof(i) )){
       Serial.println("Chyba při odeslání!");
    }
    nRF.startListening();
    unsigned long casCekaniOdezvy = micros();
    boolean timeout = false;
    while ( ! nRF.available() ){
    if (micros() - casCekaniOdezvy > 200000 ){
          timeout = true;
          break;
      }      
    }
    if ( timeout ){
      Serial.println("Chyba při prijmu, vyprseni casu na odezvu!");
    }
    else{
     
        unsigned long prijataData;
        nRF.read( &prijataData, sizeof(prijataData) );
        unsigned long casKonec = micros();
        Serial.print("Odeslana volba: ");
        Serial.print(i);
        Serial.print(", prijata data: ");
        Serial.println(prijataData);
        Serial.print("Delka spojeni: ");
        Serial.print(casKonec - casZacatek);
        Serial.println(" mikrosekund.");
    }
    delay(200);
  }
}
Prijímač:

Kód: Vybrat vše

// nRF24L01 přijímač
#include <SPI.h>
#include "RF24.h"
int prijem;
const int buzzer = 5;
#define CE 2
#define CS 15
RF24 nRF(CE, CS);
byte adresaPrijimac[]= "prijimac00";
byte adresaVysilac[]= "vysilac00";
void setup() {
  Serial.begin(9600);
  pinMode(buzzer, OUTPUT);
  nRF.begin();
  nRF.setDataRate( RF24_250KBPS );
  nRF.setPALevel(RF24_PA_HIGH);
  nRF.openWritingPipe(adresaPrijimac);
  nRF.openReadingPipe(1,adresaVysilac);
  nRF.startListening();
}

void loop() {
  unsigned long odezva;
  if( nRF.available()){
    // čekání na příjem dat
    while (nRF.available()) {
      nRF.read( &prijem, sizeof(prijem) );
    }
    Serial.print("Prijata volba: ");
    Serial.print(prijem);
    switch( prijem ) {
      case 1:
    
        odezva = millis();
       
      tone(buzzer, 50, 500);
       
        break;
      case 2:
        odezva = millis()/1000;
        break;
      case 3:
        odezva = micros();
        break;
      default:
        odezva = 0;
        break;
    }
    nRF.stopListening();
    nRF.write( &odezva, sizeof(odezva) );     
    nRF.startListening(); 
  }
}

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: NRF24L01

Příspěvek od pavel1tu » 14 kvě 2018, 12:49

Koukal jsem že v jednom kodu se sanžíš odesílat "řetězec" v jiném jen číslo.

"Některé knihovny" umí jen čísla a ve starších verzích mi šla jen čísla celá.
Na internetu lze sehnat upravené knihovny na odesílání i řetězce, či jakéhokoliv textu, prostě to tam nasypeš, ono si to rozloží na znaky, ty převede na čísla a na druhé straně ti to opět složí řetězec.
Mám jen zdroják - knihovny nemám, provozoval jsem to na starém PC a odešel disk, teď knihovny zpětně dohledávám.

Pokud to už víš, tak nic :-)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: NRF24L01

Příspěvek od martinius96 » 14 kvě 2018, 13:18

Nakoniec som asi prišiel nato, že tie čísla mi budú úplne postačovať.. Budem len odosielať 1, alebo 2 vzhľadom na situáciu, ktorý button bude stlačený. A to si už jednoducho porovnám. :-) Ale ďakujem za ochotu

seta1J
Příspěvky: 29
Registrován: 02 říj 2017, 04:32
Reputation: 0

Re: NRF24L01

Příspěvek od seta1J » 18 kvě 2018, 02:11

Zdravím, také s tím zápasím zatím bez úspěchu. Jak je to s řádkem #define CS 15 ? Pokud je to na Nano.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: NRF24L01

Příspěvek od martinius96 » 18 kvě 2018, 02:51

Ja som to dal na NodeMCU dosku.
CE a CSN pin sa definuje. Tieto piny si zvolíš sám.. Takže tam nahradíš iba čísla digitálneho pinu, kam to pripájaš. :)
Daj pozor, či nemáš naopak + a - ako som mal ja.. moduly vďaka bohu prežili.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů