O primeiro passo para o software são as rotinas para tratamento dos displays. Para o display de 4 dígitos eu já tinha encontrado uma biblioteca adequada (TM1637). Daí que eu resolvi fazer uma biblioteca equivalente para o display de 8 dígitos. O resultado está aqui.
O display de 8 dígitos utiliza um MAX7219, que é bastante simples de utilizar. A única rotina complicada é a escrita de números decimais. Como na rotina equivalente na biblioteca TM1637, ela suporta escrever um número qualquer de dígitos a partir de qualquer posição, com supressão ou não dos zeros à esquerda. Além disso, eu coloquei o tratamento de números negativos (necessário para a velocidade). Eu me atrapalhei um pouco no mapeamento dos dígitos nos registradores, mas após um par de horas cheguei à rotina abaixo:
void MAX7219Display::showNumberDec(long num, bool leading_zero,
uint8_t length, uint8_t pos)
{
uint8_t prim;
uint8_t aux[8];
bool showZero = leading_zero;
uint8_t i;
// Valida parâmetros
if (pos >= m_nDig)
pos = m_nDig-1;
if ((pos+length) > m_nDig)
length = m_nDig - pos;
// Trata números negativos
prim = MAX7219_DIG7 - pos;
if (num < 0)
{
num = -num;
write7219 (prim, SEG_G);
prim--;
length--;
}
// Gera os dígitos
for (i = 0; i < length; i++)
{
aux[i] = (uint8_t)(num % 10L);
num = num / 10L;
}
// Escreve os dígitos
for(i = 0; i < length; i++)
{
uint8_t dig = aux[length - i - 1];
if (!showZero && (dig == 0) && (i != (length-1)))
{
write7219 (prim - i, 0);
}
else
{
if (dig != 0)
showZero = true;
write7219 (prim - i, digitToSegment[dig]);
}
}
}
Uma vez tendo as rotinas de escrita nos displays, foi só adaptar o código que eu tinha feito para a segunda versão do Lunar Lander. O código final também pode ser baixado do github (aqui).
Ok, chega de conversa. O vídeo abaixo mostra o projeto em funcionamento, com um pouso sendo "habilmente" concluído.

Nenhum comentário:
Postar um comentário