Mensagem

"Sonhar mais um sonho impossível, lutar quando é fácil ceder, vencer o inimigo invencível, negar quando a regra é vender."
Miguel de Cervantes.

Gerando Tons DTMF com o Arduino

   A pedido, analisei brevemente o application note AVR314:DTMF Generator, da Atmel, que explica como usar um AVR para gerar tons DTMF. Pesquisando na rede encontrei alguns códigos que me auxiliaram. Dessa forma, fiz apenas uma organização e adequação desses programas para o ATmega328P do Arduino. Nao fiz nenhuma análise do sinal produzido, apenas um teste rápido para verificar o funcionamento do código.

   O programa foi desenvolvido em C no Atmel Studio e empreguei o meu Shield com teclado em conjunto com um buzzer para o teste

DOWNLOAD AQUI - DTMF_Generator

Técnicas de Multiplexação

   Neste post, algumas técnicas importantes de multiplexação são apresentadas. Elas são utilizadas para diminuir o número de componentes externos ao microcontrolador e/ou número de I/Os necessários. Trata-se de técnicas de multiplexação de sinais para emprego em displays, acionamento de conjuntos de LEDs (matriz e cubo) e outros dispositivos eletrônicos.
   Quando são necessários vários pinos de I/O para o acionamento de um determinado circuito e o microcontrolador não os dispõem, é fundamental o emprego da multiplexação: técnica para transitar com vários dados em uma mesma via ou barramento. A multiplexação também é empregada para diminuir o número de vias e pode diminuir a complexidade física das placas de circuito impresso. 
   A ideia da multiplexação é dividir as atividades no tempo, empregando o mesmo meio físico para isso. A desoneração do hardware é substituída por um aumento na complexidade do software de controle e no tempo de execução das tarefas. Entretanto, devido à considerável velocidade de processamento dos sistemas envolvidos, geralmente isto não é um problema. As melhores técnicas de multiplexação empregam o menor número possível de componentes externos para cumprir as funções que devem ser desempenhadas pelo hardware.
   A seguir disponibilizo o capítulo 11 do livro AVR e Arduino: Técnicas de Projeto. Existem outras técnicas de multiplexação que podem utilizar o conversor AD, o comparador Analógico, ou um sinal PWM de um microcontrolador, mas isso é um assunto para outra ocasião.


DOWNLOAD AQUI -> Técnicas de Multiplexação.



RTOS

   Este post trata de uma importante ferramenta de programação para desenvolvimento de projetos de mais alto nível, os sistemas operacionais de tempo real - RTOS, compatíveis principalmente com arquiteturas de 32 bits. Entretanto, com o desenvolvimento de novos firmwares e com a maior disponibilidade de memória, os microcontroladores de 8 bits podem suportar sistemas operacionais mínimos e ainda apresentar desempenho satisfatório. A utilização de um RTOS se justifica pelas facilidade de programação, permitindo a solução de problemas complexos, difíceis de tratar com a programação convencional. Assim, com algum sacrifício de desempenho, pode-se utilizar um RTOS em um microcontrolador de 8 bits. O uso de um RTOS com esses microcontroladores não é usual dado a limitação da CPU. Todavia, é possível utilizar sistemas mínimos que podem produzir desempenho satisfatório dependendo dos tempos de acionamento e processamento necessários para uma determinada tarefa.
   A seguir disponibilizo o capítulo 21 do livro AVR e Arduino: Técnicas de Projeto, utilizando o BRTOS para o ATmega328. Esse capítulo formaliza as definições e traz exemplos de uso da programação C com o ATMEL Studio.


DOWNLOAD AQUI ->  RTOS


O Importantíssimo Trabalho com Bits

   A programação de um microcontrolador exige o bom trabalho com bits. Dessa forma, a otimização do programa pode ser feita em qualquer acesso aos registradores de I/O (trabalho). 
   Quando se programa em C é fundamental conhecer como trabalhar com bits, assim estou disponibilizando o material básico que utilizo com meus alunos, parte do capítulo 4 do livro AVR e Arduino: Técnicas de Projeto, (O Importantíssimo Trabalho com Bits).
   Em resumo são 4 macros: set_bit( ), clr_bit( ), cpl_bit( ) e tst_bit( ). O compilador GCC para o AVR faz um bom trabalho com elas e gera o menor número de instruções Assembly possível.
   A programação microcontrolada também exige o uso direto de registradores com mascára de bits, conforme lógica de programação. Isto é visível nos programas disponibilizados no livro supracitado. Por exemplo: PORTD |= 0x0F  preserva os 4 MSBs do PORTD e ativa somente os 4 LSBs. Ao contrário de PORTD &=0x0F, que limpa os 4 MSBs. 
   Dependendo da lógica necessária, podem ser necessárias várias funções lógicas para alterar um determinado bit/conjunto em um registrador/variável.

Teclado Matricial

   Uma forma muito comum de entrada de dados em um sistema microcontrolado é através de teclas (botões ou chaves tácteis). Quando o número delas é pequeno, cada uma pode ser associada a um pino de I/O do microcontrolador. Entretanto, quando o seu número é grande, não é conveniente utilizar muitos pinos de I/O. Um teclado convencional emprega 3 × 4 teclas (12) ou 4 × 4 teclas (16) (fig. 1). Ao invés de se empregar 12 ou 16 pinos para a leitura desses teclados, empregam-se 7 ou 8 pinos, respectivamente.


Fig. 1 – Teclado matricial hexadecimal: 4 × 4.

   Para a leitura de teclados com várias teclas, é necessário empregar o conceito de matriz, em que os botões são arranjados em colunas e linhas, conforme é mostrado na fig. 1; o teclado é lido utilizando-se uma varredura. O pressionar de uma tecla produzirá um curto-circuito entre uma coluna e uma linha e o sinal da coluna se refletirá na linha ou vice-versa. A ideia é trocar sucessivamente o nível lógico das colunas, a chamada varredura, e verificar se esse nível lógico aparece nas linhas (ou vice-versa). Se, por exemplo, a varredura for feita nas colunas e houver alteração no sinal lógico de alguma linha, significa que alguma tecla foi pressionada e, então, com base na coluna habilitada, sabe-se qual tecla foi pressionada. Nesse tipo de varredura, o emprego de resistores de pull-up ou pull-down nas vias de entrada é fundamental, visto que para a leitura as entradas sempre devem estar em um nível lógico conhecido. Na fig. 2, dois teclados com resistores de pull-up e pull-down são ilustrados, onde o sinal de varredura é aplicado às colunas, as saídas do sistema de controle.

Fig. 2 – Teclados com resistores de pull-up (a) e pull-down (b) para as entradas do sistema de controle. A varredura é feita nas colunas.

   Nos microcontroladores ATmega, a conexão de um teclado é facilmente obtida, pois existem resistores de pull-up habilitáveis em todos os pinos de I/O. Assim, um possível circuito para o trabalho com um teclado é apresentado na fig. 3. Um código exemplo de uma função para leitura desse teclado pode ser encontrado nos programas do meu livro (aqui neste post).

Fig. 3 – Teclado 4 × 4 controlado pelo ATmega328.

Obs.: Este material foi adaptado do capítulo 8 do livro AVR e Arduino: Técnicas de Projeto. 

Fonte Analógica de Tensão

Este é o projeto de um fonte linear simples, baseada em circuitos integrados reguladores para uma corrente máxima de 1A. São empregados os CIs 7805, 7812, 7912 e LM317, para as tensões respectivas de: 5V, 12V, -12V e variável. Na montagem da PCI os reguladores podem ser empregados conforme conveniência, por exemplo, se desejado, a fonte pode ter somente uma saída de tensão ajustável. Nesse caso, é necessário utilizar os componentes para essa regulagem de tensão.

Downloads: circuito, lista de componentes, PCI_botton (pdf), PCI_silk (pdf) e PCI_completa (gerber).

As fotografias da montagem podem ser vistas abaixo. Foi complicado colocar todos os componentes na caixa patola, principalmente os dissipadores de calor. A furação e adequação da caixa aos diferentes componentes também foi bastante trabalhosa. 

Deve-se tomar cuidado na montagem dos dissipadores, pois os reguladores 7912 e LM317 não possuem sua carcaça metálica ligada ao terra, o que exige o uso de isoladores entre eles e o dissipador de calor.

Para evitar torções desnecessárias e possível quebra, na montagem é interessante realizar a solda dos fios na posição que ficarão dentro da caixa. O uso de "espaguete" termo retrátil ajuda na organização da fiação.

Utilizei um galvanômetro para a visualização da tensão variável. Para limitar a corrente do galvanômetro empreguei uma resistência de 30kOhms em série com um dos seus terminais. Foi necessário desenhar a escala conforme posição do potenciômetro de ajuste.

 Montagem da PCI com detalhe dos dissipadores.

 Vista áerea do cabeamento do transformador.
 PCI, chave ON/OFF e conectores 12V e -12V.
 PCI fixada.

 Vista do cabeamento, abaixo da PCI.
 Ligação dos terminais frontais (5V e variável).
 Já com o LED sinalizador montado.
 Com o porta fusível.
Com o galvanômetro.
Gran Finale.



 
Faltaram os pézinhos de silicone e os rótulos das tensões. Fica para segunda-feira.


Programação C para Arduino

Na data de 26/05/2013 fiz uma breve introdução à programação C para Arduino no The Developer´s Conference (TDC2013), aqui em Florianópolis. A apresentação é apenas um indicativo do que foi falado. Download na figura abaixo.



uGame

   Este projeto foi desenvolvido para a programação básica de jogos, foi baseado em um projeto que encontrei em um site japones (http://nicotak.com/avr/ledgame.html). O hardware emprega 4 matrizes de 8x8 LEDs (pixel quadrado) e o 74HC595 para a expansão de I/O, o circuito pode ser visto aqui. Infelizmente a placa de circuito impresso foi desenvolvida com um erro na posição das matrizes de LEDs (tenho certa culpa no processo). Dessa forma, necessitei fazer uma placa de correção. Assim, não estou disponibilizando o seu desenho (se alguém o desejar, é só me escrever).

   Fiz um programa básico onde realizo a varredura da matriz de LEDs dentro de uma interrupção do timer do ATmega328 (microcontrolador utilizado), o que resultou em torno de 750 bytes de programação.

   A matriz de LEDs é mapeada no programa por um vetor de 16 posições com 16 bits cada (unsigned int), o que permite a qualquer momento escrever em qualquer pixel da matriz. Por incrível que possa parecer, dada a estrutura da matriz, utilizar variáveis de 16 bits em detrimento as de 8 bits (no caso do ATmega), resultou em um código mais eficiente.

   Também fiz algumas rotinas de som, o que permite tocar algumas notas músicais de forma simples.

   Como gosto de aproveitar o hardware, acabei incluindo um sensor de tempertura (LM35). Dessa forma, utilizo um filtro de média móvel de 64 amostras para a suavização da leitura.

   O programa demo é quase uma pintura, pelo menos nas funcionalidades básicas, vale a pena analisá-lo (download aqui).

   Desenvolvi o jogo da cobra, adaptação daquele antigo jogo de celular onde uma cobrinha vai comento os pixels e aumentado de tamanho. Nessa parte da programação, a coisa já ficou mais confusa e menos otimizada. Criei um vetor que armazena as coodenadas XY da cabeça da cobra a cada passo e permite aumentar e movimentar a cobra. No vídeo abaixo é possível ver a funcionalidade do jogo.

   Em resumo, a necessidade de desenvolver algoritmos diferentes de acordo com o jogo é bem desafiadora, e sem dúvida, é necessário um bom projeto para um jogo bem programado. 

   Um aprendizado dessa brincadeira: quanto mais elegante forem as funcões desenvolvidas, mais fácil é criar o restante da programação, a lógica do jogo.

video