Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

FlickMote: Controle Remoto IR por Gestos para Casa Inteligente

Componentes e Materiais

Aplicativos e Serviços Online

Sobre o Projeto

Introdução

Controlar eletrodomésticos e gadgets via controle remoto infravermelho é comum. Mas a mesma tarefa pode ser feita mais facilmente. O motivo principal de propor novo sistema de controle remoto por gestos é remover a necessidade de olhar para o controle portátil e procurar tecla específica — principalmente para idosos. Este projeto apresenta sistema inovador para controlar eletrodomésticos através de gestos da mão como dispositivo de controle remoto. Chamado FlickMote. Usa medidor de distância ultrassônico para determinar gesto do usuário e emite sinal IR. Microcontrolador: Arduino 101.

Componentes de Hardware

  1. Arduino 101 ou Uno
  2. Módulo ultrassônico HC-SR04
  3. LED Infravermelho
  4. Resistor apropriado para LED IR (220Ω)
  5. LED RGB
  6. Protoboard e fios

Como Funciona

Usa medidor ultrassônico para determinar gesto do usuário e emite sinal IR para TV conforme comando. Distância em polegadas pode ser ajustada no código.

Diagrama de Circuito (Fritzing)

Construção:

  1. Conecte LED IR ao pino 3 via resistor apropriado, catodo ao GND.
  2. Conecte sensor ultrassônico a 5V e GND. Pino trigger → pino 8, echo → pino 7 (configuráveis no programa).
  3. Conecte LED RGB ao GND e pinos 11 (vermelho), 10 (verde), 9 (azul). Também configuráveis.

Controles

Energia

Deslizar sobre sensor dentro de 3 polegadas faz LED piscar roxo — confirmação que sinal 'liga/desliga' está pronto. Para evitar desligar TV acidentalmente, o sketch espera segundo deslize dentro de 5 segundos do primeiro para confirmar. Neste ponto, sinal é enviado à TV.

Canal

Deslizar dentro de 10 polegadas (mas não dentro de 3) muda canal para baixo. Deslizar entre 10 e 20 polegadas muda canal para cima.

Volume

Segurar mão dentro de 10 polegadas (mas não dentro de 3) diminui volume. Segurar entre 10 e 20 polegadas aumenta volume. Volume continua mudando até remover a mão.

Vantagens e Melhorias

Código

/* Swipe Remote Control
   Usa medidor ultrassônico para determinar gesto e emite sinal IR para TV Sony.
   - High swipe (> 10in) = Channel Up
   - Low swipe = Channel Down
   - High hold (> 10in) = Volume Up
   - Low hold = Volume Down
   - Cover sensor (< 3in) = Turn On / Off
   Criado por Vignesh Jaishankar
   Usa biblioteca IRremote (https://github.com/shirriff/Arduino-IRremote)
*/
#include <IRremote.h>

#define CONTROL_CH 1
#define CONTROL_VOL 2
#define CONTROL_POW 3
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20
#define DIST_DOWN 10
#define DIST_POW 3

const int irPin = 3;
const int pingPin = 8;
const int echoPin = 7;
const int led = 13;
const int ledR = 11;
const int ledG = 10;
const int ledB = 9;

unsigned long timer;
IRsend irsend;
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;

  duration = doPing();

  if (timer && timer < (millis() - 5000) && (millis() > 5000)) {
    Serial.println("timer reset");
    timer = false;
  }
  digitalWrite(led, LOW);
  setColor(0, 0, 0);

  inches = microsecondsToInches(duration);

  if (inches < DIST_MAX) {
    Serial.print(inches); Serial.println("in");

    if (inches < DIST_POW) {
      Serial.println(timer);
      if (timer) {
        doIR(CONTROL_POW, 0);
        timer = false;
        delay(2000);
      } else {
        Serial.println("power flag set");
        timer = millis();
        setColor(255, 50, 50);
        delay(500);
      }
    } else {
      value = handleDist(inches);
      delay(300);
      if (microsecondsToInches(doPing()) > DIST_MAX) {
        doIR(CONTROL_CH, value);
      } else {
        int d = 500;
        while (inches < DIST_MAX) {
          value = handleDist(inches);
          doIR(CONTROL_VOL, value);
          delay(d);
          inches = microsecondsToInches(doPing());
          d = 100;
        }
        delay(500);
      }
    }
  }
  delay(50);
}

int handleDist(int inches) {
  if (inches > DIST_DOWN) {
    digitalWrite(led, HIGH);
    return CONTROL_UP;
  } else {
    digitalWrite(led, LOW);
    return CONTROL_DOWN;
  }
}

void doIR(int control, int val) {
  switch(control) {
    case CONTROL_POW:
      Serial.println("power on / off 0xa90");
      for (int i = 0; i < 3; i++) {
        setColor(255, 0, 0);
        irsend.sendSony(0xa90, 12);
        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

Diagrama de fiação Fritzing: flickmote_9Gx3XNFHEp.fzz

Processo de manufatura

  1. Construa um Dispositivo de Levitação Ultrassônica com Arduino – Guia Passo a Passo
  2. Construa um Spybot Controlado por Bluetooth com Arduino
  3. DIY Arduino TV B-Gone: Controle Remoto Universal para Todas as TVs
  4. Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
  5. Find Me: Localizador Inteligente de Objetos com Arduino e Bluetooth
  6. Soluções de Energia Otimizadas para Projetos Arduino
  7. Jogo da Velha com Arduino, Matriz LED MAX7219 e Caixa de Papelão
  8. Construa um Robô Quadrúpede Inteligente com Arduino: Guia Passo a Passo
  9. Volante Joystick Arduino Personalizado para Jogos
  10. Sistema Radar Compacto com Arduino Nano, Sensor HC-SR04 e Display 1.8"