Transceiver radio Capricieux ...

Bonsoir à tous.

Pour un projet de drone, j'utilise une communication radio avec deux Arduino nano et deux transceiver radio NRF24L01+ avec antenne.
Ca marche bien, parfois quand je reset une des deux cartes, parfois les deux, mais ça fonctionne pendant environ 5 sec ...
Voici mon code

Emetteur :

#include <SPI.h>  
#include "RF24.h"

RF24 myRadio(7, 8);
byte addresses[][6] = {"0"};

int pot;
int data;

int inpot;

void setup()
{
  Serial.begin(115200);
  Serial.print("SEND");
  delay(1000);
  myRadio.begin();  
  myRadio.setChannel(115); 
  myRadio.setPALevel(RF24_PA_MAX);
  myRadio.setDataRate( RF24_250KBPS ) ; 
  myRadio.openWritingPipe( addresses[0]);
  delay(1000);
}

void loop()
{
  myRadio.write(&pot, sizeof(pot)); 
  Serial.println(pot);
  inpot = analogRead(A0);
  pot = map(inpot, 0, 1023, 0, 100);

}

Récepteur :

#include <SPI.h>  
#include "RF24.h"

RF24 myRadio(7, 8); 

int pot;

byte addresses[][6] = {"0"}; 

void setup() 
{
  Serial.begin(115200);
  Serial.println("RECEIVE");
  delay(1000);
  
  myRadio.begin(); 
  myRadio.setChannel(115); 
  myRadio.setPALevel(RF24_PA_MAX);
  myRadio.setDataRate( RF24_250KBPS ) ; 
  myRadio.openReadingPipe(1, addresses[0]);
  myRadio.startListening();
}


void loop()  
{

  if (myRadio.available()) 
  {
    while (myRadio.available())
    {
      myRadio.read( &pot, sizeof(pot) );
    }
    Serial.print(pot);
    Serial.println("%");
  }
  

}

j'ai aussi fais des recherches qui disaient qu'il fallait mettre un condo de 10uF pour lisser le courant et éviter les pics, qui perdraient les paquets pendant la liaison ...

Si vous avez des idées, n'hésitez pas à me donner des conseil :slight_smile:
Bonne soirée

Qu’est-ce que vous Faites avecbyte addresses[][6] = {"0"};

Pourquoi vous balancez la valeur avant de la lire?

myRadio.write(&pot, sizeof(pot)); 
  Serial.println(pot);
  inpot = analogRead(A0);
  pot = map(inpot, 0, 1023, 0, 100);

ça marche parce que la loop fait son boulot mais c’est moche

Vous balancez la sauce super vite, que se passe-t-il si vous mettez un petit delay pour emetttre x fois par seconde

J-M-L:
Qu’est-ce que vous Faites avecbyte addresses[][6] = {"0"};

Je n'en ai aucune idée, je me suis basé sur un code déjà existant

Pourquoi vous balancez la valeur avant de la lire?

myRadio.write(&pot, sizeof(pot)); 

Serial.println(pot);
  inpot = analogRead(A0);
  pot = map(inpot, 0, 1023, 0, 100);


ça marche parce que la loop fait son boulot mais c’est moche

Vous balancez la sauce super vite, que se passe-t-il si vous mettez un petit delay pour emetttre x fois par seconde

Oui c'est vrai, c'est bête..
Je vais essayer avec un delay
Mais j'avais vu sur un forum qu'il fallait éviter les delay, les boucles for ou while to grandes

Vous pouvez faire cela sans delay avec la technique de millis()

void loop()
{
  const uint32_t period = 250; // ms
  static uint32_t chrono = 0;

  // est-ce le moment d'émettre ?
  if (millis()-chrono >= period) { // 4 fois par seconde 
    pot = map(analogRead(A0), 0, 1023, 0, 100);
    myRadio.write(&pot, sizeof(pot)); 
    Serial.println(pot);
    chrono += period;
  }
  // ici vous pouvez faire autre chose 

}

Mais regardez aussi comment les codes de démo déclarent les adressses et oui il faut que l’alimentation soit super propre et stable pour que ça fonctionne bien. (Et si vous émettez plein pot, il ne faut pas que vos 2 unités soient à quelques cm l’une de l’autre sur votre table quand vous testez)

Si ça vous intéresse j’avais écrit un petit tuto sur le sujet (et il y en a d’autres dans la partie tuto)

Lorsque je suis en USB, l'alim est stable ? Ou est ce qu'avec le condo ça fonctionnerait bien ?

En tout cas, quand je m'éloigne un peu (3m), je reçois ça, mais plus aucune valeur après 5 secondes:

5
23
43
59
74
77
76
57
37
26
19
19
19
20
29
46
57
67
78
92
100
100
100
100
100
100
91
74
62
50
39
24
12
5
5
9
25
44
62
75
87
93
99
100
100
98
77
58
37
37

Sinon, je dois prendre un générateur ?

Comment est branché votre NRF? Quel type avez vous ?

Je suis branché comme sur votre tuto:

NRF24L01+ avec leur support adaptateur de tension:
VCC --> 5V
GND --> GND
CE --> D7
CSN --> D8
SCK --> D13
MOSI (MO) --> D11
MISO (MI) --> D12
IRQ --> Non connecté

Et voici mon NRF:

J'ai oublié de préciser que mon code utilise les Millis maintenant

Si vous testez cela, qu'est-ce que ça fait:

émetteur:

// ************* La Radio *************
#include <SPI.h>
#include <RF24.h> // voir http://tmrh20.github.io/RF24/

RF24 radio(7, 8);  // Configurer vos radio nRF24L01+ sur le bus SPI et mettre  CE sur D7 et CSN sur D8
const byte adresse[] = "0pipe";  // Le nom du "pipe" de communication

// -----------------------------------
// envoi d'un octet vers l'autre radio
// -----------------------------------
void envoyerMessage(uint8_t nombre)
{
  if (!radio.write( &nombre, sizeof(nombre))) {
    Serial.println(F("erreur d'envoi"));
  }
}
// -----------------

void setup() {
  Serial.begin(115200);

  // On configure la radio
  radio.begin();

  // pour le test on règle le niveau d'énergie à RF24_PA_LOW pour éviter les interférences
  // mettre à RF24_PA_MAX si on veut la puissance d'émission max
  radio.setPALevel(RF24_PA_LOW);

  // On ouvre un pipe d'écriture
  radio.openWritingPipe(adresse);

  // On s'assure de ne pas écouter pour qu'on puisse émettre
  radio.stopListening();
}

void loop()
{
  const uint32_t period = 250; // ms
  static uint32_t chrono = 0;

  // est-ce le moment d'émettre ?
  if (millis() - chrono >= period) { // 4 fois par seconde
    uint8_t pot = (uint8_t) map(analogRead(A0), 0, 1023, 0, 100);
    envoyerMessage(pot);
    Serial.println(pot);
    chrono += period;
  }
  // ici vous pouvez faire autre chose
}

récepteur:

// ************* La Radio *************
#include <SPI.h>
#include <RF24.h> // voir http://tmrh20.github.io/RF24/

RF24 radio(7, 8);  // Configurer vos radio nRF24L01+ sur le bus SPI et mettre  CE sur D7 et CSN sur D8
const byte adresse[] = "0pipe";  // Le nom du "pipe" de communication

// ----------------------------------------------------------------------------------------
// vérifie si on a reçu une commande de la part de l'autre radio (1 octet)
// ----------------------------------------------------------------------------------------
bool ecouterRadio(uint8_t &message)
{
 bool messageRecu = false;
 if ( radio.available()) {
   while (radio.available()) {
     radio.read( &message, sizeof(message) );  // on lit l'octet reçu (si plusieurs messages on ne conserve que le dernier)
   }
   messageRecu = true;
 }
 return messageRecu;
}

// -----------------
void setup() {
 Serial.begin(115200);

 // On configure la radio
 radio.begin();
 // pour le test on règle le niveau d'énergie à RF24_PA_LOW pour éviter les interférences
 // mettre à RF24_PA_MAX si on veut la puissance d'émission max
 radio.setPALevel(RF24_PA_LOW);

 // on écoute sur "0pipe"
 radio.openReadingPipe(1, adresse);

 // on se met en écoute
 radio.startListening();
}

void loop()
{
 uint8_t pot;
 // a-t-on reçu quelque chose
 if (ecouterRadio(pot)) {
   Serial.print(F("J'ai recu "));
   Serial.println(pot);
 }
 // ici vous pouvez faire autre chose
}

J'ai tapé cela ici directement en prenant simplement le code de mon tuto mais en virant la communication réciproque, absolument pas testé.

ça marchait très bien, mais même problème, 5 secondes après, plus aucune nouvelles ...
Mes modules sont défectueux ? Ou alors après ces 5 secondes, le courant n'est plus stable ?

avez vous la dernière version de la librairie ?

essayez de changer les 250ms en 1000ms pour avoir un message par seconde pour voir si ça change quelque chose

avec 1 seconde, ça marche très bien, mais inutilisable pour ce que je veux en faire (drone). Par contre, j'ai ça, est ce que c'est lié au temps de communication qui a été changé ? :

erreur d'envoi
27
erreur d'envoi
39
erreur d'envoi
86
erreur d'envoi
100
erreur d'envoi
100
erreur d'envoi
100
erreur d'envoi
96
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
74
erreur d'envoi
99
erreur d'envoi
100
erreur d'envoi
83
erreur d'envoi
67
erreur d'envoi
50
erreur d'envoi
50
erreur d'envoi
50
erreur d'envoi
51
erreur d'envoi
50
erreur d'envoi
31
erreur d'envoi
6

Oui, je l'ai téléchargée sur github il y a quelques jours

vous êtes alors peut-être en environnement hyper bruité.

essayez en changeant de canal, en passant en setAutoAck(1) et mettez aussi la payloadSize à 1 puisqu'on envoie 1 octet (pas la peine d'en envoyer 32)

Ok ça fonctionne très bien ! J'ai réussi à changer de canal je pense, mais comment envoyer qu'un octet ?

Et merci beaucoup !

Bon, j'ai un peu testé en allumant une LED en fonction du potentiomètre, et ça fonctionne bien. Sauf que quand je m'éloigne à + de 5m environ, je perds la communication, même si c'est du au LOW dans le setup je pense.
Sinon, je trouve pas ça très fiable pour l'instant et pour l'utilisation sur un drone, c'est assez aléatoire au niveau de la connexion, des paquets sont perdus, etc..

Bref, c'est vraiment pas fiable ...
Quelqu'un pour m'aider ??

5 m en extérieur ?

En intérieur