Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

FlickMote : Télécommande IR à gestes pour maison connectée

Composants et fournitures

Applications et services en ligne

À propos du projet

FlickMote : Télécommande IR à gestes pour maison connectée

INTRODUCTION

Contrôler les appareils électroménagers et gadgets électroniques via une télécommande infrarouge est courant. Mais cette même tâche peut être rendue plus facile. Le but principal de ce nouveau système de télécommande par gestes est d'éliminer le besoin de regarder la télécommande tenue en main et de chercher la touche spécifique pour chaque fonction, surtout pour les personnes âgées. Ce projet présente un système novateur pour contrôler les appareils domestiques par gestes de la main. Le projet sera appelé FlickRemote dans ce rapport. Il utilise un télémètre ultrasonique pour déterminer le geste de l'utilisateur et émet un signal IR. Microcontrôleur : Arduino 101 (ou Uno).

COMPOSANTS MATÉRIELS

  1. Arduino 101 ou Uno
  2. Module ultrasonique HC-SR04
  3. LED infrarouge
  4. Résistance appropriée pour LED IR (220 Ω)
  5. LED RGB
  6. Plaque d'essai et fils

FONCTIONNEMENT :

Ce projet utilise un télémètre ultrasonique pour détecter le geste de l'utilisateur et envoie un signal IR à une TV selon la commande. La distance ou les pouces peuvent être ajustés dans le code selon votre convenance.

SCHÉMA DE CÂBLAGE (Fritzing) :

CONSTRUCTION :

  1. Connectez la LED IR à la broche 3 via une résistance appropriée, cathode au GND.
  2. Connectez le capteur ultrasonique au 5V et GND selon ses broches. Broche Trigger → broche 8, Echo → broche 7 (configurables dans le programme).
  3. Connectez la LED RGB au GND et aux broches 11 (rouge), 10 (vert), 9 (bleu). Ces broches sont aussi configurables.
FlickMote : Télécommande IR à gestes pour maison connectée

COMMANDES

Alimentation

Balayer devant le capteur à moins de 3 pouces fait clignoter la LED en violet. C'est la confirmation qu'un signal « marche/arrêt » est prêt à être envoyé. Pour éviter d'éteindre la TV par erreur, le sketch attend un second balayage dans les 5 secondes suivant le premier pour confirmer. À ce moment, le signal est envoyé à la TV pour l'allumer ou l'éteindre.

Chaîne

Balayer entre 3 et 10 pouces fait changer la chaîne vers le bas. Balayer entre 10 et 20 pouces fait changer la chaîne vers le haut.

Volume

Maintenir la main entre 3 et 10 pouces fait baisser le volume. Maintenir entre 10 et 20 pouces monte le volume. Le volume continue de changer (haut ou bas) tant que la main reste dans la zone.

AVANTAGES ET AMÉLIORATIONS :

MERCI

FlickMote : Télécommande IR à gestes pour maison connectée

Code

Code (C/C++)

/* Swipe Remote Control
   Ce sketch utilise un télémètre ultrasonique pour déterminer le geste de l'utilisateur
   et émet un signal IR vers une TV Sony selon la commande.
   - Balayage haut (> 10in) = Chaîne Up
   - Balayage bas = Chaîne Down
   - Maintien haut (> 10in) = Volume Up
   - Maintien bas = Volume Down
   - Couvrir capteur (< 3in) = Marche / Arrêt
   Créé par Vignesh Jaishankar
   Utilise la bibliothèque IRremote (https://github.com/shirriff/Arduino-IRremote)
*/
#include <IRremote.h>

// Définitions fonctions de contrôle
#define CONTROL_CH 1 // Changement chaîne
#define CONTROL_VOL 2 // Volume
#define CONTROL_POW 3 // Alimentation
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20    // Distance max en pouces, au-dessus ignorée
#define DIST_DOWN 10   // Seuil haut/bas. Si plus haut = "up", plus bas = "down"
#define DIST_POW 3     // Seuil alimentation, plus bas = marche/arrêt

// Broche IR (définie dans la bibliothèque, cette variable est un rappel)
const int irPin = 3;

// Capteur ultrasonique 2 broches
const int pingPin = 8;
const int echoPin = 7;

// Broches LED de confirmation
const int led = 13;    // LED interne pour debug haut/bas
const int ledR = 11;
const int ledG = 10;
const int ledB = 9;

// Timer LED
unsigned long timer;

// Objet émetteur IR
IRsend irsend;

// Drapeau confirmation alimentation (nécessite deux balayages)
boolean powerConfirmed = false;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(ledR, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(pingPin, OUTPUT);
  pinMode(echoPin, INPUT);
  timer = millis();
}

void loop() {
  long duration, inches;
  int value;

  // Lecture capteur
  duration = doPing();

  // Timer pour confirmer actions (actuellement seulement alimentation)
  if (timer && timer < (millis() - 5000) && (millis() > 5000)) {
    Serial.println("timer reset");
    timer = false;
  }
  digitalWrite(led, LOW);
  setColor(0, 0, 0); // éteint

  // Conversion temps en distance
  inches = microsecondsToInches(duration);

  // Si à moins de DIST_MAX, agir
  if (inches < DIST_MAX) {
    // Debug
    Serial.print(inches);
    Serial.println("in");

    // Si très proche = signal "alimentation"
    if (inches < DIST_POW) {
      Serial.println(timer);
      if (timer) {
        doIR(CONTROL_POW, 0);
        timer = false;
        delay(2000); // évite envois multiples, délai 2 sec
      } else {
        Serial.println("power flag set");
        timer = millis();
        setColor(255, 50, 50); // violet
        delay(500);
      }
    } else { // volume ou chaîne
      // Distance détermine direction
      value = handleDist(inches);
      // Attendre 0,5 sec
      delay(300);
      // Vérifier si main a disparu
      if (microsecondsToInches(doPing()) > DIST_MAX) {
        doIR(CONTROL_CH, value); // balayage
      } else {
        // volume
        int d = 500; // premier délai plus long pour changement unique
        // Répéter tant que main présente
        while (inches < DIST_MAX) {
          value = handleDist(inches); // haut ou bas ?
          doIR(CONTROL_VOL, value);   // envoyer signal IR
          delay(d);                   // attendre
          inches = microsecondsToInches(doPing()); // revérifier
          d = 100; // délais plus courts pour ajustement volume rapide
        }
        delay(500); // évite changement chaîne accidentel après volume
      }
    }
  }
  delay(50); // assez court pour détecter tous les balayages
}

/*
 * Si distance dans seuil, marquer comme 'up' et allumer LED correspondante.
 */
int handleDist(int inches) {
  if (inches > DIST_DOWN) {
    digitalWrite(led, HIGH);
    return CONTROL_UP;
  } else {
    digitalWrite(led, LOW);
    return CONTROL_DOWN;
  }
}

/*
 * Envoyer le bon code IR
 */
void doIR(int control, int val) {
  switch (control) {
    case CONTROL_POW: // alimentation
      Serial.println("power on / off 0xa90");
      for (int i = 0; i < 3; i++) {
        setColor(255, 0, 0);
        irsend.sendSony(0xa90, 12); // Code Sony TV power
        delay(40);
      }
      break;
    case CONTROL_CH:
      setColor(0, 255, 0); // vert
      if (val == CONTROL_UP) {
        digitalWrite(led, HIGH);
        for (int i = 0; i < 3; i++) {
          irsend.sendSony(0x90, 12); delay(40);
        }
        Serial.println("channel up 0xD00A");
      } else { // down
        for (int i = 0; i < 3; i++) {
          irsend.sendSony(0x890, 12); delay(40);
        }
        Serial.println("channel down 0x3002");
      }
      break;
    case CONTROL_VOL:
      setColor(0, 0, 255); // bleu
      if (val == CONTROL_UP) {
        digitalWrite(led, HIGH);
        for (int i = 0; i < 3; i++) {
          irsend.sendSony(0x490, 12); delay(40);
        }
        Serial.println("volume up 0x490");
      } else { // down
        for (int i = 0; i < 3; i++) {
          irsend.sendSony(0xC90, 12); delay(40);
        }
        Serial.println("volume down 0xC90");
      }
      break;
  }
}

void setColor(int red, int green, int blue) {
  analogWrite(ledR, red);
  analogWrite(ledG, green);
  analogWrite(ledB, blue);
}

long doPing() {
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  return pulseIn(echoPin, HIGH);
}

long microsecondsToInches(long microseconds) {
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds) {
  return microseconds / 29 / 2;
}

Schémas

FlickMote : Télécommande IR à gestes pour maison connectée

flickmote_9Gx3XNFHEp.fzz (fichier Fritzing)

Processus de fabrication

  1. Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
  2. Construire un Spybot Arduino piloté par Bluetooth
  3. TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
  4. Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
  5. Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
  6. Solutions d'alimentation optimisées pour projets Arduino
  7. Morpion sur matrice LED MAX7219 avec boîtier en carton
  8. Construire un robot quadrupède Arduino intelligent : guide étape par étape
  9. Volant Joystick Arduino Personnalisé pour Jeux Vidéo