Modélisme

Bonjour la compagnie,
Je recherche une solution à mon problème :
en modélisme, je cherche à à décoder le signal d’un récepteur de radio commande, mais rien de concret pour le moment. La fonction pulseIn est intéressante mais n’est pas stable du tout, c’est à dire que la lecture est aléatoire. en faite le but est de conditionner le résultat avec if<> . Auriez vous une solution pour me dépanner ? ( sur méga 2560) Merci d’avance.

Merci pour les infos.En fait je recherche l'automatisation d'un bateau, en actionnant différents interrupteurs de la radio. Un mode manuel ( test ) des fonctions et un mode automatique. Pour le mode manuel aucun problème. Concernant le mode auto, j'ai besoin de décoder le récepteur pour actionner des lumières ou ouvrir des trappes permettant la sortie et activation d'une caméra avec les conditionnement alloués. Le problème apparait dès que je programme la fonction pulse. Je ne suis pas sûr mais il est probable selon mes tests que la carte est parasitée par tous les câbles qui l'entoure. Pour être sûr je vais tout refaire en incorporant les cartes dans des boites entourées d'alu pour faire un anti parasite. Les ondes du récepteur trop prèt sont peut êtres aussi le problème. Je me pose donc des questions sur le parrainage, les ondes du récepteur, l'alimentation ( 5,3V ) stable ou je ne sais pas quoi d'autre. Je cherche.....
Si tu as d'autres infos n'hésite pas merci.

Regarde donc par là rcnavy

et ici Dernières mises à jour.

tu peux faire une moyenne de ce que récupère le pulsein .

Evites les delay() dans ta boucle loop()

Merci pour les infos, j'ai fini de refaire le câblage et ai commencer à regarder toutes les belles infos, mais je n'est pas trouver la biblihoteque RcPulseIn, et comment l'installer. Malheureusement pour moi, mes ambitions sont plus grandes que ma connaissance ..... en tous cas merci pour vos réponses ..

Bonjour,

Il faut surtout éviter le PulseIn qui est une commande bloquante...

Tu souhaites décoder tous les canaux du Rx ou uniquement quelques canaux "supplémentaires" qui vont te servir à commander des fonctions "supplémentaires" (lumière, sirène, pompe pour jet d'eau...) ?

J'entends par "supplémentaires" : qui ne sont pas les canaux de commande du moteurs ou du gouvernail... ;).

UniseV

EDIT : Quel est la marque de ton système radio+rx ?

Bonjour UsineV
je possede un radio HITEC 9 canaux, et utilise le canal 1 pour le moteur et canal 2 pour le gouvernail. Seuls ces deux canaux n'entre pas sur la carte Arduino. Tous les autres me servent pour piloter divers éléments, comme lumière, trappes, et futur caméra avec transmetteur. Pour le moment je suis bloqué avec la PulseIn qui fait n'importe quoi. Valeurs aléatoire entre +1800 et -1800 environ ( obtenu avec Serial print, qui fou la merd....)
mes test sont identiques avec ou sans serial et Delay ( qui me sert à protéger mes relais en attendant la solution)

Bonjour,
les valeurs entre +1800 et -1800 sont mise en forme? ou c'est directement le résultat de PulseIn() ?
PulseIn() renvoie un unsigned long qui ne peut pas être négatif, alors je ne comprends pas trop...

et bien moi non plus je comprends pas ! mais les valeurs données avec le serial print me donne se genre de valeur aléatoire, plus généralement positive, mais de temps en temps une petite négative ! j 'ai donc pensé a du parrasitage et j'ai donc remanier l'ensemble. Je dois faire les tests ce week end. Dans le première version j'avais le même problème mais plus ou moins lié au régime moteur. J'ai donc acheter une nouvelle batterie pour un circuit puissance et un circuit commande et mesure. Le problème reste entier et n'arrive que si je programme un pulseIn . La commande par inter fonctionne sans aucun problème. Une solution serai d'avoir un oscilo mais oups j'en ai pas. Je pense que mon problème n'est que de la programmation concernant la mesure car le reste fonctionne. Réaction normale par rapport à la mesure obtenue, donc clignotement aléatoire de l'ensemble. Et je n'est donc pas encore commencer le contrôle des servis moteur pour mes trappes.
Mon problème est que je suis novice sur ce système et que si j'ai pas des fonctions toutes faites je ne peux pas m'en créer

On peut voir le code?

//#include <Servo.h> test
//#include <SoftRcPulseIn.h> test

// PGM ARDUINO Liubov Version 2
// Nomination des pins et variables
int O22 = 22; // circuit des phares avant blanc L20 e† L23 et K1
int O31 = 31; // circuit lumiere jaune batiment du bas L1 * 10 et K2
int O35 = 35; // circuit lumiere bleu cabine L2A
int O23 = 23; // avec O24 L2B
int O26 = 26; // circuit lumiere bleu compartiment camera L3 et K3
int O25 = 25; // circuit lumiere bleu escalier L4A
int O27 = 27; // avec O25 L4B
int O28 = 28; // circuit lumiere verte feux de position L5
int I14 = 14; // Circuit Inter test all ITEST
int I15 = 15; // circuit Inter trappe ITEST
int I16 = 16; // circuit inter trappes ouvertes ITD et ITG
int PULSE3 = 3; // lecture Recepteur canal 3 camera
int PULSE4 = 4; // lecture Recepteur canal 4 camera
int PULSE5 = A0; // lecture Recepteur canal 5 lumiere bas, cabine, escalier, position
int PULSE6 = 6; // lecture Recepteur canal 6
int PULSE7 = 7; // lecture Recepteur canal 7
int PULSE8 = 8; // lecture Recepteur canal 8
int PULSE9 = 9; // lecture Recepteur canal 9
int SERVO1 = 10; // Controle servo 1 SMD
int SERVO2 = 11; // Controle servo 2 SMG
int SERVO3 = 12; // Controle servo 3
int SERVO4 = 13; // Controle servo 4
int M1; // lecture Marqueur 1 etat inter test lumiere ( I14=1 )
int M10; //Marqueur 10 etat M1 pour condition manuel ( I14 = 1 )
int M100; //Marrqueur de fonctionnement lumiere en automatique ( I14 = 0 )
int M2; // lecture Marqueur 2 etat inter trappe ( I15 = 1 )
int M20; // Marqueur 20 etat M2 pour condition manuel ( I15 = 1 )
int M200; // Marqueur de fonctionement trappe en auto ( I15 = 0 )
int M3; // lecture Etat ferme ou ouvert des trappes
int M30;
//int PERIODE5; // etat pulse 5

void setup()
{
// Fonction des pins
pinMode (O22, OUTPUT);
pinMode (O31, OUTPUT);
pinMode (O35, OUTPUT);
pinMode (O23, OUTPUT);
pinMode (O26, OUTPUT);
pinMode (O25, OUTPUT);
pinMode (O27, OUTPUT);
pinMode (O28, OUTPUT);
pinMode (PULSE3, INPUT);
pinMode (PULSE4, INPUT);
pinMode (PULSE5, INPUT);
pinMode (PULSE6, INPUT);
pinMode (PULSE7, INPUT);
pinMode (PULSE8, INPUT);
pinMode (PULSE9, INPUT);
pinMode (SERVO1, OUTPUT);
pinMode (SERVO2, OUTPUT);
pinMode (SERVO3, OUTPUT);
pinMode (SERVO4, OUTPUT);
//Serial.begin(115200);
}
void loop()
{
// Gestion inter test I14
M1 = digitalRead (I14); // Marqueur 1 prend la valeur de I14
if (M1 == HIGH)
{
M10 = 1; // Lumiere en Manu oui
M100 = 0; // Lumiere en auto non
}
if (M1 == LOW)
{
M10 = 0; // Lumiere en manu non
M100 = 1; // Lumiere en auto oui
}
//Gestion I15 ouverture des trappe en manuel
M2 = digitalRead (I15);
if (M2 == HIGH)
{
M20 = 1; // Trappe en Manu oui
M200 = 0; // Trappe en auto non
}
if (M2 == LOW)
{
M20 = 0; // Trappe en auto non
M200 = 1; // Trappe en auto oui
}

// A faire si M10=1 lumiere en manu
if (M10 == 1)
{
digitalWrite (O22, HIGH);
digitalWrite (O31, HIGH);
digitalWrite (O26, HIGH);
digitalWrite (O35, HIGH);
digitalWrite (O23, HIGH);
digitalWrite (O25, HIGH);
digitalWrite (O27, HIGH);
digitalWrite (O28, HIGH);
}
// A faire si M10=0 lumiere en auto
else if (M10 == 0)
{
digitalWrite (O22, LOW);
digitalWrite (O31, LOW);
digitalWrite (O26, LOW);
digitalWrite (O35, LOW);
digitalWrite (O23, LOW);
digitalWrite (O25, LOW);
digitalWrite (O27, LOW);
digitalWrite (O28, LOW);
}
// mettre gestion des trappes en Manu

//Mode Automatique:
//lecture etat trappe M3 et condition, ouvertes M30=1 fermees M30=0
M3 = digitalRead (I16);
if ( M3 == HIGH)
{
M30 = 1; // trappes ouvertes
}
else if ( M3 == LOW)
{
M30 = 0; // trappes fermees
}

// Gestion canal 5, SW(F) a simple effet Lumiere batiment du bas, cabine, escaler et mat
// Auto actif
int PERIODE5 = pulseIn (PULSE5, HIGH);// lecture pulse5

if ((PERIODE5 > 1500) && (M100 == 1))
{
digitalWrite (O31, LOW);// lumiere du bas
digitalWrite (O35, LOW);// lumiere cabine
digitalWrite (O23, LOW);// lumiere cabine
digitalWrite (O25, LOW);// lumiere escalier
digitalWrite (O27, LOW);// lumiere escalier
digitalWrite (O28, LOW);// feux de position
}
else if ((PERIODE5 < 1500) && (M100 == 1))
{
digitalWrite (O31, HIGH);// lumiere du bas
digitalWrite (O35, HIGH);// lumiere cabine
digitalWrite (O23, HIGH);// lumiere cabine
digitalWrite (O25, HIGH);// lumiere escalier
digitalWrite (O27, HIGH);// lumiere escalier
digitalWrite (O28, HIGH);// feux de position
}
// gestion lumière bleu trappe
if ((PERIODE5 > 1500) && (M100 == 1) && (M30 == 0))
{
digitalWrite (O26, HIGH);// lumiere compartiment camera
}
else if ((PERIODE5 < 1500) && (M100 == 1) && (M30 == 1))
{
digitalWrite (O26, LOW);// lumiere compartiment camera
}

//Serial.print(" PERIODE5=");
//Serial.print (PERIODE5);

//delay(2000);

}

int PULSE5 = A0;
sur A0 ou borne 5 le problème est le même

Essayez avec :

  unsigned long PERIODE5 = pulseIn (PULSE5, HIGH);// lecture pulse5


  Serial.print("PERIODE5 = ");
  Serial.println (PERIODE5);

  //delay(2000);

L’affichage va défiler rapidement, mais je ne suis pas sûr que la fonction pulseIn cohabite bien avec la fonction delay…

déjà fait aussi mais je vais re essayer

Franchement ça me gonfle, car le problème est toujours le même.

"PERIODE5" est bien déclaré en "unsigned long"? pas en "int"? et sa valeur est négative??

Franchement dans les deux cas j'ai pas revu de valeurs négatives, mais c'est toujours du n'importe quoi sinon

pourquoi le servo gouvernail fonctionne sans problème alors qu'il m'ai impossible de décoper le signal correctement avec pulse, y as t'il une autre fonction ? la bibliothèque RcPulseIn est introuvable, pas encore mis la main dessus
C'est mon seul problème avant de passer au contrôle des servos et finir mon bateau !

Sans pulseIn() :

je n'ai pas eu le courage de tout lire...

Merci l'ami, ça ma l'air d'être plus que compliquer pour lire des malheurs signaux, je vais peut être passer par du binaire, il existe des relais dans le commerce qui sont piloter par un recepteur de radio, je vais peut être abandonné ce problème merdique de pulse et repasser ça en binaire. Ce que je ne comprends pas c'est alors comment les relais fonctionnent ? et les servos ? En potentiomètre ? n'est donc il pas possible de faire la même chose avec Arduino ? d'une passion je trouve que ça deviens un cauchemar ce truc. Pourtant Arduino est capable de maitriser des servos donc de ce substituer au recepteur ....
En tous cas je te remercie pour toutes tes infos et n'hésite pas si tu tu trouve un truc plus simple pour me dépanner. Encore merci de ta patience avec un novice.