Arduino standalone na protoboard: como fazer
Como montar um Arduino na protoboard a partir de um ATmega328 e um kit de componentes simples. [atualizado]
Arduino standalone é a montagem que replica o funcionamento básico de um Arduino, geralmente a partir de um microcontrolador ATmega328 e do conjunto de componentes adicionais necessários para fazê-lo funcionar nas condições desejadas.
Saber como montar um Arduino standalone depende basicamente de encontrar um dos variados tutoriais que geralmente descendem, por via direta ou não, do clássico guia “oficial” de montagem de um Arduino numa protoboard, criado originalmente por David Mellis, ou do clássico guia ilustrado publicado por Tom Igoe, que mostra um modelo que incorpora mais funcionalidades.
Ambos (Mellis e Igoe) fazem parte da equipe original do projeto Arduino, e os seus 2 guias para montagem de Arduino standalone em protoboard permanecem até hoje disponíveis no site oficial arduino.cc, embora só o guia do David Mellis tenha recebido atualizações (o guia do Tom Igoe tem até valor histórico, pois replica os modelos de Arduino de antes da adoção de conexão USB no projeto). Hoje, a convite da Usinainfo, que patrocinou este meu experimento, vamos conhecer em detalhes um modelo similar ao do guia publicado pelo David Mellis.
Um Arduino Uno tem blocos para alimentação, serial e processamento, mas podemos fazer um standalone só com o bloco de processamento.
Um Arduino (como o Arduino Uno, que é o exemplo mais popular) é composto por vários blocos funcionais, cujo núcleo geralmente se divide em pelo menos 3 grandes grupos: energia, comunicação USB e processamento. Um Arduino standalone pode (mas não precisa) dispensar os 2 primeiros, especialmente se for receber a energia já regulada de alguma origem externa, e se não precisar ser programado1, ou se for receber sua programação com ajuda de algum módulo externo autosuficiente (como um FTDI, ou mesmo um outro Arduino funcionando como programador).
Já vimos anteriormente um Arduino standalone mínimo, aquele que eu já apresentei em um artigo anterior sobre bootloaders: só um microcontrolador, sem componentes externos, operando com seu clock interno de 8MHz. Essa montagem reduzida tem seus usos, e essa mesma configuração limitada inclusive é usada no modelo oficial Arduino Lilypad, voltado a aplicações no vestuário e em acessórios de moda.
Hoje veremos um passo além, mostrado na foto acima: um Arduino standalone montado na protoboard, incorporando clock externo rodando na mesma frequência que a do Arduino Uno (16 MHz), com botão físico de reset, e com um led conectado ao pino 13. Todos os componentes mostrados na foto (exceto a protoboard e os jumpers) são parte do kit Arduino Standalone da Usinainfo, e a montagem está descrita a seguir.
Nota: este artigo foi atualizado em 26.02.2016 com correções (erros de contagem de pinos nos diagramas, e uma menção equivocada aos números dos pinos do cristal) a partir de apontamentos enviados pelo leitor Andre Sencioles. Obrigado, Andre!
Seu primeiro Arduino numa protoboard
Montar seu próprio Arduino em uma protoboard é um rito de passagem para muitos que se aproximam do mundo dos microcontroladores por essa via.
A montagem em si não tem nada de muito complexo (exceto, talvez, se o seu ATmega328 vier sem um bootloader pré-instalado), mas ela permite ver na prática, possivelmente pela primeira vez, onde fica a fronteira entre o microcontrolador e a placa de desenvolvimento.
Além da protoboard alimentada com 5V regulados, e de alguns jumpers, esse projeto precisa de um pequeno número de componentes. A minha montagem para este artigo usou como base um kit pronto, o Kit Arduino Standalone Atmega328 + Bootloader, da Usinainfo, composto pelos seguintes elementos:
- Atmega328P já com o bootloader do Arduino Uno pré-instalado
- Componentes do clock: 1 Cristal 16 MHz + 2 Capacitores Cerâmicos 22pF
- Componentes do reset: 1 Chave Táctil (Push Button) + 1 Resistor 10KΩ
- Componentes de interface com o usuário: 1 LED Verde 5mm + 1 Resistor 330Ω
Naturalmente você pode montar um kit desses com componentes que já tenha à mão mas, caso pense em comprá-los separadamente, preste atenção ao bootloader: se você comprar sem e não tiver ainda a prática com a instalação dele, pode ser um elemento de complexidade a mais no seu projeto, embora fácil de transpor (dica: “Como gravar bootloader em um ATmega328 sem componentes externos”). Outro ponto que merece atenção especial é o valor dos 2 capacitores para o clock: o recomendado é que eles sejam iguais e na faixa entre 18 e 22pF. Fora dela, a contagem de tempo e a sincronização com outros componentes ficará prejudicada ou até comprometida.
Pinos do Arduino X pinos do ATmega328
A primeira fronteira a ser identificada é a dos pinos.
Provavelmente você está acostumado aos pinos do Arduino Uno: 0 a 13, A0 a A5, Vin, 5V, GND, etc.. Montar seu primeiro standalone é a hora a partir da qual não dá mais para adiar saber que, embora a maioria dos pinos do Uno corresponda diretamente a pinos que também existem no ATmega328 que faz parte dele, eles nem sempre têm o mesmo nome, e não estão na mesma ordem.
A maior parte dos pinos do seu Arduino Uno corresponde diretamente a pinos do ATmega328 que faz parte dele, mas a ordem, os nomes e a numeração mudam.
O diagrama a seguir permite identificar a correspondência entre os pinos físicos de um ATmega328 DIP (numerados de 1 a 28 – antes de contar, lembre-se de sempre colocar para cima o lado com o chanfro!) e as diversas convenções de nomenclatura – a convenção adotada pela IDE do Arduino está em rosa:
Note que alguns compartilhamentos de funções entre pinos que encontramos no Arduino Uno nascem dessa configuração física do ATmega328: por exemplo, os pinos digitais 0 e 1 (em rosa) acumulam as funções de RX e TX serial. Há vários outros casos, identifique-os!
Alguns pinos serão especialmente importantes na nossa montagem, e vamos descrevê-los brevemente:
- VCC (pino 7 e pino 20): alimentação. Vamos conectar cada um deles aos 5V da nossa protoboard.
- AREF (pino 21): é a referência de tensão para os comparadores analógicos. Também vamos conectá-lo aos 5V da protoboard2.
- GND (pino 8 e pino 22): terra. Vamos conectar cada um deles ao terra da nossa protoboard.
- RESET (pino 1): sempre que este pino fica LOW, o ATmega328 reinicializa. Vamos conectá-lo ao 5V de forma a mantê-lo sempre HIGH, mas colocar um botão que o conecte temporariamente ao GND (tornando-o LOW) para pressionar quando quisermos resetar.
- XTAL1 e XTAL2 (pinos 9 e 10): conexão à fonte externa de sincronização (oscilador ou cristal).
Também usaremos ou mencionaremos no procedimento outros pinos específicos:
- Pino físico 19: equivale ao pino digital 13 do Arduino Uno, e – assim como acontece no Uno – vamos conectar a ele um led, para permitir que você teste o conjunto usando o popular exemplo Blink, que acompanha a IDE.
- Pino físico 2: função RX da comunicação serial/USART, será conectado (opcionalmente) a outro Arduino ou a um adaptador USB-serial, para que nosso Arduino standalone possa ser programado.
- Pino físico 3: função TX da comunicação serial/USART, será conectado (opcionalmente) a outro Arduino ou a um adaptador USB-serial, para que nosso Arduino standalone possa ser programado.
Todos os demais pinos podem ser usados conforme sua preferência, dependendo da aplicação desejada. Para facilitar a identificação, nas minhas montagens eu imprimo etiquetas como essas, que indicam, junto a cada pino físico do ATmega328, o nome correspondente na convenção do Arduino:
O cristal do clock
A frequência do clock é o elemento central da velocidade de execução de instruções pela CPU, e oficialmente o ATmega328 pode funcionar a até 20MHz. Por razões históricas que preservaram a compatibilidade com modelos anteriores baseados no ATmega8, entretanto, o Arduino Uno funciona abaixo disso, a 16MHz.
Já vimos que o ATmega328 possui um oscilador interno que pode ser usado quando queremos dispensar componentes externos. Mas ele é limitado a 8MHz, e não é tão preciso quanto um cristal externo pode ser. Na nossa montagem, usaremos um circuito de cristal externo de 16MHz, e essa parte da montagem fica assim:
Esse circuito é montado com um cristal e 2 capacitores. Note que um terminal do cristal está conectado ao pino 9 (XTAL1) e o outro está no pino 10 (XTAL2). Entre cada um dos 2 terminais e o GND da protoboard temos um capacitor cerâmico de 22pf.
Todos os componentes adicionados nesta etapa (o próprio ATmega328, o cristal e os 2 capacitores) fazem parte do kit da Usinainfo.
A alimentação
Embora crucial para o funcionamento, a alimentação não tem nada de especial no nosso standalone bem simples, que simplesmente assume que as raias positivas da protoboard serão posteriormente ligadas a 5V regulados, e as raias negativas serão ligadas ao GND da mesma fonte:
Observe que, além do que já havíamos colocado para montar o cristal, apenas acrescentamos 5 jumpers, sendo 2 ligados ao GND da protoboard (nos pinos 8 e 22) e 3 ligados aos 5V da protoboard (pinos 7, 20 e 21).
Se nosso standalone fosse fazer medidas precisas nas suas portas analógicas, o pino 20 demandaria atenção especial, na forma de um filtro para reduzir o ruído.
O circuito do reset
O reset do ATmega328 é comandado pelo seu pino físico 1, cujo estado normal deve ser HIGH: sempre que ele cai para LOW, provoca um reset.
Para mantê-lo sempre em HIGH, poderíamos simplesmente colocar um jumper entre ele e os 5V da protoboard. Mas somos ambiciosos e queremos ter um botão de reset, então faremos algo um pouco diferente, trocando esse jumper por um resistor de 10KΩ (também incluído no kit), assim:
Note que com esse resistor de 10KΩ conectando o pino 1 (RESET) aos 5V da protoboard, o pino 1 ficará permanentemente em HIGH, e assim nosso standalone funcionará continuamente, sem reset, a não ser que os 5V sejam cortados.
Mas o kit que estamos usando veio com um botão, e ele serve justamente para implementarmos um comando físico para o reset, que é muito simples, bastando plugar o botão e 2 jumpers:
Observe que colocamos o botão logo acima do ATmega328. Um dos seus terminais do lado esquerdo (ou inferior, no desenho) foi conectado ao pino 1 (RESET) do ATmega328, e o outro ao GND da placa. Essa conexão não tem nenhum resistor, ao contrário do que fizemos na conexão aos 5V. Assim, quando o botão for pressionado, a conexão ao GND ficará ativa, o pino 1 passará a estar LOW, e assim teremos o nosso reset.
O led "do pino 13"
O led interno que vem conectado ao pino 13 do Arduino Uno é quase uma tradição, e inúmeros tutoriais e exemplos se baseiam integralmente nele para indicar estados ou transmitir as mais variadas informações.
Até mesmo o bootloader padrão do Uno tira proveito da disponibilidade do led do pino 13: ele o pisca algumas vezes para indicar o funcionamento do boot (e/ou o início do carregamento de programas).
O kit vem acompanhado de um led verde e do resistor de 330Ω adequado para acompanhá-lo. Para conectá-los ao pino 19 do ATmega328 (que corresponde ao pino 13 do Arduino Uno), eu fiz assim:
Note que o resistor de 330Ω está conectado ao pino físico 19 e ao terminal positivo do led, e que o terminal negativo do led está conectado ao GND da protoboard.
Colocando para funcionar
Neste ponto, o meu Arduino standalone já está montado, e só o que falta é alimentar a protoboard com 5V regulados. Uma maneira simples de fazer isso é conectar a raia de 5V do lado esquerdo à do lado direito, conectar o GND do lado esquerdo ao do lado direito, e plugar uma fonte externa de 5V (pode até ser os pinos 5V e GND de um Arduino Uno que você tenha à mão) a qualquer um dos 2 lados, como neste exemplo:
Note que na parte superior do desenho temos 2 novos jumpers conectando o pino 5V de um Arduino Uno à raia positiva da protoboard, e o pino GND do Uno à raia negativa da protoboard. Na extremidade direita do desenho também temos 2 jumpers, conectando as 2 raias negativas entre si, e as 2 raias positivas entre si.
Verifique com atenção se não inverteu nenhum jumper, conecte o Arduino Uno à porta USB do seu computador, e ele irá alimentar a protoboard, colocando o seu Arduino standalone para funcionar.
Considerando que o ATmega328 do seu standalone esteja com o bootloader instalado, o seu led verde deve piscar rapidamente no momento em que você faz a conexão elétrica, e voltar a piscar a cada vez que você provocar um reset. Se ele não fizer isso, revise todas as conexões mais uma vez.
Você pode se certificar de que o ATmega328 em questão está funcionando (e com bootloader instalado) usando as dicas do artigo “Explorando a arquitetura do ATmega328: identificando a configuração geral e os fuses”.
Programando o Arduino standalone na protoboard
Na etapa anterior já concluímos a montagem do kit, mas ele ainda não faz nada. Para fazer, é preciso programar o ATmega328 e, se necessário, conectá-lo a mais componentes e módulos demandados por nossa aplicação.
Uma forma básica de fazer essa programação é transplantando o chip, que corresponde a retirar fisicamente o ATmega328 de um Arduino Uno que usamos para desenvolver nossa aplicação, e em seguida plugá-lo na protoboard do nosso standalone. Se for fazê-lo, cuidado para não quebrar terminais, inverter conexões, causar danos pela eletricidade estática, etc.
Para desenvolver diretamente no standalone, podemos plugá-lo à IDE do Arduino por meio de um adaptador USB-Serial, que pode ser um módulo dedicado (FTDI ou similares) ou mesmo um outro Arduino rodando um programa especial para isso. Já vimos as duas alternativas em artigos anteriores:
- Como fazer upload de programas para um ATmega na protoboard usando conversor USB–Serial
- Como fazer upload de programas para um ATmega na protoboard usando um Arduino
Ao programar, como estamos usando o mesmo microcontrolador e clock do Arduino Uno, você pode configurar a IDE como se estivesse de fato programando para o Uno. Programe usando as mesmas identificações de pinos que usaria normalmente (ou seja: no Blink, use o pino 13), e faça as conexões físicas usando o diagrama de equivalência apresentado mais acima, ou um adesivo como o meu ;-)
Divirta-se!
Patrocínio: Usinainfo
Quero agradecer à UsinaInfo, que vem patrocinando alguns experimentos do BR-Arduino, inclusive este com o kit Arduino standalone.
Além de receber material da empresa para os experimentos como parte do acordo de patrocínio, eu já fiz compras de componentes lá, aproveitando a variedade, o estoque bem suprido, as descrições detalhadas e a qualidade do seu sistema de comércio eletrônico. Recomendo sem ressalvas.
Agradeço também pela confiança que ficou expressa nos termos do patrocínio: a empresa me enviou os componentes necessários ao experimento combinado, mas não fez qualquer exigência sobre a forma e nem buscou exercer controle sobre o que eu fosse escrever. Obrigado, UsinaInfo!
Comentar