Índice:

Implementação do sensor de gesto APDS9960 sem bloqueio: 5 etapas
Implementação do sensor de gesto APDS9960 sem bloqueio: 5 etapas

Vídeo: Implementação do sensor de gesto APDS9960 sem bloqueio: 5 etapas

Vídeo: Implementação do sensor de gesto APDS9960 sem bloqueio: 5 etapas
Vídeo: SOLDANDO, CONECTANDO E UTILIZANDO O SENSOR DE CORES RGB - APDS9960 - COM ARDUINO 2024, Julho
Anonim
Implementação de sensor de gesto APDS9960 sem bloqueio
Implementação de sensor de gesto APDS9960 sem bloqueio
Implementação de sensor de gesto APDS9960 sem bloqueio
Implementação de sensor de gesto APDS9960 sem bloqueio
Implementação de sensor de gesto APDS9960 sem bloqueio
Implementação de sensor de gesto APDS9960 sem bloqueio

Preâmbulo

Este Instructable detalha como criar uma implementação sem bloqueio do Sensor de Gestos APDS9960 usando SparkFun_APDS-9960_Sensor_Arduino_Library.

Introdução

Então você provavelmente está se perguntando o que é não-bloqueador? Ou mesmo bloqueando para esse assunto?

Mais importante, por que é importante ter algo que não bloqueie corretamente?

Ok, então quando um microprocessador executa um programa, ele executa sequencialmente linhas de código e, ao fazer isso, faz chamadas e retorna de funções de acordo com a ordem em que você as escreveu.

Uma chamada de bloqueio é apenas uma chamada para qualquer tipo de funcionalidade que causa a interrupção da execução, ou seja, uma chamada de função em que o chamador não retomará a execução até que a função chamada termine de ser executada.

Então, por que isto é importante?

No caso em que você escreveu algum código que precisa executar regularmente muitas funções sequencialmente, como ler uma temperatura, ler um botão e atualizar uma tela, se o código para atualizar a tela for uma chamada de bloqueio, seu sistema não responderá a pressionamentos de botão e mudanças na temperatura, já que o processador gastará todo o seu tempo esperando a atualização do display e não lendo o status do botão ou a temperatura mais recente.

De minha parte, quero criar um dispositivo de desktop IoT compatível com MQTT sobre WiFi que leia os valores de temperatura / umidade locais e remotos, níveis de luz ambiente, pressão barométrica, controle do tempo, exiba todos esses parâmetros em um LCD, registre em um uSD cartão em tempo real, ler entradas de botão, gravar em LEDs de saída e monitorar gestos para controlar coisas em minha infraestrutura IoT e tudo isso para ser controlado por um ESP8266-12.

Infelizmente, as únicas duas fontes da biblioteca APDS9960 que consegui encontrar foram as bibliotecas SparkFun e AdaFruit, ambas extraídas do código do aplicativo da Avago (fabricante do ADPS9960) e possuem uma chamada chamada ‘readGesture’ que contém um tempo (1) {}; loop que, quando usado no projeto acima, faz com que o ESP8266-12E seja redefinido sempre que o sensor ADPS9960 ficar saturado (ou seja, quando um objeto permaneceu próximo ou havia outra fonte de infravermelho iluminando o sensor).

Consequentemente, para resolver esse comportamento, optei por mover o processamento dos Gestos para um segundo processador em que o ESP8266-12E se tornou o microcontrolador mestre e este sistema o escravo, conforme ilustrado nas fotos 1 e 2 acima, nos diagramas Visão geral do sistema e Composição do sistema, respectivamente. A Figura 3 mostra o circuito do protótipo.

A fim de limitar as alterações que precisei fazer no meu código existente, também escrevi uma classe / biblioteca de wrapper com o nome criativo de ‘APDS9960_NonBlocking’.

O que se segue é uma explicação detalhada da solução sem bloqueio.

Quais peças eu preciso?

Se você deseja construir a solução I2C que funciona com a biblioteca APDS9960_NonBlocking, você precisará das seguintes partes.

  1. 1 off ATMega328P aqui
  2. 1 off PCF8574P aqui
  3. 6 resistores de 10K aqui
  4. 4 resistores de 1K desligados aqui
  5. 1 diodo 1N914 desligado aqui
  6. 1 off PN2222 NPN Transistor aqui
  7. 1 cristal de 16 MHz aqui
  8. 2 capacitores de 0,1uF aqui
  9. 1 capacitor eletrolítico de 1000uF aqui
  10. 1 capacitor eletrolítico de 10uF aqui
  11. 2 capacitores de 22pF aqui

Se você quiser ler a saída do sensor de gesto por meio da interface paralela, pode descartar o PCF8574P e três resistores de 10K.

Qual software eu preciso?

Arduino IDE 1.6.9

Quais habilidades eu preciso?

Para configurar o sistema, use o código-fonte (fornecido) e crie os circuitos necessários de que você precisará do seguinte;

  • Domínio mínimo de eletrônica,
  • Conhecimento do Arduino e seu IDE,
  • Uma compreensão de como programar um Arduino embutido (consulte Instructable 'Programando o ATTiny85, ATTiny84 e ATMega328P: Arduino como ISP')
  • Alguma paciência.

Assuntos abordados

  • Breve visão geral do circuito
  • Breve visão geral do software
  • Testando o dispositivo de detecção de gestos APDS9960
  • Conclusão
  • Referências

Etapa 1: Visão geral do circuito

Visão geral do circuito
Visão geral do circuito

O circuito é dividido em duas seções;

  • O primeiro é a conversão serial I2C para paralela realizada por meio dos resistores R8… 10 e IC1. Aqui, R8… R10 define o endereço I2C para o chip de expansão de E / S de 8 bits IC1 e NXP PCF8574A. Os intervalos de endereços válidos para este dispositivo são 0x38… 0x3F respectivamente. No exemplo de software I2C fornecido 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' precisaria ser alterado para se adequar a este intervalo de endereços.
  • Todos os outros componentes formam um Arduino Uno escravo embutido e têm as seguintes funções;

    • R1, T1, R2 e D1 fornecem uma entrada de reinicialização do dispositivo escravo. Aqui, um pulso alto ativo em IC1 - P7 forçará U1 a reiniciar.
    • R3, R4 são resistores limitadores de corrente para as linhas TX / RX de programação do dispositivo incorporado.
    • C5 e R7 permitem que o IDE do Arduino programe U1 automaticamente por meio de um pulso na linha DTR de um dispositivo FTDI conectado.
    • R5 e R6 são resistores pull up I2C para o APDS9960 com C6 fornecendo desacoplamento de trilho de alimentação local.
    • U1, C1, C2 e Q1 formam o Arduino Uno integrado e seu relógio, respectivamente.
    • Finalmente, C3 e C4 fornecem desacoplamento de trilhos de alimentação local para U1.

Etapa 2: Visão geral do software

Visão geral do software
Visão geral do software
Visão geral do software
Visão geral do software
Visão geral do software
Visão geral do software

Preâmbulo

Para compilar com sucesso este código-fonte, você precisará das seguintes bibliotecas extras para programar o Arduino Uno U1 embutido;

SparkFun_APDS9960.h

  • Por: Steve Quinn
  • Objetivo: Esta é uma versão bifurcada do Sensor SparkFun APDS9960 bifurcada de jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Ele tem algumas modificações para ajudar na depuração e tem um detector dessensibilizado para reduzir o acionamento espúrio.
  • De:

APDS9960_NonBlocking.h

  • Por: Steve Quinn
  • Objetivo: Fornece uma interface limpa para incorporar esta implementação sem bloqueio do Sensor de Gestos APDS9960 em seu código Arduino.
  • De:

Consulte o Instructable a seguir sobre como programar um microcontrolador Arduino Uno embutido (ATMega328P) se você não estiver familiarizado com a forma de fazer isso;

PROGRAMANDO O ATTINY85, ATTINY84 E ATMEGA328P: ARDUINO AS ISP

Visão Geral Funcional

O microcontrolador escravo embarcado ATMega328P controla a linha INT do ADPS9960. Quando esta linha fica baixa, o microcontrolador lê os registros ADPS9960 e determina se houve um gesto válido detectado. Se um gesto válido for detectado, o código para este gesto 0x0… 0x6, 0xF é colocado na Porta B e 'nGestureAvailable' é declarado baixo.

Quando o dispositivo Master vê 'nGestureAvailable' ativo, ele lê o valor na Porta B e então pulsa 'nGestureClear' baixo temporariamente para confirmar o recebimento dos dados.

O dispositivo escravo então desativa 'nGestureAvailable' alto e limpa os dados na Porta B. A figura 5 acima mostra uma captura de tela obtida de um analisador lógico durante um ciclo completo de detecção / leitura.

Visão geral do código

A Figura 1 acima detalha como o software em U1, o escravo embutido Arduino Uno funciona, junto com a Figura 2 como as duas tarefas de fundo / primeiro plano interagem. A Figura 3 é um segmento de código que descreve como usar a APDS9960_NonBlockinglibrary. A figura 4 fornece um mapeamento entre os pinos digitais do Arduino Uno e os pinos de hardware reais no ATMega328P.

Depois de reiniciar, o microcontrolador escravo integrado inicializa o APDS9960, permitindo que a detecção de gesto acione sua saída INT e configura sua E / S, anexando a rotina de serviço de interrupção (ISR) 'GESTURE_CLEAR ()' para interromper o vetor INT0 (pino digital 2, pino 4 do hardware IC), configurando-o para um gatilho de borda descendente. Isso forma a entrada nGestureClear do dispositivo mestre.

O pino de saída de interrupção 'INT' do APDS9960 é conectado ao pino digital 4, pino 6 do IC de hardware, que é configurado como uma entrada para U1.

A linha de sinal 'nGestureAvailable' no pino digital 7, pino 13 do IC de hardware é configurada como uma saída e definida como alta, inativa (desativada).

Finalmente, os bits 0 a 3 da porta B, respectivamente, são configurados como saídas e definidos como baixos. Estes formam o nibble de dados que representa os vários tipos de gestos detectados; Nenhum = 0x0, Erro = 0xF, Up = 0x1, Down = 0x2, Left = 0x3, Right = 0x4, Near = 0x5 e Far = 0x6.

A tarefa em segundo plano 'Loop' é agendada, que pesquisa continuamente a saída INT de interrupção do APDS9960 por meio da leitura do pino digital 4. Quando a saída INT do APDS9960 torna-se ativa baixa, indicando que o sensor foi acionado, o microcontrolador tenta interpretar qualquer gesto chamando 'readGesture () 'com ele enquanto (1) {}; loop infinito.

Se um gesto válido foi detectado, este valor é gravado na Porta B, a saída 'nGestureAvailable' é declarada e o semáforo booleano 'bGestureAvailable' é definido, evitando que qualquer outro gesto seja registrado.

Assim que o mestre detecta a saída ativa 'nGestureAvailable', ele lê esse novo valor e pulsa 'nGestureClear' ativo baixo. Esta borda descendente dispara a tarefa de primeiro plano 'ISR GESTURE_CLEAR ()' para ser agendada, suspendendo a execução da tarefa de segundo plano 'Loop', limpando a porta B, o semáforo 'bGestureAvailable' e a saída 'nGestureAvailable'.

A tarefa em primeiro plano 'GESTURE_CLEAR ()' está agora suspensa e a tarefa em segundo plano 'Loop' re-agendada. Outros gestos do APDS9960 agora podem ser detectados.

Ao usar tarefas de primeiro plano / segundo plano disparadas por interrupção desta forma, o loop infinito potencial em 'readGesture ()' do dispositivo escravo não afetará a operação do dispositivo mestre e também não impedirá a execução do dispositivo escravo. Isso forma a base de um sistema operacional de tempo real (RTOS) muito simples.

Nota: O prefixo 'n' significa ativo baixo ou afirmado como em 'nGestureAvailable'

Etapa 3: Testar o dispositivo de detecção de gestos APDS9960 sem bloqueio

Testando o dispositivo de detecção de gestos APDS9960 sem bloqueio
Testando o dispositivo de detecção de gestos APDS9960 sem bloqueio
Testando o dispositivo de detecção de gestos APDS9960 sem bloqueio
Testando o dispositivo de detecção de gestos APDS9960 sem bloqueio
Testando o dispositivo de detecção de gestos APDS9960 sem bloqueio
Testando o dispositivo de detecção de gestos APDS9960 sem bloqueio
Testando o dispositivo de detecção de gestos APDS9960 sem bloqueio
Testando o dispositivo de detecção de gestos APDS9960 sem bloqueio

Preâmbulo

Mesmo que o módulo APDS9960 seja fornecido com + 5v, ele usa um regulador + 3v3 integrado, o que significa que suas linhas I2C são compatíveis com + 3v3 e não + 5v. É por isso que escolhi usar o Arduino Due compatível com + 3v3 como o microcontrolador de teste, para evitar a necessidade de deslocadores de nível.

Se, entretanto, você deseja usar um Arduino Uno real, então você precisa mudar o nível das linhas I2C para U1. Consulte o Instructable a seguir, onde anexei um conjunto de slides útil (I2C_LCD_With_Arduino) que fornece muitas dicas práticas sobre o uso do I2C.

Teste de interface I2C

As fotos 1 e 2 acima mostram como configurar e programar o sistema para a interface I2C. Você precisará baixar e instalar a biblioteca APDS9960_NonBlocking primeiro. aqui

Teste de interface paralela

As fotos 3 e 4 detalham o mesmo para a interface paralela

Etapa 4: Conclusão

Conclusão
Conclusão

Em geral

O código funciona bem e detecta gestos responsivamente, sem falsos positivos. Ele está instalado e funcionando há algumas semanas agora como um dispositivo escravo em meu próximo projeto. Eu tentei muitos modos de falha diferentes (e também o fez o curioso moggie doméstico de Quinn) que anteriormente resultou em uma reinicialização de ESP8266-12, sem nenhum efeito negativo.

Possíveis melhorias

  • O óbvio. Reescreva a biblioteca do sensor de gestos APDS9960 para não bloquear.

    Na verdade, entrei em contato com a Broadcom, que me indicou um distribuidor local que prontamente ignorou meu pedido de suporte, apenas não sou SparkFun ou AdaFruit, acho. Portanto, isso provavelmente terá que esperar um pouco

  • Transfira o código para um microcontrolador escravo menor. Usar um ATMega328P para uma tarefa é um pouco exagerado. Embora eu inicialmente tenha olhado para o ATTiny84, parei antes de usar um porque senti que o tamanho do código compilado era um limite. Com a sobrecarga adicional de ter que modificar a biblioteca APDS9960 para trabalhar com uma biblioteca I2C diferente.

Etapa 5: Referências

Necessário para programar o arduino embutido (ATMega328P - U1)

SparkFun_APDS9960.h

  • Por: Steve Quinn
  • Objetivo: Esta é uma versão bifurcada do Sensor SparkFun APDS9960 bifurcada de jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Ele tem algumas modificações para ajudar na depuração e tem um detector dessensibilizado para reduzir o acionamento espúrio.
  • De:

Necessário para incorporar esta funcionalidade sem bloqueio em seu código Arduino e dar exemplos funcionais

APDS9960_NonBlocking.h

  • Por: Steve Quinn
  • Objetivo: Fornece uma interface limpa para incorporar esta implementação sem bloqueio do Sensor de Gestos APDS9960 em seu código Arduino.
  • De:

Sistema operacional em tempo real

https://en.wikipedia.org/wiki/Real-time_operating_system

Folha de Dados APDS9960

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

Recomendado: