Fagner Souza: Protótipo de Placa de Sensores e LEDs: Hardware e Firmware
Protótipo de Placa de Sensores e LEDs: Hardware e Firmware
Olá leitores. Hoje trago um projeto simples de placa de sensores e leds, baseado na plataforma Arduino. O bacana desse projeto é que ele pode servir de base para exercitar vários dos conceitos que utilizamos na automação bancária. Por exemplo, podemos criar um device driver para controlar essa placa, e depois podemos criar um service provider implementando a classe SIU do XFS.
Antes de falar sobre o projeto, vou falar um pouco sobre a plataforma Arduíno. Aqueles que gostam de eletrônica certamente já ouviram falar de Arduíno. Trata-se de uma plataforma para prototipagem de projetos de eletrônica, muito utilizado também por entusiastas do "faça você mesmo". O Arduíno é open source e é fácil. Existe uma infinidade de versões de placa Arduíno, originais e compatível, que variam basicamente em relação a quantidade de entradas e saída que a placa pode controlar. Também existe uma infinidade de módulo de hardware, como sensores, motores DC e outros tipos de atuadores, que você acopla a sua placa Arduíno facilmente. Na parte da programação, existem muitas bibliotecas prontas que você pode reutilizar, e que vão auxiliá-lo na codificação do seu firmware, usando o compilador do Arduíno que é simples e bem intuitivo. Talvez a versão de placa Arduíno mais comum seja a Arduíno Unon da imagem a seguir. Essa é, inclusive, a versão de placa utilizada no nosso projeto.
Existem placas Arduíno originais (como essas da imagem) e existem também aquelas que são compatíveis. Como se trata de um projeto open source, qualquer pessoa um pouco mais hábil em eletrônica pode criar a sua própria "construção" de placa Arduíno. Assim, existem na Internet uma infinidade de placas compatíveis. Pode haver algumas variações de qualidade dos materiais e até mesmo em formato dos conectores, mas as placas compatíveis tem basicamente as mesmas capacidades da placa Arduíno original. Geralmente elas são mais baratas, então a escolha vai de cada um. Eu, por exemplo, preferi comprar a versão original até como uma forma de incentivo ao projeto Arduíno. Dai que minha placa é original e enviada direto da Itália.
Pois bem, abaixo exibo o esquema da placa de sensores e leds, mas antes de prosseguirmos fica um alerta: sou apenas um simples entusiasta de eletrônica, não um engenheiro eletrônico. Então, me perdoem por eventuais faltas de otimazação nesse circuito. O conceito desse esquema é servir a um Terminal de Consulta (kiosk), dotado de uma porta (para acesso ao micro, impressora e demais dispositivos), uma leitora de cartões, uma impressora térmica, sinalização luminosa e sonora, sensoriamento de luz, temperatura e nível.
A esquerda do esquema vemos a placa Arduino Uno. O projeto poderia ser feito com outras placas Arduino, inclusive com as versões menores como a Arduino Nano. Eu escolhi a Arduino Uno porque é esse o modelo que tenho em casa. Os demais componentes do projeto são:
Leds: o objetivo desses leds é a sinalização para o usuário. Nesse projeto, eu considero que um desses leds é para indicar a inserção de cartão na leitora e o outro para indicar a saída de papel na impressora térmica;
Buzzer: sinalização sonora para o usuário. Por exemplo: podemos soar um alarme caso a porta do cofre seja aberta sem a devida autenticação no sistema, ou podemos simplesmente chamar a atenção do usuário para uma ação requerida da parte dele. Podemos variar a intensidade do som que é emito pelo Buzzer, logo esse componente trabalha com valores contínuos, em uma escala que sai de 31 e vai até 65535, para a placa Arduino Uno;
Button Switch: o papel desse componente é indicar porta do cofre ou gabinete aberto ou fechado. Esse componente portanto, só pode assumir dois valores: aberto ou fechado;
Resistores: o papel desses componentes no circuito é evitar que os leds se queimem ou que haja curto circuito na placa, no caso do resitor ligado ao Button Switch;
Potenciômetro: permite configurar a sensibilidade do sensor de temperatura. Em outras palavras, indica a partir de qual temperatura o sensor deve alarmar;
Sensor de Temperatura: indica a temperatura ao redor de um ponto. Esse sensor poderia estar espalhado pelo o equipamento em série, para indicar, por exemplo, tentativas de arrombamento com maçarico; Esse sensor pode ser configurado com um resistor ou potenciômetro, para alarmar somente quando a temperatura atingir um certo limite. Portanto, os valores fornecidos por esse sensor partem de um valor mínimo e vão até o limite máximo, que depende das características físicas do sensor. Normalmente consultamos o datasheet do modelo/fabricante do componente para obter esse tipo de informação;
Sensor de Nível: indica se houve uma inclinação. Portanto, esse sensor fornece os valores: nivelado ou inclinado;
Sensor de Luz: indica a incidência de luz em um ponto. Esse também é um sensor que fornece valores de mínimo e máximo de acordo com o limite fisico do sensor, definido pelo modelo/fabricante;
LCD: esse é um componente acessório no circuito. Eu o inclui apenas para mostrar os dados de entrada e saída da porta serial. Ou seja, o uso desse componente é complemente opcional;
Eu mantenho esse projeto no site AUTODESK 123D CIRCUITS. Esse site permite criar e simular circuitos Arduino, incluindo a parte do firmware. O link para o projeto da placa é esse: Sensor and LED's Board. É uma plataforma colaborativa também. Então, se quiserem fazer modificações, fiquem à vontade.
Segue abaixo um trecho do código fonte para controlar o firmware dessa placa. Trata-se de um código em C\C++ padrão Arduíno, e de fácil leitura. Quando falo firmware, me refiro ao software embarcado no microcontrolador da placa Arduino. É ele que permite controlar as entradas e saídas da placa de acordo com as necessidades do projeto. Cada pino de entrada ou saída recebe uma identificação no código. Dependendo do tipo de pino, você pode usar comandos de leitura ou aplicar uma tensão (ligar) algum componente conectado ao pino. O Arduino inclusive oferece algumas bibliotecas prontas para você fazer isso de forma mais facilitada e de acordo com o componente que estiver conectado nos pinos. LiquidCrystal.h é um exemplo de biblioteca Arduino para controle de LCD. Um firmware Arduíno tem basicamente a seguinte estrutura, conforme exemplo abaixo:
As funções setup() e loop() são obrigatórias. A função setup() é executada durante o carregamento do firmware e ocorre somente uma vez para cada carregamento, seja quando a placa é ligada ou quando é resetada. É um bom local para inicialização de variáveis e configurações em geral, já que será executado apenas uma vez. No exemplo acima, eu estou configurando os pinos que estarei utilizando, indicando quais serão pinos de entrada e quais serão de saída. Configuro também a velocidade da comunicação Serial e o tamanho do LCD que está acoplado a placa Arduíno; A função loop() será executada eternamente em laço, ou seja, assim que ela terminar sua execução, o microntrolador a executará novamente desde o início. Portanto, é nessa função que a inteligência do firmware deverá ser programada. No exemplo acima, eu verifico se há dados disponiveis na porta serial e os leio. Depois disso utilizo sub-funções (não exibidas ai nesse exemplo), para processar o dado recebido na porta Serial. Por fim, eu escrevo no LCD todas essas informações e finalizo o loop processando tarefas que estiverem pendentes. O firmware desse projeto foi programado para responder a seguinte lista de comandos:
Comando "S": comando de leitura do status dos sensores. A resposta é uma String no formato "Sddddd", onde 'd' pode ser 0 ou 1, de acordo com o estado do sensor. Para os sensores de valores contínuos como o sensor de temperatura e luz, foi configurado um valor limite para considerar quando a resposta deve variar entre 0 e 1;
Comando "LCd": comando para ligar/desligar LED da leitora de cartão. A posição 'd' pode ser 0, para desligar, 1 para ligar ou 2 para ligar piscante;
Comando "LPd": comando para ligar/desligar LED da impressora térmica. A posição 'd' pode ser 0, para desligar, 1 para ligar ou 2 para ligar piscante;
Comando "Ad": comando para ligar/desligar BUZZER. A posição 'd' pode ser 0, para desligar, 1 para ligar ou 2 para ligar alarme;
Acessando o projeto "Sensor and Led's Board" você consegue visualizar o código completo do firmware. Você consegue também executar e simular esse projeto, para exercitar esses comandos e o comportamento dos sensores e atuadores previstos no projeto. Basta cliclar em "Start Simulation", para que o circuito seja "ligado":
Clicando em "Code Editor" você tem acesso ao código fonte e também ao "Serial Monitor":
Por meio do "Serial Monitor" você pode simular o envio de dados na porta serial da placa. Basta digitar um texto e clicar em "Send". Com isso, você envia as Strings dos comandos mencionados anteriormente para ver o circuito ganhar vida. Exemplo: envie "S" para obter os status dos sensores. Envie "A2" para ouvir o BUZZER alarmar, e "LC1" ou "LP1" para ligar um dos LEDs. Se você tiver esses componentes em casa e uma placa Arduino, você pode também baixar o código fonte do firmware nesse mesmo link e instalá-lo no seu Arduino e dai fazer o teste no teu próprio hardware.
Com esses comandos básicos essa placa permite criar, por exemplo, um Service Provider XFS, que poderia ser facilmente integrado em uma aplicação FrontEnd para um Terminal de Consulta (kiosk). Para isso, basta primeiro criar um Device Driver para controlar essa placa. Ou seja, uma interface de comandos de alto nível que possam ser mais facilmente integradas em outro software. Poderiamos ter nesse Device Driver apenas duas funções públicas:
String readSensor();
void setIndicator(int indicatorID, int indicatorValue)
Com um device driver pronto, basta escrever um Service Provider XFS da classe SIU (Sensors and Indicator Unit Device), cuja especificação está contida no documento CWA 10 de cada versão da especificação XFS. Essa especificação pode ser baixada aqui, na sua versão mais recente: CWA 16926-10.