quinta-feira, março 15, 2018

Franzininho: Treinador de Código Morse

Partindo para um projeto um pouco mais ambicioso, vamos ver o "Treinador de Código Morse". A ideia é simples: um botão é usado para entrar com texto em código Morse. A cada pressão um sinal sonoro é emitido num buzzer. Os caracteres reconhecidos são apresentados em um display LCD. Para conseguirmos implementar isto vamos ter que usar várias coisas interessantes.


Botão

Esta é a parte mais simples do projeto. O botão é ligado a uma entrada digital (P1) do Franzinho, a outra ponta é ligada ao terra. Ativando o "pull-up" interno, a entrada digital será lida em nível alto quando o botão estiver solto e nível baixo quando o botão estiver apertado.

Sinal Sonoro

Outra parte simples. Vamos usar um buzzer, que emite um sinal quando recebe alimentação. O único cuidado é que a corrente do buzzer é alta demais para ser fornecida diretamente pelo ATtiny. Por este motivo é usado um transistor; eu usei um 2N2222 mas qualquer transistor NPN de uso geral deve funcionar.

Display

Aqui está a parte principal do hardware. Vamos usar um display LCD alfanumérico, já falei bastante sobre este tipo de display no blog. O modelo específico que eu usei é um curioso (pode chamar de fofo?) display de 2 linhas de 8 caracteres. Ele se comporta de forma semelhante aos mais tradicionais displays de 2 x 16; devido ao tamanho o conector tem duas fileiras de 8 pinos ao invés de uma única de 16,

O principal problema deste tipo de display é que ele necessita de vários sinais de controle, o que não temos no Franzininho. A solução adotada foi usar um CI PCF8574 para expandir a nossa capacidade de saída digital.  Nós já vimos isto antes, integrado a um display 2x16 (eu segui as mesmas conexões).

O PCF8574 se conecta ao ATtiny pelo protocolo I2C. Também já falamos bastante sobre isto (por exemplo, aqui). É um protocolo que usa apenas dois sinais para interconectar vários dispositivos. Cada dispositivo escravo possui um endereço. Aqui eu tive uma pequena "dificuldade": perdi algum tempo até perceber que eu usei um PCF8574A ao invés de um simples PCF8574. Para a nossa aplicação (e a maioria delas) os dois são equivalentes porém o endereço é diferente (0x20 no 8574 e 0x38 no 8574A).

Para permitir conectar os múltiplos dispositivos, os drivers dos dispositivos I2C são do tipo "open colector": podem forçar o sinal em nível baixo ou deixa-lo livre. Para o sinal ficar em nível alto quando ninguém o aciona é necessário colocar pull-ups. Eu coloquei resistores de 47K, porém talvez os pullups internos do ATtiny sejam suficientes (acabei não testando devido à confusão com os endereços).

Um dos pinos do display é a tensão que define o contraste. Seguindo as recomendações do fabricante, liguei ao pino central de um trimpot de 10K com pontas em Vcc e Gnd. Não sei se é o meu display específico, mas foi preciso deixar bem próximo de uma ponta para conseguir ver os caracteres.

Por último, temos a questão do backlight. O PCF é capaz de fornecer a corrente necessária, mas temos problema com a tensão. O display que eu usei precisa de cerca de 4V (4,2V segundo o datasheet) para acender os LEDs do backlight. O Franzininho possui um diodo na entrada de alimentação, o que reduz a sua tensão de operação de 5V para 4,3V. Subtraia a perda interna do PCF8574 e o resultado é que o backlight não acende. Dependendo do display que você usar, pode ser possível controlar o backlight, neste caso coloque um resistor para limitar a corrente.

Circuito Completo

Software

Mais uma vez uma biblioteca padrão do Arduino não suporta o ATtiny. No caso, a biblioteca Wire (que implementa o I2C). Felizmente a Adafruit disponibiliza uma biblioteca compatível. Para o tratamento do display fiz uma adaptação direta do código Python que eu escrevi para o Raspberry Pi (e descobri que já não lembrava mais a sintaxe de classes do C++).

Com todos os blocos prontos, é só construir a aplicação. O código deste projeto (e dos anteriores) pode ser baixado do GitHub.

Operação

Ao ligar o circuito estamos no modo "Treino". Neste modo o software "aprende" a velocidade do operador; ele fica neste modo até você ficar 3 segundos sem apertar o teclado. Ao sair deste modo, a média dos três últimos apertos é considerada o tempo para o "ponto" do código Morse.

Por padrão, o tempo para um traço deve ser três vezes o tempo do ponto. O tempo entre os pontos e traços de um caracter deve ser igual ao tempo de um ponto (este foi o meu ponto fraco ao treinar). Ao final de uma letra deve ser dado o tempo de um traço e ao final de uma palavra deve ser dado o tempo de sete pontos.

Os pontos e traços vão sendo mostrados na linha inferior do display, até ser detectado o tempo entre caracteres. Os caracteres vão sendo mostrados na linha de cima do display.

O vídeo abaixo mostra o funcionamento.





Nenhum comentário: