Accueil > Arduino, Matériel > Commander l’Arduino à partir de la télécommande Canon RC-5

Commander l’Arduino à partir de la télécommande Canon RC-5

Dans les précédents articles, nous avons vu comment décoder le signal IR de la télécommande Canon RC-5; également la possibilité de commander un appareil photo Canon EOS400D à partir de l’Arduino.

Pour finir l’utilisation de cette télécommande, nous allons étudier la possibilité de commander l’Arduino à partir de celle-ci.

Pour rappel, le schéma de câblage entre l’Arduino et le capteur sera le suivant :

image_thumb2

 

Le programme sera le suivant :

/* Ce programme permet de commander l’Arduino à partir d’une télécommande IR
*/
#define IRpin_PIN PIND         //définit l’utilisation du mode RAW pour l’entrée
#define IRpin 2                //définit le numéro de broche utilisée
#define MAXPULSE 65000         //définit un signal de 65 ms maximum
#define NUMPULSES 50           //définit un nombre d’impulsion à traiter
#define RESOLUTION 20          //définit la résolution 20µs pour l’échantillonage
#define PLAGE_ERREUR 20        //définit la plage d’erreur autorisée 20%
uint16_t pulses[NUMPULSES][2]; //définit un tableau pour enregistrer les niveaux haut et bas
uint8_t currentpulse = 0;
int Canonrc5_Signal[] = {
  500,5200,
  500,0};                      //définit le code de la télécommande Canon RC5 en µs (Haut, Bas, …)

void setup(void) {
  Serial.begin(9600);
  Serial.println("Attente reception");
}

void loop(void) {
  int numberpulses;
  numberpulses = listenForIR();
  if (IRcompare(numberpulses, Canonrc5_Signal, sizeof(Canonrc5_Signal)/4)) {
    Serial.println("OK");
  }
  delay(500);
}

boolean IRcompare(int numpulses, int Signal[], int refsize) {
  int count = min(numpulses, refsize);
  for (int i=0; i< count-1; i++) {
    int oncode = pulses[i][1] * RESOLUTION;
    int offcode = pulses[i+1][0] * RESOLUTION;
    if ( abs(oncode – Signal[i*2 + 0]) <= (Signal[i*2 + 0] * PLAGE_ERREUR / 100)) {
    }
    else {
      // Le code ne correspond pas
      return false;
    }
    if ( abs(offcode – Signal[i*2 + 1]) <= (Signal[i*2 + 1] * PLAGE_ERREUR / 100)) {
    }
    else {
      // Le code ne correspond pas
      return false;
    }
  }
  // Le code correspond
  return true;
}

int listenForIR(void) {
  currentpulse = 0;
  while (1) {
    uint16_t highpulse, lowpulse;
    highpulse = lowpulse = 0;
    while (IRpin_PIN & (1 << IRpin)) {
      highpulse++;
      delayMicroseconds(RESOLUTION);
      if (((highpulse >= MAXPULSE) && (currentpulse != 0)) || currentpulse == NUMPULSES) {
        return currentpulse;
      }
    }
    pulses[currentpulse][0] = highpulse;
    while (! (IRpin_PIN & _BV(IRpin))) {
      lowpulse++;
      delayMicroseconds(RESOLUTION);
      if (((lowpulse >= MAXPULSE) && (currentpulse != 0)) || currentpulse == NUMPULSES) {
        return currentpulse;
      }
    }
    pulses[currentpulse][1] = lowpulse;
    currentpulse++;
  }
}

Télécharger le programme et ouvrir le moniteur série; voilà, maintenant il suffit d emodifier le programme afin de piloter un port d’E/S lorsque l’Arduino détecte le signal IR de cette télécommande.

Publicités
Catégories :Arduino, Matériel Étiquettes : , ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :