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
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
Bonne soirée
ç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)
// ************* 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 ?
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é ? :
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..