Arduino no Atmel Studio 7 – Parte 3

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
}
Figura 1: LCD 8 bits modo Read e Write. Pino 5 do display (RW) é ligado no pino D11 do Arduino.

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.

Figura 3: Renomeando o projeto de ‘Blink’ para ‘Controle_LCD’.
#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).

Figura 4: Recuperando a linha de comando do AVRDUDE.

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:

Figura 5: Linha de acionamento do AVRDUDE

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).

Figura 6: Configurando o AVRDUDE no Atmel Studio

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.

Last updated by at .

Deixe um comentário