terça-feira, junho 11, 2013

Painel de Controle Microcontrolado: Programação

Ao final da montagem (vista no post anterior da série), o resultado foi um belo peso de papel. Para "dar vida" ao painel é preciso programar o microcontrolador.


O primeiro passo foi gravar no microcontrolador o bootloader do Arduino, juntamente com o exemplo Blink, com o auxílio de um UsbTinyISP:
  • Carreguei a aplicação Blink em um Arduino Uno.
  • Retirei o ATmega do Uno e usei o UsbTiny para ler a sua memória Flash e salvar em um arquivo no PC.
  • Liguei ao UsbTiny um ATmega novo, gravei a Flash lida e programei os fuses com os valores usados no Arduino.
Colocando este ATmega no painel, tive o prazer de ver um dos LEDs da barra piscando alegremente a cada 1 segundo.

O teste seguinte foi exercitar todos os LEDs, o buzzer e o botão. Exceto pelos LEDs ligados ao 74HC595 e ao botão, bastou copiar a sequência usada no Blink, alterando o pino utilizado (observando a correspondência entre os pinos do ATmega e a numeração usada nas bibliotecas do Arduino e lembrando que os pinos A0 a A5 podem ser usados como pinos digitais 14 a 14).

O uso do 74HC595 é simplificado pela existência da função ShiftOut no Arduino:
// Acende/Apaga os LEDs da barra conforme um valor
void barraLeds (int val)
{
  shiftOut (shiftData, shiftClk, MSBFIRST, val & 0xFF);
  digitalWrite (shiftReg, HIGH);  
  digitalWrite (shiftReg, LOW);
  digitalWrite (ledBar8, (val & 0x100) ? HIGH : LOW);
  digitalWrite (ledBar9, (val & 0x200) ? HIGH : LOW);
}
O botão também não requer grandes códigos:
// Iniciação em setup()
  pinMode (botaoReset, INPUT);
  digitalWrite (botaoReset, HIGH);

// Testa se botão apertado
  if (digitalRead (botaoReset) == LOW)
  {
    // botão está apertado
  }

O resultado final esta nos arquivos do blog, em PC1.zip.

É chegado o momento de fazer a aplicação propriamente dita. O código não é muito sofisticado. Usa e abusa do random (por enquanto sem iniciar a semente para permitir repetir o comportamento durante os testes):
  • Ao ligar, aciona em ordem sequência os LEDs de "alimentação". O LED da "refrigeração" é aceso na cor verde.
  • Os LEDs de "processamento" e "ocupado" são piscados continuamente de forma aleatória.
  • O LED de "heartbeat" varia continuamente de intensidade (aproveitei aqui o código do exemplo ArduinoISP)
  • Os LEDs de "temperatura" são acesos progressivamente até a metade da barra e depois oscilam ligeiramente.
  • O painel fica neste comportamento "normal" até ocorrer (aleatoriamente) uma falha. Isto é sinalizado acendendo o botão de "falha" e mudando o LED de "refrigeração" para vermelho.
  • A partir daí a "temperatura" vai subindo. Atingido um certo nível, o LED "perigo" é aceso.
  • Ao atingir a "temperatura" máxima, o LED "pânico" acende e o buzzer é acionado.
  • O painel permanece assim até que o botão de "reset" seja apertado, voltando ao comportamento "normal".
O código está em PC2.zip, o vídeo abaixo mostra a sequência descrita:


Nenhum comentário: