Voiture RC (nrf24l01) [RESOLU merci à tous]

Bonjour à tous,

Je suis sur un projet de voiture RC sur arduino uno, utilisant un module de gestion des moteurs L298N et un module RC nrfl24l01,
Le code me semble correct (aussi bien le transmetteur que le récepteur), le problème est que les 2 moteurs devraient tourner à la meme vitesse et ce n'est pas le cas, il y en a un sur les 2 qui tourne "normalement" et l'autre au ralenti voir pas du tout....
Je ne vois pas ou j'ai fait l'erreur, je vous envoie le code du transmetteur, du récepteur et les photos du montage.
Merci pour tout aide que vous pourrez me fournir, voila 3 soirs que je me creuse la tete sans aucune solution :confused: :sob:

Transmission:

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

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

RF24 radio(9,10);
const uint64_t pipe = 0xF0F0F0F000LL; 
int msg[1]; 
int potpin_1 = A0; /* joystick x et y correspondent a 2 potar*/
int val_1; 
int potpin_2 = A1; 
int val_2; 

void setup(void){
radio.begin();
radio.setPALevel(RF24_PA_HIGH);
radio.openWritingPipe(pipe); 

}
void loop() {
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);
val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);

/* la valeur des potars ( joystick ici) va de 0 à 1023 et la frequence du nrf224  
 *  va de 0 à 255, comme il y a 2 informations a taiter ( avant arriere et gauche droite)
 *  il faut diviser cette freauence en 2 ( 1 potar par moitié) si il y avait 3 informations il faudrait diviser la frequence par 3
 */
}

et enfin le code pour la reception:

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

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

RF24 radio(9,10);
const uint64_t pipe = 0xF0F0F0F000LL; 
int msg[1]; 
int data; 

int avant;
int droite;
int gauche;           
int arriere;           
const int in1 = 1;    // direction pin 1
const int in2 = 2;    // direction pin 2
const int in3 = 3;    // idem
const int in4 = 4;    // idem
const int ena = 5;    // PWM pin changement de la vitesse
const int enb = 6;

void stop()
{
  
 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
   digitalWrite(enb, LOW);//ou analogWrite(enb, 200)
   digitalWrite(enb, LOW);
}

void dirgauche(int gauche)
{
  
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  digitalWrite(ena, HIGH); // remplacer "150" par "gauche" si besoin
  digitalWrite(enb, HIGH); //ou analogWrite(enb, 200)
}

void dirdroite(int droite)
{
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  digitalWrite(ena, HIGH); // remplacer "150" par "droite" si besoin
  digitalWrite(enb, HIGH);//ou analogWrite(enb, 200)
}

void diravant (int avant)
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  digitalWrite(ena, HIGH); // remplacer "150" par "avant" si besoin
  digitalWrite(enb, HIGH); //ou analogWrite(enb, 200)
}

void dirarriere (int arriere)
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  digitalWrite(ena, HIGH); // remplacer "150" par "arriere" si besoin
  digitalWrite(enb, HIGH);//ou analogWrite(enb, 200)
}



void setup()
{
  Serial.begin(9600);
  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(ena, OUTPUT);      // connection to L298n
  pinMode(enb, OUTPUT);

delay(50);
radio.begin();
radio.setPALevel(RF24_PA_HIGH);
radio.openReadingPipe(1,pipe); 
radio.startListening();
}

void loop()
{
  if (radio.available())radio.read(msg, 1);
  if (msg[0] <64 && msg[0] >-1)data = msg[0], gauche = map(data, 63, 0, 0, 255),dirgauche(gauche); /* Gestion de la gauche. data: ce que est recu comme info de l'emeteur, ensuite division de
  la frequence entre 0 et 60 ( division en 5 part pour gauche, droite, avant arriere et stop) */

  
  if (msg[0] >64 && msg[0] <=128)data = msg[0], droite = map(data, 128, 65, 255, 0), dirdroite(droite);
  if (msg[0] >128 && msg[0] <=189)data = msg[0], avant = map(data, 189, 129, 0, 255), diravant(avant);
  if (msg[0] >=201 && msg[0] <=255)data = msg[0], arriere = map(data, 255, 201, 255, 0), dirarriere(arriere);
  if (msg[0] >190 && msg[0] <=200)data = msg[0], stop();
  Serial.println(arriere);
  
}

Merci encore pour votre aide.

Bonjour pépé,

Merci pour ta réponse, effectivement je n'ai pas d'indice de vitesse ( j'ai essayé avec, mais le résultat était le meme ).
J'ai deja essayé de changer les moteurs, c'est la meme chose, tout comme le module l298n.
Peux tu m'assurer que le code est bon?
J'ai meme modifié l'alimentation, est mis plus ou moins de puissance mais rien à faire :frowning:

Bonjour,
d'après le datasheet du L298, VSmin = VIH + 2.5V
est-ce respecté dans ton montage ?

Merci Pepe,
en fait je mets les annotation pour moi quand je relis mon code pour mieux comprendre ou voir ce qui pourrait être modifié quand sa marche pas. Mais tu as raison, je vais re-verifier encore le montage.

Bonjour Trimarco,

Pourrais tu me dire à quoi correspond le VIH et le VSmin stp?

je ne sais pas si cela réponds exactement à ta question mais la tension appliqué a l'entrée du L298n est de 7,2V, jai meme essayé en couplant une pile 9V en plus de mes 2 batteries mais rien n'a changé

pepe:
Par exemple, un listing chronométré des données reçues par radio permettrait de mettre en cause / hors de cause les éléments situés en amont / en aval.

Comment faire cela? j'ai bien vérifié en tout cas via le port série que le "message" était bien reçu (avant, arrière, droite gauche)

la tension appliqué a l'entrée du L298n est de 7,2V

admettons que ce que tu appelles l'entrée du L298 soit bien la broche Vs, qui correspond sans doute à l'entrée notée 12V sur ton module
si ton arduino est alimenté en 5V, la tension min sur Vs devrait être de 7.5V, ce qui n'est pas tout à fait le cas ici. Est-ce la cause du problème, je n'en sais rien, mais il faudrait en avoir le cœur net

EDIT :
en reregardant ton montage, j'ai l'inconfortable impression que tu as branché le + de ta batterie sur le 5V, au lieu du 12V = Vs = 7.2V ... ?

pepe:
Tu dois donc pouvoir dire quelles sont les séquences de commande qui donnent satisfaction et celles qui aboutissent à un dysfonctionnement, et si le comportement est constant.

justement sur le port serie tout semble bien fonctionner et le résultat visuel sur les moteur est le meme: 1 fonctionne très bien l'autre pas du tout ou très lentement. franchement je comprends pas...

trimarco232:
EDIT :
en reregardant ton montage, j'ai l'inconfortable impression que tu as branché le + de ta batterie sur le 5V, au lieu du 12V = Vs = 7.2V ... ?

Oui effectivement, j'ai essayé les 2 entrées celle de 5v et l'autre aussi de different manière... misère de misère, rien à faire, le résultat est le meme. 1 moteur va plus vite et l'autre est "poussif" ou ne marche pas
Note importante, c'est toujours celui qui est relié sur les "out1 et 2" qui fonctionne le mieux

c'est toujours celui qui est relié sur les "out1 et 2" qui fonctionne le mieux

et si tu inverses in1 et in2, il se passe quoi ?

J'ai essayé d'inverser in1 et 2 mais aussi in3 et 4 et le resultat est le meme.
je vous envoie une petite video pour vous rendre compte.
le moteur 1 est relié au out 3-4
le moteur 2 est relié au out 1-2

quelque soit la commande ( avant, arrière, gauche, droite) le moteur 2 va vite et l'autre lentement...

avant.zip (946 KB)

et si tu permutes in1/2 avec in3/4 ?

pareil :sob:

Merci pour ta réponse pépé,

le "avant" est le "avant" tout court en fait.. je ne sais pas comment l'expliquer, pour moi cela veut dire que uniquement la commande avant fait effet donc les 2 moteurs doivent tourner dans le meme sens et à la meme vitesse.

Effectivement il y a une zone neutre gauche droite inexistante penses tu que c'est cela le problème qui génère la lenteur d'un des moteur?

Mais en tout cas lorsque le joystick du récepteur est en position neutre, aucun des moteur ne tourne.

Je vais essayer de créer une zone neutre gauche droite en tout cas.

J'ai passé tellement d'heure et de soirs ( je ne suis malheureusement pas un expert ) à créer et comprendre ce code et construire le hardware que j'en suis presque démotivé.

Merci en tout cas de vous creuser la tete avec moi, je me sens un peu moins seul pour le coup

hello
ce n'est pas la solution, mais il y a deux fois pour enb et rien pour ena:
void stop()
{

digitalWrite(in1, LOW);//moteur1
digitalWrite(in2, LOW);//moteur1
digitalWrite(in3, LOW);//moteur2
digitalWrite(in4, LOW);//moteur2
digitalWrite(enb, LOW);//ou analogWrite(enb, 200)
digitalWrite(enb, LOW);
}

bonjour,
puisque en inversant les moteurs c'est toujours le même moteur qui pose problème cela ne viendrait il pas des moteurs ?
cordialement
Alain

sans doute !
peux-tu jeter un oeil au moteur faiblard, y a-t-il quelque chose qui l’empêche de tourner sereinement ?

@alainav1
non, astajoh dit que c'est toujours la même moitié (3/4)du 298 qui déconne
je le cite en #11
Note importante, c'est toujours celui qui est relié sur les "out1 et 2" qui fonctionne le mieux

au fait il y a des "shunts" (3) sur la platine 298. qu'en est il de leurs positions

un descriptif ou une ou plusieurs photos pour nous montrer leurs positions

montre nous aussi (mieux) le raccordement du 12 V à ta platine.

une photo du dessus qui ne laisse pas de place pour le parallaxe.

Bonjour,
je gère la vitesse d'un train miniature et le choix de la fréquence modifie le comportement du moteur .
personnellement la fréquence pour ce type de moteur la plus efficace (couple maxi ) est autour de 250 HZ.
j'ai donc choisi cette fréquence (je n'utilise pas les rf24 ) mais le bluetooth (HC06)
ci joint le lien que j'ai utilisé pour modifier la fréquence

si cela peux t'aider ?

cordialement
alain

Un grand merci a tous pour vos message ca fait du bien un peu de soutien.
Je vous envoie les photos demandées et suis entrain de modifier (doucement) le code pour laisser une zone neutre pour le droite/gauche, je le poste ensuite dès que c'est fait et testé

voila je viens d'ajouter la zone neutre mais rien a faire, le resutat est toujours le meme ..... la loose :frowning:

Je vous mets le code de la reception modifié:

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

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

RF24 radio(9,10);
const uint64_t pipe = 0xF0F0F0F000LL; 
int msg[1]; 
int data; 

int avant;
int droite;
int gauche;           
int arriere;           
const int in1 = 1;    // direction pin 1
const int in2 = 2;    // direction pin 2
const int in3 = 3;    // idem
const int in4 = 4;    // idem
const int ena = 5;    // PWM pin changement de la vitesse
const int enb = 6;

void stop()
{
  
 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
   digitalWrite(enb, LOW);//ou analogWrite(enb, 200)
   digitalWrite(ena, LOW);
}

void dirgauche(int gauche)
{
  
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  digitalWrite(ena, HIGH); // remplacer "150" par "gauche" si besoin
  digitalWrite(enb, HIGH); //ou analogWrite(enb, 200)
}

void dirdroite(int droite)
{
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  digitalWrite(ena, HIGH); // remplacer "150" par "droite" si besoin
  digitalWrite(enb, HIGH);//ou analogWrite(enb, 200)
}

void diravant (int avant)
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  digitalWrite(ena, HIGH); // remplacer "150" par "avant" si besoin
  digitalWrite(enb, HIGH); //ou analogWrite(enb, 200)
}

void dirarriere (int arriere)
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  digitalWrite(ena, HIGH); // remplacer "150" par "arriere" si besoin
  digitalWrite(enb, HIGH);//ou analogWrite(enb, 200)
}



void setup()
{
  Serial.begin(9600);
  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(ena, OUTPUT);      // connection to L298n
  pinMode(enb, OUTPUT);

delay(50);
radio.begin();
radio.setPALevel(RF24_PA_HIGH);
radio.openReadingPipe(1,pipe); 
radio.startListening();
}

void loop()
{
  if (radio.available())radio.read(msg, 1);
  if (msg[0] <62 && msg[0] >-1)data = msg[0], gauche = map(data, 63, 0, 0, 255),dirgauche(gauche); /* Gestion de la gauche. data: ce que est recu comme info de l'emeteur, ensuite division de
  la frequence entre 0 et 60 ( division en 5 part pour gauche, droite, avant arriere et stop) */

  if (msg[0] >62 && msg [0] <=72)data = msg[0], stop();
  if (msg[0] >73 && msg[0] <=128)data = msg[0], droite = map(data, 128, 65, 255, 0), dirdroite(droite);
  if (msg[0] >128 && msg[0] <=189)data = msg[0], avant = map(data, 189, 129, 0, 255), diravant(avant);
  if (msg[0] >=201 && msg[0] <=255)data = msg[0], arriere = map(data, 255, 201, 255, 0), dirarriere(arriere);
  if (msg[0] >190 && msg[0] <=200)data = msg[0], stop();
  Serial.println(arriere);
  
}

hello
tu n'as pas de cavalier à coté de in1 et de in4 ?