nrF24L01 en aanverwanten

Arduino shields
Berichten: 109
Geregistreerd: 05 Dec 2014, 22:09

Re: nrF24L01 en aanverwanten

Berichtdoor Palumbus » 01 Feb 2015, 19:44

Dank,

ik ga eerst uitproberen.
Mogelijk alleen de masternode in het (de?) Mesh voorzien van een PA en LNA versie.

Nadeel van een antenne is dat de ontvanger, met trilmotortje, dan weer slechter in je borstzak past....

Advertisement

Berichten: 109
Geregistreerd: 05 Dec 2014, 22:09

Re: nrF24L01 en aanverwanten

Berichtdoor Palumbus » 08 Feb 2015, 17:02

Nou, prototypes draaien
Masternode met nrf24, trilmotor en per node een 2-kleurige led
Node(s) met nrf24, pir sensor en 2-kleurige led.

Zelfs het dynamisch adresseren in een mesh werkt top

Alleen wel allemaal binnen een straal van 5 meter.
Niet verwacht dat het bereik zo slecht is van die rf modules
Zelfs de positie van de rf module heeft invloed..
Gericht op ontvanger geeft 5 meter bereik, omhoog gericht geeft 4 meter bereik.

En nu... Externe antennes gaan gebruiken of 'sterkere' rf modules gaan zoeken ?
In iedergeval een betere foutafhandeling in gaan bouwen..

G.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: nrF24L01 en aanverwanten

Berichtdoor nicoverduin » 08 Feb 2015, 17:11

Laat je code hier zien dan kunnen wij ook meedenken :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 109
Geregistreerd: 05 Dec 2014, 22:09

Re: nrF24L01 en aanverwanten

Berichtdoor Palumbus » 08 Feb 2015, 17:25

Met foutafhandeling bedoel ik op de master beter afhandelen van niet ontvangen pakketjes.
Ik ga er nu vanuit dat een alarm gereset wordt op de ontvanger doordat de node een IDLE pakketje zend.
Maar als juist dan de verbinding uitvalt, blijft het alarm actief.

Dus resetten van alarmstatus moet ik verplaatsen naar de ontvanger omdat ik nooit zeker kan zijn van de verbinding.

Ik zal zo even mn sketches uploaden. Die staan niet op mn ipad.....

Berichten: 109
Geregistreerd: 05 Dec 2014, 22:09

Re: nrF24L01 en aanverwanten

Berichtdoor Palumbus » 08 Feb 2015, 17:48

De sketches zijn ruim voorzien van debugregels en ook ruim van commentaar voorzien...
Oude gewoontes roesten niet heh :)

Tevens is de masternode tijdelijk aangepast naar een SODQA MOJA, aangezien ik niet voldoende nano's in huis had. Wordt later omgebouwd naar 5 leds voor 5 nodes


De masternode:
Code: Alles selecteren
/*
Bewegingsmelder ontvanger
NRFMesh Auto Dynamic Addressing sensornodes over RF network

*
* Note: This sketch only functions on SODAQ MOJA

*/

#define VERSIE "1.0.a"

#define GREENLED1   4   // Digital Pin Green led1
#define GREENLED2   5   // Digital Pin Green led2
//#define GREENLED3   6   // Pin 6 op MOJO board is power grove connectors, niet bruikbaar voor led

#define REDLED1      7   // Digital Pin Red led1
#define REDLED2      8   // Digital Pin Red led2
#define BUZZER      9   // Digital Pin trilmotor

#define AAN LOW                // Sinking schakelen naar 0
#define UIT HIGH

#include "RF24.h"
#include "RF24Network.h"
#include "RF24Mesh.h"
#include "SPI.h"

//Include eeprom.h for AVR (Uno, Nano) etc. except ATTiny // ***nodig ??**
#include "EEPROM.h"

/***** Configure the chosen CE,CS pins *****/
RF24 radio(3, 2);         // RF Radio normaalgesproken op 9,10 op SODAQ MOJA 3 2n 2
RF24Network network(radio);
RF24Mesh mesh(radio, network);

// Configure the payload
struct payload_t {
   int node;
   char sensortype;
   char versie[6];
};

//Setpup led array
int WarmUpLED[3] = { 0, GREENLED1, GREENLED2 };
int AlarmLED[3] = { 0, REDLED1, REDLED2 };

void setup() {
   //Debug Serial
   Serial.begin(57600);
   Serial.println("Entering Setup");

   // Setup pins for Buzzer and leds
   Serial.println("Setting up pins");
   PinSettings();

   //Startup looplicht
   Serial.println("Flashing Leds up");
   LoopLichtUp();

   // Set the nodeID to 0 for the master node
   Serial.println("Setting nodeID 0");
   mesh.setNodeID(0);

   // Connect to the mesh
   Serial.println("Beginning mesh");
   mesh.begin();

   //Einde Startup looplicht
   Serial.println("Flashing Leds down");
   LoopLichtDown();

   Serial.println("Leaving setup, starting loop and updating mesh");
}

void loop() {

   // Call mesh.update to keep the network updated
   mesh.update();

   // In addition, keep the 'DHCP service' running on the master node
   // so addresses will be assigned to the sensor nodes
   mesh.DHCP();

   // Check for incoming data from the sensors
   if (network.available()) {

      Serial.println("Incoming package and preparing payload");
      //Prepare payload
      payload_t payload;

      //Read header
      Serial.print("Reading header, ");
      RF24NetworkHeader header;

      Serial.print("Filling payload, ");
      network.read(header, &payload, sizeof(payload));

      // Actie afhankelijk van type alarm
      Serial.print("Taking action with header.type :");
      Serial.println(char(header.type));
      switch (header.type) {
         // Als WARMUP message
         case 'W':
            // Warmup acties
            // Switch on corresponding LED
            Serial.print("W - Warmup - turn on greenled number ");
                                Serial.println(payload.node);
            digitalWrite(WarmUpLED[payload.node], AAN);
            break;
         case 'L':
            // Warmup acties
            // Switch off corresponding LED
            Serial.print("L - Warmup - turn off greenled number ");
                                Serial.println(payload.node);
            digitalWrite(WarmUpLED[payload.node], UIT);
            break;
         case 'I':
            // Idle acties
            Serial.print("I - Idle - turn off both leds node ");
                                Serial.println(payload.node);
            digitalWrite(AlarmLED[payload.node], UIT);
            digitalWrite(WarmUpLED[payload.node], UIT); // just in case
            break;
         case 'A':
            // ALARM acties
            Serial.print("A - Alarm - turn on buzzer and Red led for node ");
                                Serial.println(payload.node);
            digitalWrite(AlarmLED[payload.node], AAN);
            digitalWrite(BUZZER, HIGH);
            delay(200);
            digitalWrite(BUZZER, LOW);
            break;
         case 'R':
            // Reay acties
            Serial.print("R - Armed and Ready - turn off Red led for node ");
                                Serial.println(payload.node);
            digitalWrite(AlarmLED[payload.node], UIT);
            break;
         default:
            Serial.println("Onbekend bericht");
            // Onbekend type bericht
            Serial.print("Unknown action with header.type :");
            Serial.println(header.type);
            break;
      }

   }
}

void PinSettings() {
   // Setup pins for Buzzer and leds
   pinMode(BUZZER, OUTPUT);

   pinMode(GREENLED1, OUTPUT);
   pinMode(GREENLED2, OUTPUT);
   // pinMode(GREENLED3, OUTPUT); // Tijdelijk op SODAQ

   pinMode(6, OUTPUT);          // Power op grove connectors aan zetten
        digitalWrite(6, HIGH);

   pinMode(REDLED1, OUTPUT);
   pinMode(REDLED2, OUTPUT);
   // pinMode(REDLED3, OUTPUT);

}

void LoopLichtUp() {
   // Buzzer
   digitalWrite(BUZZER, HIGH);
   delay(200);
   digitalWrite(BUZZER, LOW);
   // Leds
   for (int nI = 1; nI < 3; nI++) {
      digitalWrite(AlarmLED[nI], AAN);
      delay(100);
      digitalWrite(AlarmLED[nI], UIT);
      delay(100);
      digitalWrite(WarmUpLED[nI], AAN);
      delay(100);
   }
}

void LoopLichtDown() {
   // Leds
   for (int nI = 2; nI > 0; nI--) {
      digitalWrite(WarmUpLED[nI], UIT);
      delay(100);
      digitalWrite(AlarmLED[nI], AAN);
      delay(100);
      digitalWrite(AlarmLED[nI], UIT);
      delay(100);
   }
   // Buzzer
   digitalWrite(BUZZER, HIGH);
   delay(200);
   digitalWrite(BUZZER, LOW);
}



En de node sketch (dit is node nr 2)
Code: Alles selecteren
/*
Bewegingsmelder zender
NRFMesh Auto Dynamic Addressing sensornodes over RF network
*/

#define nodeNummer 2         // Physical Sensor ID
#define nodeTYPE 'P'          // Type sensor voor toekomstig gebruik
#define nodeVERSIE "1.0.a"            // Versie software voor toekomstig gebruik

#define PIR_MOTION_SENSOR 4            // Digital Pin Bewegingsmelder
#define REDLED 5         // Digital Pin Red led
#define GREENLED 6         // Digital Pin Green led
#define AAN LOW                         // Sinking led aanzetten door pin LOW te zetten
#define UIT HIGH                        // Sinking led uitzetten door pin HIGH te zetten

#include "EEPROM.h"
#include "RF24.h"         // RF module
#include "RF24Network.h"      // RFNetwork functionaliteit
#include "RF24Mesh.h"         // RFMesh functionaliteit
#include "SPI.h"         // Serial Peripheral Interface

RF24 radio(9, 10);         // RF Radio op pin 9 en 10
RF24Network network(radio);    // Setup network
RF24Mesh mesh(radio, network);    // Setup Mesh

// Configure the payload
struct payload_t {
   int node;
   char sensortype;
   char versie[6];
};
 
// Setup variabelen
int nIdleCounter = 0;
bool lAlarmGemeld = false;

void setup() {

   //Debug Serial
   Serial.begin(57600);
   Serial.println("Entering Setup");

   // Setup pins
   PinSettings();

   Serial.println("Flashing Leds");
   DubbelFlashLed();

   // Setp Mesh
   Serial.println("Setting up nodeID");
   Serial.print("nodeID: ");
   Serial.println(nodeNummer);
   
   mesh.setNodeID(nodeNummer);

   Serial.println("Flashing Leds");
   DubbelFlashLed();

   // Connect to the mesh
   Serial.println("Connecting to mesh");
   mesh.begin();

   Serial.println("Flashing Leds");
   DubbelFlashLed();

   Serial.println("Updating mesh");
   mesh.update();   

   Serial.println("Flashing Leds");
   DubbelFlashLed();

   Serial.println("Payload pakketje vullen");
   // vul payload
   payload_t pakketje;
   pakketje.node = nodeNummer;
   pakketje.sensortype = nodeTYPE;
   strcpy(pakketje.versie, nodeVERSIE);

   // Debug
   Serial.print("nodeID: ");
   Serial.println(nodeNummer);
   Serial.print("nodeTYPE: ");
   Serial.println(nodeTYPE);
   Serial.print("nodeVERSIE: ");
   Serial.println(nodeVERSIE);

   Serial.println("Warming up PIR for 1 min.");
   Serial.print("Send WARMUP message: ");
   /* Warmup PIR sensor 1 min */
   // Doe 150 keer = 1 minuut
   for (int nI=0; nI < 150; nI++) {

      // Groene led AAN
      digitalWrite(GREENLED, AAN);

      Serial.print(nI);
      Serial.print(" W");
      
      // Send an 'WARMUP' type message containing nodeID and type of sensor
      if (!mesh.write(&pakketje, 'W', sizeof(pakketje))) {
         // If a write fails, check connectivity to the mesh network
         Serial.println("Write failed, checking connectivity");
         if (!mesh.checkConnection()) {
            Serial.println("Connection failed, refreshing address");
            //refresh the network address
            mesh.renewAddress();
         }
      }

      // Wacht 0.2 seconde
      delay(200);

      // Groene Led UIT
      digitalWrite(GREENLED, UIT);

      Serial.print("L ");
      // Schakel Led op ontvanger uit
      mesh.write(&pakketje, 'L', sizeof(pakketje));

      // Wacht 0.2 seconde
      delay(200);
   }

   // Zend Ready and Armed
   Serial.println("Zend Ready and Armed pakketje");
   if (!mesh.write(&pakketje, 'R', sizeof(pakketje)))    {
      // If a write fails, check connectivity to the mesh network and try again only once
      Serial.println("Write fail");
      if (!mesh.checkConnection()) {
         //refresh the network address
         Serial.println("Geen connection, renew address");
         mesh.renewAddress();
      }
      Serial.println("Herkansing READY pakketje");
      mesh.write(&pakketje, 'R', sizeof(pakketje));
   }
   // Led Uit
   Serial.println("LEDs knipperen en uit zetten");
   DubbelFlashLed();
   Serial.println("Leaving Setup en starting Loop met update mesh");

}

void loop()
{
   // Mesh update
   mesh.update();

   // vul payload
   payload_t pakketje;
   pakketje.node = nodeNummer;
   pakketje.sensortype = nodeTYPE;
   strcpy(pakketje.versie, nodeVERSIE);

   //Check PIR Sensor for movement
   int sensorValue = digitalRead(PIR_MOTION_SENSOR);

   // Idle loop counter
   bool lGelukt = true;

   // Beweging gedetecteerd
   if (sensorValue == HIGH) {
      Serial.println("MOTION DETECTED, send A message");
      // Zend 'Alarm' message
      lGelukt = mesh.write(&pakketje, 'A', sizeof(pakketje));
      nIdleCounter = 0;
                lAlarmGemeld = true;
   }
   else {
      // Zend 'IDLE' message 1 keer per minuut en READY 10 seconde na laatste alarm
                if (nIdleCounter == 10) {
                  if (lAlarmGemeld) {
                    lGelukt = mesh.write(&pakketje, 'R', sizeof(pakketje));
                    lAlarmGemeld = false;
                  }
                }
      if (nIdleCounter > 59) {
         Serial.println("IDLE, once a minute send I message");
         lGelukt = mesh.write(&pakketje, 'I', sizeof(pakketje));
         nIdleCounter = 0;
      }
      else {
         nIdleCounter += 1;
      }
   }
   // Wacht 1 seconde
   delay(1000);
   //Als mesh fail, retry
   if (!lGelukt) {
      Serial.println("Send niet gelukt, check connectie");

      if (!mesh.checkConnection()) {
         Serial.println("Connection lost, renewing address");

         //refresh the network address
         mesh.renewAddress();
      }
   }
}

void DubbelFlashLed() {
   digitalWrite(GREENLED, AAN);
   delay(200);
   digitalWrite(GREENLED, UIT);
   delay(200);
   digitalWrite(REDLED, AAN);
   delay(200);
   digitalWrite(REDLED, UIT);
   delay(200);
}
void PinSettings() {
   // Setup leds
   pinMode(REDLED, OUTPUT);
   pinMode(GREENLED, OUTPUT);

   // Setup PIR Sensor
   pinMode(PIR_MOTION_SENSOR, INPUT);

}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: nrF24L01 en aanverwanten

Berichtdoor nicoverduin » 08 Feb 2015, 18:33

Ik heb nog eens gekeken hoe ik toen met die dingen om ging ('t is ook alweer een tijdje geleden), maar ik gebruikte dit om de modules op te starten.
cpp code
/**
* @name setupRF24()
* setup the nRF24l01 module
*/
void setupRF24() {
//
// setup the nRF24L01 module
//
printf_begin();
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 ou own handshaking as we need more than 6 devices to control
//
// create the message pipes
//
radio.openWritingPipe(pipes[0]); // pipe zero for sending
radio.openReadingPipe(1, pipes[1]); // one pipe for receiving
//
// start executing
//
radio.startListening(); // go into listen mode
radio.printDetails(); // show the details on the serial
}

En met name dat PA level zou kunnen helpen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 109
Geregistreerd: 05 Dec 2014, 22:09

Re: nrF24L01 en aanverwanten

Berichtdoor Palumbus » 08 Feb 2015, 18:44

Ik zal eens duiken in de rfnetwork librarys die ik gebruik welke pa levels en data-rate gebruikt worden als default

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: nrF24L01 en aanverwanten

Berichtdoor nicoverduin » 08 Feb 2015, 20:49

Palumbus schreef:Ik zal eens duiken in de rfnetwork librarys die ik gebruik welke pa levels en data-rate gebruikt worden als default

Ik heb zo 's gekeken in die libraries en je zou kunnen proberen:
cpp code
setPaLevel(RF24_PA_MAX);

Ik neem tenminste aan de je de libraries van TMRh20?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Vorige

Terug naar Shields

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten