nRF24L01 Wie kan mij een klein beetje op gang helpen?

Ik ben momenteel al een tijdje aan het stoeien met de nRF24L01+

Ik ben nieuw met arduino en heb al tientallen tutorials gemaakt om C onder de knie te krijgen. Lezen en aanpassen lukt al aardig. Echter het zelf schrijven is moeilijk.

Nu heb ik 2 arduino’s met de nRF24L01+ modules werkend. Nu kom ik bij de code.

Op internet heb ik een code gevonden welke ik zou willen aanpassen naar mijn behoefte.

Mijn vraag gaat over de transmitter code. Momenteel loopt de code door in de serial monitor getallen 1 tot en met 5 in te type. hieraan zitten LED gelinkt op receiver. Dit werkt prima. Nu wil ik ipv zelf die getallen in te typen een vaste “loop” aan getallen hebben met de daarbij behorende delay.

alvast bedankt

Transmitter code

// * Code №1 for transmitter

//****************************

//урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch

//v.01 transmitter Arduino NRF24L01 radio connection between two Arduino

//Version 0.1 2013/07/13

//detailed video instructions lay here
//http://www.youtube.com/user/d36073?feature=watch

//код №2 для приёмника http://yadi.sk/d/b2t1JAhT6lgYU

//NRF24L01+ 2.4GHz Antenna Wireless Transceiver Module For Microcontr

//Arduino №1 received data from the TV series, sends a radio broadcast packet

//Arduino №2 receives the packet and sends it back to the Arduino №1.

//Arduino №1 receives the packet and sends back to the show.

//that is what is written in the series, then it should go back.

//If you send in a series with Arduino №1 team (1,2,3,4,5) is on the Arduino №2

//will be switched on and off the LEDs.

//http://arduino.ru/forum/programmirovanie/nrf24l01

//*/

// This Download Library

//https://github.com/maniacbug/RF24

//https://github.com/maniacbug/RF24/archive/master.zip

//http://yadi.sk/d/ZvMq19fB6lgPs

#include <SPI.h>

#include "RF24.h"

RF24 radio(9, 10);

const uint64_t pipes[2] = {

0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// The address of reception and transmission channels

void setup(){

Serial.begin(9600);

radio.begin();

radio.setDataRate(RF24_250KBPS); // Transfer Rate

radio.setChannel(100); // Channel number from 0 to 127

radio.setRetries(15,15); // Number of attempts and the time between attempts

radio.openWritingPipe(pipes[1]); // Open channel

radio.openReadingPipe(1, pipes[0]); // Open one of the 6 channels of reception

radio.startListening(); // Start listening to Live

}

void loop(){

if(Serial.available()){

char data[32] = "";

byte i = 0;

while(Serial.available()){

data[i] = Serial.read(); // get the data from the series.

i++;

delay(2);

}

data[i] = 0;

radio.stopListening();

radio.write(&data, 32); // and send them to the Arduino №2

radio.startListening();

}

if(radio.available()){

char data[32] = "";

radio.read(&data, 32); // back to accept a package of Arduino №2

Serial.println(data); // And pass it back to the show

}

}

receiver code

// * Code to the receiver №2



//lesson from Dmitry Osipov. http://www.youtube.com/user/d36073?feature=watch

//v.01 receiver Arduino NRF24L01 radio connection between two Arduino

//Version 0.1 2013/07/13

//detailed video instructions lay here

//http://www.youtube.com/user/d36073?feature=watch

//NRF24L01+ 2.4GHz Antenna Wireless Transceiver Module For Microcontr

//Arduino №1 received data from the TV series, sends a radio broadcast packet

//Arduino №2 receives the packet and sends it back to the Arduino №1.

//Arduino №1 receives the packet and sends back to the show.

//that is what is written in the series, then it should go back.

//If you send in a series with Arduino №1 team (1,2,3,4,5) is on the Arduino №2

//will be switched on and off the LEDs.

//http://arduino.ru/forum/programmirovanie/nrf24l01



// This Download Library

//https://github.com/maniacbug/RF24

//https://github.com/maniacbug/RF24/archive/master.zip

//http://yadi.sk/d/ZvMq19fB6lgPs

#include <SPI.h>

#include "RF24.h"

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

// Contact NRF24L01 from radio to connect to pinamnam -> Arduino

//SCK -> 13

//MISO -> 12

//MOSI -> 11

//CSN -> 10

//CE -> 9

RF24 radio(9, 10);

// where the pins are connected LEDs

int led = 2;

int led1 = 4;

const uint64_t pipes[2] = {

0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// The address of reception and transmission channels

void setup(){

radio.begin();

radio.setDataRate(RF24_250KBPS); // Transfer Rate

radio.setChannel(100); // Channel number from 0 to 127

radio.setRetries(15,15); // Number of attempts and the time between attempts

radio.openWritingPipe(pipes[0]); // Open channel

radio.openReadingPipe(1, pipes[1]); // Open one of the 6 channels of reception

radio.startListening();// Start listening to Live

pinMode(led1, OUTPUT);

pinMode(led, OUTPUT);

}

void loop(){

if(radio.available()){

char data[32] = "";

radio.read(&data, 32); // receives a packet with Arduino №1

// If you have to figure 1, the LED

if (data[0] == '1') digitalWrite(led, HIGH);

if (data[0] == '2') digitalWrite(led, LOW);

if (data[0] == '3') digitalWrite(led1, HIGH);

if (data[0] == '4') digitalWrite(led1, LOW);

if (data[0] == '5') digitalWrite(led, HIGH), delay(1000),digitalWrite(led, LOW);

radio.stopListening();

radio.write(&data, 32);// And sends back to the Arduino №1

radio.startListening();

}

}

Als het commentaar ontbreekt is het soms handig om deze zelf toe te voegen om te begrijpen wat het programma doet:

// * Code №1 for transmitter

//****************************

//урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch

//v.01 transmitter Arduino NRF24L01 radio connection between two Arduino

//Version 0.1 2013/07/13

//detailed video instructions lay here
//http://www.youtube.com/user/d36073?feature=watch

//код №2 для приёмника http://yadi.sk/d/b2t1JAhT6lgYU

//NRF24L01+ 2.4GHz Antenna Wireless Transceiver Module For Microcontr

//Arduino №1 received data from the TV series, sends a radio broadcast packet

//Arduino №2 receives the packet and sends it back to the Arduino №1.

//Arduino №1 receives the packet and sends back to the show.

//that is what is written in the series, then it should go back.

//If you send in a series with Arduino №1 team (1,2,3,4,5) is on the Arduino №2

//will be switched on and off the LEDs.

//http://arduino.ru/forum/programmirovanie/nrf24l01

//*/

// This Download Library

//https://github.com/maniacbug/RF24

//https://github.com/maniacbug/RF24/archive/master.zip

//http://yadi.sk/d/ZvMq19fB6lgPs

#include <SPI.h>

#include "RF24.h"

RF24 radio(9, 10);

const uint64_t pipes[2] = {

0xF0F0F0F000LL, 0xF0F0F0F0FFLL }; // The address of reception and transmission channels

void setup() {

    Serial.begin(9600);

    radio.begin();

    radio.setDataRate(RF24_250KBPS); // Transfer Rate

    radio.setChannel(100); // Channel number from 0 to 127

    radio.setRetries(15, 15); // Number of attempts and the time between attempts

    radio.openWritingPipe(pipes[1]); // Open channel

    radio.openReadingPipe(1, pipes[0]); // Open one of the 6 channels of reception

    radio.startListening(); // Start listening to Live

}

void loop() {
    //
    // lees de serial
    //
    if (Serial.available()) {
        //
        // creer een ontvangst buffer
        //
        char data[32] = "";
        //
        // i wijst naar eerste entry in buffer
        //
        byte i = 0;
        //
        // zolang er data binnenkomt op serial
        //
        while (Serial.available()) {
            //
            // zet ontvangen karakter in buufer
            //
            data[i] = Serial.read(); // get the data from the series.
            //
            // verhoog buffer index
            //
            i++;
            //
            // wacht ff
            //
            delay(2);
        }
        //
        // zet een string terminator aan het einde van de buffer
        //
        data[i] = 0;
        //
        // zet de nRF in zen modus
        //
        radio.stopListening();
        //
        // schrijf de data weg als string in de buffer
        //
        radio.write(&data, 32); // and send them to the Arduino №2
        //
        // en weer lekker luisteren
        //
        radio.startListening();
    }
    //
    // kijk of er iets is binnengekomen van de andere nRF
    //
    if (radio.available()) {
        //
        // creer een lege buffer
        //
        char data[32] = "";
        //
        // lees de ontvangen dat tot een max van 32 bytes
        //
        radio.read(&data, 32); // back to accept a package of Arduino №2
        //
        // en toon deze op de serial
        //
        Serial.println(data); // And pass it back to the show
    }
}

Waarbij het er weer eens wordt aangetoond dat de lezer niet altijd begrijpt wat de schrijver bedoelt…

Beste Nico,

Bedankt voor je reactie. Het commentaar staat er niet bij om dat ik deze niet zelf kon verzinnen (momenteel nog te weinig kennis) De rest is vertaald uit het Russisch.

Wat ik kan opmaken uit je commentaar is dat ik eigenlijk de buffer zou moeten vullen met de gewenste loop met de daarbij behorende delays?

Yep. let er we wel op dat de tekens in leesbare vorm worden verstuurd tussen de Serial en nRF’s dus:

for (uint8_t i = 0; i < 5; i++ ){
   sprintf(data,"%d", i);
   ...... en nu verzenden naar de nrf
}

Sorry maar ik kan niet vinden waar dat het tussen moet. char data[32] = “”;?

Ik neem aan dat het dan de bedoeling is om het zo weer te geven

  void loop() {
    //
    // lees de serial
    //
    if (Serial.available()) {
        //
        bitWrite(1);
        delay(300);
        bitWrite(2);
        delay(200);
        
        //
        char data[32] = "";
        //
        // i wijst naar eerste entry in buffer

of ben ik nu op de verkeerde weg?

Waar komt die bitwrite ineens vandaan... weer een reden om commentaar toe te voegen waarom je iets doet......

En nee je bent niet op de goede weg bezig.......

Ik heb commentaar toegevoegd per regel. Daar moet je meer op weg kunnen.....

De reden om een buffer leeg te maken net voor de read is om te zorgen dat je geen last hebt van voorgaande vullingen....

Ik heb een nieuwe code gemaakt. Ik kwam er niet uit hoe ik de data werkend kreeg.
Met mijn nieuwe code heb ik (voor zo ver ik het kan) commentaar bij geschreven. Ik heb de code voor de helft werkend.

Wat maak ik?
Een draadloos stoplicht. TX verzend berichtjes naar de RX om de kleur te veranderen.

Wat werkt er?
De TX verzend een bericht en de RX ontvangt dit bericht netjes en voert het daarbij behorende inhoud.

Wat werkt er niet?
Als ik de delay in de RX code zet werkt het stoplicht naar behoren. Het is echter de bedoeling om meerdere nodes toe te voegen. na enkele minuten lopen de stoplichten niet meer gelijk. Nu wilde ik de delay in de TX node plaatsen. Maar verzend de TX geen berichten meer? iemand een idee wat ik niet goed doe? Voor mijn gevoel ben ik dicht bij een oplossing maar ik krijg hem niet gevonden

Alvast bedankt.

TX

/*
Code For Wireless traffic light Transceiver. 
Head node sends signal to 3 other nodes in a star network



*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int msg[1]; // Send over package message 
RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red = 5; // LED red on pin 7 
int orange = 4; // LED orange on pin 6 
int green = 3; // LED green on pin 5

void setup(void){ //Setup and configure rf radio
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);  // Open pipe to other nodes for communication
 
  pinMode (red, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green, OUTPUT);} // Pinmode for LED OUTPUT
 
void loop(void){
  digitalWrite(red, HIGH); //starting red HIGH
  if (digitalRead(red) == HIGH)delay(1000);{{ // If red is HIGH Send Message 001 for 1 second
  msg[0] = 001; 
  radio.write(msg, 1);} //write msg 

  digitalWrite(orange, HIGH); //starting red HIGH
  if (digitalRead(orange) == HIGH)delay(1000);{ // If orange is HIGH Send Message 002 for 1 second
  msg[0] = 002; //
  radio.write(msg, 1);} //write msg 


  digitalWrite(green, HIGH); //starting red HIGH
  if (digitalRead(green) == HIGH)delay(1000);{ // If red is HIGH Send Message 003 for 1 second
  msg[0] = 003;
  radio.write(msg, 1); //write msg 

}  
}}

RX code

/*
Code For Wireless traffic light Receiver. 
Head node sends signal to 3 other nodes in a star network

*/

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int msg[1]; // Send over package message 
RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red = 5; // LED red on pin 7 
int orange = 4; // LED orange on pin 6 
int green = 3; // LED green on pin 5

void setup(void){ //Setup and configure rf radio
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1,pipe); //Open pipe to base node for communication 
  radio.startListening(); //Starting to listen to base node 
  delay(40);
  
  pinMode (red, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green, OUTPUT);} // Pinmode for LED OUTPUT
 
void loop(void){
  if (radio.available()){ // if Radio available start Communication 
    bool done = false;    
    while (!done){ 
      done = radio.read(msg, 1);  // if done read msg     
      Serial.println(msg[0]); // print msg 
      if (msg[0] == 001){delay(10); // if msg 0 is 001 light red will start 
      digitalWrite(red, HIGH);
      digitalWrite(orange, LOW);
      digitalWrite(green, LOW);
 //     delay(1000);}
      if (msg[0] == 002){delay(10);// if msg 0 is 002 light orange will start
      digitalWrite(red, LOW);
      digitalWrite(orange, HIGH);
      digitalWrite(green, LOW);
 //     delay(1000);}
      if (msg[0] == 003){delay(10);// if msg 0 is 001 light red will start
      digitalWrite(red, LOW);
      digitalWrite(orange, LOW);
      digitalWrite(green, HIGH);
//      delay(1000);}
}}
 
 
 
  else{Serial.println("No radio available");}}

Als ik naar je zender code kijk, zie ik:

Als pin led Rood hoog is, wacht dan 1 seconde en verzend dan het bericht.

En zo ook voor de andere pinnen. Wat ik mis is de begin state van de LEDS, wat als alle drie de LEDpinnen laag zijn?

Alle nodes draaien op een kristal. Deze kristallen hebben onderling altijd kleine verschillen waardoor na verloop van tijd de synchronisatie verloren gaat.

Wellicht is het een idee om een gesynchroniseerde state te definieren zoals alle stoplichten op rood en daarna weer te beginnen met het versturen van je code?

Omdat je pipes terug een ack stuurt en meerdere nodes gebruikt gaan ze door elkaar terug antwoorden dat ze het bericht hebben ontvangen. dat vernaggelt het bericht en blijven ze het proberen.
a) de auto ack uitzetten.

Hier een stukje setup code uit mijn programma waarbij ik broadcast naar meervoudige devices:

    radio.begin();                                            // Enable the RF24
    radio.setDataRate(RF24_250KBPS);                        // transmission rate 250K-bps
    radio.setPALevel(RF24_PA_MAX);                            // set transmitter to maximum level
    radio.setChannel(RF24_CHANNEL);                            // use channel
    radio.enableDynamicPayloads();                            // enable dynamic message sizes
    radio.setRetries(0, 0);                                    // set the maximum number of retries and duration
    radio.setCRCLength(RF24_CRC_16);                        // 16 bit CRC is used
    radio.setAutoAck(false);                                // we have to do our own handshaking as we need more than 6 devices to control

Mogelijk helpt je dat verder

Ik ben ongeveer 1,5 jaar bezig met de arduino hobby en o.a. ook met de nrf24L01 module.
Ik heb voornamelijk home automation als doel en ben begonnen met de "sensornet" sketsches + RF24 & RF24Network libraries.

Kijk eens op:

Mij bevalt het iig nog steeds.

(Via de RF24Network communiceren alle nodes naar z'n parent node zodat de afstand tussen de basenode en onderste node groter kan zijn dan t bereik van 1 module. (boomstructuur)
De pakketjes tussen de nodes zijn classes met properties waarin je dus commando's en waardes kan verzenden)

Hoop dat je er wat aan hebt!

Blijven leuke bordjes. Ben alleen wel benieuwd hoelang ze kunnen overleven met de komst van zeer goedkope WiFi System on Chip bordjes.

Daar ben ik inderdaad ook benieuwd naar. De keuze voor die nrf24 modules was puur om het geld gezien je voor een nrf24 1$ pst betaald en een CC3000 Wifi Shield waar ik nu dan mee bezig ben +-20$.
Wanneer er ook goedkope varianten van de wifi komen zou ik eerder daar voor gaan uiteraard of zijn deze er al? Iemand linkjes?

de ESP8266 is sinds vorig jaar Sept oid op de markt. De ontwikkelstraat is er ook al. De kleinste ESP8266-03 heeft 2 IO pinnen en Rx/Tx. Is een system-on-chip waardoor je alles erin kan programmeren. User flash geheugen is iets van 256kb (give-or-take a few). Het is gewoon C wat je programmeert. Wel anders als de Arduino, maar dan ben je voor iets van 3 us$ klaar. belangrijk is wel dat hij op 3.3V werkt. En trekt best wat stroom (230mA bij zenden). Tests hebben laten zien dat 400 mtr haalbaar is.
Er zijn ook uitgebreidere modules met FCC en CE goedkeuringen (bijv. ESP8266-12) en allerlei shieldjes ervoor. Er is ook een httpd server beschikbaar die standaard in AP mode begint. Je kan op dat ding aanloggen aan je eigen netwerk waardoor hij in STA mode komt (of beide) en heb je een servertje in je netwerk hangen. Er zijn ook al allerlei Iot oplossingen.
Je kan dat ding ook via de Arduino (AT commando's) aansturen. Maar waarom zou je als je dat ding rechtstreeks kan programmeren.
Let wel er is een leercurve!! het is geen Arduino. Dit is gewoon standaard C en dat is wel iets anders.
Van de week las ik dat OSRAM nu ook uitkomt met een chip (gebaseerd op de Cortex M0 processor [128Kb]) met vergelijkbare functies. Geen idee wat ze gaan kosten....
Tenslotte kan het sowieso geen kwaad om eens verder te kijken voor de modernere processoren (32 bits). Die kosten tegenwoordig net zoveel als de Arduino maar hebben wel beduidende meer capaciteit. MBED.org is wel actief met een online compiler waarbij je evengoed nog een beetje in het "Arduino wereldje" kan blijven en toch op de grotere broertjes gaat ontwikkelen. De Arduino Due is een alternatief, maar mijns inziens te prijzig tov de huidige markt.

Verder ben ik begonnen met experimenteren met de EMW3162.. Zelfde verhaal maar dan met veel meer IO pinnen.

Zie verder:
www.esp8266.com
http://www.verelec.nl/
En nog vele anderen.

Tenslotte let wel dat dit een Arduino forum is gesponsored door Arduino. Het zou niet netjes zijn om allerlei uitgebreide discussies te voeren over dit onderwerp. Die hebben hun eigen forums.