24 de setembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

O melhor bootloader no Atmega328PB

bootloader no Atmega328PB

Esse artigo é só coisa empolgante! Além de vermos aqui o melhor bootloader no Atmega328PB, vamos ver características importantes que estão inclusas nessa MCU com “B” de “Boa”!

Não quero ser fofoqueiro, mas já tem uma série de placas com essa MCU sendo produzidas no Brasil. Em breve devo fazer artigos com elas e, meus caros, que placas LINDAS! LINDAS!!! Só eu vi!!! Mas para esse artigo estou usando um Arduino Pro Micro com a Atmega328PB. Acompanhe até o final.

Atmega328PB vs Atmega328P

Vamos começar pelo lado “não Bom”. Essa MCU não tem formato DIP. Daqui pra frente tudo é bom!

Ela possui 10 PWM, 2 UARTS (como o Atmega32u4), 2 SPI e 2 I2C. Só isso já justifica uma mudança, hum? O Número de pinos da MCU é a mesma da 328P SMD, mas conta com alguns IO a mais; 27 I/Os. Um monte de características técnicas são importantes, mas não fundamentais para quem quer apenas usar uma placa com essa MCU.

MiniCore: E o melhor bootloader no Atmega328P

Que tanta importância pode ter um bootloader a não ser entregar um acesso pela porta USB, não é mesmo? – Não, não é só isso. Uma das características importantes de um bootloader é seu tamanho, afinal, ele ocupará espaço que poderia ser usado pelo nosso programa. Mas o MiniCore não é só isso; trata-se de um conjunto core + bootloader.

O Minicore utiliza uma versão customizada do Optiboot, que já é um bootloader pequeno, mas adicionalmente o MiniCore adicionou funcionalidades.

Para usar o MiniCore é nercessário estar com uma IDE atualizada do Arduino. No momento desse artigo, a versão 1.8.5. Deve funcionar normalmente na versão 2.0 também, mas não quis iniciar os testes por ela porque precisava comprovar o funcionamento sem inserir problemas que pudessem ofuscar o processo.

MCUs suportadas

Esse bootloader é compatível com outras MCUs também, sendo o ATmega8, 48, 88, 168 e 328, em todas suas variantes: A, P, PA e PB.

Porta de upload

Com o MiniCore podemos escolher qual das duas portas usar para upload. Deixei a 0 por padrão, mas é muito interessante para quando colocar uma placa com essa MCU em campo, dando acesso a uma porta serial que só permite leitura, para o caso de necessitar monitoramento.

Brown Out Detection

Para evitar que uma MCU queime quando houver queda de tensão, podemos programar seu desligamento através do BOD. O MiniCore oferece essa opção pelo menu Ferramentas da própria IDE do Arduino!

LTO

O Link Time Otimization faz uma redução do código. Usando o MiniCore, mesmo sem gravar o bootloader, é possível fazer uso desse recurso.

printf

Talvez ainda não tenha ficado claro, mas o MiniCore não é apenas o bootloader; é uma caixa de surpresas que oferece recursos úteis como os citados acima. Além disso, temos o printf, que dá muito mais flexibilidade com a comunicação serial. Não será mais necessário compilar a mensagem antes de imprimir, nem imprimir parte em uma linha e parte em outra linha! O lado negativo é que ela não imprimirá floats ou doubles.

Um exemplo simples de uso serial algo como:

int count = 0;
for (uint8_t i=0;i<10;i++){
    Serial.printf("O valor de 'i' agora: %d\n",i);
    count++;
}

A macro F() também continua disponível.

Optiboot e a flash

O MiniCore utiliza o Optiboot como bootloader. Ele permite escrita na flash pela aplicação, então invés de usar EEPROM podemos escrever diretamente na flash, que é muito mais rápida! Esse é um exemplo de uso.

Como instalar o MiniCore

Para instalar o Minicore e o melhor bootloader para o Atmega328PB, o primeiro passo é adicionar a URL ao gerenciamento de placas, clicando em Arquivo > Preferências e colocando essa URL:

https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json

Depois abra Ferramentas > Placa > Gerenciador de Placas e procure por MiniCore. Instale-o.

Para usar com Atmega328PB é necessário ter a a última versão do toolchain do Arduino. Para garantir que a sua está devidamente atualizada, repita o processo para acessar o Gerenciador de Placas e procure por Arduino AVR Boards. Se houver versão mais atual, atualize.

Gravador para instalar o bootloader no Atmega328PB

Tem diversos gravadores diferentes. Eu usei um USBASP. Na Saravati tem outro modelo. Se tiver um Arduino UNO sobrando, pode usar como gravador temporário. Não se preocupe, ele só fará papel de bridge, a gravação será no dispositivo após ele, seguindo o artigo “Dois modos de gravar o bootloader no Atmega328“. Esse artigo será fundamental se for gravar o MiniCore porque ele tem a definição certinha do wiring, que servirá para qualquer placa. O wiring no Arduino Pro Micro fica assim:

Essa imagem é um Ctrl+Chups. Google Images é ótimo pra isso sempre que preciso de uma referência por imagem, não deixe de experimentar.

Configuração de parâmetros na IDE do Arduino

Comece por uma configuração mais certeira. Deixe o menu desse jeito:

No submenu Placa: “ATmega328”, a seleção deve ser feita no submenu MiniCore. A porta não aparece porque está conectado um gravador USBASP. Tendo feito o wiring devidamente, agora basta clicar em Gravar Bootloader. Se a gravação der certo, você verá o LED piscar 2 vezes em um segundo, com intervalos próximos. No vídeo será mais fácil visualizar essa parte.

Tendo gravado o bootloader, agora pode seguir o método padrão, usando a porta USB ou um adaptador FTDI para gravar o sketch, clicando em Upload.

Compatibilidade com o core Arduino padrão

O MiniCore segue o mesmo padrão do Arduino UNO e não haverá problemas com bibliotecas, fique tranquilo. A diferença será os GPIO adicionais, PB6 e PB7 – que certamente não serão usados na maioria dos projetos. O pino de reset pode ser usado como IO também, assinado como pino 22 (PC6).

Um esquemático mínimo para a Atmega 328PB (e outras):

Vídeo do bootloader no Atmega328PB

Como de costume, o artigo sai primeiro. Assim que editar o vídeo relacionado, estará disponível em nosso canal DobitaobyteBrasil no Youtube. Se não é inscrito ainda, inscreva-se como sinal de apoio ao blog e principalmente ao canal, que ainda é extremamente humilde.