Problème commande infrarouge

Bonjour,

Avant toute chose je tiens tout de même à préciser que je suis un débutant en Arduino et que j'ai peut-être fait une erreur très bête mais j'ai quand-même besoin de votre aide.

J'ai le projet de faire une souris télécommandée pour mon chat,
la commande se fait par infrarouge et il n'y a que 3 boutons que j'utilise avant, droite et gauche.
Mais voilà le problème : quand j'appuie sur un des trois boutons que j'ai programmé cela ne fait pas sortir d’électricité dans la sortie digitale :confused: et je dis bien "sortie" car dans mon programme j'ai bien défini les deux pins digitales de mes moteurs comme sortie.

Configuration matérielle :

  • arduino nano
  • télécomange infra rouge
  • Récepteur infrarouge (1838B) seul ou monté sur carte capteur (j'ai essayé les 2 et même résultat)
  • 1 carte PWR pour les moteurs

D'ailleurs voici mon programme :

#include <IRremote.h>

const char DIN_RECEPTEUR_INFRAROUGE = 2;

IRrecv MonRecepteurInfraRouge(DIN_RECEPTEUR_INFRAROUGE);

decode_results MessageRecu;

void setup () {
Serial.begin (9600);
MonRecepteurInfraRouge.enableIRIn();
pinMode (3,OUTPUT);
pinMode (4,OUTPUT);

}

void loop () {

if (MonRecepteurInfraRouge.decode(&MessageRecu))
{
//Serial.println (MessageRecu.value);

/digitalWrite (3,HIGH);
delay (1000);
digitalWrite (3,LOW);
/

if (MessageRecu.value == 0xFF18E7) //Si la flèche du haut à été pressée
{
digitalWrite (3,HIGH);
digitalWrite (4,HIGH);
//Serial.println ("Avance");
}
if (MessageRecu.value == 0xFF10EF) //Si la flèche de gauche à été pressée
{
digitalWrite (3,HIGH);
digitalWrite (4,LOW);
//Serial.println ("Tourne a gauche");
}
if (MessageRecu.value == 0xFF5AA5) //Si la flèche de droite à été pressée
{
digitalWrite (3,LOW);
digitalWrite (4,HIGH);
//Serial.println ("Tourne a droite");
}
}

digitalWrite (3,LOW);
digitalWrite (4,LOW);

MonRecepteurInfraRouge.resume();
}

J'ai vérifié les moteurs en faisant un petit programme avec juste un digitalwrite et les moteurs tournent.

J'ai fait un autre programme qui affiche le nom des touches quand on les presses et il fonctionne correctement avec toutes les touches de la télécommande mais quand j'ajoute un digitalwrite pour les touches qui m’intéressent il m'affiche bien le nom des touches mais il ne fait pas de digitalwrite sur toutes les touches :frowning: .

Merci d'avance pour vos réponses.

Electrocat

Hello

Vous activez bien une de vos sorties (ou deux) mais vous réduisez tous vos efforts à néant ensuite :

  // ligne 50
  digitalWrite (3,LOW);
  digitalWrite (4,LOW);
}

Rebonjour,

Merci pour ta réponse je vais supprimer ces lignes de code et je te tiens au courant.

Electocat

Rebonjour ClarkGaybeul,

J'ai essayé ce que tu m'as dit de faire mais cela ne change rien si tu as une autre idée elle est la bienvenue mais en attendant d'autres réponsesje vais regarder dans mon programme si il n'y a pas d'autre erreurs bêtes.

Electrocat

mais quand j'ajoute un digitalwrite pour les touches qui m'intéressent il m'affiche bien le nom des touches mais il ne fait pas de digitalwrite sur toutes les touches

Comment pouvez-vous être sûr que l'appel à digitalWrite n'est pas exécuté ?
Quel moyen de contrôle utilisez-vous ?
Qu'y a t-il de branché sur ces sorties 3 et 4 ?

Autre remarque : faire basculer une ou deux sorties à l'état haut va la ou les maintenir dans cet état, à moins d'envoyer un nouveau code de télécommande qui la fasse basculer à l'état bas.
Est-ce bien ce que vous voulez ?
Il faudrait décrire la cinématique avec plus de clarté.

Il faut que vous mettiez un delai ou -incl.- que vous reactiviez les ordres d'impression pour voir que vos ordres sont bien executés.
Ensuite, vous devriez définir l'etat de votre systèeme, et comment il doit repondre à une télécommande (ex: si ordre "tourner à gauche": tourner à gauche *** pendant*** 500 millisecondes peut avoir un sens....)Mais dans l'etat, votre code fait tourner pendant uelques microsecondes....

Bonjour dbrion06 et ClarkGaybeul,

Je vais répondre à ClarkGaybeul puis à dbrion06 :

Je suis sûr que l'appel à digitalwrite n'a pas été exécuté car même si je mets un LED (avec une résistance bien sûr !) elle ne s’allume pas.

ClarkGaybeul:
Quel moyen de contrôle utilisez-vous ?

Je ne comprends pas de quoi vous parlez :frowning: le moyen de contrôle de quoi ?

Sur les sorties digitales 3 et 4 il y a branché les moteurs en passant par une carte de puissance fournie avec les moteurs (pour mes test le ranche des LEDs sur les sorties)

ClarkGaybeul:
Autre remarque : faire basculer une ou deux sorties à l'état haut va la ou les maintenir dans cet état, à moins d'envoyer un nouveau code de télécommande qui la fasse basculer à l'état bas.
Est-ce bien ce que vous voulez ?

Pas tout à fait, en fait ce que je voudrais c'est que tant que j'appuie sur le bouton il avance ou tourne à droite ou à gauche en fonction du bouton pressé et que dès que je relâche le bouton il s'arrête.

Réponse à dbrion06 :
Oui, tu as raison il faudrait que je mette un délai (Je te tien au courant de si cela fonctionne).

dbrion06:
Il faut que vous mettiez un delai ou -incl.- que vous reactiviez les ordres d'impression pour voir que vos ordres sont bien executés.

Par-contre que sont les ordres d'impression ? (je ne m'y connais pas trop en vocabulaire Arduino)

dbrion06:
Ensuite, vous devriez définir l'etat de votre systèeme, et comment il doit repondre à une télécommande (ex: si ordre "tourner à gauche": tourner à gauche *** pendant*** 500 millisecondes peut avoir un sens....)Mais dans l'etat, votre code fait tourner pendant uelques microsecondes....

Je ne sais pas non plus ce qu'est l'état du système :frowning: Mais merci quand même pour ta réponse :slight_smile:

Merci à vous deux pour vos réponses je vais faire ce que vous m'avez dit de faire.

Electrocat

Je ne comprends pas de quoi vous parlez :frowning: le moyen de contrôle de quoi ?

Du contrôle de l'état de la sortie.
Exemple : une LED + R comme vous l'avez fait, mais sans rien d'autre branché dessus. Je cherche simplement à procéder par élimination.
1er cas à éliminer : vos sorties sont HS.
Moyen de le savoir : faire des tests basiques.

Pas tout à fait, en fait ce que je voudrais c'est que tant que j'appuie sur le bouton il avance ou tourne à droite ou à gauche en fonction du bouton pressé et que dès que je relâche le bouton il s'arrête.

Je ne suis pas sûr qu'une télécommande envoie 1 code, puis un autre, puis un autre, si vous laissez le doigt sur le même bouton. A vous de tester.

Cordialement
Jo

Par-contre que sont les ordres d'impression ? (je ne m'y connais pas trop en vocabulaire Arduino)

C'st mon jargon à moi pour designer

    //Serial.println ("Avance");

que vous avez mis en commentaire (autrefois, on imprimait effectivement via des lignes série, menaçant de déforestation)
Normalement, ces ordres peuvent vous confirmer que vous avez bien fait ce que vous voulez....

LE fait est que votre programme a de fortes chances de marcher, mais qu'il est trop rapide (les tests de présence -et éventuellement le décodage- de l'IR , l'allumage des LEDs et le "rebouclage" -c'est la fonction de loop- prennent moins de 1-10 millisecondes: vous ne puvez pas voir une LED, et les moteurs ne peuvent pas démarrer)
Pour le ralentir, vous avez deux options :

a) mettre un delay (500 millisecondes n'est pas mal, laissant le temps de comprendre). Si votre projet est de vous en tenir à ça, sans évolution -ajout de capteur de fin de course, par exemple-, vous pouvez sauter b)

b) regarder des tutoriels sur les machines d'état et les delais non bloquants, permettant de répondre rapidement à divers ordres; Programmation Automate fini / Machine à état - Tutoriels et cours - Arduino Forum est lisible, progressif (mais il vous faut imaginer que les événements, au lieu d'être des appuis sur des boutons, sont la reception de code infrarouge .... ou le fait que le temps imparti est écoulé -minuterie-).
Au début, ce sera plus frustrant que (a), mais vous pottez rendre votre télécommande plus complexe, si besoin, et plus réactive (avec un delai de 500 millisecondes, votre automate est aveugle dans certaines configurations)

Bonjour dbrion06 et CLarkGaybeul,

Cette fois je vais répondre à dbrion06 puis ClarkGaybeul :

J'ai mis des délais de 500 millisecondes dans mon programme mais malheureusement rien ne se passe :frowning: .

Je vais remettre les prints et je te tient au courant si il affiche quelque chose dans le moniteur série.

dbrion06:
b) regarder des tutoriels sur les machines d'état et les delais non bloquants, permettant de répondre rapidement à divers ordres; Programmation Automate fini / Machine à état - Tutoriels et cours - Arduino Forum est lisible, progressif (mais il vous faut imaginer que les événements, au lieu d'être des appuis sur des boutons, sont la reception de code infrarouge .... ou le fait que le temps imparti est écoulé -minuterie-).
Au début, ce sera plus frustrant que (a), mais vous pottez rendre votre télécommande plus complexe, si besoin, et plus réactive (avec un delai de 500 millisecondes, votre automate est aveugle dans certaines configurations)

Je vais aller voir ça ! :slight_smile:

Réponse à CalrkGaybeul :

Je vais tester les sorties comme tu ma l'as dit et je tiens au courant :wink: .

J'ai fait le test et un bouton envoie toujours le même code.

Cordialement

Electrocat

Rebonjour à vous deux,

J'ai remis les prints mais rien ne se passe dans le moniteur série :frowning:

J'ai testé mes sorties en mettant juste un code avec des digitalWrite et les moteurs tournent parfaitement :wink:

PS : Désolé pour l'arrivée tardive de ce post je n'avait plus accès à internet jusqu’à maintenant.

ELectrocat

Avec un moniteur série réglé sur 9600 baud ?

Serial.begin (9600);

Bonjour à vous tous,

Je voudrais vous remercie pour l'aide que vous m'avez apporté car ma souris fonctionne ! :smiley:

Le problème était juste que le "MonRecepteurInfraRouge.Resume;" était une accolade de trop en dessous
en clair il était dans le "void loop" au lieu d'être dans le "if MonRecepteurInfraRouge.decade(&MessageRecu)".

Donc il faisait des resume alors qu'il n'en avait pas besoin et cela devait causer un bug.

Merci encore à vous tous.

Electrocat