Índice:

Decodificador de sensor Arduino RF: 5 etapas
Decodificador de sensor Arduino RF: 5 etapas

Vídeo: Decodificador de sensor Arduino RF: 5 etapas

Vídeo: Decodificador de sensor Arduino RF: 5 etapas
Vídeo: How to make a LED digital counter using 7- Segment Display 2024, Julho
Anonim
Decodificador de sensor Arduino RF
Decodificador de sensor Arduino RF

Minha casa anterior veio com um sistema de segurança pré-instalado que tinha sensores de porta, um sensor de movimento e um painel de controle. Tudo estava conectado a uma grande caixa de eletrônicos em um armário e havia instruções para ligar um telefone fixo para discar automaticamente em caso de alarme. Quando tentei brincar com ele, descobri que um dos sensores da porta estava instalado de forma incompleta e outro estava intermitente devido ao alinhamento incorreto. Tanto para a instalação profissional apregoada no cartão de visita da empresa de segurança. Minha solução na época foi comprar algumas câmeras de segurança na Internet e um alarme de segurança sem fio barato.

Avance até hoje e aquele alarme sem fio está em uma caixa no meu porão. Depois de adquirir um receptor RF barato, decidi ver se conseguia decodificar as mensagens transmitidas pelos diversos sensores de alarme e controles remotos que possuo. Percebi que, como todos trabalhavam com a caixa de alarme barata, todos deveriam usar o mesmo formato de mensagem com apenas um ID diferente. Logo descobri que eles são semelhantes apenas na estrutura geral das mensagens. Portanto, o projeto rapidamente passou de trivial a muito interessante.

Etapa 1: Módulos de sensor

Módulos de Sensor
Módulos de Sensor
Módulos de Sensor
Módulos de Sensor
Módulos de Sensor
Módulos de Sensor
Módulos de Sensor
Módulos de Sensor

Como você pode ver nas fotos acima, os transmissores incluem sensores de porta aberta, detectores de movimento, controles remotos de arme e um teclado sem fio usado para programar a caixa de alarme. Acontece que nenhum desses dispositivos usa o mesmo comprimento de sincronização ou duração de bits. A única semelhança, além do comprimento da mensagem, é o formato básico dos bits. Cada bit ocupa um período de tempo fixo com a diferença entre zero e um sendo o ciclo de trabalho das porções alta / baixa.

A bela forma de onda mostrada acima NÃO é a que recebi primeiro. Como há muito tráfego na banda de frequência de 433 MHz, tive que me certificar de ativar o sensor antes de definir o osciloscópio para fazer um único disparo. Felizmente, os sensores emitem várias cópias da mensagem de dados quando ativados e os controles remotos e o teclado continuam emitindo mensagens enquanto uma tecla é pressionada. Usando o osciloscópio, consegui determinar a duração da sincronização e as durações dos bits de dados para cada item. Conforme mencionado anteriormente, os tempos de sincronização são diferentes e os tempos de bit são diferentes, mas todos os formatos de mensagem têm uma sincronização de baixo nível seguida por 24 bits de dados e um bit de parada. Isso foi o suficiente para eu ser capaz de construir um decodificador genérico em software sem ter que codificar todos os detalhes diferentes para cada dispositivo.

Etapa 2: Hardware

Hardware
Hardware
Hardware
Hardware

Eu originalmente construí um decodificador de sensor usando um microcontrolador PIC e linguagem assembly. Tenho brincado com variantes do Arduino recentemente, então pensei em ver se poderia replicá-lo. O esquema simples é mostrado acima e também há uma foto do meu protótipo. Tudo o que fiz foi usar três fios de jumper comuns para ir do Arduino Nano à placa receptora de RF. Energia e uma única linha de dados são tudo o que você precisa.

Se você ler meu Instructable no “display de tempo e clima 3 em 1”, verá que uso um receptor RXB6 comum de 433 MHz. Você pode conseguir que os receptores realmente baratos funcionem no curto alcance necessário para este projeto, mas eu ainda recomendo usar um receptor super-heteródino.

Etapa 3: Software

O software converte os bits recebidos em caracteres ASCII exibíveis. Ele produz o valor do comprimento de sincronização e os comprimentos dos bits 1 e 0. Como eu já conhecia os comprimentos de sincronização e os formatos de bits, poderia ter escrito o software especificamente para eles. Em vez disso, decidi ver se poderia escrevê-lo para classificar os comprimentos de sincronização e descobrir automaticamente os bits de dados. Isso deve facilitar a modificação, caso eu queira tentar detectar outros formatos em algum momento. É importante notar que o software não sabe se o primeiro bit de uma mensagem é 1 ou 0. Ele assume que é 1 mas, se descobrir que deveria ser zero, ele inverterá o bits na mensagem concluída antes de enviá-la pela porta serial.

Os tempos do pulso de sincronização e os bits de dados são determinados usando a entrada de interrupção externa INT0 para acionar um manipulador de interrupção. INT0 pode disparar ao subir, descer ou ambas as bordas, ou em um nível baixo estável. O software é interrompido em ambas as bordas e mede a quantidade de tempo que o pulso permanece baixo. Isso simplifica as coisas porque o início / sincronização da mensagem é um pulso de baixo nível e os bits podem ser determinados com base em seu tempo de baixo nível.

O manipulador de interrupção primeiro determina se a contagem capturada é longa o suficiente para ser um pulso de início / sincronização. Os vários dispositivos que tenho usam pulsos de sincronização de 4, 9, 10 e 14 milissegundos. As instruções de definição para os valores de sincronização mínimo / máximo permitidos estão à frente no software e atualmente são definidas para 3 e 16 milissegundos. Os tempos de bit também variam entre os sensores, então o algoritmo para decodificar bits precisa levar isso em consideração. O tempo de bit do primeiro bit é salvo como é o tempo de um bit subsequente que tem uma diferença significativa do primeiro bit. Uma comparação direta dos tempos de bit subsequentes não é possível, portanto, um "fator de correção" define ("Variação") é usado. A decodificação de bits começa assumindo que o primeiro bit de dados é sempre registrado como um 1 lógico. Esse valor é salvo e usado para testar os bits subsequentes. Se uma contagem de bits de dados subsequente estiver dentro da janela de variação do valor salvo, ela também será registrada como uma lógica 1. Se estiver fora da janela de variação do valor salvo, será registrada como uma lógica 0. Se a lógica 0 o tempo de bit é menor que o primeiro tempo de bit, então um sinalizador é definido para informar ao software que os bytes precisam ser invertidos antes de serem exibidos. O único caso em que esse algoritmo falha é quando os bits em uma mensagem são todos 0's. Podemos aceitar essa limitação porque esse tipo de mensagem não tem sentido.

Todos os sensores em que estou interessado têm um comprimento de mensagem de 24 bits de dados, mas o software não se limita a esse comprimento. Há um buffer para até sete bytes (mais podem ser adicionados) e define o comprimento mínimo e máximo da mensagem em bytes. O software é configurado para coletar os bits, convertê-los em bytes, armazená-los temporariamente e, em seguida, gerá-los no formato ASCII por meio da porta serial. O evento que dispara a saída da mensagem é o recebimento de um novo pulso de início / sincronização.

Etapa 4: registro de dados

Registro de dados
Registro de dados

O software é configurado para produzir os dados convertidos como caracteres ASCII por meio da saída serial (TX) do Arduino. Quando fiz a versão PIC, precisei fazer a interface com um programa de terminal no PC para exibir os dados. Uma vantagem do Arduino IDE é que ele possui uma função Serial Monitor incorporada. Eu defino a taxa da porta serial para 115,2k e, em seguida, defino a janela Serial Monitor para a mesma taxa. A captura de tela aqui mostra um display típico com saídas de uma variedade de sensores que possuo. Como você pode ver, os dados às vezes não são perfeitos, mas você pode determinar facilmente qual deve ser o valor real de cada sensor.

Etapa 5: Amostra de software receptor

Amostra de software receptor
Amostra de software receptor

Incluí um exemplo de lista de software que mostra como você pode usar as informações coletadas para receber um conjunto específico de códigos para seu aplicativo. Este exemplo é configurado para emular uma das minhas tomadas remotas Etekcity. Um comando liga o LED embutido no Nano (D13) e o outro comando desliga o LED. Se você não tiver um LED embutido em seu Arduino, adicione o resistor e o LED conforme mostrado no diagrama. Em uma aplicação real, essa função ligaria / desligaria uma tomada elétrica (usando um relé ou um triac). Os tempos de sincronização, tempos de bit e bytes de dados esperados são todos definidos antecipadamente para facilitar a modificação. Você pode usar qualquer uma das linhas de dados restantes para ligar / desligar coisas, etc. para seu aplicativo específico. Basta adicionar o código de comando aplicável para definir e substituir a lógica liga / desliga do LED no “loop” para atender às suas necessidades.

Recomendado: