Lâmpada controlada por gestos no Arduino

imagem

Olá pessoal !!!
Fico feliz por poder mostrar a você meu novo ofício novamente.
Desta vez, montei uma lâmpada de arduino controlada por gestos.

Esse projeto me levou muito tempo, o que sempre me falta.
Montei a primeira versão da lâmpada muito rapidamente e ela funcionou perfeitamente para mim na placa de ensaio, mas quando a mudei para um local permanente no gabinete, tudo começou: todos os problemas com congelamentos, falsos positivos e outros problemas surgiram. Pesquisando na Internet, encontrei em sites estrangeiros muitas reclamações relacionadas aos problemas do sensor APDS9960, mas não encontrei soluções para esses problemas. Eu tive que gastar um pouco de tempo estudando a folha de dados deste sensor e entendendo sua operação. No final, valeu a pena e eu fui capaz de escrever um código de trabalho estável.

E assim, tudo em ordem.

Descrição da lâmpada


A ênfase principal nesta lâmpada não estava na visualização, mas no controle de gestos, todas as outras funções são secundárias.

A lâmpada acende com gestos à esquerda ou à direita, e você também pode acender com um gesto em sua direção, mas isso não é totalmente conveniente. Em seguida, com os gestos esquerdo e direito, você pode rolar pelos efeitos de iluminação. Se você começar a virar para a direita, a lâmpada mudará suas cores de branco para vermelho, incluindo todas as cores primárias e as transições entre elas.

Se, depois de acender a lâmpada, começarmos a virar para a esquerda, veremos efeitos dinâmicos de iluminação, como "Fogo", "Matriz", "Lâmpada de lava", "Arco-íris", "Confete", "Faíscas", "Lâmpada ardente". Se precisar retornar a uma lâmpada normal, em vez de virar, você pode desligar a lâmpada com um gesto de si mesmo e ativar qualquer um dos três gestos.
O desligamento é feito por um gesto seu.



O brilho é regulado pelo gesto de se aproximar e se afastar do sensor. Primeiro, você precisa aproximar a palma da mão do sensor e, em seguida, levantá-la bruscamente. A lâmpada muda para o modo de ajuste de brilho, aproximando a palma da mão cada vez mais perto. Você precisa encontrar a luminosidade apropriada e travar a mão por alguns segundos, para que o valor da luminosidade seja preservado. Quando o brilho é mantido, a lâmpada informa você desligando suavemente a luz e ligando-a com um novo nível de brilho.

Não prestei muita atenção aos efeitos visuais, pois pretendo fazer uma segunda versão da lâmpada no mini controlador Wemos D1. No qual pretendo levar tudo ao ideal. Pelo mesmo motivo, ainda uso apenas uma linha de LEDs, composta por 4 tiras ws2812b, em vez de quatro.

APDS9960 Interrupções


Na verdade, os principais problemas da lâmpada LED estão associados a ela. As interrupções em apds9960 vivem suas próprias vidas, podem funcionar de qualquer coisa, por exemplo, de interferência EM ou de estar perto do sensor de uma pessoa, de ondulações na nutrição e possivelmente de outra coisa.



Primeiro, tentei corrigir o problema com alterações no hardware. A filtragem de energia não ajudou, mesmo com uma bateria 18650, o sensor ainda continuou a viver sua vida. Tentei mudar o resistor de carga do sinal INT para + 5V e isso também não trouxe sucesso.

À medida que o estudo chegava, entendia-se por que ocorriam interrupções falsas. O principal problema são reflexões aleatórias do sinal IR. O fabricante recomenda cobrir o sensor e tudo o que estiver ao redor com um revestimento de borracha preta. Eu não tenho essa tinta e não me incomodei com ela. Embora isso possa reduzir um pouco o número de falsos positivos.

Escrevi um código que filtra todos os gatilhos aleatórios, mas tive outro problema. Depois que a interrupção é acionada, a informação do gesto é transmitida através do barramento I2C, não instantaneamente, mas com um certo atraso. E se a fonte de alimentação devido à faixa de LEDs de endereço for barulhenta, o tempo de transmissão, levando em consideração essas interferências, sempre será diferente. Eu tive que levar esse fato em consideração e reescrever o código para determinar os gestos de uma nova maneira.

Definição de gestos


Se o código não usar interrupção do sensor, não haverá problemas com a definição do gesto. Mas, neste caso, a multitarefa é perdida. Se um efeito dinâmico for ativado na lâmpada, será necessário um código cíclico, constantemente executável, e serão necessárias interrupções para remover o controlador do ciclo.

Para melhorar a estabilidade do reconhecimento de gestos, também foi necessário reduzir a sensibilidade do receptor na biblioteca. Para fazer isso, substitua a linha no arquivo SparkFun_APDS9960.h:

if (! setLEDBoost (LED_BOOST_300))
em
if (! setLEDBoost (LED_BOOST_150))

Se você baixou a biblioteca deste artigo, não precisa fazer nada, tudo já foi corrigido lá.
Também selecionei experimentalmente a corrente do LED de 50 mA, na qual os gestos são determinados de maneira mais estável e não há necessidade de forçar um LED infravermelho com uma corrente de 100 mA.

E também cometi um erro ao colocar o microcontrolador na parte inferior da lâmpada e o sensor de gesto na tampa superior. Por causa disso, para conectar o arduino e o apds9960, tive que usar fios de 30 cm de comprimento, o que também acrescentou instabilidade adicional ao sensor. Como resultado, derrotei todos esses problemas programaticamente.

Esquema




Para alimentar o dispositivo, eu uso um carregador do meu smartphone, com uma tensão de saída de 5V e uma corrente de 2A. Mas, de fato, uma lâmpada com luz branca acesa com brilho máximo não consome acima de 1,3 A. Portanto, qualquer fonte de energia com uma corrente de saída de pelo menos 1,3 A é adequada.

O estabilizador dc-dc mini360 pode ser substituído por qualquer outro conversor de tensão abaixador, com uma corrente de saída de pelo menos 150 mA.

No diagrama abaixo, eu não uso um conversor de nível lógico, mas essa é minha decisão pessoal. E, portanto, não aceito responsabilidade antecipadamente no caso de, se você falhar, o sensor APDS9960 conectado sem um conversor de nível TTL.

Em vez do Arduino Nano, você pode usar o controlador Arduino UNO ou seus clones.

Certifique-se de verificar a presença de jumpers no sensor de gestos, eles estão marcados em vermelho na foto abaixo. Em caso de ausência, um ferro de solda deve ser aplicado a esses caminhos de contato, aplique e aqueça a solda até formar uma gota uniforme. Agora, os chineses estão fornecendo esses sensores sem jumpers. Sem esses jumpers, a operação do sensor não é garantida.



Componentes Utilizados


Arduino Nano - 1 unid.
Sensor de gestos APDS9960 - 1 pc.
Tiras de LED ws2812b - 4 unid.
Conversor step-down Mini360 - 1 pc.
Fios de conexão - 1 conjunto.

Código de programa para Arduino


O código é dividido em duas partes. Na primeira parte é o código principal que funciona com o sensor e na segunda parte é o código para todos os efeitos de iluminação.

Você pode adicionar qualquer efeito por analogia com o meu código, mas o mais importante, não se esqueça de adicionar uma função para sair do gesto do efeito em loop. Para fazer isso, adicione a seguinte linha no final do loop if (check_int ()) return;

Descrição das principais funções do programa
Os processos processingGesture () interrompem o sensor de gestos.
Os processos processingProximity () interrompem o sensor de proximidade.
Gesture_int () - interrompe o manipulador do sensor de gestos.
proximidade_int () - interrompe o manipulador do sensor de proximidade.

Descrição das constantes


APDS9960_INT - entrada para uma interrupção externa. O Arduino Nano e o UNO têm apenas duas dessas entradas, 2 e 3.

PIN - aqui você precisa especificar a saída para a faixa de LEDs. Você pode especificar qualquer pino digital ao qual as correias ws2812b estão conectadas.

NUM_PIX - aqui indicamos o número de LEDs de endereço na fita usada.
alcance - o limite de erro é de 0 a 10. Se, ao ajustar o brilho, uma mão é fixada acima do sensor por 2 segundos, as leituras devem ser salvas, mas se as leituras não forem salvas, aumente gradualmente o limite de erro.

Faça o download da biblioteca APDS9960
Baixar esboço da lâmpada

Vídeo mostrando o funcionamento da lâmpada



Sumário


A lâmpada ao vivo parece melhor do que no vídeo. Agora é pedido a todos que o viram de mim que colecionem o mesmo para eles. No momento, não gosto de como o ajuste de brilho funciona, mas estou trabalhando nisso. Não prometo isso em breve, mas a próxima versão da lâmpada já está em desenvolvimento.

Obrigado por ler o artigo até o fim! Se você ainda tiver dúvidas, pode perguntar nos comentários abaixo do artigo.

PS


Idéia da lâmpada inspirada aqui
Eu peguei os principais efeitos aqui

Source: https://habr.com/ru/post/pt484278/


All Articles