quinta-feira, agosto 28, 2014

Lunar Lander Mark III - Software

No post anterior vimos o circuito e a montagem do Lunar Lander. Veremos agora alguns detalhes do software.


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: