Índice:

Controle remoto universal da TV - Ardiuino, infravermelho: 5 etapas
Controle remoto universal da TV - Ardiuino, infravermelho: 5 etapas

Vídeo: Controle remoto universal da TV - Ardiuino, infravermelho: 5 etapas

Vídeo: Controle remoto universal da TV - Ardiuino, infravermelho: 5 etapas
Vídeo: How to use Arduino as TV Remote Controller with Infrared 2024, Novembro
Anonim
Controle remoto universal de TV - Ardiuino, infravermelho
Controle remoto universal de TV - Ardiuino, infravermelho

Olá! Neste instrutível, mostrarei como construir e programar seu próprio controle remoto universal que funcionará com a maioria das coisas que utilizam um controle remoto infravermelho e que também "ouvirá" e decodificará um sinal infravermelho enviado por vários outros controles remotos.

Um pouco do pano de fundo do que me inspirou a construir este controle remoto - eu, como a maioria de vocês, perco meus controles remotos constantemente, e essa calamidade é bastante frustrante, então acho que vamos resolver isso! Eu construí este controle remoto e discretamente o incorporei na minha cabeceira personalizada (eu também sou marceneiro) - não posso perder o controle remoto se ele fizer parte da minha cabeceira!

Suprimentos

Coisas que você precisa: -Arduino UNO ou Nano - a milhagem pode variar com outras placas

- Placa de ensaio sem solda (ou tira soldável, se desejar torná-la mais permanente)

-Jumperwires de várias cores e comprimentos

- Botões de pressão momentâneos (5) (você pode adicionar mais botões, mas precisará usar pinos digitais, já que todos os pinos analógicos, exceto 1, são usados - você precisará verificar se utilizou adequadamente os resistores pull up ou puxe para baixo os resistores e elimine os botões de pressão)

-10K Ohm resistor (5) (se você quiser mais botões, você vai precisar de mais deles)

Resistor de -470 Ohm (2)

- LED infravermelho

- LED vermelho

- Sensor infravermelho (usei o número da peça VS1838B, você poderia usar outro, basta verificar a pinagem)

(Opcional) Ferro de solda, solda, fluxo de solda.

Etapa 1: Construindo o Circuito:

Construindo o Circuito
Construindo o Circuito

1). Sempre gosto de começar com o layout de meus componentes, pois isso sempre direciona o layout na placa de ensaio.

-Apertar botões

-LEDS: o LED vermelho e o LED IR são conectados em conjunto, para que você possa ver o que o LED IR está fazendo.

-Sensor

2). Resistores

- Os cinco resistores de 10K que anexamos aos botões são chamados de resistores "pull down". Os resistores de puxar para baixo garantem que, quando um botão não é pressionado, o pino do Arduino correspondente obtém 0 Volts (ou pelo menos perto disso). Para obter mais informações sobre resistores pull down (ou pull up), aqui está um guia detalhado:

www.electronics-tutorials.ws/logic/pull-up…

Esses resistores podem não ser totalmente necessários, mas se você estiver recebendo impulsos "fantasmas", é mais do que provável que seja causado pelo acoplamento capacitivo e os resistores pull down evitam isso.

3). Fios de circuito

4). 5V e fios de aterramento

Use a imagem fornecida para referência! não tenha medo de alterá-lo de acordo com as suas necessidades!

Etapa 2: Código:

#include const int RECV_PIN = 7; // Pino de leitura do sensor IV int Button1 = A4; // Farthest Left int Button2 = A3; // 2º da esquerda int Button3 = A2; // Middle int Button4 = A1; // 2ª à direita int Button5 = A0; // Mais à direita int LED = 3; // LED IV e LED vermelho int val = 0; // Alterando o valor IRsend irsend; IRrecv irrecv (RECV_PIN); resultados de decode_results;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, SAÍDA); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // usando leitura analógica em vez de leitura digital para evitar problemas de capacitância cativa. também ajuda a eliminar os botões. // Ter uma leitura analógica em 900 permite algum espaço de manobra nos valores, ou seja, o sinal infravermelho será enviado mesmo se um 5V completo não for aplicado ao pino. // mas 900 é alto o suficiente para não ler erroneamente devido ao atraso de acoplamento capacitivo (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // mudar o valor em "i <3" mudará o número de vezes que o sinal é repetido imediatamente. então "i <2" repetirá o sinal duas vezes. // você pode precisar brincar com este número se sua TV não estiver respondendo, geralmente, 1 ou 3 funcionam mais, se não, tente números ímpares. // você também pode precisar brincar com os valores de tempo de atraso intra sinal, por exemplo, para minha TV 10 funciona, mas 30 não. {irsend.sendSony (0xa90, 12); // Código de energia da TV Sony, para minha TV, o código precisa ser enviado 3x3, então 3 pulsos, três tempos separados de atraso (10); // "atraso intra sinal" para (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" é o número do bit, diferentes protocolos exigem diferentes números de bit. NEC tem 32, Sony tem 12, você pode procurar os outros atrasos (10); for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Retardo para diminuir o volume da TV Sony (100);}}} delay (100);} if (irrecv.decode (& results)) // a parte abaixo do código permite que você interprete os sinais infravermelhos de vários controles remotos. {Serial.println (resultados.valor, HEX); // irá gerar o procedimento "NEC, Sony, Etc.." e um código de TV "c90, a90, FF02FD", você precisará adicionar 0x à frente do switch de código de TV (results.decode_type) {case DENON: Serial.println ("DENON"); pausa; case NEC: Serial.println ("NEC"); pausa; case PANASONIC: Serial.println ("PANASONIC"); pausa; case SONY: Serial.println ("SONY"); pausa; caso RC5: Serial.println ("RC5"); pausa; case JVC: Serial.println ("JVC"); pausa; case SANYO: Serial.println ("SANYO"); pausa; case MITSUBISHI: Serial.println ("MITSUBISHI"); pausa; caso SAMSUNG: Serial.println ("SAMSUNG"); pausa; caso LG: Serial.println ("LG"); pausa; caso RC6: Serial.println ("RC6"); pausa; case DISH: Serial.println ("DISH"); pausa; case SHARP: Serial.println ("SHARP"); pausa; case WHYNTER: Serial.println ("WHYNTER"); pausa; case AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pausa; padrão: case UNKNOWN: Serial.println ("UNKNOWN"); pausa;} irrecv.resume ();}}

Etapa 3: Código em profundidade: envio de sinais de infravermelho

Vou me referir às linhas de código pelo número da linha - para acompanhar, use este link:

pastebin.com/AQr0fBLg

Primeiro, precisamos incluir a Biblioteca Remota IR do z3t0.

Aqui está um link para a biblioteca:

github.com/z3t0/Arduino-IRremote

Se você precisar de um guia sobre como baixar corretamente uma biblioteca e instalá-la no IDE:

www.arduino.cc/en/guide/libraries

A linha 1 inclui a biblioteca.

Em seguida, precisamos declarar algumas variáveis, as linhas 2-12 fazem isso.

Usamos "cost int" para definir variáveis que não mudarão, todas exceto uma se enquadram nesta categoria.

Usamos "int" para definir variáveis que serão alteradas.

Devemos usar um pino com pulso com modulação (PWM) para nosso pino de LED - qualquer pino que tenha "~" próximo a ele será suficiente, em meu código - usamos o pino digital 3.

Em seguida, precisamos fazer algumas configurações - este código será executado apenas uma vez quando o Arduino for ligado ou reiniciado.

Observe que estamos definindo nossas entradas e saídas (15-20), acionando o monitor serial (21), habilitando o sensor IR (22) e dizendo ao Arduino para piscar o LED integrado sempre que recebermos um sinal no sensor (23).

A seguir, construiremos nosso loop - esse código será executado repetidamente, indo de cima para baixo algumas vezes por segundo.

Na linha 25, usamos uma instrução if, que diz ao Arduino "procure esses critérios específicos, se esses critérios forem atendidos, faça essa coisa específica". Nesse caso, o critério é analogRead (Button1)> 900, ou em outras palavras - "Arduino, olhe para o botão1, que definimos como pino A4 anteriormente, se o sinal analógico recebido for maior que 900, prossiga para nossas próximas instruções, se não, siga em frente ". Há um pouco para desempacotar aqui, então vamos mergulhar: um sinal analógico no Arduino é um valor igual ou menor que 5 V, com 5 V igual a 1023 e 0 V igual a 0. Qualquer tensão entre 0 e 5 V pode ser definida por um número, e com um pouco de matemática, podemos descobrir esse número, ou vice-versa, uma voltagem. Divida 1024 (incluímos 0 como uma unidade) por 5, o que nos dá 204,8. Por exemplo, usamos o número 900, para traduzir isso em voltagem, simplesmente dividimos 900 por 204,8, o que nos dá ~ 4,4V. Estamos dizendo ao Arduino para procurar uma voltagem maior que ~ 4,4 volts e, se for, execute nossa próxima instrução.

Falando das próximas instruções (linha 25), vemos irsend.sendNEC (0xFF02FD, 32). Isso diz "Arduino, envie um pulso modulado que segue o protocolo NEC, especificamente o sinal FF02FD, e certifique-se de que tem 32 bits". Isso fará com que nosso LED infravermelho pisque de forma que outros dispositivos possam entender. Pense nisso um pouco como Código Morse, mas apenas com luz invisível! Existem muitos protocolos diferentes por aí, cada um com centenas, senão milhares de sinais individuais, e cada um com seu número de bits específico - nosso dispositivo será capaz de reconhecer uma grande quantidade desses sinais, mas vamos mergulhar nisso mais tarde!

Na linha 28, temos nosso primeiro atraso - isto é para evitar sinais de repetição não intencionais, uma vez que o botão é pressionado e o sinal de IV é enviado, temos 100 milissegundos para tirar o dedo do botão. Isso não parece muito tempo, mas, na prática, parece funcionar bem. a função de atraso diz ao Arduino "não faça nada por X milissegundos" e, para referência, são 1000 milissegundos por segundo.

Passando para o nosso próximo botão na linha 29, botão 5 (originalmente tinha 4 botões neste controle remoto, adicionei um quinto, é por isso que estamos fora de serviço). Em essência, é a mesma coisa que o botão 1, mas com algumas diferenças importantes. A primeira diferença que você verá é uma instrução for - este é essencialmente outro loop - um loop com outro loop maior, loopception. Especificamente, temos "for (int i = 0; i <3; i ++)", leia isso como "Arduino, vamos começar em 0, repita as instruções a seguir até chegarmos a 3 vezes". A função for é usada porque muitos dispositivos são programados para procurar um sinal repetido e, no nosso caso, 3 vezes. Você pode simplesmente alterar o número 3 para um número diferente se o seu dispositivo solicitar uma programação de repetição diferente. Outra diferença importante com o botão 5 é que ele é repetido novamente, 3 vezes ou 3x3. Em outras palavras, enviamos o sinal 3 vezes, esperamos 10 milissegundos, o enviamos novamente 3 vezes, esperamos outros 10 milissegundos e, em seguida, o enviamos 3 vezes novamente. Esse tipo de comunicação é comum para ligar e desligar dispositivos e pode ser apenas o que sua TV ou dispositivo exige - a chave para isso é brincar com todas as variáveis até obter o resultado desejado. Altere o valor de atraso curto, altere o valor de repetição, envie 6 lotes em vez de 3, etc. Os dispositivos são programados intencionalmente com regras de sinal arbitrárias, imagine se o controle remoto da TV enviasse o mesmo tipo de sinal da barra de som; toda vez que você muda de canal na TV, a barra de som é desligada - é por isso que existem regras de sinal diferentes.

Os próximos três botões são programados com os mesmos princípios, pelo menos em parte, descritos acima - portanto, podemos pular até a linha 55.

Etapa 4: Código em profundidade: recebimento de sinais de infravermelho

Código em profundidade: Recebendo sinais de infravermelho
Código em profundidade: Recebendo sinais de infravermelho

Na linha 55, começamos a programar o Arduino para interpretar os sinais IR enviados por outros controles remotos - isso é necessário para que você possa descobrir os protocolos e sinais que os seus remotos utilizam. A primeira linha de código na linha 55 é if (irrecv.decode (& results) leia isso como "Arduino, procure um código IR, se você encontrar um, retorne um valor verdadeiro, se nada for encontrado, retorne falso. Quando verdadeiro, registre as informações em "resultados" ".

Seguindo para a linha 56, temos Serial.println (results.value, HEX) que diz "Ardunio, imprima os resultados no monitor serial em formato HEX". Hex, que significa hexadecimal, é uma maneira de encurtar uma string binária (apenas 0's e 1's) em algo um pouco mais fácil de digitar. Por exemplo, 101010010000 é "a90", o código usado para desligar e ligar minha TV, e 111111110000001011111101 é 0xFF02FD, que controla minha faixa RGB. Você pode usar o gráfico acima para converter binário em hexadecimal e vice-versa ou pode usar o seguinte link:

www.rapidtables.com/convert/number/hex-to-…

Até a linha 57, temos uma nova função, chamada de switch case.

Essencialmente, um caso de switch nos permite especificar instruções diferentes com base nos resultados de uma determinada variável (caso). o break sai da instrução switch e é usado no final de cada instrução.

Usamos a caixa do interruptor aqui para alterar a forma como imprimimos no monitor serial com base nos protocolos que nosso Arduino detecta nos vários controles remotos.

Etapa 5: Conclusão

Se você tiver alguma dúvida, sinta-se à vontade para entrar em contato comigo aqui! Fico feliz em tentar ajudá-lo da melhor forma que posso.

Espero que você tenha aprendido algo que possa usar para tornar sua vida um pouco melhor!

-RB

Recomendado: