Controle remoto de TV a bateria com caixa impressa em 3D
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 3 | ||||
| × | 4 | ||||
| × | 3 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 6 | ||||
| × | 1 |
Ferramentas e máquinas necessárias
| ||||
| ||||
| ||||
|
Sobre este projeto
Introdução
O controle remoto da TV da minha namorada parou de funcionar. Ela poderia ter comprado um substituto barato em uma loja próxima, mas então pensou:nós dois somos engenheiros, vamos fazer o nosso próprio juntos!
Como somos bastante complementares em nossas habilidades, essa foi uma maneira diferente, mas divertida de passar algum tempo durante o bloqueio e nos deu a oportunidade de aprender um pouco sobre como essa tecnologia do dia a dia funciona.
Ah, e ter uma pequena impressora 3D em casa também desempenhou um papel.
Como funciona
Em primeiro lugar, como queríamos fazer um design simples com base no Arduino UNO, avaliamos o número mínimo de comandos necessários para operar nossa TV. Consideramos que 6 comandos eram suficientes:chave ON / OFF, Seleção de fonte, Ch +, Ch-, Vol +, Vol-.
Leitura do botão
Para evitar o uso de resistores adicionais, o projeto conta com os resistores pull-up internos do Arduino. Se o controle remoto não estiver no modo de hibernação (veja abaixo), cada estado do botão é pesquisado em cada ciclo de loop. Para evitar a contagem de acertos múltiplos, uma rotina de eliminação simples é implementada explorando o
millis ()
função. Enviando sinais infravermelhos
A comunicação infravermelha é tratada pelo
IRremote.h
biblioteca (parabéns aos programadores!). Tudo o que tivemos que fazer foi configurar o protocolo para nossa tv (diferentes fabricantes desenvolveram seus próprios protocolos) e pesquisar no Google os códigos em HEX dos diferentes comandos que queríamos usar e associá-los aos botões. No que se refere ao projeto do circuito, para que os comandos da biblioteca efetivamente pilotem o LED IR, este deve ser conectado ao pino 3 do Arduino UNO. Atualmente, o código é escrito para três tipos diferentes de tv, selecionáveis comentando / descomentando um
#define
diretiva na primeira parte do código. Bateria salvar
Para reduzir o consumo de energia, algumas estratégias são implementadas, explorando os comandos do
avr / sleep.h
e avr / power.h
bibliotecas. Todos os periféricos e interfaces não utilizados (ADC, SPI, TWI, timer1, usart) são desligados na rotina de configuração. O LED embutido no pino 13 do PWM também está apagado. Também decidimos dessoldar o LED de alimentação do Arduino UNO, que, caso contrário, está sempre ligado, embora não seja uma operação recomendada.
Além disso, explorando o
millis ()
, se nenhum botão for pressionado por 5 segundos, o controle remoto entrará no modo de hibernação, a partir do qual será ativado quando o botão Liga / Desliga for pressionado novamente.
Como é construído
Eletrônicos montagem
Todo o circuito está embutido em uma placa de prototipagem, projetada para caber nos cabeçalhos do Arduino UNO. Usando um ferro de solda, os botões foram soldados considerando a posição final no controle remoto. Na parte inferior, os dois resistores de 47ohm foram soldados em paralelo, a fim de atingir a corrente desejada através do LED IR.
Usando o fio de solda, traços foram feitos na placa de prototipagem para conectar os pinos do botão e o LED IR aos conectores de pinos machos.
Desta forma, a placa assemelha-se a uma blindagem que é instalada no Arduino UNO através dos conectores de pinos, garantindo todas as conexões corretas.
Gabinete CAD e CAM
O gabinete foi projetado para conter a bateria, o conjunto da placa de prototipagem Arduino UNO +, expondo apenas os botões na parte superior e o LED IR na parte frontal.
O gabinete consiste em duas partes, projetadas com o software SolidWorks CAD, pré-processado com o software de fatiamento Ultimaker Cura e, finalmente, impresso em 3D em PLA usando uma impressora Anycubic Mega Zero 3D.
O Arduino UNO é preso à base usando 3 parafusos M2.5, que se encaixam em orifícios de alinhamento extrudados de dentro da base. Uma vez que o Arduino estiver preso, o LED IR se projetará para fora da placa de prototipagem, a fim de alinhá-lo com o orifício interno específico e mantê-lo na posição durante a montagem das duas partes do gabinete, três minipolares são adicionados para evitar movimentos laterais dos cabos de LED. A bateria é encaixada por pressão em um espaço dedicado.
A capa foi desenhada de forma a expor apenas os botões e ao lado de cada um deles, um símbolo está gravado na capa para mostrar a função de cada botão.
A base e a tampa do gabinete são montadas com 4 parafusos M3.
Galeria de fotos
Código
- TV_remote.ino
TV_remote.ino Arduino
#include#include #include // Definição do pino // Um LED IR deve ser conectado ao Arduino PWM pino 3 # define OnOff 1 # define Source 0 # define CH_plus 4 # define CH_minus 5 # define Vol_plus 6 # define Vol_minus 7 # define Interrupt_Pin 2 // Apenas pino 2 ou 3 no Arduino Uno // Definição do modelo de TV // # define LG_TV // # define SAMSUNG_TV # define SONY_TV // Códigos de definição # ifdef LG_TV unsigned long on_off_code =551489775; // HEX 20DF10EF unsigned long vol_plus_code =551502015; // HEX 20DF40BF sem sinal longo vol_minus_code =551534655; // HEX 20DFC03F unsigned long ch_plus_code =551485695; // HEX 20DF00FF sem sinal long ch_minus_code =551518335; // HEX 20DF807F sem sinal longo source_code =551538735; // HEX 20DFD02F # endif # ifdef SAMSUNG_TV unsigned long on_off_code =3772793023; // HEX E0E040BF unsigned long vol_plus_code =3772833823; // HEX E0E0E01F unsigned long vol_minus_code =3772829743; // HEX E0E0D02F unsigned long ch_plus_code =3772795063; // HEX E0E048B7 unsigned long ch_minus_code =3772778743; // HEX E0E008F7 unsigned long source_code =3772809343; // HEX E0E0807F # endif # ifdef SONY_TV unsigned long on_off_code =2704; // HEX A90 sem sinal long vol_plus_code =1168; // HEX 490 sem sinal longo vol_minus_code =3216; // HEX C90 sem sinal long ch_plus_code =144; // HEX 090 sem sinal long ch_minus_code =2192; // HEX 890 sem sinal longo source_code =2640; // HEX A50 # endif // Habilitar depuração // # define DEBUG // IRsend irsend; // Criar objeto IR sem sinal longo debounce_time; sem sinal longo last_time; void setup () {analogWrite (13,0); // liga o led embutido // noInterrupts (); // desabilita interrupções // CLKPR =_BV (CLKPCE); // habilita as configurações do prescaler do relógio // CLKPR =_BV (CLKPS0); // definir clock prescaler =2 -> 8 MHz // interrupts (); pinMode (OnOff, INPUT_PULLUP); pinMode (fonte, INPUT_PULLUP); pinMode (CH_plus, INPUT_PULLUP); pinMode (CH_minus, INPUT_PULLUP); pinMode (Vol_plus, INPUT_PULLUP); pinMode (Vol_minus, INPUT_PULLUP); pinMode (Interrupt_Pin, INPUT_PULLUP); // economia de energia power_adc_disable (); // desativa todos os ADCs power_spi_disable (); // desativa SPI power_timer1_disable (); // disbale timer 1 (0 é para millis (), 2 é para irremote.h) power_usart0_disable (); // desativa serial power_twi_disable (); // desativa o TWI #ifdef DEBUG Serial.begin (9600); #endif} void loop () {// verificar OnOff if (! digitalRead (OnOff)) {debounce_time =millis (); while (millis () - debounce_time <40) {; } if (! digitalRead (OnOff)) {#ifdef LG_TV irsend.sendNEC (on_off_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG (on_off_code, 32); #endif #ifdef SONY_TV irsend.sendSony (on_off_code, 12); #endif last_time =millis (); // última vez que um botão foi pressionado #ifdef DEBUG Serial.println ("OnOff"); #endif}} // verifique a fonte if (! digitalRead (Source)) {debounce_time =millis (); while (millis () - debounce_time <40) {; } if (! digitalRead (Source)) {#ifdef LG_TV irsend.sendNEC (source_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG (source_code, 32); #endif #ifdef SONY_TV irsend.sendSony (source_code, 12); #endif last_time =millis (); // última vez que um botão foi pressionado #ifdef DEBUG Serial.println ("Source"); #endif}} // verificar CH_plus if (! digitalRead (CH_plus)) {debounce_time =millis (); while (millis () - debounce_time <40) {; } if (! digitalRead (CH_plus)) {#ifdef LG_TV irsend.sendNEC (ch_plus_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG (ch_plus_code, 32); #endif #ifdef SONY_TV irsend.sendSony (ch_plus_code, 12); #endif last_time =millis (); // última vez que um botão foi pressionado #ifdef DEBUG Serial.println ("CH +"); #endif}} // verificar CH_minus if (! digitalRead (CH_minus)) {debounce_time =millis (); while (millis () - debounce_time <40) {; } if (! digitalRead (CH_minus)) {#ifdef LG_TV irsend.sendNEC (ch_minus_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG (ch_minus_code, 32); #endif #ifdef SONY_TV irsend.sendSony (ch_minus_code, 12); #endif last_time =millis (); // última vez que um botão foi pressionado #ifdef DEBUG Serial.println ("CH-"); #endif}} // verificar Vol_plus if (! digitalRead (Vol_plus)) {debounce_time =millis (); while (millis () - debounce_time <40) {; } if (! digitalRead (Vol_plus)) {#ifdef LG_TV irsend.sendNEC (vol_plus_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG (vol_plus_code, 32); #endif #ifdef SONY_TV irsend.sendSony (vol_plus_code, 12); #endif last_time =millis (); // última vez que um botão foi pressionado #ifdef DEBUG Serial.println ("Vol +"); #endif}} // verificar Vol_minus if (! digitalRead (Vol_minus)) {debounce_time =millis (); while (millis () - debounce_time <40) {; } if (! digitalRead (Vol_minus)) {#ifdef LG_TV irsend.sendNEC (vol_minus_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG (vol_minus_code, 32); #endif #ifdef SONY_TV irsend.sendSony (vol_minus_code, 12); #endif last_time =millis (); // última vez que um botão foi pressionado #ifdef DEBUG Serial.println ("Vol-"); #endif}} if (millis () - last_time> 5000) {// um botão não foi pressionado por 10 s #ifdef DEBUG Serial.println ("Indo dormir ..."); #endif going_to_sleep (); // entra no modo de espera #ifdef DEBUG Serial.println ("Waking up ..."); #endif}} // Modo Sleep functionvoid going_to_sleep () {sleep_enable (); // ativa o modo de hibernação attachInterrupt (digitalPinToInterrupt (Interrupt_Pin), wake_up, LOW); // interromper para acordar -> configurar o pino de interrupção como NOR COM FIO !!! set_sleep_mode (SLEEP_MODE_PWR_DOWN); // modo de hibernação total sleep_cpu (); // ativa o modo de hibernação} // Wake Up functionvoid wake_up () {sleep_disable (); // desativa o modo de espera detachInterrupt (digitalPinToInterrupt (Interrupt_Pin)); // remove a interrupção}
Peças personalizadas e gabinetes
Esquemas
remote_sketch_r4f8a47oWX.fzProcesso de manufatura
- Controle de acesso com QR, RFID e verificação de temperatura
- Usando remoto infravermelho com Raspberry Pi sem LIRC
- PiCy - O Robô Minúsculo Raspberry Pi!
- Jogo Arduino Gyroscope com MPU-6050
- Câmera de segurança Discord com ESP32
- Aceitar moeda de controle com Arduino
- Unopad - Controlador Arduino MIDI com Ableton
- Arduino com Bluetooth para controlar um LED!
- Torno com CNC
- 5 vantagens do controle remoto de produção