NRF24 je me noie

Bonjour à tous,
voilà, je suis prof de physique et je travaille avec mes élèves sur une télécommande de voiture RC à base d'arduino. Nous avons réussi le job avec 2 arduinos uno...Mais il nous faut plus d'entrées au niveau de l'émetteur, et donc nous avons gentiment basculé sur un couple Nano/Mega....Et là... c'est la misère...
-J'utilise 2 antennes NRF24L01+ avec la petite alimentation. J'ai un beau 3.2V à l'entrée, à priori pas besoin de condensateur d'entrée.
-J'ai changé les Miso/Mosi/SKR pour la Mega.
-J'utilise une alimentation externe pour la puissance
-J'utilise la biblio RF24

Je peux joindre les codes ...
mais là...Je sèche...besoin de me désaltérer :wink:
Si quelqu'un a des idées...Je suis preneur.
Tchin

Bonsoir
La misere oui mais laquelle bleue noire rouge on sait pas

Plus serieusement dire clairement ce qui ne va pas joindre le branchement et le code serait un plus indéniablement

Cordialement jfs59

Bonjour et bienvenue,

Fil de discussion créé au mauvais endroit. Ce sous-forum est réservé aux Tutoriels et cours.
Message déplacé dans la racine du forum francophone.

Merci de prendre quelques minutes pour lire les bonnes pratiques du forum francophone et les appliquer.

Bonsoir, effectivement....
merci de l'intérêt, je joins les codes, il y a pas d'info dedans, c'est pour des 5ème...avec les parties debug

Emetteur : Mega

#include <Servo.h>
Servo myservo;  // create servo object to control a servo

//-------------------------servo dee la voiture pilote par un potar------------------------
//int pin_volant = A0;  // analog pin used to connect the potentiometer
#define pin_volant  A0
int val_volant;    // variable to read the _volantue from the analog pin


// -------------------------esc de la voiture piloté par un potar------------------------------
#define pin_accel   A1      // [Entrée] Pour mesure de la tension du point milieu du potentiomètre de commande
int val_accel;

//--------------------bouton----------------------
const int pin_bouton1 = 2; // un bouton sur la broche 2
int bouton1; 
const int pin_led=13; //led de test bouton

//-------------------module communication------------------------------
#include <SPI.h>
//#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(53, 49); // CE, CSN
#define SOFT_SPI_MISO_PIN 50  //12 uno et 50 mega
#define SOFT_SPI_MOSI_PIN 51 // 11 uno et 51 mega
#define SOFT_SPI_SCK_PIN 52  //13 uno 52 mega

const byte address[6] = "00001"; // adresse pipe de transmission


//------------------structure à envoyer--------------------
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  int volant = 22;
  int accel = 10;
  int bouton1 = LOW;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // Create a variable with the above structure



void setup() {
    Serial.begin(9600);
    pinMode(pin_bouton1, INPUT_PULLUP); // définition des bouton comme entree en pullup
    pinMode(pin_led, OUTPUT);
    radio.begin();
    myservo.attach(3);//servo de test émetteur
  
  radio.openWritingPipe(address); //ouvre le canal
  radio.setDataRate(RF24_2MBPS);  // vitesse de transmission
  radio.setChannel(124);            // canal de transmission 124 est libre
  radio.setPALevel(RF24_PA_MIN);    // puissance réception min pour les tests
  radio.stopListening();            //arr^te l'écoute
}

void loop() {

  bouton1 = digitalRead(pin_bouton1); //on lit la valeur de bouton1
  data.bouton1=bouton1;
 digitalWrite(pin_led,bouton1);
data.volant=100;

   /* if(etatBouton == HIGH) // test si le bouton a un niveau logique HAUT
    {
        c=
    }
    else  // test si le bouton a un niveau logique différent de HAUT (donc BAS)
    {
        digitalWrite(led, HIGH); //la LED reste éteinte
    }
    */
   //On envoie les données dans la strucure
  val_volant = analogRead(pin_volant);
  val_volant = map(val_volant, 0, 1023, 50, 130);
  data.volant = val_volant;

  val_accel = analogRead(pin_accel);// Lecture de la tension retournée par le potentiomètre (valeur comprise entre 0 et 1023)
  val_accel = map(val_accel, 0, 1023, 1100, 1900); //dureeImpulsionCommandeESC = map(val_accel, 0, 1023, dureeMinimaleImpulsionCommandeESC, dureeMaximaleImpulsionCommandeESC); 1100-1300 marcge Ar 1300-1900marhge av
  data.accel= val_accel;
  
//------------------debug------------------
Serial.print("data.bouton1 : ");  
Serial.println(data.bouton1);
Serial.print("bouton1 : ");
Serial.println(bouton1);

  radio.write(&data, sizeof(Data_Package)); //envoie tout le paquet struct
  //delay(1000);
  
}

et le récepteur, NANO

//recepteur nano sur voiture
#include <Servo.h>
Servo servo_volant;  // create servo object to control a servo
#define pin_volant 3


//-------------------module communication------------------------------
#include <SPI.h>
//#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN
//#define SOFT_SPI_MISO_PIN 12  //12 uno et 50 mega ou par default sur UNO et Nano
//#define SOFT_SPI_MOSI_PIN 11 // 11 uno et 51 mega
//#define SOFT_SPI_SCK_PIN 13  //13 uno 52 mega



const byte address[6] = "00001";



// ------------------------------ESC------------------------------
Servo ESC;
int ESC_pin =9;

//------------------bouton---------------
int pin_bouton1 = 2; //Led de test
int bouton2;
//--------------------Structure
struct Data_Package {
 int volant = 0;
  int accel = 0;
 int bouton1 = 1; //ajouter les autres fonction
  };

Data_Package data; //Creation de ta variable liée a la structure
int val;

void setup() {

  Serial.begin(9600);//communication Pc debuggage
 
  //------------------------------------------------------
 pinMode(pin_bouton1, OUTPUT);
  servo_volant.attach(pin_volant);   // attache the servo on pin 9 to the servo object
  ESC.attach(ESC_pin);               //declare le pin de l'ESC
  radio.begin();                     //début communication
  radio.openReadingPipe(0, address); //ouvre le canal
  radio.setDataRate(RF24_2MBPS);     // vitesse de transmission
  radio.setChannel(124);            // canal de transmission 124 est libre
  radio.setPALevel(RF24_PA_MIN);    // puissance réception min pour les tests
   radio.startListening();          //début l'écoute
}

void loop() {
  
  if (radio.available()) {radio.read(&data, sizeof(Data_Package));} //Lecture structure
 
 /* Serial.print("volant: ");
  Serial.println(data.volant);
  Serial.print("accel: ");
  Serial.println(data.accel);
  Serial.print("bouton1 ");
  Serial.println(data.bouton1);
  Serial.print("d: ");
  delay (100);
 */
 
 val=data.volant;// on recupere la valeur volant
 bouton2 =data.bouton1;
 Serial.print("data.bouton1 ");// debuggage
  Serial.println(data.bouton1);
  Serial.print("bouton1 ");
  Serial.println(bouton2);
  digitalWrite(pin_bouton1, bouton2);
  ESC.writeMicroseconds(data.accel);
  servo_volant.write(data.volant);//position du servo volant
  delay(100);
 
}

un grand merci.

Et c'est quoi le problème ?
Parce que là tout ce qu'on sait, c'est que c'est la misère.
Effectivement.

Bonjour,
oui effectivement... :rofl:
Je n'aurais pas du demander de l'aide à chaud...
Je vais essayé d'être plus précis...Un regard externe est nécessaire parce qu'à force d'être la tête dedans je ne vois plus de solution...
J'ai commencé par 2 UNO et là, tout fonctionne, le problème c'est que je n'ai pas assez d'entrée pour l'émetteur (un simulateur de voiture en tube PVC où les gamins sont assis dedans avec 3 pédales, un volant , clignotants et klaxon) Il me donc 3 potars (volant/accélération/frein) et des interrupteurs (6 pour la boite de vitesse voir 8 avec notre boîte 7 vitesses, 2 pour clignotants, 1 klaxon et par la suite, 4 de plus pour piloter un bras robotiser ( servo)...

Pour le récepteur sur la voiture RC (Traxxas) J'ai l'ECS avec un mappage car il gère entre 0 et 1024 (de mémoire)avec 0-400 marche AR et 400-1024 marche avant. Chaque interrupteur de la boite de vitesse nous permettra de modifier le mappage pour changer la vitesse maximale, soit une sortie. 2ème sortie pour la direction (un servo) , 2 sorties pour clignotant, 1 sortie klaxon et par la suite, 4 sorties pour le bras.

Le flux vidéo de la caméra est indépendant de l'arduino.

voilà pour le projet...qui va évoluer en fonction des élèves.

j'utilise donc une structure que je remplis sur l'émetteur et que j'envoie au récepteur.

Je n'arrive pas à communiquer entre la Mega et la Nano... J'ai lu un moment que la biblio rf24 ne gérait pas la Mega, mais j'ai vu plein de tuto qui fonctionne...

Je pense que le code est bon, sauf si à force de bidouiller, j'ai modifié un truc...

A priori le gros problème avec la NRF24 c'est la stabilité de l'alimentation, en sortant l'oscillo, j'ai un beau 3.2v stable même à pleine puissance. J'alimente l'émetteur avec un 12V sur l'entrée de la carte (la prise à côté de l'USB) . Pour le récepteur, j'alimente la NaNo par la Vin en 7.2V, la batterie de la voiture RC.

J'ai testé un test de la NRF24 (Home - elekkrypt) , à priori c'est bon pour l'émetteur et le récepteur.

Ne sachant pas comment visualiser les signaux radios, je ne sais pas si c'est un problème d'émission ou de réception...Ou les 2...

Bref...Je suis preneur de toutes les pistes...Merci à vous de prendre du temps. :smiling_face_with_three_hearts:

.
Il faut vraiment te tirer les vers du nez... Ca veux dire quoi "je n'arrive pas..." ?

Pour résoudre un problème, il y a 3 phases:

  • décrire les symptômes,
  • établir un diagnostic,
  • trouver un remède.
    Toi tu commences par la phase 2.
    Donnes les symptômes, STP

:wink:
Je dirais plutôt que je noie les symptômes... :sweat_smile:

Je ne reçois rien sur l'émetteur...
Mais je ne sais pas comment tester si j'envoie...
donc...Je n'arrive pas à communiquer entre mes 2 arduinos...

Je pense que si j'arrivais à diagnostiquer mieux...Je saurais répondre, c'est bien là le soucis du travail solo, il manque le regard extérieur.

Mais pourquoi je fais des projets complexes :rofl: mes collègues font clignoter des diodes pour faire un feu rouge :rofl: j'imagine qu'ils sont aux champignons ce matin :joy:

Et du coup, quand je lis les données envoyées, je n'ai que les valeurs d'initialisations...

Tu le fais exprès ? C'est normal que tu ne reçoive rien, l'émetteur il émet...

Déjà, tu peut truffer ton code de Serial.print(...) pour savoir si le programme se déroule comme tu le penses. Méthode classique.
Si rien d'anormal, vérifie tes branchements.
Si c'est OK, re-vérifie tes branchements.
Si tout est normal, re-re-vérifies tes branchements.
Je ne rigole pas. Pas du tout. C'est indispensable.
Si ça marche toujours pas, revois ton code. A 2 à l'heure. En te posant des questions à chaque ligne. Ai-je correctement initialisé le bignouf ? Passé-je les bons paramètres (Serial.print() est ton ami).
Si toujours KO, essaye avec un autre hardware. Change de tranceiver radio (tu en as bien sûr acheté 2, j'espère ? C-à-d 1 de secours )
Voilà, tu as du boulot pour les vacances :smiley:

bon alors, tu les reçois ces données, ou tu ne les reçois pas ???
Il faut vraiment apprendre à être clair : qui fait quoi ? comment ? pourquoi ? etc..

Si vous avez bien réussi avec l'arduino uno, pourquoi utiliser le méga ? Il utilise un uno comme récepteur et pour l'émetteur, il utilise un ensemble de uno + nanos (un nano par enfant), connectés via I2C pour étendre les entrées d' émetteur. Lisez ceci.
Salutations:
E.gonzalez

Excellente idée gonpezzi...Je ne savais pas que c'était possible avec une 2ème arduino. J'ai vu ça et ils utilisent des modules PCF8574 en extension IC2, mais je trouve le code trop compliqué pour mes collégiens...Ils ont appris à faire clignoter une LED en début d'année...Ils sont hyper motivés mais bon...Ce qui explique mon choix de la Méga.

Par contre , je ne vois pas où je ne suis pas clair :thinking: ah, oui j'ai inversé récepteur et émetteur...et "Et du coup, quand je lis les données envoyées, je n'ai que les valeurs d'initialisations..." il faut à priori initialiser les valeurs de la structure du RECEPTEUR, et je ne lis sur le récepteur que ces données d'initialisations...et donc pas les données de l'émetteur. ça change tout avec le bon mot :wink:

J'ai revérifié tous le câblage et même les câbles...Si vous n'avez rien vu de flagrant dans le code, cela confirme ma dernière hypothèse...La destruction du matériel...J'ai effectivement un NRF en plus et j'ai pu tester...Je viens de tester d'autres programmes, j'ai l'impression qu'une Mega est HS... et là je n'ai pas de secours...Avec l'alimentation externe, les gamins ont du brancher un plus sur la mauvaise borne...

J'avance à petit pas...

Avant tout il faudrait peut etre faire un programme minimum en envoyant une seule donnée chaque seconde et de regarder si on la recois

Uniquement dans le but d'économiser des broches sur l'émetteur :

8 entrées pour la boîte de vitesses ?
N'est-elle pas "synchromée" ?
Connaissez-vous un véhicule où l'on peut passer de la 6ème à la 1ère ?

Si vous utilisez 3 broches numériques pour la boîte de vitesses, une pour le passage à la vitesse supérieure, une pour le point mort et une pour le passage à la vitesse inférieure, vous pouvez avoir 3 broches libres pour allumer les feux et passer de la longue à la courte, par exemple.

Bonjour à tous,
alors je viens donner des news...J'ai enfin trouvé les pb...
-carte Mega cramée

  • mauvaise soudure sur un NRF
    -une piste de mon schied à visser HS
  • 2 câbles dupont hs...

voilà quand on bosse avec 24 gamins :rofl: la douceurs des gamins me surprendra toujours...

bref, tout fonctionne...enfin chez moi...vendredi je mets dans les pattes des jeunes... :sweat_smile:

Pourquoi 8 vitesses? parce que c'est plus clair pour les gamins, enfin avec la boite que nous avons faites...Je n'ai pas le temps de former des dessinateurs, du coup, ils ont trouvé une boite toute faite : https://www.thingiverse.com/thing:4206445
Je n'aurais pas le temps de simplifier pour une boite 5 vitesses + AR , on verra après...

pour info, pour apprendre aux gamins, je commence par Mblock, et après, on passe au C++, et en fonction des motivations des gamins on avance.

c'est pas toujours simple :sweat_smile: