Você está na página 1de 37

Referncia Arduino - Portas Digitais

As portas digitais podem ser configuradas tanto como entrada e sada. Este artigo
explica a funcionalidade das portas nesses modos. Enquanto o ttulo deste artigo se
refere a portas digitais, importante lembrar que uma vasta maioria das portas
analgicas do Arduino (ATMega podem ser configuradas, e usadas, da mesma maneira
que as portas digitais.
Propriedades das Portas Configuradas como Entrada (INPUT)
!ortas do Arduino (ATMega s"o por padr"o consideradas como entradas, ent"o estas
n"o precisam explicitamente ser declaradas como entrada atravs da fun#"o pinMode(.
!ortas configuradas como entrada se encontram em um estado con$ecido por alta
imped%ncia. &ma forma de explicar isso que portas de entrada demandam muito
pouco, ou quase nada, do circuito que est"o amostrando, equivalente a um resistor de
'(( mega o$ms em srie com a porta. )sto significa que n"o necess*ria muita corrente
para alternar as portas de entrada de um estado para outro, e que estas podem se tornar
muito +teis para tarefas como, implementar um sensor capacitivo, sensvel ao toque-
efetuar a leitura de um .E/ como se fosse um foto0diodo- ou ainda fa1er a leitura de
um sensor analgico com um esquema 23Time.
)sto significa tambm, entretanto, que as portas de entrada apresentar"o sensibilidade
aleatria entre estados pelo simples fato de n"o ter nada conectado a elas, ou mesmo por
estarem conectadas a um fio solto, detectando rudo eltrico a partir do ambiente, ou
acoplamento capacitivo do estado das portas ad4acentes.
Resistor de Elea!"o (Pullup)
/essa forma se fa1 necess*rio, muitas ve1es, nortear uma porta de entrada para um
estado con$ecido, quando nen$um sinal se fa1 presente. )sto pode ser feito adicionando
na entrada, um resistor de eleva#"o (ligando no 56, ou um resistor de refer7ncia
(pulldo8n 0 ligado no terra. '(9 o$ms um valor comumente utili1ado.
Existem tambm resistores de eleva#"o convenientemente construdos internamente no
c$ip do ATMega, que podem ser acessados via programa#"o. Estes resistores de
eleva#"o embutidos podem ser acessados da seguinte maneira,
pinMode(pin, ):!&T- ;; configura a porta como entrada
digital<rite(pin, =)>=- ;; liga o resistor de eleva#"o (pullup
:ote que estes resistores de eleva#"o prov7m corrente suficiente para acender de forma
bem suave um .E/ conectado a porta configurada como entrada. ?e os .E/@s de um
pro4eto estiverem acendendo dessa forma bem suave, provavelmente exatamente isso
que est* acontecendo e o programador esqueceu de usar a fun#"o pinMode( para
configurar as portas como sada (A&T!&T.
2epare tambm que os resistores de eleva#"o s"o controlados pelos mesmos
registradores (endere#os internos da memria do c$ip que controlam se uma porta est*
em um estado alto (=)>= ou baixo (.A<. 3onsequentemente um pino que
configurado para ter um resistor de eleva#"o ligado quando a porta uma entrada,
manter* o estado alto mesmo quando a porta for alterada para sada, atravs da fun#"o
pinMode(. )sso funciona de forma inversa tambm, e uma porta de sada deixada em
estado alto, ter* os resistores de eleva#"o automaticamente ligados se for alterada para o
modo de entrada pelo pinMode(.
N#TA$ A porta digital 'B mais difcil de se utili1ar como uma porta de entrada dentre
as outras portas digitais, pois existe um .E/ ligado a ela, com um resistor em srie,
soldado na placa, na maioria das placas. ?e voc7 $abilitar seu resistor de eleva#"o, ela
travar* em uma tens"o aproximada de ',C6, ao invs dos esperados 56, por causa do
.E/ embutido na placa, e o resistor em srie sempre puxar* o nvel de tens"o para
baixo, resultando sempre em um estado baixo (.A<. ?e voc7 quiser usar a porta 'B
como entrada digital, ligue um resistor de refer7ncia (pulldo8n externo.
Propriedades das Portas Configuradas como %a&da (#UTPUT)
!ortas configuradas como sada atravs do pinMode( encontram0se em um estado de
baixa imped%ncia. )sso significa que elas podem fornecer uma quantidade consider*vel
de corrente para outros circuitos. As portas do ATMega podem alimentar (fornecer
corrente positiva ou ancorar (fornecer corrente negativa at D(mA (miliampres de
corrente para outros dispositivos;circuitos. )sso corrente suficiente para acender bem
forte um .E/ (n"o se esque#a do resistor em srie, ou acomodar v*rios sensores, por
exemplo- mas n"o fornece corrente suficiente para ativar diretamente a maioria dos
rel7s, solenides, ou motores.
3urto0circuitos nas portas do Arduino, ou tentativas de ativar dispositivos que
consomem altas correntes, podem danificar ou at destruir o transistor de sada da porta-
ou ainda danificar completamente o c$ip ATMega. Muitas ve1es isso resulta em um
pino EmortoE no microcontrolador, mas o resto do c$ip ainda funciona adequadamente.
!or essa ra1"o, uma boa ideia conectar portas de sada aos dispositivos, atravs de um
resistor de DC( ou '9 o$ms, a n"o ser que a m*xima corrente consumida das portas se4a
necess*ria para alguma aplica#"o em particular.
Referncia Arduino - pin'ode()( digital)rite() e dela*()
+un!"o$ pin'ode()
/escri#"o
3onfigura a porta especificada para se comportar tanto como entrada ou sada. 6e4a o
post sobre portas digitais para maiores detal$es.
?intaxe
pinMode(pin, mode
!ar%metros
pin, o n+mero da porta que voc7 dese4a configurar
mode, ):!&T para entrada e A&T!&T para sada
2etorna
:ada
:ota
As portas analgicas podem ser usadas como portas digitais, referindo0as como A(, A'
etc.
+un!"o$ digital)rite()

/escri#"o
Altera o estado da porta para alto (=)>= ou baixo (.A< de uma porta digital.
?e a porta foi configurada como sada (A&T!&T pela fun#"o pinMode(, sua voltagem
ser* correspondente aos valores de 56 (ou B.B6 nas placas de B.B6 para alto (=)>=, e
(6 (>:/ para baixo (.A<.
?e a porta configurada como entrada ():!&T, escrever um valor alto (=)>= com o
digital<rite( $abilitar* o resistor de eleva#"o (pullup interno de F(G (ve4a a postagem
sobre portas digitais. Escrever um valor baixo (.A< desabilitar* o resistor de
eleva#"o. Este resistor de eleva#"o suficiente para acionar muito fracamente um .E/,
portanto se o .E/ funcionar, mas dessa forma fraca, esta a causa mais prov*vel. A
solu#"o configurar a porta para sada (A&T!&T atravs da fun#"o pinMode(.
N#TA$ A porta digital 'B mais difcil de se utili1ar como uma porta de entrada dentre
as outras portas digitais, pois existe um .E/ ligado a ela, com um resistor em srie,
soldado na placa, na maioria das placas. ?e voc7 $abilitar seu resistor de eleva#"o, ela
travar* em uma tens"o aproximada de ',C6, ao invs dos esperados 56, por causa do
.E/ embutido na placa, e o resistor em srie sempre puxar* o nvel de tens"o para
baixo, resultando sempre em um estado baixo (.A<. ?e voc7 quiser usar a porta 'B
como entrada digital, ligue um resistor de refer7ncia (pulldo8n externo.
?intaxe
digital<rite(pin, value
!ar%metros
pin, o n+mero da porta
value, =)>= para o estado alto ou .A< para o estado baixo
2etorna
nada
3onfigura a porta 'B para o estado alto (=)>=, pausa por um segundo e depois
configura a porta de volta para o estado baixo (.A<.
:ota
As portas analgicas podem ser usadas como portas digitais, referindo0as como A(, A'
etc.
+un!"o$ dela*()
/escri#"o
!ausa o programa por um perodo de tempo (em milissegundos especificado pelo
par%metro. (Existem '((( milissegundos em um segundo.
?intaxe
delaH(ms
!ar%metros
ms, quantidade de milissegundos a parar o programa (unsigned long
2etorna
nada
Advert7ncia
Assim como f*cil criar o efeito de piscar um .E/ com a fun#"o delaH(, e muitos
programas (s9etc$es utili1am pausas curtas para tarefas como garantir o
pressionamento de um bot"o, o uso da fun#"o delaH( tem significativos obst*culos.
:en$uma outra a#"o, como leitura de sensores, c*lculos matem*ticos, ou manipula#"o
de portas funciona durante a pausa pela fun#"o delaH(. /essa forma, esta pausa tem
como efeito causar a inoperabilidade de todas as outras atividades. !ara abordagens
alternativas no controle de tempo, considere o uso da fun#"o millis(. !rogramadores
mais experientes evitam utili1ar a fun#"o delaH( para c*lculos de tempo maiores que '(
milissegundos, a n"o ser que o programa se4a realmente muito simples. 3ertas coisas,
entretanto, continuam funcionando enquanto a fun#"o delaH( est* controlando o c$ip do
ATMega, porque essa fun#"o n"o desabilita as interrup#Ies. 3omunica#"o serial que
c$ega no pino 2J gravada, valores !<M (analog8rite e o estado das portas s"o
mantidos, assim como as interrup#Ies funcionam como esperado.

E,emplo

int led!in K 'B- ;; .E/ conectado na porta 'B
void setup(
L
pinMode(led!in, A&T!&T- ;; configura a porta como saida (A&T!&T
M
void loop(
L
digital<rite(led!in, =)>=- ;; liga (=)>= o .E/
delaH('(((- ;; espera um segundo
digital<rite(led!in, .A<- ;; desliga (.A< o .E/
delaH('(((- ;; espera um segundo
M
Constantes do Arduino
Constantes
3onstantes s"o vari*veis pr0definidas da linguagem do Arduino. Elas s"o usadas para
fa1er com que programas fiquem mais f*ceis de ler. 3onstantes s"o classificadas em
grupos.

Definindo N&eis -.gicos e Constantes /ooleanas (true e false)
Existem duas constantes utili1adas para representar verdade e falsidade na linguagem do
Arduino, true (erdadeiro) e false (falso).
false
Nalso o mais f*cil de se definir. Nalso definido como 1ero ((.
true
6erdadeiro normalmente tido como um (', que est* correto, mas verdadeiro tem uma
defini#"o mais ampla. Oualquer inteiro que n"o se4a 1ero (( considerado verdadeiro,
num sentido booleano. Ent"o 0', F e 0F(( s"o todos definidos como verdadeiro, tambm
em um sentido booleano.
:ote que as constantes verdadeiro (true e falso (false s"o digitadas em caixa0baixa
(letras min+sculas, ao contr*rio de =)>= (A.TA, .A< (PA)JA, ):!&T
(E:T2A/A e A&T!&T (?A)/A.

Definindo os N&eis das Portas( 0I10 e -#)
Ouando lendo ou escrevendo em uma porta digital, existem apenas dois valores
possveis que a porta pode ser lida;configurada, 0I10 (A-T#) e -#) (/AI2#).
0I10
A entendimento de =)>= (em rela#"o a porta um pouco diferente dependendo se a
porta foi configurada como ):!&T (E:T2A/A ou A&T!&T (?A)/A. Ouando uma
porta configurada como ):!&T, utili1ando a fun#"o pinMode, e lida com a fun#"o
digital2ead, o microcontrolador retornar* =)>= se a voltagem de B volts ou mais
estiver presente na porta.
&ma porta tambm pode ser configurada como ):!&T com o pinMode e na sequ7ncia
ser configurada como =)>= com a fun#"o digital<rite. )sto ativar* o resistor interno de
eleva#"o de F(G o$ms, o qual derivar* a porta para o valor =)>= a n"o ser que ela se4a
tra1ida para .A<, por um circuito externo.
Ouando uma porta configurada para A&T!&T com a fun#"o pinMode, e configurada
para =)>= com a digital<rite, a porta ficar* em 5 volts. :este estado, a porta pode
fornecer corrente, por exemplo para acender um .E/, conectado atravs de um resistor
em srie com o terra (ground ou >:/, ou mesmo para outro pino configurado como
sada e com valor .A< (tem o mesmo efeito do >:/.
-#) (/AI2#)
A significado de .A< tambm tem diferentes entendimentos dependendo de como a
porta configurada para ):!&T ou A&T!&T. Ouando uma porta configurada como
):!&T pela fun#"o pinMode, e lida com a fun#"o digital2ead, o microcontrolador ir*
retornar .A< se a voltagem de F volts ou menos estiver presente na porta.
Ouando uma porta configurada para A&T!&T com pinMode, e configurada como
.A< pelo digital<rite, a porta ter* o valor de ( volts. :este estado podemos ancorar
corrente, como no exemplo do .E/ ligado atravs de um resistor em srie com uma
porta A&T!&T no estado =)>=.

Definindo Portas Digitais( INPUT (ENTRADA) e #UTPUT (%AIDA)
!ortas digitais podem ser usadas tanto como INPUT ou #UTPUT. Mudar o estado de
uma porta de ):!&T para A&T!&T com a fun#"o pinMode( muda drasticamente as
caractersticas eltricas da porta.
Porta Configurada como Entrada
!ortas do Arduino (ATMega configuradas como INPUT com pinMode est"o em um
estado con$ecido por alta0imped%ncia. &ma forma de explicar isso que a porta
configurada como ):!&T demanda muito pouca corrente do circuito que est*
amostrando, como se tivesse um resistor de '(( Megao$ms em srie com a porta. )sto
se fa1 +til para leitura de um sensor, mas n"o para acender um .E/.
Porta Configurada como %a&da
!ortas configuradas como #UTPUT com pinMode est"o em um estado con$ecido por
baixa0imped%ncia. )sso significa que elas podem fornecer uma quantidade substancial
de corrente para outros circuitos. As portas do ATMega podem fornecer (prover corrente
positiva ou ancorar (prover corrente negativa at D( mA (miliamperes de corrente
para outros dispositivos;circuitos. 3onfiguradas dessa forma, as portas podem fornecer
corrente para acender um .E/, mas se tornam in+teis para leitura de um sensor. !ortas
configuradas como sada podem tambm ser danificadas ou destrudas se curto0
circuitadas tanto ao terra quanto aos 5 volts. A corrente fornecida pelas portas do
ATMega tambm n"o s"o suficientes para a maioria dos motores e rel7s, ent"o algum
circuito de casamento se fa1 necess*rio.
3ari4eis do Arduino
3ari4eis
&ma vari*vel uma forma de nomear e guardar um valor para usar depois pelo
programa, como dados de um sensor, ou ainda, um valor intermedi*rio de um c*lculo.
Declarando 3ari4eis
Antes de serem utili1adas, as vari*veis devem ser declaradas. /eclarar uma vari*vel
significa definir seu tipo, e opcionalmente, configurar um valor inicial (iniciar a
vari*vel. 6ari*veis n"o precisam ser iniciadas (conferidas um valor quando estas s"o
declaradas, mas muitas ve1es se fa1 +til.
int inputVariable1; // iniciando varivel
int inputVariable2 = 0; // iniciando e atribuindo valor
!rogramadores devem considerar o taman$o dos n+meros que dese4am guardar,
escol$endo o tipo da vari*vel. 6ari*veis sobrecarregam quando o valor excede o espa#o
designado para guard*0lo. 6e4a abaixo por exemplo.
Escopo da 3ari4el
Autra escol$a importante que os programadores enfrentam onde declarar as vari*veisQ
A lugar especfico que as vari*veis s"o declaradas influencia como v*rias fun#Ies do
programa a enxergaro. )sto c$amado de escopo.
Iniciando 3ari4eis
6ari*veis devem ser iniciadas (designadas um valor no momento que elas s"o
declaradas ou depois. R sempre uma boa pr*tica de programa#"o verificar que uma
vari*vel ten$a dados v*lido dentro dela, antes de ser utili1ada.
Exemplo,
int calibrationVal = 17; // declara calibrationVal e configura seu
valor
// inicial
%o5recarga da 3ari4el
Ouando vari*veis t7m seu valor excedido pela capacidade m*xima do seu tipo, elas
sobrecarregam e voltam para seu valor mnimo. )sto acontece em ambas dire#Ies.
int x
x = -32,7!;
x = x - 1; // x cont"# 32,77 - sobrecarrega na dire$%o
negativa
x = 32,77;
x = x & 1; // x cont"# -32,7! ' sobrecarrega
Usando 3ari4eis
&ma ve1 que vari*veis ten$am sido declaradas, elas podem ser usadas configurando a
vari*vel para o valor que se dese4a arma1enar, atravs do operador de atribui#"o (um
sinal de igual. A operador de atribui#"o di1 ao programa para atribuir o que estiver do
lado direito do sinal de igual, dentro da vari*vel que deve ficar do lado esquerdo do
sinal de igual.
inputVariable1 = 7; // configura varivel c(a#ada
inputVariable1
// atribuindo o valor 7
inputVariable2 = analog)ead*2+; // configura varivel c(a#ada
inputVariable2
// atribuindo a voltage# lida de u#a porta
// anal,gica 2
E,emplos
int lig(t-ensVal;
c(ar current.etter;
unsigned long speed/f.ig(t = 1!0000.;
c(ar error1essage = 23escol(a outra i#press%o34; // vide5 string

&ma ve1 que a vari*vel ten$a sido configurada (conferida um valor, voc7 pode testar
seu valor para verificar se atende determinada condi#"o, ou usar seu valor diretamente.
!or exemplo, o cdigo a seguir testa se o valor da vari*vel input6ariableF menor que
'((, ent"o configurando um atraso (delaH baseado no valor de input6ariableF, que no
mnimo '((.
if *inputVariable2 6 100+
2
inputVariable2 = 100;
4
dela7*inputVariable2+;

Este exemplo mostra todas as tr7s opera#Ies +teis que se pode fa1er com vari*veis. Ele
testa a vari*vel (if (inputVariable2 < 100), configura o valor '(( caso o teste
ten$a passado (inputVariable2 = 100, e utili1a o valor arma1enado na vari*vel
como par%metro de entrada na fun#"o delay (delay(inputVariable2).
Nota de Estilo$ 6oc7 deve nomear suas vari*veis descrevendo as caractersticas do
valor guardado, para fa1er o cdigo ficar mais agrad*vel de ler. :omes de vari*veis
como tilt%ensor ou pus6/utton te a4udam (ou a qualquer um que este4a lendo seu
cdigo a entender o que a vari*vel representa.
6oc7 pode nomear uma vari*vel com qualquer palavra que voc7 quiser, desde que n"o
se4am as reservadas do Arduino (lin9 para palavras reservadas. Evite nomes que
comecem com n+meros.
Alguns Tipos de 3ari4eis
c$ar
bHte
int
unsigned int
long
unsigned long
float
double
Escopo das 3ari4eis
6ari*veis na linguagem 3, que o Arduino usa, tem uma caracterstica con$ecida por
escopo. )sto um contraste com linguagens como PA?)3 que qualquer vari*vel uma
vari*vel global.
&ma vari*vel global uma que pode ser vista por qualquer fun#"o dentro de um
programa. 6ari*veis locais s"o apenas visveis para a fun#"o na qual foram declaradas.
:o ambiente do Arduino, qualquer vari*vel declarada fora de uma fun#"o (ex. setup,
loop, etc., considerada uma vari*vel global.
Ouando programas come#am a ficar grandes e mais complexos, vari*veis locais s"o
+teis para garantir que apenas uma fun#"o ter* acesso apenas as suas prprias vari*veis.
)sso evita erros de programa#"o quando uma fun#"o inadvertidamente, modifica o valor
de vari*veis utili1adas por outra fun#"o.
Algumas ve1es +til declarar e iniciar uma vari*vel interna para um lao (loop. Assim
criamos uma vari*vel que possa apenas ser acessada na parte interna das c$aves LM do
lao-for.
E,emplo$
int g891val; // :ual:uer fun$%o acessa essa varivel
void setup*+
2
// ;;;
4
void loop*+
2
int i; // 3i3 " apenas 3vis<vel3 dentro da fun$%o 3loop3
float f; // 3f3 " apenas 3vis<vel3 dentro da fun$%o 3loop3
// ;;;
for *int = = 0; = 6100; =&&+2
// varivel >=? pode ser apenas
// acessada dentro das c(aves do la$o-for
4
4
Traduo: Renato Aloi
Original em Ingls: ttp:!!arduino"cc!en!Reference!#ariable$eclaration
ttp:!!arduino"cc!en!Reference!scope
!ostado por 2enato Aloi Ss '5,DD B coment*rios,
Marcadores, 3urso Arduino >r*tis 2obtica Automa#"o 2obot Micro 3ontrolador
ATMega 6ari*veis Nun#Ies 3
7uinta-feira( 8 de noem5ro de 9:;;
+un!<es do Arduino
?egmentar o cdigo em fun#Ies possibilita ao programador criar partes modulares, que
desempen$am tarefas bem definidas, e ent"o retornam para a *rea do cdigo a partir de
onde foram c$amadas. A caso tpico de cria#"o de uma fun#"o quando existe a
necessidade de executar a mesma tarefa diversas ve1es durante um programa.
!ara programadores acostumados ao PA?)3, fun#Ies do Arduino fornecem (e
estendem a utilidade do uso das subrotinas (>A?&P em PA?)3.
!adroni1ar fragmentos de cdigo em fun#Ies tem v*rias vantagens,
Nun#Ies a4udam o programador permanecer organi1ado, muitas ve1es, isso a4uda
a montar o conceito do programa.
Nun#Ies codificam a tarefa em um +nico lugar, para que a funcionalidade se4a
pensada e depurada uma +nica ve1.
As c$ances de erros em modifica#Ies redu1em drasticamente, no caso do cdigo
precisar ser alterado.
Nun#Ies redu1em o taman$o dos ?9etc$es (pro4etos criados na )/E do Arduino,
do ingl7s, rascun$os, pois se#Ies de cdigo podem ser reutili1adas diversas
ve1es.
Elas tambm tornam mais f*cil reutili1ar cdigo, tornando0o mais modular, e
com um efeito colateral benfico, fica mais agrad*vel de ler o cdigo.
Existem duas fun#Ies mandatrias nos ?9etc$es do Arduino, setup( e loop(. Autras
fun#Ies podem ser criadas fora das c$aves (LM dessas duas fun#Ies. 3omo um
exemplo, vamos criar uma fun#"o simples para multiplicar dois valores.
E,emplo
!ara Tc$amarU nossa fun#"o simples de multiplica#"o, ns passamos os par%metros do
tipo de dados que a fun#"o est* esperando,
void loop2
int i = 2;
int = = 3;
int @;
@ = #71ultipl7Aunction*i, =+; // @ noB contains
4
:ossa fun#"o precisa ser declarada fora de qualquer outra fun#"o, ent"o
TMin$aNuncaoMultiplicar(U pode ficar tanto acima quanto abaixo da fun#"o principal
Tloop(U.
A cdigo completo deve ficar parecido com isto,
void setup*+2
-erial;begin*C00+;
4
void loop*+ 2
int i = 2;
int = = 3;
int @;
@ = #71ultipl7Aunction*i, =+; // @ noB contains
-erial;println*@+;
dela7*D00+;
4
int #71ultipl7Aunction*int x, int 7+2
int result;
result = x E 7;
return result;
4
#utro e,emplo
Esta fun#"o abaixo far* a leitura de um sensor, cinco ve1es, utili1ando a fun#"o
analog2ead(- calculando a mdia das cinco leituras. Ela tambm converte os dados da
leitura para V bits ((0F55, e a inverte, invertendo assim a sada.
int )ead-ensFandFGondition*+2
int i;
int sval = 0;
for *i = 0; i 6 D; i&&+2
sval = sval & analog)ead*0+; // sensor na porta anal,gica 0
4
sval = sval / D; // #"dia
sval = sval / H; // converte para ! bits *0 - 2DD+
sval = 2DD - sval; // inverte a sa<da
return sval;
4
!ara c$amar a fun#"o, ns apenas fa1emos a atribui#"o para uma vari*vel.
int sens;
sens = )ead-ensFandFGondition*+;
-a!os )6ile = +or do Arduino
comando for
Descrio
O comando for utilizado para repetir blocos de comandos inseridos entre chaves. Um
contador incremental normalmente utilizado para incrementar e finalizar o lao. O comando
for til em qualquer tarefa repetitiva, e largamente utilizado em combinao com arra!s para
processar cole"es de dados#portas.
O lao for constitu$do de % partes&
for 'iniciao( condio( incremento) *
##comando's)(
+
, iniciao 'declarao da vari-vel contadora) acontece primeiro e e.atamente uma nica vez.
/ada vez que o lao roda, a condio testada( se verdadeira, o bloco de comandos e seu
incremento e.ecutado, ento a condio verificada novamente. 0uando a condio se torna
falsa, o lao termina.
Exemplo
// Isvanece u# .IJ usando u#a porta 891
int 891pin = 10; // .IJ e# s"rie co# resistor H70 o(# na porta 10
void setup*+
2
// nada a ser feito no setup
4
void loop*+
2
for *int i=0; i 6= 2DD; i&&+2
analog9rite*891pin, i+;
dela7*10+;
4
4
Dicas de Codificao
O lao for do / muito mais fle.$vel que outros laos encontrados em outras linguagens de
programao, incluindo 1,23/. 0ualquer uma das % partes 'ou todas elas) podem ser omitidas,
embora os pontos e v$rgulas so obrigat4rios. 5anto que os comandos de iniciao, condio e
incremento podem ser qualquer comando v-lido em /, mesmo que as vari-veis no tenham
relao entre si. 6 permitido o uso de qualquer tipo de vari-vel, mesmo float. 6stes tipos no
usuais para comandos for devem fornecer solu"es para alguns problemas raros de
programao.
7or e.emplo, utilizando multiplicao na parte incremental gerar- uma progresso logar$timica&
for*int x = 2; x 6 100; x = x E 1;D+2
println*x+;
4
8esultado& 9,%,:,;,<,=%,=<,9>,:9,;%,<:
Outro e.emplo, esvanece um ?6@ ao ligar e desligar com esse lao for
void loop*+
2
int x = 1;
for *int i = 0; i K -1; i = i & x+2
analog9rite*891pin, i+;
if *i == 2DD+ x = -1; // #uda a dire$%o no pico
dela7*10+;
4
4
lao while
Descrio
?aos Ahile vo e.ecutar sequencialmente e para sempre, at que a e.presso
dentro dos parBnteses ') se torne falsa. ,lgum evento deve mudar o estado da
vari-vel testada, ou ento o lao Ahile no terminar- nunca. 6ste evento pode
estar em seu c4digo, como uma vari-vel incremental, ou uma condio e.terna,
como um sensor de teste, um boto etc.
Sintaxe
B(ile*express%o+2
// co#ando*s+
4
Parametros
e.presso C um 'boolean) comando / que retorne verdadeiro ou falso 'true ou false)
Exemplo
var = 0;
B(ile*var 6 200+2
// fa$a algu#a coisa repetitiva por 200 veLes
var&&;
4
%trings no Arduino
Descri!"o
?trings de texto podem ser representadas de duas formas. 6oc7 pode utili1ar o tipo de
vari*vel T?tringU, que parte do Arduino desde a vers"o (('W, ou voc7 pode fa1er uma
string a partir de um arraH de vari*veis do tipo Tc$arU e adicionar a termina#"o nula.
Este artigo descreve o +ltimo mtodo. !ara maiores detal$es sobre o ob4eto ?tring, que
permite maiores funcionalidades (e tambm maior custo de memria, ve4a o artigo
mais abaixo.
E,emplos
Todas as formas abaixo s"o declara#Ies v*lidas de strings.
c(ar -tr1M1DN;
c(ar -tr2M!N = 2OaO,OrO,OdO,OuO,OiO,OnO,OoO4;
c(ar -tr3M!N = 2OaO,OrO,OdO,OuO,OiO,OnO,OoO,OP0O4;
c(ar -trHM N = 3arduino3;
c(ar -trDM!N = 3arduino3;
c(ar -trM1DN = 3arduino3;
Possi5ilidades para declara!"o de strings
/eclare um arraH de caracteres (c$ar sem inici*0lo, como feito em ?tr'
/eclare um arraH de caracteres (c$ar, com um caractere adicional, e o prprio
compilador acrescentar* o caractere de termina#"o nula, como feito em ?trF
Adicionar explicitamente o caractere nulo, como em ?trB
)nicie com uma constante de texto, contida entre aspas- o compilador vai definir
o taman$o do arraH de caracteres automaticamente, calculando o taman$o da
string mais o terminador nulo, conforme ?trD
)nicie um arraH com o taman$o declarado explicitamente e uma constante de
texto entre aspas, vide, ?tr5
)nicie um arraH, deixando espa#o extra para strings com taman$os maiores,
conforme ?trX
Termina!"o Nula
>eralmente, strings s"o terminadas com um caractere nulo, (cdigo A?3)) 1ero Y(Z.
)sto permite que fun#Ies (como a ?erial.print( con$ecerem onde termina o texto da
string. 3aso contr*rio, essas fun#Ies continuariam a ler bHtes da memria que n"o
fa1em parte da string.
)sso significa que sua string precisa ter espa#o suficiente para um ou mais caracteres
alm do texto que voc7 dese4a arma1enar. R por isso que a vari*vel ?trF e ?tr5 (acima
precisam de V caracteres, mesmo tendo a palavra TarduinoU apenas C letras [ a +ltima
posi#"o preenc$ida automaticamente com o caractere nulo. ?trD ser* automaticamente
redimensionada para o taman$o de V caracteres, sendo uma posi#"o para o nulo. :a
vari*vel ?trB, ns declaramos explicitamente o taman$o e adicionamos o caractere nulo
(@\(@ por nossa conta.
6e4a que possvel ter uma string sem o caractere final nulo (por exemplo, declarando a
vari*vel ?trF com C ao invs de V caracteres. )sso fal$ar* na maioria das fun#Ies que
esperam uma string para funcionar, portanto n"o fa#a isso intencionalmente] ?e voc7
perceber um comportamento diferente, como adi#"o de caracteres estran$os na sua
string, este pode ser o problema.
Aspas %imples ou Duplas>
?trings sempre s"o definidas escrevendo0se um texto contido entre aspas duplas
(exemplo, EAbcE, e caracteres sempre s"o definidos escrevendo0se uma +nica letra (ou
dgito, ou algum caractere da tabela A?3)), contido dentre aspas simples, ou apstrofes
(exemplo, @A@.
?ue5rando strings longas
6oc7 pode quebrar strings assim,
c(ar #7-tringMN = 30# texto :ue co#e$a a:ui3
3 e ter#ina logo3
3 ali3;
Arra* de %trings
Ouando trabal$amos com uma grande quantidade de texto, em um pro4eto com displaH
.3/, por exemplo, muito comum fa1er uso de um arraH de strings. 3omo as strings
por si s s"o arraHs de caracteres, um arraH de string nada mais sen"o um arraH bi0
dimensional de caracteres.
:o cdigo abaixo, o asterisco aps o tipo de vari*vel (Tc$ar^U, indica que esta vari*vel
um arraH de ponteiros. Todos os arraHs na realidade s"o ponteiros de memria, ent"o
este o requisito para fa1er arraHs de arraHs. A estudo de ponteiros uma das partes
mais difceis para um iniciante, mas necess*rio entender ponteiros em detal$es, para
us*0los de forma efetiva aqui.
E,emplo
c(arE #7-tringsMN=23Q(is is string 13, 3Q(is is string 23, 3Q(is is
string 33,
3Q(is is string H3, 3Q(is is string D3,3Q(is is string 34;
void setup*+2
-erial;begin*C00+;
4
void loop*+2
for *int i = 0; i 6 ; i&&+2
-erial;println*#7-tringsMiN+;
dela7*D00+;
4
4
#5@eto %tring
Descri!"o
A classe ?tring, parte do Arduino desde a vers"o (('W, nos permite utili1ar e manipular
strings de texto de uma maneira mais completa aos arraHs de caracteres. 6oc7 pode
concatenar textos, adicionar trec$os de texto, pesquisar expressIes no texto e substituir
trec$os, e muito mais. 3onsome mais memria que um simples arraH de caracteres, mas
muito mais +til.
!ara refer7ncia, arraHs de caracteres s"o declarados como TstringU com o TsU min+sculo,
e inst%ncias da classe ?tring s"o declaradas como T?tringU, com a letra T?U mai+scula.
2epare tambm que strings constantes, especificadas por aspas duplas, s"o tratadas
como arraHs de caracteres, e n"o como inst%ncias da classe ?tring.
+un!<es
?tring(
c$arAt(
compareTo(
concat(
ends<it$(
equals(
equals)gnore3ase(
getPHtes(
indexAf(
last)ndexAf(
lengt$(
replace(
set3$arAt(
starts<it$(
substring(
to3$arArraH(
to.o8er3ase(
to&pper3ase(
trim(
#peradores
YZ (element access
_ (concatenation
KK (comparison
E,emplos
?tring3onstructors
?tringAdditionAperator
?tring)ndexAf
?tringAppendAperator
?tring.engt$Trim
?tring3ase3$anges
?tring2eplace
?tring3$aracters
?tring?tarts<it$Ends<it$
?tring3omparisonAperators
?tring?ubstring
C.digo +onte RTCA-CD - Curso Arduino Adanced - Aula B

!essoal,
?egue abaixo o cdigo fonte utili1ado na Aula C do 3urso Arduino Advanced,
sobre o 2elgio em Tempo 2eal com /isplaH .3/ 'XxF.
Rinclude
Rinclude
Rinclude
)QGFJ-1307 )QG;
.i:uidGr7stal lcd*12, 11, D, H, 3, 2+;
void setup*+
2
-erial;begin*C00+;
9ire;begin*+;
)QG;begin*+;
lcd;begin*1, 2+;
if *S)QG;isrunning*++
2
)QG;ad=ust*JateQi#e*FFJTQIFF, FFQU1IFF++;
4
4
void loop*+
2
JateQi#e agora = )QG;noB*+;
-tring relogioFdata = 3JQ5 3;
-tring relogioF(ora = 3V)5 3;

int dia = agora;da7*+;
int #es = agora;#ont(*+;
int ano = agora;7ear*+;

relogioFdata &= Trru#aWero*dia+;
relogioFdata &= 3/3;
relogioFdata &= Trru#aWero*#es+;
relogioFdata &= 3/3;
relogioFdata &= ano;

int (ora = agora;(our*+;
int #inuto = agora;#inute*+;
int segundo = agora;second*+;

relogioF(ora &= Trru#aWero*(ora+;
relogioF(ora &= 353;
relogioF(ora &= Trru#aWero*#inuto+;
relogioF(ora &= 353;
relogioF(ora &= Trru#aWero*segundo+;

lcd;setGursor*0, 0+;
lcd;print*relogioFdata+;
lcd;setGursor*0, 1+;
lcd;print*relogioF(ora+;

dela7*D00+;
4
-tring Trru#aWero*int i+
2
-tring ret;
if *i 6 10+ ret &= 303;
ret &= i;
return ret;
4
C.digo +onte Arduino para Ponte 0 ia P)'
!essoal,
?egue o cdigo do exemplo de acionamento da !onte = via !<M, conforme o
vdeo abaixo,

int portaV1 = C;
int portaV2 = 10;
int potpin = 0;
int val;
int val1;
int val2;

void setup*+
2
-erial;begin*C00+;
4

void loop*+
2
val = analog)ead*potpin+;

val1 = #ap*val, 0, D11, 2DD, 0+;
val2 = #ap*val, D12, 1023, 0, 2DD+;

if *val K D11+ val1 = 0;
else val2 = 0;

-erial;print*3Val5 3+;
-erial;print*val, JIG+;
-erial;print*3 Val15 3+;
-erial;print*val1, JIG+;
-erial;print*3 Val25 3+;
-erial;println*val2, JIG+;

analog9rite*portaV1, val1+;
analog9rite*portaV2, val2+;
C.digos do 'aterial Adicional da Aula C (Ponte 0)
!essoal,
?egue abaixo os cdigos do Material Adicional da Aula V (!onte = publicado no
`outube.
3digo do Motor de !asso,
ainclude
const int steps!er2evolution K F((-
?tepper mH?tepper(steps!er2evolution, V,W,'(,''-
void setup( L
mH?tepper.set?peed(X(-
?erial.begin(WX((-
M
void loop( L
?erial.println(Ecloc98iseE-
mH?tepper.step(steps!er2evolution-
delaH(5((-

?erial.println(Ecountercloc98iseE-
mH?tepper.step(0steps!er2evolution-
delaH(5((-
M

3digo do Plin9 com dois motores,
void setup( L
pinMode('B, A&T!&T-
pinMode('F, A&T!&T-
pinMode('(, A&T!&T-
pinMode('', A&T!&T-
digital<rite('B, .A<-
digital<rite('F, .A<-
digital<rite('(, .A<-
digital<rite('', .A<-
M
void loop( L
digital<rite('B, =)>=-
digital<rite('F, .A<-
digital<rite('(, =)>=-
digital<rite('', .A<-
delaH('(((-
digital<rite('B, .A<-
digital<rite('F, =)>=-
digital<rite('(, .A<-
digital<rite('', =)>=-
delaH('(((-
M
C.digos +ontes da Aula ;: (E,pansor de Porta) do Curso Arduino
!essoal,
?egue os cdigos fontes utili1ados na Aula '( do 3urso Arduino Advanced. E conforme
prometido segue o cdigo tambm do contador regressivo.
C.digo D;
ainclude
adefine expansor' (xBV
void setup(
L
<ire.begin(-
<ire.beginTransmission(expansor'-
<ire.send((xNN-
<ire.endTransmission(-
M
void loop(
L
<ire.beginTransmission(expansor'-
<ire.send(P'(((((('-
<ire.endTransmission(-
delaH('(((-
<ire.beginTransmission(expansor'-
<ire.send(P('''''('-
<ire.endTransmission(-
delaH('(((-
M

C.digo D9

ainclude
adefine expansor' (xBV
adefine expansorF (xBW
void setup(
L
<ire.begin(-
comunica(expansor', (xNN-
comunica(expansorF, (xNN-
M
void loop(
L
comunica(expansor', P'(((((('-
comunica(expansorF, P('''''('-
delaH('(((-
comunica(expansorF, P'(((((('-
comunica(expansor', P('''''('-
delaH('(((-
M
void comunica(bHte endereco, bHte digito
L
<ire.beginTransmission(endereco-
<ire.send(digito-
<ire.endTransmission(-
M

C.digo E,tra do Contador Regressio

ainclude
adefine expansor' (xBV
adefine expansorF (xBW
void setup(
L
<ire.begin(-
Escreve/igito(expansor', (xNN-
Escreve/igito(expansorF, (xNE-
M
void loop(
L
for(int i K WW- i bK (- i00
L
bHte a K i ; '(-
bHte b K i 0 (a ^ '(-
if (i c '( a K (-
Escreve/igito(expansorF, 3onverte/igito(a-
Escreve/igito(expansor', 3onverte/igito(b-
delaH('(((-
M
M
bHte 3onverte/igito(bHte decimal
L
s8itc$(decimal
L
case (,
return P((('((('-
case ',
return P('''''('-
case F,
return P(('(((''-
case B,
return P(('('(('-
case D,
return P('((''('-
case 5,
return P'((('(('-
case X,
return P'(((((('-
case C,
return P((''''('-
case V,
return P((((((('-
case W,
return P(((('(('-
default,
return P'''(''''-
M
M
void Escreve/igito(bHte endereco, bHte digito
L
<ire.beginTransmission(endereco-
<ire.send(digito-
<ire.endTransmission(-
M

C.digo +onte - Aula ;E do Curso Arduino Adanced (P0P)
!essoal,
?egue o cdigo utili1ado no Arduino,
void setup(
L
?erial.begin(WX((-
delaH('(((-
M
void loop(
L
if (?erial.available(
L
c$ar recebido K ?erial.read(-
if (recebido K @t@
L
int valor.ido K analog2ead((-
float temperatura K (valor.ido ^ (.((DVV ^ '((-
?erial.print(ETemperatura, E-
?erial.println(temperatura-
M
M
M
3digo utili1ado no !=!,
cQp$p
;;MA3;.inux
;;dportAddress K @;dev;ttH.J`e@-
;;<indo8s
dportAddress K @3AMB@-
exec(Emode comB, PA&/KWX(( !A2)T`K: dataKV stopK' xonKoffE-
ec$o(E c$'b Temperatura 6ia Arduino c;$'b E-
ec$o(E cpb 3onectando, aguarde...E-
dport K fopen(dportAddress, @8_@-
if(]dport
L
ec$o E cbr ;b :ao foi possivel abrir a porta dportAddressE-
M
else
L
ec$o E cbr ;b 3onectado com sucesso na porta dportAddressE-
M
ec$o(E c;pb E-
sleep(B-
f8rite(dport, @t@-
sleep('-
ec$o fgets(dport-
fclose(dport-
Qb
C.digo +onte da Aula so5re /luetoot6
const int porta.ed = 13;
void setup*+
2
-erial;begin*C00+;
pin1ode*porta.ed, /0Q80Q+;
digital9rite*porta.ed, ./9+;
4
void loop*+
2
if *-erial;available*++
2
int c = -erial;read*+;
if *c == OaO+
2
digital9rite*porta.ed, VUXV+;
-erial;println*3/@, led ligadoS3+;
4
else if *c == ObO+
2
digital9rite*porta.ed, ./9+;
-erial;println*3/@, led desligadoS3+;
4
4
4
Arduino e a Internet (ou seria Et6ernet>)
!essoal,
Est* uma bagun#a esse assunto de Eligar o Arduino na )nternetE, nQ
6amos come#ar com um gloss*rio para a4udar,
Internet 0 2ede mundial de computadores
Et6ernet 0 2ede local de computadores
Roteador 0 >erenciador de rotas entre as redes locais e a internet
Arduino 0 A$... bom... deixa pr* l*. ^
Ca5o Cross (#er) 0 con$ecido tambm por Epar0tran#adoE 0 3abo usado para
ligar um computador n@outro sem o uso de um gerenciador de rotas (roteador
Ca5o de Rede (Normal) 0 tambm tran#ado, mas n"o tem o Epar0tran#adoE ou
Epar0invertidoE (este +ltimo, sendo o termo mais correto. &sado para ligar o
computador direto no roteador. Tambm liga do roteador no modem.
'odem 0 /ispositivo (normalmente fornecido pela operadora de sinal, :ET,
Teleffnica etc. que transforma o sinal (de uma forma que n"o importa e tradu1
para o roteador. !or isso ligamos o modem em uma porta especial do roteador.
#peradora 0 Au E!rovedoraE, ou ainda ENornecedoraE de sinal Ede )nternetE,
conforme costumamos di1er, a prestadora de servi#os que nos cobra todo m7s
uma conta enorme por uma internet de m* qualidade, e quando cai, ficamos
$oras no EatendimentoE escutando musiquin$as e atendentes di1endo coisas do
tipo, E6ou estar fa1endo, sen$orE, E6ou estar verificando, sen$orE...
Access Point 0 &m nome c$ique para um roteador com fun#Ies especiais de
repeti#"o de sinal.
(^ !recisa de um post s sobre esse item do gloss*rio.
Agora a parte complicada
Pom, qualquer placa ou mdulo Et$ernet que adicionarmos ao Arduino vai fornecer
exatamente isso, ou se4a, conex"o com a rede local de computadores. :ormalmente
aquela rede que tem )!@s 'WF.'XV.(.', sendo esse o )! do roteador. (As ve1es
'WF.'XV.'.'.
Atualmente temos os seguintes placas;mdulos para Arduino
)iFnet Et6ernet %6ield )E;::
'icroc6ip ENC9CGH:
)E;:: sI ENC9CGH:
Atualmente existe um problema de ruptura no mercado. As prprios vendedores e
importadores n"o est"o sabendo direito que pedir aos seus fornecedores. As clientes
est"o confusos. :"o sabem ao certo se devem partir para uma plataforma <i1net
<5'((, mas se EoriginalE, ou se compatvel com Arduino ME>A... Ao mesmo tempo
que confian#a podemos ter em um mdulo E:3FVgX(, que custa B( ou D( reaisQ
A resposta n"o f*cil. &m longo camin$o precisa ser tril$ado. !ara quem est*
come#ando f*cil, basta ligar um Et$ernet ?$ield <5'(( em um Arduino &:A e ser
feli1]
Mas e quem amadureceu uma ideia e quer colocar em pr*ticaQ ?e o pro4eto final for um
Et$ernet ?$ield e um Arduino &:A, dentro de uma caixin$a, tudo bem, n"o perca
tempo lendo este tpico.
Eu ac$o que n"o por a, um pro4eto profissional precisa de uma placa centrali1adora
(con$ecido por centralina e mdulos de integra#"o.
A Et$ernet ?$ield <5'(( n"o abre espa#o para integra#Ies. ?eu circuito externo
muito complicado] Nica difcil tirar o c$ip <5'(( do Et$ernet ?$ield e utili1ar em
nossos pro4etos.
Ele tem uma interface ?!) de DM$1 que um parto de fa1er funcionar em processadores
que rodam a 'XM$1 e F(M$1, como o caso do Arduino &:A e ME>A,
respectivamente.
!or isso algumas pessoas tem problemas na instala#"o desse modelo de Et$ernet ?$ield
no Arduino ME>A. A cloc9 precisa ser dividido por 5 e n"o por D como no Arduino
&:A. :"o sei direito como isso pode acontecer, mas parece que acontece. 6ers"o antiga
de )/EQ )ncompatibilidade entre 2E6F e 2E6B, sei l*] !ode ser um monte de coisas.
Ainda estou investigando. 6ou c$egar no fundo dessa $istria]
Pom, resumindo, descobri que pro4etos concorrentes ao !rotuino Prea9out (pro4eto
antigo e engavetado, que foi copiado pelo concorrente. ?egue foto do !rotuino
Prea9out para voc7s entenderem do que estou falando,
Protuino /reaJout (9:;:)
Estes pro4etos clone do !rotuino est"o utili1ando o <5F(( e n"o mais o <5'((] Nui
atr*s para descobrir porque]QQ
/escobri ent"o que o <5F(( precisa de menos componentes externos, por essa ra1"o,
pfde ser redu1ido a um mdulo pequeno,
'.dulo )E9::
Alm disso o c$ip do <5F(( fisicamente menor que o c$ip do <5'((, e a ?!) vai at
V(M$1]
Pom, para fec$ar esse assunto, investigando mais a fundo descobri que existe tambm
um <5B(( da <i1net,
)iFnet )E8::
$ttp,;;888.8i1net.co.9r;subhmodules;en;product;!roducth/etail.aspQ
cate'K5icateFKCicateBKF5ipidK'('F
Mas fiquei com uma pulga atr*s da orel$a] Alguma coisa n"o est* certa] A pre#o desses
mdulos da <i1net] 3ad7 a filosofia do cdigo abertoQ /a plataforma aberta]Q Eles
est"o fec$ando cada ve1 mais a caixa0preta e cobrando mais caro por produtos
incompletos, isso mesmoQ Esses mdulos custam de 2d'5(,(( a 2dF((,((] !or esse
pre#o eu posso comprar um 2aspberrH !i e usar a interface de Et$ernet dele] &m
absurdo de caro]
!elo menos a Microc$ip est* sendo mais decente e est* vendendo seus c$ips a um pre#o
bem acessvel e em formatos que s"o vanta4osos para o desenvolvedor de plataformas
open source, como a vers"o /)!,
ENC9CGH: ers"o DIP
(timo para prottipos e montagens na protoboard]
)E;:: A 3enda No 'ercado
:"o importa se for EoriginalE ou Ec$in7sE] As c$ineses atualmente est"o especialistas
em copiar circuitos externos]
Todos eles est"o defasados] /esatuali1ados] As vendedores n"o est"o bem informados
dessas mudan#as- e os clientes que precisam exigir o modelo novo, se4a ele o <5F(( ou
<5B((, se4a ele qual for, pois pelo pre#o que custam, tem que ser o mais atuali1ado
possvel]
Mas e o E:3FVgX(, qual o problema deleQ Pom, o problema que n"o existe biblioteca
oficial do Arduino para ele. ? bibliotecas suportadas pela comunidade.
g* o <5'(( da <i1net uma caixa fec$ada, s com a biblioteca aberta, integrada na
)/E do Arduino. Au se4a, quando voc7 baixa o programa do Arduino, a biblioteca 4*
vem 4unto e instalada 4unto com o Arduino.
:o E:3FVgX(, precisamos primeiro ac$ar uma biblioteca, e decidir por ela, pois
existem algumas. Eu mesmo 4* fi1 umas B versIes diferentes.
)E;:: sI ENC9CGH: - Conclus"o
:a min$a opini"o, nen$um dos dois est* bom, pois o <5'(( n"o funciona no Arduino
?upervisrio e nem no !rotuino. 6amos esperar pelo <5F((.
Ouanto ao E:3FVgX(, ele tambm tem uma srie de revisIes e atualmente est* na
vers"o X. As bibliotecas disponveis que continuam sendo atuali1adas s"o,
Min$as,
$ttps,;;git$ub.com;renatoaloi;EncFV3ore.ib (atuali1ada recentemente
$ttps,;;git$ub.com;renatoaloi;Et$erEnc.ib
Terceiros,
$ttps,;;git$ub.com;4c8;et$ercard
R isso pessoal, estamos na vanguarda, mas ainda na espera desse aman$ecer que se
desen$a no $ori1onte] Muitas vari*veis est"o rodando no caldeir"o]
&ma boa passagem de ano para todos e que F('D se4a o ano de integra#"o e lembrem0
se, estou aqui para incomodar] :"o vou deixar barato em F('D]
Curso Arduino E,press Aula H - Controle Remoto Uniersal
!ostado por 2enato Aloi Ss 'D,(W :en$um coment*rio,
se,ta-feira( ;8 de deFem5ro de 9:;8
1uia para o Arduino -eonardo
!ara conectar o Arduino .eonardo no computador, voc7 vai precisar de um cabo &?P
tipo Micro0P.
Este cabo fornecer* energia e conectividade para a placa. Ao programar o .eonardo,
voc7 deve escol$er TArduino .eonardoU no menu Tools K /oards a partir do Arduino
)/E.
Diferen!as do Arduino Uno
Em geral, voc7 programa e usa o .eonardo como qualquer outra vers"o do Arduino.
Existem, entretanto, algumas diferen#as muito importantes.
%icrocontrolador &nico para s'etces e comunicao ()*
A .eonardo difere de versIes do Arduino na maneira em que usa o microcontrolador
para ambas as tarefas, rodar os s9etc$es e se comunicar com o computador, atravs de
&?P. A &:A e outras versIes do Arduino usam microcontroladores separados para
essas duas fun#Ies, ou se4a, a conex"o &?P com o computador permanece aberta,
independente do estado do microcontrolador principal. 3ombinando essas duas
funcionalidades em um +nico microcontrolador, o .eonardo nos permite maior
flexibilidade, na forma em que ele se comunica com o computador. )sto tambm a4uda a
redu1ir o custo da placa, removendo a necessidade de um microcontrolador adicional.
Re-enumerao da )erial no Reset
3onsiderando que o .eonardo n"o possui um c$ip dedicado para lidar com a
comunica#"o serial, significa que a porta serial virtual [ uma rotina do programa.
Assim como o computador cria uma inst%ncia da porta serial quando voc7 conecta um
Arduino qualquer na porta &?P, o .eonardo cria uma inst%ncia de porta serial toda ve1
que roda seu bootloader. A placa, quando conectada na porta &?P do computador,
instanciada como um 3onnected /evice 3lass (3/3.
)sso significa que toda ve1 que voc7 reinicia a placa, a conex"o serial &?P tambm
reiniciada. A placa vai desaparecer da lista de portas seriais, e a lista ser* re0enumerada.
Oualquer programa que tentar abrir uma conex"o serial com o .eonardo perder* sua
conex"o. Em contraste com o Arduino &:A, que voc7 pode reiniciar o
microcontrolador principal (o ATMegaBFV!, sem terminar a conex"o &?P (que
mantida por um ATMegaV&F ou um ATMega'X&F. Essa diferen#a tem implica#Ies na
instala#"o do driver, no upload, e na comunica#"o- que ser"o discutidos abaixo.
+o reinicia ,uando a abre a )erial
Ao contr*rio do Arduino &:A, o .eonardo n"o reinicia o s9etc$ quando voc7 abre uma
porta serial no computador. )sso significa que voc7 n"o ver* os dados que 4* foram
enviados pela serial para o computador, incluindo, por exemplo, a maioria dos dados
enviados na fun#"o setup(.
Esta mudan#a significa que, se voc7 est* usando qualquer instru#"o ?erial print(,
println( ou 8rite( no seu setup(, elas n"o ser"o exibidas quando voc7 abrir o monitor
da serial. !ara contornar isso, voc7 pode verificar se a porta serial est* aberta antes de
c$amar a fun#"o ?erial.begin(, da seguinte forma,
?erial.begin(WX((-
!! en,uanto serial nao esta aberta- nao faca nada.
8$ile (]?erial -
/mulao de Teclado e %ouse
&ma vantagem de usar um +nico c$ip para seus s9etc$es, e para a &?P, de aumentar a
flexibilidade na comunica#"o com o computador. Enquanto a placa aparece como uma
porta virtual (tambm c$amado 3/3 serial, aos ol$os do seu sistema operacional para
programa#"o e comunica#"o (com a feita pelo Arduino &:A, este tambm pode se
comportar com um teclado ou mouse (=)/. 6e4a a sess"o de TPoas !r*ticas de
3odifica#"oU abaixo para dicas sobre como usar essa funcionalidade.
)eparao da ()* e da 0omunicao )erial
:o .eonardo, a classe principal %erial refere0se ao driver serial da conex"o &?P da sua
placa. E n"o est* conectada diretamente (fisicamente aos pinos ( e '. !ara usar o
$ard8are da porta serial (pinos ( e ', 2J e TJ, utili1e %erial;. (6e4a ?erial 2eference
!ages para maiores informa#Ies
$iferenas entre %apeamento de 1inos
A .eonardo possui algumas pequenas diferen#as na sua capacidade de atribui#"o de
v*rios pinos (especialmente para ?!) e T<). Estes s"o detal$ados na =ard8are !age.
Instalando os Driers para o -eonardo
O)2
A primeira ve1 que voc7 conecta um .eonardo em um Mac, o EGeHboard ?etup
AssistantE ser* lan#ado. :"o existe nada para ser configurado com o .eonardo, ent"o
voc7 pode fec$ar a caixa de di*logo clicando no bot"o vermel$o, no canto superior
esquerdo da 4anela.
Instru3es para 4indo5s
As instru#Ies a seguir s"o para o <indo8s C. Elas s"o v*lidas tambm para o <indo8s
J!, considerando algumas pequenas diferen#as entre as 4anelas de di*logo.
3onecte a sua placa e espere pelo <indo8s come#ar o processo de instala#"o dos
drivers. 3aso o instalador n"o inicie automaticamente, navegue at o T<indo8s /evice
ManagerU (?tart b 3ontrol !anel b =ard8are e encontre o Arduino .eonardo na
listagem de dispositivos. 3lique com o bot"o direito e escol$a Update drier.
:a prxima tela, escol$a EPro8se mH computer for driver soft8areE, e clique em :ext.
3lique no bot"o Pro8se... . Autra caixa de di*logo aparece, navegue at a pasta do
Arduino que voc7 acabou de fa1er o do8nload. ?elecione a pasta drivers e clique AG,
ent"o clique em :ext.
6oc7 receber* uma notifica#"o de que a placa n"o passou no teste <indo8s .ogo.
3lique no bot"o 3ontinue AnH8aH.
/epois de alguns momentos, uma 4anela ir* te informar que o 8i1ard terminou a
instala#"o do Arduino Esplora. !ressione o bot"o 3lose.
Instru3es para 6inux
:"o existe a necessidade de instalar drivers para &buntu 'F.(D.
Carregando C.digo no -eonardo
:o geral, voc7 carrega o cdigo no .eonardo como faria em qualquer outra vers"o do
Arduino. 3lique no bot"o upload, no Arduino )/E, e seu s9etc$ ser* automaticamente
carregado na placa- e ent"o iniciado. )sso funciona mais ou menos da mesma forma que
no &:A, o soft8are do Arduino comanda um reset na placa, lan#ando um bootloader [
que respons*vel por receber, arma1enar, e iniciar o novo s9etc$.
Entretanto, em ra1"o da porta serial ser virtual, ela desaparece quando a placa efetua um
reset, ent"o o soft8are do Arduino usa uma estratgia diferente para coordenar o upload,
tanto com o &:A, quanto com outras versIes. Assim, aps iniciar o auto0reset do
.eonardo (usando a porta serial selecionada no menu Tools b ?erial !ort, o soft8are do
Arduino espera por uma nova porta virtual (3/3 serial ; 3AM aparecer [ a qual ele
assume representar o bootloader. Ent"o ele efetua o upload para esta nova porta 3AM
que apareceu.
Essas diferen#as afetam a forma que voc7 utili1a o bot"o de reset para efetuar um
upload, se o auto0reset n"o estiver funcionando. !ressione e segure o bot"o do
.eonardo, ent"o clique no bot"o de upload no soft8are do Arduino. Apenas solte o
bot"o de reset aps voc7 ver a mensagem T&ploading...U aparecer na barra de status do
soft8are. Ouando voc7 fi1er isso, o bootloader iniciar*, criando uma nova porta virtual
(3/3 serial no computador. A soft8are ver* a porta aparecer e efetuar* o upload
atravs dela. :ovamente, isso apenas necess*rio se a forma normal de upload (i.e.
apenas clicando no bot"o de upload n"o funcionar. (note que o auto0reset iniciado
quando o computador abre a porta serial na velocidade de 'F(( bauds- e ent"o a fec$a-
isso n"o funciona se algo interfere com a comunica#"o &?P da placa [ por exemplo,
desabilitando as interrup#Ies.
/oas Pr4ticas de Codifica!"o com o -eonardo
Aten!"o ao utiliFar 5i5liotecas de teclado e mouse U%/$ se as bibliotecas de Mouse
ou GeHboard est"o constantemente $abilitadas, ser* difcil programar sua placa.
Nun#Ies como Mouse.move( e GeHboard.print(, que movem o cursor do mouse ou
enviam teclas digitadas para um computador conectado, devem apenas ser c$amadas
quando voc7 estiver pronto para atend70las. R recomend*vel usar um sistema de
controle que possa ligar essa funcionalidade, assim como um interruptor, ou apenas
respondendo a dispositivos que voc7 possa controlar. Ouando usando bibliotecas Mouse
e GeHboard, mel$or testar antes o resultado, atravs de ?erial.print(. /essa forma,
voc7 pode garantir que os resultados s"o ra1o*veis. Mais informa#Ies de como lidar
com isso, ve4a exemplos nas bibliotecas Mouse e GeHboard.
Usando o monitor de serial de forma efetia$ como a serial est* compartil$ando o
microcontrolador com o processamento principal, a capacidade do seu computador de
preenc$er o buffer da serial ser* t"o r*pido como em versIes do &:A ou anteriores.
6oc7 vai reparar que se voc7 continuar enviando dados pela serial repetidamente, por
exemplo, assim,
void loop( L
int sensor2eading K analog2ead(A(-
?erial.println(sensor2eading-
M
A monitor da serial vai ficar extremamente lento, enquanto ele tenta acompan$ar a
velocidade. ?e voc7 se deparar com essa situa#"o, adicione um pequeno atraso ao seu
loop de forma que o buffer da serial do computador n"o se4a preenc$ido t"o r*pido at
um atraso de um milissegundo a4udar*,
void loop( L
int sensor2eading K analog2ead(A(-
?erial.println(sensor2eading-
delaH('-
M
Aplica#Ies seriais que utili1am as bibliotecas nativas, que n"o se4a a biblioteca 2JTJ,
l7em o buffer da serial mais rapidamente, assim voc7 n"o deve encontrar este erro, fora
do monitor da serial, processing, ou outra aplica#"o baseada na biblioteca 2JTJ.