Sopa de pedra
e configurando o AVRDUDE no Atmel Studio:
Tópicos:
1- Introdução,
2- Para saber mais,
3- Sopa de pedra,
4- AVRDUDE no Atmel Studio
5- Finalizando
Se você curtir esse artigo, não esqueça de dar uns cliques nos anúncios para ver o que os anunciantes tem para te oferecer. Vou ficar muito contente.
1- Introdução:
Este artigo irá abordar aspectos finais da importação do projeto Arduino para o Atmel Studio, como utilizar a solução importada para desenvolver um novo código, usando no caso o modelo ‘Blink’ como template para desenvolver o projeto ‘Controle_LCD’. Será apresentado como renomear um projeto e como configurar o AVRDUDE para fazer o upload no Arduino do código compilado no Atmel Studio.
Quem está acompanhando a série ‘Arduino no Atmel Studio 7’ viu na parte 1 e na parte 2 como se faz para importar um projeto Arduino no Atmel Studio tendo por base o projeto ‘Blink’ do Arduino.
Também entrou em contato com o conceito de ‘Solução’ cuja proposta do Atmel Studio transforma um projeto Arduino em um conjunto de projetos composto pelo ‘ArduinoCore’ e o ‘Projeto do usuário’, projetos que são interligados pelas diretivas de compilação descritas no documento ‘Toolchain’ de cada projeto.
Junto com tudo isso também aprendeu a importar bibliotecas externas como a ‘LiquidCrystal’ e a configurar apropriadamente na ‘Toolchain’ evitando o erro de configuração ‘<nome da biblioteca>: No such file or directory’.
Caro Leitor, como de praxe e antes de nos aprofundarmos: Sua presença em meu site causa-me elevada estima e júbilo. Sinta-se à vontade para comentar e inclusive propor melhorias em meu texto. Boa leitura!
2- Para saber mais:
3- Sopa de pedra:
Uma vez compilado o código do artigo anterior, transcrito abaixo, é lógico que ele não serve para nada além de piscar o led da placa.
Note que a única alteração realizada foi o instanciamento do objeto ‘lcd’ a partir da classe LiquidCrystal na linha 11, que não serve para nada além de provar que a ‘Toolchain’ dos projetos ‘ArduinoCore’ e ‘Blink’ foram configuradas corretamente, resolvendo o erro compilação.
#include <Arduino.h>
#include <LiquidCrystal.h>
/* O diagrama esquemático para esse programa está disponível no link:
"https://nets-nuts.com.br/eletronica/ligando-o-lcd-no-arduino-4bits/"
Escolher o diagrama esquemático '8 bits Read Write' */
LiquidCrystal lcd(10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9);
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // Começo do pisca pisca
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000); // Fim do pisca pisca
}
Considerando que o esquemático na figura 1 acima é compatível com o instanciamento do objeto lcd, bem que é possível adicionar o código que falta, inicializar e comandar o display. Abaixo segue uma possível solução, que mantém o led da placa piscando:
/* O diagrama esquemático para esse programa está disponível no link:
"https://nets-nuts.com.br/eletronica/ligando-o-lcd-no-arduino-4bits/"
Escolher o diagrama esquemático '8 bits Read Write' */
#include <Arduino.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9);
void setup() {
// Inicializando o display
lcd.begin(20, 4);
lcd.clear();
lcd.setCursor(8, 0);
lcd.print("NETS");
lcd.setCursor(9, 1);
lcd.print("&&");
lcd.setCursor(8,2);
lcd.print("NUTS");
lcd.setCursor(6,3);
lcd.print("LCD 20x4");
delay(5000);
//Fim da inicializacao do display
// Inicialização do LED_BUILTIN como saída.
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// Pisca pisca
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
// Fim do pisca pisca
//Controlando o display
int posicao_final;
//Deslocando para a esquerda
for (int posicao = 0; posicao < 6; posicao++) {
lcd.scrollDisplayLeft();
delay(300);
}
//Deslocando para direita
for (int posicao = 0; posicao < 12; posicao++) {
lcd.scrollDisplayRight();
delay(300);
posicao_final = posicao;
}
//Voltando para o centro
for (int posicao = posicao_final; posicao > 5; posicao--) {
lcd.scrollDisplayLeft();
delay(300);
}
//Fim do controle do display
}
O código acima até consegue controlar o display e pisca o led da placa também.
Como essas piscadelas da placa são esquisitas e não influenciam o funcionamento do display LCD, conforme código abaixo e para finalizar a sopa de pedra, remove-se a parte do pisca-pisca.
Figura 3 ao lado apresenta como renomear o nome do projeto de ‘Blink’ para ‘Controle_LCD’, no ‘Solution Explorer’.
Basta clicar sobre o nome do projeto ‘Blink'(1) com o botão direito do mouse, vai abrir o menu de contexto, no qual deve-se selecionar a opção ‘Rename’ e em seguida é possível mudar o nome do projeto.
Nesse caso o nome do projeto foi alterado de ‘Blink’ para ‘Controle_LCD’, conforme figura 3 ao lado.
#include <Arduino.h>
#include <LiquidCrystal.h>
//O diagrama esquemático para esse programa está disponível no link:
//https://nets-nuts.com.br/pt/eletronica/ligando-o-lcd-no-arduino-4bits/
//Escolher o diagrama esquemático '8 bits Read Write'
//Sopa de pedra sem a pedra.
//Remoção do código para piscar o led da placa
LiquidCrystal lcd(10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9);
void setup() {
//Começo da inicialização do display
//Define o número de colunas e linhas do LCD
lcd.begin(20, 4);
//Limpa a tela
lcd.clear();
//Posiciona o cursor na coluna 8, linha 0
lcd.setCursor(8, 0);
//Envia o texto entre aspas para o LCD
lcd.print("NETS");
//Posiciona o cursor na coluna 9, linha 1
lcd.setCursor(9, 1);
//Envia o texto entre aspas para o LCD
lcd.print("&&");
//Posiciona o cursor na coluna 8, linha 2
lcd.setCursor(8,2);
//Envia o texto entre aspas para o LCD
lcd.print("NUTS");
//Posiciona o cursor na coluna 5, linha 3
lcd.setCursor(6,3);
//Envia o texto entre aspas para o LCD
lcd.print("LCD 20x4");
delay(5000);
//Fim da inicializacao do display
}
// A função loop roda o código para sempre.
void loop() {
//Começo do controle do display
//armazena a posição do cursor
int posicao_final;
//Deslocando para a esquerda
for (int posicao = 0; posicao < 6; posicao++)
{
lcd.scrollDisplayLeft();
delay(300);
}
//Deslocando para direita
for (int posicao = 0; posicao < 12; posicao++)
{
lcd.scrollDisplayRight();
delay(300);
//Guardando a posição do cursor
posicao_final = posicao;
}
//Voltando para o centro
for (int posicao = posicao_final; posicao > 5; posicao--)
{
lcd.scrollDisplayLeft();
delay(300);
}
//Fim do controle do display
}
Concluída a sopa de pedra, essa série cobriu desde a abertura de um projeto Arduino, sua importação e configuração para funcionar no Atmel Studio bem como o uso dessa solução para servir de base para o desenvolvimento de uma aplicação distinta, para controlar um display LCD nesse caso.
4- AVRDUDE no Atmel Studio:
Compilado o código é necessário fazer o upload do mesmo para a placa Arduino. O upload de código binário em projetos Arduino fica a cargo da aplicação AVRDUDE. Esse tópico aborda como configurar e usar o AVRDUDE para funcionar na plataforma Atmel Studio.
A configuração do AVRDUDE é realizada em duas partes.
Primeiro, a partir de um projeto funcionando na plataforma Arduino é recuperada a linha de comando para upload de código.
Em segundo lugar configura-se o Atmel Studio para acionar o AVRDUDE empregando a mesma linha de comando utilizada para se fazer uploads de código em projetos Arduino.
Tudo o que precisa é um projeto Arduino com código compilado e que funcione com o AVRDUDE e a instalação do Atmel Studio.
4.1- Preparando a linha de comando do AVRDUDE:
4.1.1- Abrir a plataforma Arduino com um sketch compilado e funcionando.
4.1.2- Conforme indicado na figura 4 abaixo, configurar as seguintes opções nas preferências da plataforma Arduino: Clicar em ‘File'(1) -> Preferences(2) -> Marcar as opções para mostrar mensagens estendidas de compilação e de upload(3) -> Clicar em Ok(4).
4.1.3- Feita a configuração acima, fazer o upload do projeto para o Arduino.
4.1.4- Na janela de log, localize a linha do acionamento do AVRDUDE, conforme indicado na figura 5 abaixo:
4.1.5- Essa linha de comando é construida de acordo com a configuração de sua máquina e certamente é diferente do exemplo abaixo, mas sua estrutura é a mesma. Use o exemplo a seguir como modelo.
4.1.6- Copie e cole essa linha de comando de sua máquina, indicada na figura 5, em um bloco de notas que preste, de preferência o notepad++ ou outro de sua preferência. O comando ficará parecido com o comando abaixo:
C:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/bin/avrdude -CC:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\RENAT~1.DES\AppData\Loca\Temp\arduino_build_72236/LCD20X4_8bits_read_write.ino.hex:i
4.1.7- A linha de comando precisa ser dividida em duas partes: A parte da chamada do executável e a parte da chamada dos parâmetros do AVRDUDE.
Parte do executável (comando formatado):
C:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/bin/avrdude.exe (não esquecer de acrescentar .exe)
Parte dos parâmetros:
-CC:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\RENAT~1.DES\AppData\Loca\Temp\arduino_build_72236/LCD20X4_8bits_read_write.ino.hex:i
4.1.8- Na parte dos parâmetros e conforme indicado abaixo, substitua tudo o que está entre ‘:w:’ e ‘:i’ por “$(ProjectDir)Debug\$(TargetName).hex”, com as aspas.
Antes de substituir:
-CC:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\RENAT~1.DES\AppData\Loca\Temp\arduino_build_72236/LCD20X4_8bits_read_write.ino.hex:i
Após substituir (parâmetro formatado – preste atenção nas aspas!!!):
-C"C:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf" -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:"$(ProjectDir)Debug\$(TargetName).hex":i
*Lembre-se: A linha de comando depende da versão do seu AVRDUDE.
4.2- Configurando o AVRDUDE no Atmel Studio:
No Atmel Studio, clicar em ‘Tools'(1) -> ‘External Tools'(2) -> Escolher um título significativonem ‘Title'(3) -> Inserir o comando conforme formatado no item 4.1.7. Inserir o argumento(5) conforme formatado no tópico 4.1.8 -> Selecionar o checkbox para utilizar a janela ‘Output'(6) e clicar em ‘Ok'(7).
Pronto, só isso.
A opção ‘AVRDUDE’ será adicionada no menu ‘Tools’ antes da opção ‘External Tools’.
Agora, para rodar o AVRDUDE basta clicar em ‘Tools’ -> ‘AVRDUDE’. O programa será iniciado conforme configurado e carregará no Arduino o código binário previamente compilado.
4.3- Dicas e Mensagem de erro:
O AVRDUDE deve funcionar. A parte crítica nesse procedimento é o tópico 4.1.8. Uma aspas fora do lugar e nada irá funcionar. Não há quebra de linhas. A linha de comando e a linha de argumentos não tem quebras de linhas, elas são contínuas.
Quando carregando o código binário para o Arduino, o AVRDUDE sempre irá abrir e irá tentar carregar o código para o Arduino, mesmo que ele não exista. Se o código binário não existir, o AVRDUDE irá retornar uma mensagem dizendo que o arquivo não foi encontrado, conforme exemplo abaixo na linha 49:
avrdude.exe: Version 6.3, compiled on Dec 16 2016 at 13:33:19
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf"
Using Port : COM3
Using Programmer : arduino
Overriding Baud Rate : 115200
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Programmer Type : Arduino
Description : Arduino
Hardware Version: 3
Firmware Version: 4.4
Vtarget : 0.3 V
Varef : 0.3 V
Oscillator : 28.800 kHz
SCK period : 3.3 us
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude.exe: Device signature = 0x1e950f (probably m328p)
avrdude.exe: safemode: hfuse reads as 0
avrdude.exe: safemode: efuse reads as 0
avrdude.exe: reading input file "C:\Users\renat.DESKTOP-7SIJLUM\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\Blink\Debug\Controle_LCD.hex"
avrdude.exe: can't open input file C:\Users\renat.DESKTOP-7SIJLUM\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\Blink\Debug\Controle_LCD.hex: No such file or directory
avrdude.exe: read from file 'C:\Users\renat.DESKTOP-7SIJLUM\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\Blink\Debug\Controle_LCD.hex' failed
avrdude.exe: safemode: hfuse reads as 0
avrdude.exe: safemode: efuse reads as 0
avrdude.exe: safemode: Fuses OK (E:00, H:00, L:00)
avrdude.exe done. Thank you.
Finalizando:
Com esse artigo fecha-se o ciclo. Um programa foi aberto no Arduino, importado para o AtmelStudio, compilado e carregado no Arduino utilizando o AVRDUDE.
Tendo fôlego, no próximo artigo irei abordar em linhas gerais como debugar um código no AtmelStudio utilizando o simulador. Me aguardem.
Um grande abraço e nos vemos na próxima.
By Renato de Pierri
22 de Janeiro de 2017.