Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

FlickMote: Mando IR por gestos para Smart Home

Componentes y suministros

Aplicaciones y servicios en línea

Sobre el proyecto

FlickMote: Mando IR por gestos para Smart Home

INTRODUCCIÓN

Controlar electrodomésticos y gadgets mediante mando a distancia infrarrojo es algo común. Pero la misma tarea puede hacerse más fácilmente. El motivo principal de proponer un nuevo sistema de control remoto por gestos de mano es eliminar la necesidad de mirar el mando manual y buscar una tecla específica para cada función, especialmente para personas mayores. Este proyecto presenta un sistema novedoso para controlar electrodomésticos mediante gestos de mano como dispositivo de control remoto. El proyecto se denominará flickremote en este informe. Usa un telémetro ultrasónico para determinar el gesto del usuario y emite una señal IR, usando la placa de desarrollo Arduino 101.

COMPONENTES HARDWARE

  1. Arduino 101 o Uno
  2. Módulo ultrasónico HC‑SR04
  3. LED infrarrojo
  4. Resistencia adecuada para el LED IR (220 Ω)
  5. LED RGB
  6. Protoboard y cables

FUNCIONAMIENTO:

Este proyecto usa un telémetro ultrasónico para determinar el gesto del usuario y emite una señal IR a un televisor según el comando dado. La distancia en pulgadas puede editarse en el código según conveniencia.

CONSTRUCCIÓN:

  1. Conecta el LED IR al pin 3 a través de una resistencia adecuada, y el cátodo a GND.
  2. Conecta el sensor ultrasónico a 5 V y GND donde indiquen los pines. Conecta el pin trigger al pin 8 y el pin echo al 7. Estos pines son configurables en el programa.
  3. Conecta el LED RGB a GND y pines 11 (rojo), 10 (verde), 9 (azul). Estos pines también son configurables.
FlickMote: Mando IR por gestos para Smart Home

CONTROLES

Encendido/Apagado

Deslizar la mano sobre el sensor a menos de 3 pulgadas hará que el LED parpadee en morado. Esto confirma que una señal de «encender/apagar» está lista para enviarse. Para evitar apagados accidentales, el sketch espera un segundo deslizamiento dentro de 5 segundos del primero para confirmar. En ese momento se envía la señal al TV para encender/apagar.

Canal

Deslizar a menos de 10 pulgadas (pero no menos de 3) cambia el canal hacia abajo. Deslizar entre 10 y 20 pulgadas cambia el canal hacia arriba.

Volumen

Mantener la mano a menos de 10 pulgadas (pero no menos de 3) baja el volumen. Mantener entre 10 y 20 pulgadas sube el volumen. El volumen seguirá cambiando (arriba o abajo) hasta que retires la mano.

VENTAJAS Y MEJORAS:

GRACIAS

FlickMote: Mando IR por gestos para Smart Home

Código

/* Mando a distancia por gestos
   Este sketch usa un telémetro ultrasónico para determinar el gesto del usuario
   y emite una señal IR a un TV Sony según el comando.
   - Deslizamiento alto (> 10 pulg) = Canal arriba
   - Deslizamiento bajo = Canal abajo
   - Mantenimiento alto (> 10 pulg) = Volumen arriba
   - Mantenimiento bajo = Volumen abajo
   - Cubrir sensor (< 3 pulg) = Encender / Apagar
   Creado por Vignesh Jaishankar
   Usa la librería IRremote (https://github.com/shirriff/Arduino-IRremote)
*/
#include <IRremote.h>

// Definiciones para funciones de control
#define CONTROL_CH 1  // Cambio canal
#define CONTROL_VOL 2 // Volumen
#define CONTROL_POW 3 // Encendido
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20   // Distancia máxima en pulgadas, superior se ignora
#define DIST_DOWN 10  // Umbral para arriba/abajo. Si mayor, comando «up», si menor «down»
#define DIST_POW 3    // Umbral para encendido, menor = power on/off

// Pin IR
const int irPin = 3; // definido en la librería, esta variable es solo recordatorio. CAMBIAR ESTO NO CAMBIA EL PIN EN LA LIBRERÍA

// Sensor de ping 2 pines
const int pingPin = 8;
const int echoPin = 7;

// Pines LED de confirmación
const int led = 13; // LED interno para depuración up/down
const int ledR = 11;
const int ledG = 10;
const int ledB = 9;

// Temporizador LED
unsigned long timer;

// Objeto transmisor IR
IRsend irsend;

// Bandera confirmación power (necesita dos deslizamientos)
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;

  // Lectura sensor
  duration = doPing();

  // Temporizador para confirmar acciones (actualmente solo power)
  if (timer && timer < (millis() - 5000) && (millis() > 5000)) {
    Serial.println("timer reset");
    timer = false;
  }
  digitalWrite(led, LOW);
  setColor(0, 0, 0); // apagado

  // Convertir tiempo a distancia
  inches = microsecondsToInches(duration);

  // Si está dentro de distancia máxima, actuar
  if (inches < DIST_MAX) {
    // Depuración
    Serial.print(inches); Serial.println("in");

    // Si muy cerca, es señal «power»
    if (inches < DIST_POW) {
      Serial.println(timer);
      if (timer) {
        doIR(CONTROL_POW, 0);
        timer = false;
        delay(2000); // no enviar más de una vez, delay 2 seg
      } else {
        Serial.println("power flag set");
        timer = millis();
        setColor(255, 50, 50);
        delay(500);
      }
    } else { // es volumen o canal
      // Distancia determina dirección control
      value = handleDist(inches);
      // Espera medio segundo
      delay(300);
      // Comprueba de nuevo, ¿ha desaparecido la mano?
      if (microsecondsToInches(doPing()) > DIST_MAX) {
        doIR(CONTROL_CH, value); // deslizamiento
      } else { // volumen
        int d = 500; // primer delay más largo para cambio único de volumen
        // Repetir hasta que se retire la mano
        while (inches < DIST_MAX) {
          value = handleDist(inches); // arriba o abajo?
          doIR(CONTROL_VOL, value);   // disparar señal IR
          delay(d);
          inches = microsecondsToInches(doPing()); // comprobar mano de nuevo
          d = 100; // delays más cortos para ajuste rápido múltiple
        }
        delay(500); // evita cambio accidental de canal tras ajuste volumen
      }
    }
  }
  delay(50); // Suficientemente corto para detectar todos los deslizamientos
}

/* Si distancia dentro de umbral, marca como 'up' y enciende LED correspondiente */
int handleDist(int inches) {
  if (inches > DIST_DOWN) {
    digitalWrite(led, HIGH);
    return CONTROL_UP;
  } else {
    digitalWrite(led, LOW);
    return CONTROL_DOWN;
  }
}

/* Dispara código IR correcto */
void doIR(int control, int val) {
  switch (control) {
    case CONTROL_POW: // power
      Serial.println("power on / off 0xa90");
      for (int i = 0; i < 3; i++) {
        setColor(255, 0, 0);
        irsend.sendSony(0xa90, 12); // Código power Sony TV
        delay(40);
      }
      break;
    case CONTROL_CH:
      setColor(0, 255, 0);
      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 {
        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);
      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 {
        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;
}

Esquemáticos

FlickMote: Mando IR por gestos para Smart Home

flickmote_9Gx3XNFHEp.fzz

Proceso de manufactura

  1. Construye un Dispositivo de Levitación Ultrasónica con Arduino – Guía Paso a Paso
  2. Construye un Spybot controlado por Bluetooth con Arduino
  3. TV‑B‑Gone DIY con Arduino: Mando universal para apagar cualquier TV
  4. Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
  5. Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
  6. Soluciones de Alimentación Optimizadas para Proyectos Arduino
  7. Tres en raya con Arduino, matriz LED MAX7219 y carcasa de cartón
  8. Construye un Robot Cuadrúpedo Inteligente con Arduino: Guía Paso a Paso
  9. Construye un volante joystick personalizado con Arduino para gaming
  10. Sistema Radar Compacto con Arduino Nano, Sensor HC-SR04 y Pantalla 1.8"
  11. Construye una Máquina CNC Totalmente Funcional con Arduino Nano R3