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

Controle remoto de TV a bateria com caixa impressa em 3D

Componentes e suprimentos

Arduino UNO
× 1
Bateria de 9 V (genérica)
× 1
9V para conector Barrel Jack
× 1
Transmissor IR (genérico)
× 1
Parafuso de máquina, M3
× 4
Parafuso de máquina, M2.5
× 3
Porca M3
× 4
M2.5 porca
× 3
Through Hole Resistor, 47 ohm
× 2
Placa de prototipagem, 2,54 mm
× 1
Botão PCB
× 6
Male-Header 36 Position 1 Row- Long (0.1 ")
× 1

Ferramentas e máquinas necessárias

Impressora 3D (genérica)
Ferro de soldar (genérico)
Arame de solda, sem chumbo
Filamento PLA, diâmetro 1,75 mm

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.


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.fz

Processo de manufatura

  1. Controle de acesso com QR, RFID e verificação de temperatura
  2. Usando remoto infravermelho com Raspberry Pi sem LIRC
  3. PiCy - O Robô Minúsculo Raspberry Pi!
  4. Jogo Arduino Gyroscope com MPU-6050
  5. Câmera de segurança Discord com ESP32
  6. Aceitar moeda de controle com Arduino
  7. Unopad - Controlador Arduino MIDI com Ableton
  8. Arduino com Bluetooth para controlar um LED!
  9. Torno com CNC
  10. 5 vantagens do controle remoto de produção