quinta-feira, novembro 16, 2017

Raspberry Pi Zero W como Controlador - Parte 2

Concluindo o post anterior, vamos ver como foi implementar o Dispensador de Doces (que eu já implementei com Arduino e ESP8266) com o Raspberry Pi Zero.



Acesso a Email

No ESP8266 eu enviei na raça os comandos POP3 para verificar os emails recebidos. Uma dificuldade é que os serviços atuais de email exigem o uso de SSL, que a pilha TCP/IP do ESP não suporta. A solução foi um amigo disponibilizar um servidor temporário de email "desprotegido" ligado à internet. Com o Raspberry Pi a coisa fica (um pouco) mais simples, o suporte completo a SSL está presente e existem vários tutorias de como acessar email usando bibliotecas Python (e outras linguagens).

Inicialmente eu escolhi a biblioteca gmail, mas ela não funcionou bem com o servidor de email que eu estou usando. O jeito foi "abrir o capô" e trabalhar no nível inferior, a biblioteca padrão imaplib. Isto exigiu conhecer um pouco os comandos IMAP (aqui tem um referência boa). Deu para otimizar um pouco e buscar somente o cabeçalho da mensagem mais atinga ainda não lida.

Controle de um Servomotor

A posição do servomotor é determinada pela largura de pulsos. Tipicamente os extremos correspondem a larguras em torno de 0,6 e 2,4 milisegundos (fonte). A precisão do posicionamento depende da precisão em gerar pulsos entre estes extremos.

No Arduino e no ESP basta usar a biblioteca padrão. No Arduino pode ser usado o PWM para gerar sinais bastante precisos. No caso do ESP a implementação é um pouco precária, mas funciona de forma satisfatória.

No Raspberry Pi a história é mais complicada. Em apenas dois pinos é possível gerar PWM por hardware (GPIO12 e GPIO18), e eles são também usados para gerar áudio no Raspberry 1, 2 e 3.  A biblioteca WiringPi gera PWM pulsando manualmente um pino de GPIO, a precisão obtida é da ordem de 0,1 ms. Ou seja, você terá aproximadamente 18 opções de posição. A biblioteca RPIO.PWM comanda o pino de GPIO via DMA, obtendo uma resolução de 0,001 ms, mas tem alguns problemas. No final eu usei o servoblaster, que é uma aplicação específica para controle de servos.

Mais detalhes sobre esta saga no meu próximo post.

Conexão do Display
Aqui também existem algumas complicações, mas já falei nelas antes. Resumindo, quem irá controlar o I2C é um driver, que precisa ser habilitado na configuração do Raspbian.

Hardware

Dependendo do seu nível de paranoia e dos seus componentes, você pode ligar diretamente o servo e o display no conector do Raspberry Pi. Puristas vão querer colocar MOSFETs na ligação do display (como descrito nos links acima). O caso do servo é um pouco mais delicado.

Em teoria o sinal de controle do servo deveria ter pulsos de 5V, mas parece aceitar tranquilo pulsos de 3,3V. Existe o medinho de dar algo errado e voltar 5V pelo fio de controle, por segurança pode-se colocar um resistor em série. Eu fiz isto (usei um resistor de 1K), pois num passado distante eu tive dois PICs danificados quando conectados a um "servo de parabólica". O segundo problema é a alimentação do servo. Quando você conecta ou move o servo, ocorre um pico de corrente que pode derrubar momentaneamente a tensão de alimentação e ressetar o Raspberry. O ideal era ter uma alimentação separada para o servo, mas a montagem fica muito mais compacta alimentando o servo direto do conector do Rasp. A solução foi colocar um capacitor em paralelo com a alimentação do servo (no meu caso, 2200uF x 25V), para ele "segurar o tranco".

Resultado

O software final pode ser baixado de https://github.com/dquadros/RPiDispenser. Como pode ser visto no vídeo abaixo, no final funcionou satisfatoriamente. A conclusão é que o Raspberry é ótimo para desenvolver a parte de comunicação com internet, bem satisfatório na comunicação via I2C e SPI, mas complicado se você precisar usar entrada e saída digital com tempos precisos.



Nenhum comentário: