problème recepteur IR et sortie PWM

Bonjour à tous,
j'ai découvert l'arduino il y a peu et je suis en train de tester un peu ses 'nombreuses' fonctionnalités !
je commande un rampe de LED via une sortie PWM de l'arduino en passant par un mosfet pour réguler ma luminosité.
jusque là aucun soucis, ça fonctionne nickel.
j'ai également tester un recepteur infra rouge pour commander une led, ça fonctionne aussi !
mon problème arrive lorsque j'essai de combiner les deux...
je fais varier la luminosité de ma rampe de LED, et je voudrais que lorsque j'appuie sur le bouton + ou - ça aille plus ou moins vite !
sauf que du coup ça ne varie plus du tout... =( mes variables vont toujours dans le bon sens, mais la luminosité ne bouge plus :confused:

voici mon code :

#include <IRremote.h>

#define RECV_PIN 3
#define TEMOIN_PIN 8
#define RAMPE_PIN 11

#define PLUS_CODE 0xFF906F // +
#define MOINS_CODE 0xFFA857 // -

int brightness = 0;    // how bright the LED is
int fadeAmount = 1;    // how many points to fade the LED by


IRrecv irrecv(RECV_PIN);
decode_results results;

boolean led = true;


// the setup routine runs once when you press reset:
void setup()  { 
  // declare pin 8 & 11 to be an output:
  pinMode(RAMPE_PIN, OUTPUT);
  pinMode(TEMOIN_PIN, OUTPUT);
  
  Serial.begin(9600);
  Serial.println("Reboot...");
  
  irrecv.enableIRIn(); // Start receiver
} 


//R
void GetIRKey() {
  Serial.println("je rentre dans mon GetIRKey...");
  decode_results results;
  if (irrecv.decode(&results)) {
    Serial.print("Reçu:");
    Serial.println(results.value);

    switch (results.value) {
    case PLUS_CODE : 
      Serial.println("+");
      led=true;
      if (fadeAmount > 1) {
        fadeAmount = fadeAmount + 1;
      }
      else if (fadeAmount < -1) {
        fadeAmount = fadeAmount - 1;
      }
      
      break;
    case MOINS_CODE :
      Serial.println("-");
      led=false;
      if (fadeAmount > 1) {
        fadeAmount = fadeAmount - 1;
      }
      else if (fadeAmount < -1) {
        fadeAmount = fadeAmount + 1;
      }
      break;
    default : 
      Serial.print("unexpected value: ");
      Serial.println(results.value, HEX);
      break;
    }

    // Tempo pour eviter la repetition d'une commande non voulu
    //delay(200); 
    irrecv.resume();  // reprise de la reception IR, necessaire

  }
}

// the loop routine runs over and over again forever:
void loop()  { 
  digitalWrite(TEMOIN_PIN, led);

  GetIRKey();
  
  // set the brightness of pin 11:
  analogWrite(RAMPE_PIN, brightness);    
  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade: 
  if (brightness == 0 || brightness == 255) { 
    fadeAmount = -fadeAmount ; 
  }     
  // wait for 30 milliseconds to see the dimming effect    
  delay(10);    

  Serial.print(fadeAmount);
  Serial.print("\t");
  Serial.print(brightness);
  Serial.println();
}

là ou je ne comprends pas c'est que si je vire la ligne "irrecv.enableIRIn(); // Start receiver" dans mon setup la luminosité varie... je la remet, ben plus rien !!! :fearful:
donc je dois avoir un problème avec mon code IR mais je ne comprend pas pourquoi...

Le problème se situe entre

int fadeAmount = 1;    // how many points to fade the LED by

et

      if (fadeAmount > 1) {
        fadeAmount = fadeAmount + 1;
      }
      else if (fadeAmount < -1) {
        fadeAmount = fadeAmount - 1;
      }

Relis calmement et essaye de simuler la main

alors effectivement je viens de me rendre compte que j'avais un ligne en double

decode_results results;

mais j'ai beau la virer ça ne change rien...
ce qui est bizarre c'est que le code tourne quand même...

edit : quand mon brightness arrive en bout de course (donc soit à 0 soit à 255, je voie ma rampe qui s'éteint quelques dixièmes de secondes)

edit 2 : encore une petite précision mon code GetIRKey à l'air de fonctionner car dans mon moniteur série je vois passer les infos ! par contre à la place de les recevoir en héla comme prévu je reçois un code décimal on dirait (par exemple 16748655 pour le + et 16754775 pour le - mais il comprend que c'est le bon bouton...) je ne sais pas si je suis très clair...

Non.
Le problème c'est tes if par rapport à la valeur initiale.

Si tu démarre avec

int fadeAmount = 1;

Que se passe t'il quand tu passes sur le if ?

Sur les if de GetIRKey tu veux dire ?
alors effectivement il n'a pas l'air de faire les opérations demandées.... mais ça à la rigueur , c'est n'est qu'une histoire de condition pas bonne, il faut que je mette des >= ou <= je pense.
mais ce n'est pas ça qui empêche ma led de varier en luminosité j'ai essayé ! je pourrais supprimer les conditions que ça ne changerai pas mon problème.
j'insiste sur le fait que j'ai beau virer n'importe quelle partie de mon code ça ne résout pas mon problème ! SAUF si j'enlève irrecv.enableIRIn(); // Start receiver

alors que ma variable brightness oscille bien entre 0 et 255 et fadeAmount bascule bien entre 1 et -1.... :confused:

Je n'ai pas trop le temps d'approfondir mais à ce que j'ai vu, la librairie fonctionne avec une interruption à 50µs (voir là les explications http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html).
Est-ce que cela ne poserait pas un problème avec les PWM?

Non mais Barbudor a je pense très bien situé le problème :wink:

Simplement je pense qu'il ne veut pas te balancer la réponse directement. Fadeamount vaut au depart 1, sauf qu'à cause de tes conditions strictes (elles excluent la possibilité que fadeamount puisse valoir -1, 0 ou 1) il ne peut pas s'extirper de sa condition :slight_smile:

Mais ce que dit Bryce ce n'est pas que la commande +/6 ne marche pas
C'est que finalement le fade ne marche plus du tout

Donc comme le suggère fdunews, il y a peut être une interaction entre les sorties PWM et la lib IR

D'après la page web de l'auteur, il utilise le TIMER1 pour la réception:

In more detail, the receiver's interrupt code is called every time the TIMER1 overflows, which is set to happen after 50 microseconds. At each interrupt, the input status is checked and the timer counter is incremented. The interrupt routine times the durations of marks (receiving a modulated signal) and spaces (no signal received), and records the durations in a buffer. The first duration is the length of the gap before the transmission starts. This is followed by alternating mark and space measurements. All measurements are in "ticks" of 50 microseconds.

Mais d'après digital_pin_to_timer_PGM, la pin 11 semble pourtant utiliser le TIMER2

ok les gars ! :slight_smile:
merci pour vos réponses !
je ne suis pas assez calé pour ça, mais je pense que l'hypothèse d'une "incompatibilité" entre ma lib et ma PWM est plus plausible ! (même si ma condition n'est pas bonne ! :wink: )
par contre du coup si ça vient de ça est ce que j'ai une solution ? ou bien je vais être obligé de me passer de mon IR ?
j'essaierai de me pencher un peu la dessus demain

Tu peux essayer la library softPWM, elle est apparement basée sur le TIMER2 : Google Code Archive - Long-term storage for Google Code Project Hosting.

B@tto:
Tu peux essayer la library softPWM, elle est apparement basée sur le TIMER2 : Google Code Archive - Long-term storage for Google Code Project Hosting.

j'ai testé la librairie, mais ça ne me convient pas, le délai pour aller de 0 à 100% ne peut pas dépasser 4000ms. à terme ça doit mettre 1/4d'heure... voire plus !
et je n'ai pas l'impression que ça fonctionne ! la luminosité change, mais je ne reçoit pas les info IR...

j'ai récupéré un vieil oscilloscope, dès que j'arrive à le faire fonctionner (en espérant qu'il fonctionne :sweat_smile:) je teste ma sortie avec mon code précédent

bryce_30:
...

j'ai récupéré un vieil oscilloscope, dès que j'arrive à le faire fonctionner (en espérant qu'il fonctionne :sweat_smile:) je teste ma sortie avec mon code précédent

bonjour
ça depend de ce que tu entend par "vieux" :grin:

en general les oscillo "même un peu anciens" sont suffisants pour jouer/verifier avec les signaux arduino "courants"

  • c'est quoi comme oscillo ?
  • il dispose d'une sortie test probe/sonde ?

c'est un metrix OX 712D
pour les sorties j'en sais rien lil ça fait plus de 10ans que je ne m'en suis pas servi d'un, et même à l'époque c'était déjà plus sophistiqué que ça au lycée ! je ne me souviens plus très bien comment ça fonctionne... je n'arrive déjà pas à mesurer du 5V continu avec :roll_eyes: :sweat_smile: lil

bryce_30:
c'est un metrix OX 712D
pour les sorties j'en sais rien lil ça fait plus de 10ans que je ne m'en suis pas servi d'un, et même à l'époque c'était déjà plus sophistiqué que ça au lycée ! je ne me souviens plus très bien comment ça fonctionne... je n'arrive déjà pas à mesurer du 5V continu avec :roll_eyes: :sweat_smile: lil

ok
c'est un petit metrix qui date de la fin des années 70
BP de 20 Mhz (vraiment utilisable jusque vers 12/15)
déjà tester si tu a des carres sur les voies en connectant le centre des BNC au signal de test

merci :wink:
mais ça n'a pas l'air de fonctionner...

bryce_30:
merci :wink:
mais ça n'a pas l'air de fonctionner...

bon
principe de base avec un oscillo CRT
a tu déjà une trace plate ? un point ?

Artouste:
bon
principe de base avec un oscillo CRT
a tu déjà une trace plate ? un point ?

oui oui ! mais quand je branche du 5V continu rien ne bouge (je suis bien calibré pour la tension) et quand je me branche sur la pin de test rien ne se passe non plus, alors à part le calibrage de la tension et du temps, je ne sais pas à quoi serve les autres réglages... peut être que c'est du à ça !
par contre autre chose, l'oscillo à quand même l'air fatigué parce que des fois sans rien toucher ma trace bouge et fait des signaux très bizarres pendant quelques dixièmes de secondes !

bryce_30:

Artouste:
bon
principe de base avec un oscillo CRT
a tu déjà une trace plate ? un point ?

oui oui ! mais quand je branche du 5V continu rien ne bouge (je suis bien calibré pour la tension) et quand je me branche sur la pin de test rien ne se passe non plus, alors à part le calibrage de la tension et du temps, je ne sais pas à quoi serve les autres réglages... peut être que c'est du à ça !
par contre autre chose, l'oscillo à quand même l'air fatigué parce que des fois sans rien toucher ma trace bouge et fait des signaux très bizarres pendant quelques dixièmes de secondes !

bonjour
bon pour resumer :
tu a combien de traces sans rien de connecté ?
fais une photo bien lisible de la face avant de l'oscillo (pour pouvoir annoter des manips)

http://gecko-tec.fr/scan/IMG_0644.jpg

et je n'ai qu'une seule trace

edit : je mets un lien vers la photo pour éviter de prendre trop de place

Sur la photo le sélecteur sur la sonde est en position REF. Donc cela court-circuite la sonde. Tu ne risques pas d'avoir un signal sur ton scope comme ça.
Essaye en position 1:1 pour commencer.