Arduino é uma plataforma open-hardware conhecida mundialmente pela sua simplicidade, utilizada para protótipos, ensino de eletrônica e robótica nas escolas e universidades. Existem diversos modelos de Arduino, como por exemplo o Uno, Mega, Pro Mini, Nano, Leonardo e Due, porém para este tutorial será abordado o Arduino Uno e seu microcontrolador Atmega328p.
O modelo Atmega328p é um microcontrolador AVR low-power CMOS de 8 bits produzido pela Atmel, opera na tensão 5V, possui 32KB de memória flash, sendo 0,5KB reservado no fim da memória (Boot Flash Section) para o bootloader, uma EEPROM de 1KB e SRAM de 2KB como demonstra a imagem abaixo, no geral contém 28 pinos e três tipos de comunicações, possuindo 1 USART, 2 SPI e 1 I2C.
O microcontrolador tem em sua base a arquitetura Harvard ou conhecido como RISC (Reduced Instruction Set Computer), na qual as memórias são separadas para as instruções do firmware. As instruções escritas na memória são executadas com a técnica Pipeline, ou seja, enquanto uma instrução do programa está sendo executada, a próxima está sendo pré-extraída, e isso podemos observar na prática forçando um delay no Pipeline. Segundo o datasheet do Atmega328p, ele executa as instruções em um ciclo de clock, chegando a 1MIPS/MHz.
Se interessou? Neste tutorial você irá montar o seu próprio Arduino, que chamamos de Standalone, a chave para o sucesso é a atenção aos detalhes e dedicação ao projeto. É recomendado um conhecimento na plataforma Arduino, e eletrônica básica para compreender os componentes e suas funcionalidades, como também trabalhar com o ferro de solda.
Se você já possui uma experiência na área de embarcados, recomendamos que dê uma olhada no nosso artigo de como fazer um Arduino Standalone completo (Avançado) para projetos mais robustos.
Materiais
Para montar um Arduino Standalone da forma mais simples precisamos de componentes eletrônicos comuns e de alguns módulos para auxiliar na montagem. Prepare a caneta e o papel para anotar os seguintes materiais necessários. Dica importante: Reutilize componentes eletrônicos de placas de sucata e sempre realize testes com um multímetro ou um testador universal de componentes eletrônicos antes de utiliza-los, isso ajuda na falta de alguns componentes.
- 1 Microcontrolador Atmel Atmega328p sem bootloader
- 1 Cristal de 16MHz
- 2 Capacitores cerâmicos de 22pF, de preferência NPO
- 3 Capacitores poliéster de 100nF
- 1 Chave push button N/O de 2 pinos ou 4 pinos
- 1 Resistor de 10KΩ
- 1 Resistor de 220Ω
- 1 Protoboard
- Fios jumpers
- 1 Módulo conversor USB Serial Ch340g
- 1 LED
- 1 Arduino Uno com cabo USB para gravar bootloader
Dicas de montagem
Com esses materiais em mãos podemos começar a montagem do Arduino Standalone, Primeiramente pegue o protoboard e encaixe o Atmega328p. Defina as pinagens do Atmega e do módulo seguindo o esquema abaixo.
No pino 1 será colocado o resistor pull-up de 10KΩ no 5V, um capacitor poliéster de 100nF e a chave push button no GND para realizar o reset do microcontrolador.
A notação VCC e AVCC significa tensão positiva do circuito integrado, ou seja, os pinos 7 e 20 são ligados ao 5V e por fim os pinos 8 e 22 ao GND.
Para um melhor funcionamento do microcontrolador, adicionamos os dois capacitores poliéster de 100nF com a função de desacoplamento, com o objetivo de evitar ruídos da rede elétrica circulando na nossa montagem, para isso ligue um capacitor no pino 7 do Atmega levando para o GND do protoboard e o outro capacitor no pino 20 para o GND também.
Os pinos 9 e 10 são ligados no cristal de 16MHz, e em cada pino coloque um capacitor cerâmico de 22pF NPO, que são responsáveis em oscilar a frequência do clock. É possível utilizar o Atmega puro e suas funções sem um cristal externo, pois internamente este microcontrolador possui um clock de 8MHz. Mas no momento em que será gravado o bootloader no modo Arduino ISP (In-circuit Serial Programmer) é setado uma variável para utilizar um clock de 16MHz, por este motivo recomendamos que utilize um cristal e seus capacitores para obter um resultado satisfatório.
Para alimentar o circuito será utilizado a tensão de 5V da USB do computador, consumindo em média 23mA. Conecte dois fios jumpers macho-fêmea nos pinos VCC e 5V do módulo para o 5V do protoboard. Os pinos do Atmega328p responsáveis pela comunicação serial são os pinos 2 e 3, para isso conecte o TX no RX (2), RX no TX (3) e GND no GND do protoboard.
Depois de conectar os cabos no módulo, é importante realizar uma comunicação serial que possa enviar os firmwares via USB de forma efetiva, para isso é necessário fazer uma pequena modificação neste modelo de módulo USB Serial, pois a quantidade de pinos que ele oferece é insuficiente para esta função, felizmente ele utiliza o chip Ch340 (utilizado no Arduino Uno e Nano Chinês - Atmega328p) que possuí todas as pinagens requeridas para uma comunicação serial completa, existem outras alternativas no mercado que não precisam fazer esta modificação.
Para realizar a modificação retire com cuidado a membrana de plástico do módulo com um estilete, pegue um cabo jumper e corte uma das pontas, solde no pino 13 do Ch340 que realizará a função de saída DTR (UART Data Terminal Ready), muito cuidado para não soldar outros pinos! Se tiver dúvidas consulte o datasheet do Ch340g. Por fim isole o módulo novamente com uma fita isolante para não quebrar o fio soldado, conecte o cabo DTR no capacitor poliéster de 100nF que está ligado no pino 1, onde auxiliará no tempo exato de reset do Atmega.
ArduinoISP e bootloader
O Atmega328p sem o seu inicializador ou bootloader não suporta comunicação serial, que consequentemente os códigos não serão gravados via USB, sendo necessário um gravador universal e o trabalho de retirar toda vez o microcontrolador do protoboard, ou então utilizando a comunicação ICSP. Para os curiosos que possuem um gravador AVR, instale o Atmel Studio 7 e programe utilizando somente os registradores, é um ótimo aprendizado em bitwise.
Não há segredos para gravar um bootloader no Atmega328p puro, a própria IDE oficial do Arduino oferece o código e a pinagem necessária para realizar este procedimento.
O primeiro passo é gravar o código ArduinoISP fornecido pela IDE oficial em uma placa Arduino Uno, para isso siga os passos abaixo.
- Abra a IDE do Arduino, versão utilizada 1.8.7.
- Na aba <Ferramentas - Placa:"Arduino/Genuino Uno" - Porta (Sua Porta)>
- Na aba <Arquivo - Exemplos - 11.ArduinoISP>
- Com o código do ArduinoISP aberto, carregue/envie para o Arduino Uno.
Com a gravação realizada, retire o módulo Ch340g e o capacitor de poliéster de 100nF no reset do Atmega328p. Para gravar o bootloader, precisamos realizar as conexões necessárias do ICSP, então siga o diagrama esquemático abaixo.
Como podemos visualizar na pinagem do Atmega328p oferecida pelo datasheet, os pinos utilizados para o modo ISP são: pino 19 SCK, pino 18 MISO e pino 17 MOSI. O pino 10 do Arduino é ligado no reset do Atmega puro e por fim ligamos a alimentação 5V e GND.
Com todas as ligações realizadas corretamente, siga estes dois passos para a gravação do bootloader.
- Conecte o Arduino Uno (ArduinoISP) no computador
- Na aba <Ferramentas - Programador: "Arduino as ISP" - Gravar Bootloader>
Se a compilação for finalizada corretamente, o bootloader foi gravado com sucesso, agora é possível enviar firmwares para o Atmega328p utilizando a comunicação serial com o módulo CH340g ou FTDI.
Testando o Arduino Standalone
Retire os cabos do modo ICSP e volte para a configuração original. Antes de testar é necessário instalar o Driver do CH340g, disponíveis para sistemas Windows 86x e 64x. Para instalar corretamente, o módulo deve estar conectado na porta USB do computador. Depois verifique no gerenciador de dispositivos do Windows qual a porta serial (COM) o módulo foi instalado. Se você já utilizou um Arduino Uno Chinês que utiliza o CH340g, provavelmente o driver estará instalado em seu computador.
Para testar o Arduino Standalone conecte um LED em modo current source com um resistor limitador de corrente de 220Ω na porta 15 do Atmega (PB1) ou como referencia a porta 9 do Arduino Uno, como demonstra a imagem abaixo.
Abra e configure a IDE como um Arduino Uno e a porta COM correspondente ao módulo USB Serial, compile e envie este código para piscar um LED ao seu Arduino Standalone e veja o resultado!
/*
* Testando o Arduino Standalone by tecdicas
* Código para acender e apagar um LED
* Pino 15 - Registrador PB1
* 24/10/2017
*/
#define led 9
void setup()
{
pinMode(led, OUTPUT); // Led na porta 9 definido como Saída
}
void loop()
{
digitalWrite(led, HIGH); // Liga
delay(500);
digitalWrite(led, LOW); // Desliga
delay(500);
}
Que tal um teste mais avançado? Este código faz o LED na porta PB1 do Atmega piscar com a lógica XOR acessando diretamente aos registradores do microcontrolador.
/*
* Testando o Arduino Standalone by TecDicas
* Código para acender e apagar um LED com a lógica XOR
* Pino 15 - Registrador PB1
* 24/10/2017
*/
void setup()
{
DDRB = DDRB | (1<<1); // Porta PB1 definida como OUTPUT
// DDRB |= (1 << DDB1) // Outra forma de setar a porta PB1 como OUTPUT
}
void loop()
{
/* Lógica do XOR
* PORTB = PORTB ^ (1<<1);
* 1 = 1 ^ 1 = 0
* 0 = 0 ^ 1 = 1
*/
PORTB = PORTB ^ (1<<1);
delay(30);
}