Go Down

Topic: NRF24L01 gestione mancata comunicazione (Read 54 times) previous topic - next topic

pinoros64

Salve a tutti , sto sviluppato un'applicazione su una centralina di avvitatura, infatti in base al programma richiamato tramite la porta i/o viene inviata l'informazione ad un arduino nano con modulo NF24 ad un modulo selezione bussola da prelevare, anche questo modulo è gestito da un modulo arduino nano con RF24, la corretta bussola prelevata abilita il servomezzo al lavoro, tutto è stato testato ed è funzionante, peccato che qualora il cambiobussola esce fuori dal campo di azione RF (circa 10metri)  teoricamente il ricevitore  perdendo contatto con l'altra unita dovrebbe bloccare il tutto ma questo non accade e rimane il servomezzo abilitato , cosa molto pericolosa in quanto si possono fare danni.  Entrami i moduli RF24 lavorano in trasmissione e ricezione , avete qualche dritta da applicare su questo sketch?

ringrazio tutti per la collaborazione

Code: [Select]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
const byte addresses [][6] = {"00001", "00002"}; // gestisci i canali di comunicazione
//configurazione ingressi e uscite, da 9 a 13 sono destinati al modulo di comunicazione
int tool_abilitato = 2;     // ingresso avvitatore abilitato da centralina
int byte_set1 = 3;            // ingresso pset bit0
int byte_set2 = 4;           // ingresso pset bit1
int byte_set3 = 5;           // ingresso pset bit2
int abilita_ciclo = 6;        // uscita per abilitare avvitatore
int ledb1 = 7;                // led bit 1
int ledb2 = 8;                // led bit 2
int ledb3 = A0;               // led bit 3
int ledtool = A1;             // led avvitatore abilitato
int ledok = A2;               // led ritorno cambio selezione bussola corretta
int bussola = 0;
boolean pset1_state = 0;
boolean pset2_state = 0;
boolean pset3_state = 0;
int abilita = 0;
boolean abilita_stato = 0;
int d = 0;
int tooldisab1;

void setup () {
  pinMode(byte_set1, INPUT_PULLUP);
  pinMode(byte_set2, INPUT_PULLUP);
  pinMode(byte_set3, INPUT_PULLUP);
  pinMode(tool_abilitato, INPUT_PULLUP);
  pinMode(abilita_ciclo, OUTPUT);
  pinMode(ledb1, OUTPUT);
  pinMode(ledb2, OUTPUT);
  pinMode(ledb3, OUTPUT);
  pinMode(ledtool, OUTPUT);
  pinMode(ledok, OUTPUT);
  radio.begin();                           //Starting the radio communication
  radio.openWritingPipe(addresses[1]);     //Setting the address at which we will send the data
  radio.openReadingPipe(1, addresses[0]);  //Setting the address at which we will receive the data
  radio.setPALevel(RF24_PA_MIN); ////setta potenza default, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm
}
void loop() {
  pset1_state = digitalRead(byte_set1);
  pset2_state = digitalRead(byte_set2);
  pset3_state = digitalRead(byte_set3);
  abilita_stato = digitalRead(tool_abilitato);

  if (pset1_state == LOW && pset2_state == HIGH && pset3_state == HIGH) { //verifica ingressi e utilizza parametri bussola n. 1
    bussola = 1;
    digitalWrite(ledb1, HIGH);
    digitalWrite(ledb3, LOW);
    digitalWrite(ledb2, LOW);
    digitalWrite(ledtool, HIGH);
    delay(5);
    radio.stopListening();                             //This sets the module as transmitter
    //button_state = digitalRead(button_pin);
    radio.write(&bussola, sizeof(bussola));  //Sending the data
    delay(5);

    radio.startListening();                            //This sets the module as receiver
    while (!radio.available());                      //Looking for incoming data
    radio.read(&abilita, sizeof(abilita)); //Reading the data
    if (abilita == 1)
    {
      digitalWrite(abilita_ciclo, HIGH);
      digitalWrite(ledok, HIGH);

    }
    else
    {
      digitalWrite(abilita_ciclo, LOW);
      digitalWrite(ledok, LOW);
    }
   
  }
  if (pset1_state == HIGH && pset2_state == LOW && pset3_state == HIGH) { //verifica ingressi e utilizza parametri bussola n. 2
    bussola = 2;
    digitalWrite(ledb1, HIGH);
    digitalWrite(ledb3, LOW);
    digitalWrite(ledb2, HIGH);
    digitalWrite(ledtool, HIGH);
    delay(5);
    radio.stopListening();                             //This sets the module as transmitter
    //button_state = digitalRead(button_pin);
    radio.write(&bussola, sizeof(bussola));  //Sending the data
    delay(5);

    radio.startListening();                            //This sets the module as receiver
    while (!radio.available());                        //Looking for incoming data
    radio.read(&abilita, sizeof(abilita)); //Reading the data
    if (abilita == 2)
    {
      digitalWrite(abilita_ciclo, HIGH);
      digitalWrite(ledok, HIGH);
    }
    else
    {
      digitalWrite(abilita_ciclo, LOW);
      digitalWrite(ledok, LOW);
    }
  }
  if (pset1_state == LOW && pset2_state == LOW && pset3_state == HIGH) { //verifica ingressi e utilizza parametri bussola n. 3
    bussola = 3;
    digitalWrite(ledb1, HIGH);
    digitalWrite(ledb3, HIGH);
    digitalWrite(ledb2, LOW);
    digitalWrite(ledtool, HIGH);
    delay(5);
    radio.stopListening();                             //This sets the module as transmitter
    //button_state = digitalRead(button_pin);
    radio.write(&bussola, sizeof(bussola));  //Sending the data
    delay(5);

    radio.startListening();                            //This sets the module as receiver
    while (!radio.available());                        //Looking for incoming data
    radio.read(&abilita, sizeof(abilita)); //Reading the data
    if (abilita == 3)
    {
      digitalWrite(abilita_ciclo, HIGH);
      digitalWrite(ledok, HIGH);
    }
    else
    {
      digitalWrite(abilita_ciclo, LOW);
      digitalWrite(ledok, LOW);
    }
  }
  if (pset1_state == HIGH && pset2_state == HIGH && pset3_state == LOW) { //verifica ingressi e utilizza parametri bussola n. 4
    bussola = 4;
    digitalWrite(ledb1, HIGH);
    digitalWrite(ledb3, HIGH);
    digitalWrite(ledb2, LOW);
    digitalWrite(ledtool, HIGH);
    delay(5);
    radio.stopListening();                             //This sets the module as transmitter
    //button_state = digitalRead(button_pin);
    radio.write(&bussola, sizeof(bussola));             //Sending the data
    delay(5);

    radio.startListening();                            //This sets the module as receiver
    while (!radio.available());                        //Looking for incoming data
    radio.read(&abilita, sizeof(abilita));              //Reading the data
    if (abilita == 4)
    {
      digitalWrite(abilita_ciclo, HIGH);
      digitalWrite(ledok, HIGH);
    }
    else
    {
      digitalWrite(abilita_ciclo, LOW);
      digitalWrite(ledok, LOW);
    }
  }
  if (abilita_stato == HIGH) {
    digitalWrite(ledtool, LOW);
  }
}

Go Up