FlickMote : Télécommande IR à gestes pour maison connectée
Composants et fournitures
- Capteur ultrasonique HC-SR04 (×1)
- Émetteur IR (LED infrarouge) générique (×1)
- LED RGB diffuse cathode commune (×1)
- Arduino 101 (×1) – compatible Uno
- Résistance 220 Ω pour LED IR
- Plaque d'essai et fils
Applications et services en ligne
- Arduino IDE
À propos du projet

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
- Arduino 101 ou Uno
- Module ultrasonique HC-SR04
- LED infrarouge
- Résistance appropriée pour LED IR (220 Ω)
- LED RGB
- 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.
- Balayage haut (> 10 pouces) = Chaîne +
- Balayage bas = Chaîne -
- Maintien haut (> 10 pouces) = Volume +
- Maintien bas = Volume -
- Couvrir le capteur (< 3 pouces) = Marche / Arrêt
SCHÉMA DE CÂBLAGE (Fritzing) :
CONSTRUCTION :
- Connectez la LED IR à la broche 3 via une résistance appropriée, cathode au GND.
- Connectez le capteur ultrasonique au 5V et GND selon ses broches. Broche Trigger → broche 8, Echo → broche 7 (configurables dans le programme).
- Connectez la LED RGB au GND et aux broches 11 (rouge), 10 (vert), 9 (bleu). Ces broches sont aussi configurables.

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 :
- Supprime le besoin de regarder la télécommande et chercher la touche spécifique.
- Solution pour contrôler les appareils (TV) pour aveugles et personnes à mobilité réduite.
- Le projet peut être amélioré en ajoutant plus de fonctionnalités pour contrôler tous les appareils domestiques par la même méthode.
MERCI

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_9Gx3XNFHEp.fzz (fichier Fritzing)
Processus de fabrication
- Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
- Construire un Spybot Arduino piloté par Bluetooth
- TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Solutions d'alimentation optimisées pour projets Arduino
- Morpion sur matrice LED MAX7219 avec boîtier en carton
- Construire un robot quadrupède Arduino intelligent : guide étape par étape
- Volant Joystick Arduino Personnalisé pour Jeux Vidéo