Você está na página 1de 0

www.revistadoarduino.com.

br
Joo Alexandre da Silveira
ARDUINO
Cartilha para Programao em C

Para Interfaces Simples
de Hardware - Edio 1.0
Esse material de domnio pblico e pode ser livremente distribudo e impresso
desde que sem modifcaes em seu contedo.
Porta USB - usada
para comunicao serial
com um computador
Funes em C:
begin( )
end( )
available( )
read( )
print( )
println( )
Pinos analgicos
usados para leitura de
sinais de sensores
Funo em C:
analogRead( )
Pinos de Alimentao
usados para alimentao de
circuitos externos e reset
do Arduino
Pinos Digitais
usados para deteo
ou transmisso de
controles digitais
Funes em C:
pinMode( )
digitalRead( )
digitalWrite( )
analogWrite( )
attachInterrupt( )
pulseIn( )
www.revistadoarduino.com.br
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina II
www.revistadoarduino.com.br
Cartilha de Programao em C para o ARDUINO
Escrita e produzida por Joo Alexandre da Silveira
Com informaes e inspiraes tomadas de:
Arduino Programming Notebook - Brian W. Evans
Experimentos com o ARDUINO - Joo Alexandre da Silveira
Programming Interactivity - Josua Noble
The C Programming Language - Kernighan and Ritche
Let Us C - Yashavant Kanetkar
C for Engineers and Scientists - Gary Bronson
www.arduino.cc
www.revistadoarduino.com.br
Edio 1.0 - janeiro de 2012
Esse material de domnio pblico e pode ser livremente distribudo
e impresso desde que sem modifcaes em seu contedo.
e-mail do autor: planctum@yahoo.com
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina III
PREFCIO
Este livreto de pouco mais de 20 pginas um guia de consulta rpida para os inici-
antes em programao do ARDUINO para criao de interfaces simples de hardware.
Ele resume em tabelas, imagens e grfcos de fcil compreenso a funo das portas
fsicas de entrada e de sada do ARDUINO e os principais comandos da sua linguagem
de programao. A idia foi reunir em um pequeno guia de bancada a descrio de cada
pino do ARDUINO e as funes na sua linguagem de programao relativas a esses
pinos. Tambem esto includas as funes para comunicao serial.
O texto foi dividido em duas partes: uma que trata da estrutura da linguagem de
programao, e uma que trata do hardware controlado por essa programao. Nessa
primeira parte apresentada a estrutura bsica da linguagem com as suas duas prin-
cipais funes; a seguir uma breve introduo sobre constantes, variveis, matrizes,
funes de matemtica e tempo e, por fm, as funes de controle de fuxo herdadas
da linguagem C/C++. Na segunda parte as portas de entrada e sada (pinos) digitais, as
portas analgicas e a porta serial do ARDUINO so descritas junto com as suas fun-
es de controle.
Para aqueles leitores interessados em se aprofundar mais no mundo do ARDUINO
e na linguagem C sugerimos os livros e sites web que aparecem na pgina II deste
livreto. Sugestes, crticas e comentrios sobre esse trabalho podem ser enviadas
diretamente para o autor pelo site www.revistadoarduino.com.br; onde o leitor poder
tambem cadastrar seu e-mail para ser notifcado sobre uma nova edio desta Car-
tilha.

Joo Alexandre da Silveira
janeiro de 2012
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina IV
www.revistadoarduino.com.br
NDICE

MAPA DAS ENTRADAS E SADAS DO ARDUINO 2
A - A ESTRUTURA DA LINGUAGEM DO ARDUINO 3
A Estrutura Bsica
Funes
Declarao de funes
setup( )
loop( )
Os smbolos
{ }
;
//
/*...*/

A.1 - CONSTANTES E VARIVEIS 4
TRUE/FALSE
HIGH/LOW
INPUT/OUPUT
Escopo da Varivel
Declarao da Varivel
Tipos de variveis
A.2 - MATRIZES 5
Declarao de uma Matriz
Escrever/Ler uma Matriz
A.3 - LGICA E ARITMTICA 6
Smbolos compostos
Operadores de comparao
Operadores lgicos
A.4 - FUNES MATEMTICAS E DE TEMPO 7
delay( )
delayMicroseconds( )
millis( )
random( )
abs( )
map( )

A.5 - FUNES PARA CONTROLE DE FLUXO 8
if
if...else
if...else...if

www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina V


while
do...while
for
switch...case
operador ternrio ?
B- AS PORTAS DE E/S DO ARDUINO E SUAS FUNES EM C 13
B.1 - OS PINOS DIGITAIS 13
pinMode( )
digitalRead( )
digitalWrite( )
analogWrite( )
attachInterrupt( )
pulseIn( )
B.2 - OS PINOS ANALGICOS 15
analogRead( )
B.3 - A PORTA SERIAL DO ARDUINO 16
Serial.begin( )
Serial.end( )
Serial.available( )
Serial.read( )
Serial.print( )
Serial.println( )
B.4 - OS PINOS DE ALIMENTAO 17
www.revistadoarduino.com.br
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 2
www.revistadoarduino.com.br
A - A ESTRUTURA DA LINGUAGEM DO ARDUINO
A estrutura bsica da linguagem de programao do Arduino bastante simples; ela formada por
dois blocos de funes que carregam outros blocos de funes escritas em linguagem C/C++. O primeiro
bloco de funes forma a funo setup( ); o segundo, a funo loop( ).
Os Smbolos usados na construo de funes so os seguintes:
{ } - Dentro das chaves vo os procedimentos (statements) que a funo deve executar;
; - O ponto-e-vrgula usado para marcar o fnal de um procedimento;
// - comentrio de uma linha: qualquer caracter depois das duas barras ignorado pelo programa;
/*...*/ - comentrio em vrias linhas: qualquer texto colocado entre esses simbolos tambem
ignorado pelo programa.

Funes em linguagens de programao
so como sub-rotinas ou procedimentos;
so pequenos blocos de programas usa-
dos para montar o programa principal.
Elas so escritas pelo programador para
realizar tarefas repetitivas, ou podem ser
importadas prontas para o programa em
forma de bibliotecas.
Declarao da Funo toda fun-
o deve ser declarada antes de ser
chamada atribuindo-lhe um tipo e um
nome seguido de parnteses, onde sero
colocados os parmetros de passagem
da funo. Depois do nome so defnidos
entre as chaves { e } os procedimen-
tos que a funo vai executar.
setup( ): Essa a primeira funo a
ser chamada quando o programa inicia.
E executada apenas nessa primeira
vez. Esta uma funo de preparao:
ela dita o comportamento dos pinos do
Arduino e inicializa a porta serial.
loop( ): A funo loop( ) chamada
logo a seguir e todas as funes embar-
cadas nela so repetidamente executa-
das. Ela fca lendo os pinos de entrada
do Arduino e comandando os pinos de
sada e a porta serial.
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina 3
Exemplo:
/*
Nesse cdigo a funo setup( ) ativa a porta serial em 9600 bits/s e a funo loop( ) fca transmitin-
do a frase Hello World! pela porta serial a cada 2 segundos.
*/
void setup( ) {
Serial.begin(9600); // inicializa a porta serial
}
void loop( ) {
Serial.println( Hello World! ); // transmite frase
delay(2000);
}
A.1 - CONSTANTES E VARIVEIS
CONSTANTES so
valores predefnidos que
nunca podem ser altera-
dos. Na linguagem C do
Arduino so 3 os grupos
de constantes; os dois
componentes de cada
grupo sempre podem
ser representados pelos
nmeros binrios 1 e 0.
TRUE/FALSE so constantes booleanas que defnem estados lgicos.
Verdadeiro qualquer valor que no seja zero. Falso sempre o valor zero.
HIGH/LOW essas constantes defnem as tenses nos pinos digitais do
Arduino. Alto uma tenso de 5 volts; baixo o terra (ou 0 volt).
INPUT/OUPUT so constantes programadas pela funo pinMode( )
para os pinos do Arduino; eles podem ser entradas (de sensores) ou podem
ser sadas (de controle).
VARIVEIS so
posies na memria de
programa do Arduino
marcadas com um nome
e o tipo de informao
que iro guardar. Essas
posies podem estar
vazias ou podem rece-
ber um valor inicial. Os
valores das variveis po-
dem ser alterados pelo
programa.
Escopo da Varivel o limite ou abrangncia da varivel. Uma variv-
el pode ser declarada em qualquer parte do programa. Se for declarada
logo no incio, antes da funo setup( ), ela tem o escopo de Varivel Glob-
al, e porisso ela pode ser vista e usada por qualquer funo no programa.
Se declarada dentro de uma funo ela tem o escopo de Varivel Local, e
s pode ser usada por essa funo.
Declarao da Varivel como as funes, toda varivel deve ser
declarada antes de ser chamada. Essa declarao consiste em atribuir
previamente um tipo e um nome varivel.
Tipos de variveis:
byte - esse tipo armazena 8 bits (0-255);
int - armazena nmeros inteiros de at 16 bits;
long - armazena nmeros inteiros de at 32 bits;
foat - variveis deste tipo podem armazenar nmeros fracionrios de at
32 bits.
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 4
www.revistadoarduino.com.br
Exemplo:
/* Esse programa escrito em C do Arduino aumenta e diminui gradativamente o brilho de um LED
conectado no pino PWM 10 do Arduino. */
int i=0; // declarao da varivel global inteira i iniciada com 0
void ledOn( ); // declarao da funo criada ledOn do tipo void
void setup( ) {
pinMode(10,OUTPUT); // aqui 2 parmetros so passados funo pinMode( )
}
void loop( ) {
for (i=0; i <= 255; i++) ledOn( ); // aumenta o brilho do led
for (i=255; i >= 0; i--) ledOn( ); // diminui o brilho do led
}
void ledOn( ) { // funo que acende o led
analogWrite (10, i); // o n do pino e o valor de i so passados funo analogWrite( )
delay (10);
}
A.2 - MATRIZES
MATRIZES so colees
de variveis do mesmo tipo,
portanto so posies na
memria de programa, com
endereos que podem ser
acessados por meio de um
identifcador, chamado de
ndice. A primeira posio de
uma matriz sempre a de
ndice 0.
Declarao de uma Matriz I As matrizes, como as variveis e
as funes, devem ser declaradas com um tipo e um nome seguido de
colchetes; e podem tambm ser inicializadas com os valores entre as
chaves. Exemplo:
int nomeMatriz [ ] = { 16,32,64,128, ... };
Declarao de uma Matriz II Pode-se tambem declarar
somente o tipo, o nome e o tamanho da matriz, deixando para o
programa o armazenamento de variveis nas posies, ou ndices, da
matriz.
int nomeMatriz [ 10 ] ; //nomeMatriz com dez 10
//posies para variveis inteiras
Escrever/Ler uma Matriz Para guardar o inteiro 16 na 4
posio da matriz nomeMatriz, usa-se:
nomeMatriz [3] = 16;
Para atribuir o valor armazenado na 5 posio de nomeMatriz
varivel x:
int x = nomeMatriz[4];
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina 5
A.3 - LGICA E ARITMTICA
Operaes Aritmticas
e lgicas as 4 operaes
aritmticas, diviso, multi-
plicao, adio e subtrao,
so representadas pelos
smbolos: /, *, + e -, respec-
tivamente, separando os
operandos. E so 3 os opera-
dores lgicos na linguagem do
Arduino que so usados para
comparar duas expresses e
retornar a constante TRUE/
FALSE.
Smbolos compostos so aqueles que combinam os smbolos arit-
mticos entre si e com o sinal de atribuio:
x ++ // x=x+1
x -- // x=x-1
x += y // x=x+y
x -= y // x=x-y
x *= y // x=x*y
x /= y // x=x/y
Operadores de comparao comparam uma varivel com
uma constante, ou variveis entre si. So usados para testar se uma
condio verdadeira.
x == y // x igual a y
x != y // x no igual a y
x < y // x menor que y
x > y // x maior que y
x <= y // x menor ou igual a y
x >= y // x maior ou igual a y
Operadores lgicos so usados para comparar duas expresses,
retornam 1 ou 0 (verdadeiro/falso).
&& AND porta lgica E
|| OR porta lgica OU
! NOT porta lgica NO
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 6
www.revistadoarduino.com.br
Funo Exemplo Notas
delay(ms)
Essa funo pausa o programa por um
perodo em milissegundos indicado pelo
parmetro entre parnteses.
delay(1000);
Com esse parmetro o pro-
grama vai pausar durante 1
segundo (1000 ms).
Durante o perodo em que
essa funo est ativa
qualquer outra funo no
programa suspensa;
equivalente ao HALT em
Assembly. Somente as
interrupes de hardware
podem parar essa funo.
delayMicroseconds(us)
Essa funo pausa o programa por um
perodo em microssegundos indicado pelo
parmetro entre parnteses.
delayMicrosec-
onds(1000);
Com esse parmetro o pro-
grama vai pausar durante 1
ms (1000 us).
As mesmas observaes
acima para a funo
delay(ms) so vlidas aqui.
millis( )
Retorna o nmero de milissegundos desde
que o Arduino comeou a executar o pro-
grama corrente.
long total = millis( );
Aqui a varivel inteira longa
(de 32 bits) total vai guar-
dar o tempo em ms desde
que o Arduino foi inicial-
izado.
Essa varivel vai ser rese-
tada depois de aproxima-
damente 9 horas.
random(min,max)
Gera nmeros pseudo-aleatrios entre
os limites min e max especifcados como
parmetros.
int valor = ran-
dom(100,400);
varivel valor vai ser
atribuido um nmero inteiro
qualquer entre 100 e 400.
O parmetro min opcio-
nal e se excludo o limite
mnimo 0. No exemplo
varivel valor poder ser
qualquer nmero inteiro
entre 0 e 400.
abs(x)
Retorna o mdulo ou valor absoluto do
nmero real passado como parmetro.
foat valor = abs(-3.14);
varivel valor vai ser
atribudo o nmero em ponto
futuante (e sem sinal) 3.14.
map(valor,min1,max1,min2,max2)
A funo map( ) converte uma faixa de
valores para outra faixa. O primeiro par-
metro valor a varivel que ser converti-
da; o segundo e o terceiro parmetros so
os valores mnimo e mximo dessa varivel;
o quarto e o quinto so os novos valores
mnimo e mximo da variavel valor.
int valor = map(analog
Read(A0),0,1023,0,255));
A varivel valor vai guardar
a leitura do nvel analgico
no pino A0 convertida da
faixa de 0-1023 para a faixa
0-255.
Com essa funo pos-
svel reverter uma
faixa de valores, ex-
emplo: int valor =
map(x,1,100,100,1);
A.4 - FUNES MATEMTICAS E DE TEMPO
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina 7
A.5 - FUNES PARA CONTROLE DE FLUXO
if um controle de fuxo usado para selecionar uma ou mais instrues baseado no resultado de um
teste de comparao. Todas as instrues entre as chaves { e } so executadas somente se o resultado
desse teste for verdadeiro; se no, essas instrues no so executadas. Verdadeiro qualquer resul-
tado, mesmo negativo, diferente de zero. Falso um resultado zero.
if (expresso) {
bloco de instrues; // se expresso for verdadeira, bloco de instrues executado
}
if...else Ao se acrescentar mais um bloco de instrues no loop do comando if pode-se criar o
comando if...else, para fazer um teste novo quando o resultado da expresso for falsa.
if (expresso) {
bloco de instrues1; // se expresso for verdadeira, bloco de instrues1 executado
}
else {
bloco de instrues2; // se expresso for falsa, bloco de instrues2 executado
}
da instruo
anterior
para a prxima
instruo
SIM
NO
O comando if...else
EXPRESSO
verdadeira?
da instruo
anterior
para a prxima
instruo
SIM
NO
O comando if
EXPRESSO
verdadeira?
BLOCO DE
INSTRUES
BLOCO DE
INSTRUES 1
BLOCO DE
INSTRUES 2
ELSE
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 8
www.revistadoarduino.com.br
switch...case possvel ir inserindo comandos if...else na posio do segundo bloco de
instrues de outro comando if...else e assim criar uma cadeia de comandos para testar dezenas
de expresses at encontrar uma que retorne um resultado verdadeiro e executar um dos blocos de
instrues; mas existe um comando prprio que simplifca bastante essa seleo, o comando switch...
case. Esse comando permite comparar uma mesma varivel inteira, ou uma expresso que retorne um
inteiro, com vrios valores possveis.
if...else if E de novo ao se acrescentar agora o comando if...else no loop do comando if pode-
se criar mais um outro comando, o if...else if. No exemplo abaixo se expresso1 for verdadeira o
bloco de instrues1 executado; se expresso1 for falsa mas expresso2 for verdadeira bloco
de instrues2 executado; e se expresso1 e expresso2 forem falsas o bloco de instrues3
executado.

ELSE IF
O comando if...else if
da instruo
anterior
para a prxima
instruo
SIM
NO
SIM
NO
EXPRESSO 1
verdadeira?
EXPRESSO 2
verdadeira?
BLOCO DE
INSTRUES 3
BLOCO DE
INSTRUES 1
BLOCO DE
INSTRUES 2
O comando switch...case
para a prxima
instruo
3 ?
2 ?
da instruo
anterior
NO
BLOCO DE
INSTRUES 4
(default)
BLOCO DE
INSTRUES 1
EXPRESSO
BLOCO DE
INSTRUES 3
1 ?
NO
NO
SIM
SIM
SIM
BLOCO DE
INSTRUES 2
if (expresso1) {
bloco de comandos1;
}
else if (expresso2) {
bloco de instrues2;
}

else {
bloco de comandos3;
}
switch (expresso) {
case 1: bloco de instrues1;
break;
case 2: bloco de instrues2;
break;
case 3: bloco de instrues3;
break;
default: bloco de instrues4;
}

ELSE
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina 9
while Uma das operaes mais frequentes que os programas executam repetir um grupo de in-
strues at que uma condio inicialmente verdadeira se torne falsa. para isso que serve o comando
while. A sua sintaxe a seguinte:
while (expresso) {
bloco de instrues;
}
O bloco de instrues ser executado enquanto o parmetro expresso for verdadeiro.
do...while Para que o bloco de instrues seja executado ao menos uma vez, ele deslocado
para a entrada da caixa de decises, antes do teste de validade:
do {
bloco de instrues;
}
while (expresso);

Aqui o bloco de instrues ser executado primeiro e s ento o parmetro expresso avaliado.
O comando while
da instruo
anterior
para a prxima
instruo
SIM
NO
EXPRESSO
verdadeira?
BLOCO DE
INSTRUES
LOOP
O comando do...while
da instruo
anterior
para a prxima
instruo
SIM
NO
EXPRESSO
verdadeira?
BLOCO DE
INSTRUES
LOOP
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 10
www.revistadoarduino.com.br
for Inserindo-se no loop do comando while um contador que registre cada execuo do bloco de
instrues cria-se o comando for. Esse contador deve ter uma varivel de controle que deve ser previa-
mente inicializada com um tipo e um valor. A sua sintaxe a seguinte:
for (varivel; expresso;incremento) {
bloco de instrues;
}
A varivel inicializada normalmente com 0 ou 1; o parmetro expresso deve conter o valor mximo
(ou mnimo) que o contador deve alcanar; e incremento o valor que ser incrementado (ou decremen-
tado) da varivel cada vez que o bloco de instrues executado. Observe que cada parmetro entre
parnteses separado por ponto e vrgula.

O comando for
da instruo
anterior
para a prxima
instruo
SIM
NO
EXPRESSO
verdadeira?
BLOCO DE
INSTRUES
LOOP
inicializao
VARIVEL
do contador
CONTADOR
Exemplo:
for (int i = 0; i <= 10; i++) {
println (contador);
delay(1000);
}
Nesse exemplo a varivel de con-
trole i do contador inicializada
com 0; o contador testado e se o
valor nele acumulado for menor
que 10 seu valor enviado para o
Terminal, e depois de 1 segundo, o
contador incrementado e seu
novo valor testado novamente.
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina 11
O operador ternrio ? possvel simplifcar cdigos com comandos if...else em C/
C++ com o operador condicional ?, tambem chamado de operador ternrio. Esse operador avalia uma
expresso e se esta for vardadeira uma instruo executada, se a expresso for falsa uma outra
expresso executada. A sua sintaxe a seguinte:
(expresso) ? instruo1 : instruo2;

Note o uso e a posio entre as duas instrues de dois pontos na sintaxe desse operador.
Exemplo:
int x = 8;
y = (x > 10) ? 15 : 20;
Aqui o valor de y vai depender da avaliao da expresso do operador ternrio; como o valor de x vale 8,
a expresso (x>10) falsa, porisso o inteiro 20 ser atribuido a y; se o valor atribuido a x fosse maior
que 10, y seria 15. Essa mesma expresso com o comando if...else fcaria assim:
int x = 8;
if (x > 10) {
y = 15;
}
else
y = 20;
O operador ternrio
para a prxima
instruo
da instruo
anterior
NO
INSTRUO 1
SIM
INSTRUO 2
EXPRESSO
verdadeira ?
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 12
www.revistadoarduino.com.br
MAPA DAS ENTRADAS E
SADAS DO ARDUINO
[E suas Funes na linguagem do Arduino]
Porta USB - usada
para comunicao serial
com um computador
Funes em C:
begin( )
end( )
available( )
read( )
print( )
println( )
Pinos analgicos
usados para leitura de
sinais de sensores
Funo em C:
analogRead( )
Pinos de Alimentao
usados para alimentao de
circuitos externos e reset
do Arduino
Pinos Digitais
usados para deteo
ou transmisso de
controles digitais
Funes em C:
pinMode( )
digitalRead( )
digitalWrite( )
analogWrite( )
attachInterrupt( )
pulseIn( )
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina 13
Funo Exemplo Notas
pinMode(pino,modo)
Serve para estabelecer a direo do
fuxo de informaes em qualquer dos 14
pinos digitais. Dois parmetros devem
ser passados funo: o primeiro indica
qual pino vai ser usado; o segundo, se
esse pino vai ser entrada ou se vai ser
sada dessas informaes.
pinMode(2,OUTPUT);
Aqui o pino 2 selecionado para
transmitir informaes do Arduino
para um circuito externo qualquer.
Para confgurar esse pino como en-
trada, o segundo parmetro dessa
funo deve ser INPUT.
Essa funo sempre
escrita dentro da
funo setup( ).
digitalRead(pino)
Uma vez confgurado um certo pino
como entrada com a funo pinMode( ),
a informao presente nesse pino pode
ser lida com a funo digitalRead( ) e
armazenada numa varivel qualquer.
int chave = digitalRead(3);
Nesse exemplo a varivel inteira
chave vai guardar o estado lgico
(verdadeiro/falso) presente no
pino digital 3.

digitalWrite(pino,valor)
Para enviar um nvel lgico para qualquer
pino digital do Arduino utiliza-se essa
funo. Dois parmetros so requeri-
dos: o nmero do pino e o estado lgico
(HIGH/LOW ) em que esse pino deve
permanecer.
digitalWrite(2,HIGH);
Aqui uma tenso de 5 volts colo-
cada no pino 2. Para enviar terra
para esse pino o segundo parmet-
ro dever ser LOW.
necessrio con-
fgurar previamente o
pino como sada com a
funo pinMode( ).
B - AS PORTAS DE E/S DO ARDUINO E SUAS FUNES
B.1 - OS PINOS DIGITAIS So 14 pinos marcados com o nome DIGITAL logo abaixo
de duas barras de 8 pinos. So numerados de 0 a 13 da direita para a esquerda e podem ser confgura-
dos pela funo pinMode( ) para detetarem ou transmitirem nveis lgicos digitais (verdadeiro/falso,
1/0 ou HIGH/LOW).
Pinos 3, 5 e 6 e 9 a11 (PWM):
6 pinos dos 14 pinos digitais podem ser
usados para gerar sinais analgicos com a
funo analogWrite( ) utilizando a tcnica
de Modulao por Largura de Pulso (PWM).

Pinos 0 e 1: os dois primeiros pinos
digitais so conectados a USART do
microcontrolador do Arduino para co
municao serial com um computador.

Pinos 2 e 3: pinos que chamam uma
ISR (Interrupt Service Routine) para
tratar uma interrupo com a funo
attachInterrupt( ) nesses pinos.

Pinos AREF e GND: o pino
AREF a entrada de tenso de
referncia para o conversor
A/D do Arduino; o pino GND
o terra, comum a todos os
outros pinos.
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 14
www.revistadoarduino.com.br
No programa abaixo essas tres funes so utilizadas para acender um led no pino 2 toda vez que
uma chave normalmente aberta no pino 3 for pressionada.
void setup() {
pinMode(2,OUTPUT); // led no pino 2 como sada
pinMode(3,INPUT); // chave no pino 3 como entrada
}
void loop() {
int chave = digitalRead(3); // varivel chave guarda estado do pino 3
digitalWrite(2,chave); // estado de chave passado para pino 2.
}
O cdigo dentro da funo loop( ) acima pode ainda ser simplifcado da seguinte forma:
void loop() {
digitalWrite(2,digitalRead(3)); // led (pino 2) acende se chave (pino 3) for pressionada.
}
Funo Exemplo Notas
analogWrite(pino,valor)
O Arduino pode gerar tenses analgicas
em 6 de seus 14 pinos digitais com a funo
analogWrite( ). Dois parmetros devem
ser passados funo: o primeiro indica em
qual pino ser gerada a tenso; o segundo
determina a amplitude dessa tenso, e
deve ter valores entre 0 (para 0 volt) e
255 (para 5 volts).
analogWrite(10,128);
Com esses parmetros uma
tenso analgica de 2,5 volts
vai aparecer no pino 10. No
necessrio confgurar um pino
PWM como sada com a funo
pinMode( ) quando se chama
funo analogWrite( ).
Modulao por Lar-
gura de Pulsos, ou PWM
(Pulse Width Modula-
tion) na lingua inglesa,
uma tcnica usada
para gerar tenses
analgicas a partir de
uma sequncia de pulsos
digitais.
attachInterrupt(pino,funo,modo)
Essa funo uma rotina de servio de
interrupo, ou ISR (Interrupt Service
Routine) em ingls. Toda vez que ocorrer
uma interrupo por hardware no pino digi-
tal 2 ou no 3 do Arduino uma outra funo,
criada pelo programador, vai ser chamada.
O terceiro parmetro, modo, informa
como a interrupo vai ser disparada, se
na borda de subida do pulso detetado no
pino do Arduino, se na borda de descida, se
quando o pulso for baixo ou se na mudana
de nvel desse pulso.
attachInterrupt(0,conta
dor,RISING);
Nesse exemplo a funo
contador vai ser chamada
quando o Arduino detetar uma
mudana do nvel LOW para
o nvel HIGH em seu pino 2.
Nessa ISR o parmetro 0
monitora o pino 2, o parmet-
ro 1 monitora o pino 3.
LOW - dispara a inter-
rupo quando o pino
est em 0;
CHANGE - dispara sem-
pre que o pino muda de
estado (de 0 para 1, ou
vice-versa);
RISING - somente
quando o pino muda de 0
para 1;
FALLING - somente
quando o pino muda de 1
para 0.
pulseIn(pino,valor,espera)
Essa funo mede a largura em microsse-
gundos de um pulso em qualquer pino digi-
tal. O parmetro valor diz funo que
tipo de pulso deve ser medido, se HIGH
ou LOW. O parmetro espera (time out)
opcional e se passado funo faz com que
a medida do pulso s comece aps o tempo
em microssegundos ali especifcado.
pulseIn(4,HIGH);
Aqui essa funo vai monito-
rar o pino 4, e quando o nvel
nesse pino mudar de LOW
para HIGH a sua largura vai
ser medida at que seu nvel
volte para LOW. Se, por ex-
emplo, for passado o valor 100
como terceiro parmetro, a
medida da largura do pulso s
ser disparada aps 100 uS.
Uma aplicao interes-
sante para essas duas
ltimas funes pode
ser vista no meu livro
Experimentos com o
Arduino, no captulo que
mostra como montar um
contador de dois dgitos
com mostradores de
7-segmentos.
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina 15
B.2 - OS PINOS ANALGICOS So 6 pinos em uma s barra com o nome ANALOG
IN, localizada no lado oposto s barras dos pinos digitais. So numerados de 0 a 5, agora da esquerda
para a direita. Esses pinos so usados para leitura de sinais analgicos de sensores conectados ao
Arduino, e podem ser de quaisquer valores entre zero a 5 volts. Os pinos de entradas analgicas no
precisam ser previamente confgurados com a funo pinMode( ).
Funo Exemplo Notas
analogRead(pino)
Essa funo l o nvel analgico
presente no pino indicado pelo
parmetro entre parnteses e,
aps a converso para o seu equiva-
lente em bits, o guarda em uma
varivel determinada pelo pro-
gramador.
int sensor = analogRead(A0);
Aqui a varivel inteira sensor vai
armazenar a tenso analgica con-
vertida para digital presente no pino
A0. Essa informao vai ser um valor
inteiro entre 0 (para 0 volt no pino)
e 1023 (se 5 volts no pino). Uma ten-
so de 2,5 volts no pino A0 vai fazer
a varivel sensor guardar o valor
inteiro 512.
Os pinos analgicos so
reconhecidos pela lingua-
gem C do Arduino tanto
como A0 a A5 como 14
a 19. Assim, a mesma
expresso acima pode ser
escrita tambem da se-
guinte forma: int sensor
= analogRead(14);
Uma observao importante em relao a esses pinos analgicos que eles podem ser confgurados
tambem como pinos digitais pela funo pinMode( ), aumentando assim o nmero desses pinos para 20.
Assim, a expresso pinMode(14,OUTPUT); transforma o pino analgico A0 em pino de sada digital
como qualquer outro presente nas duas barras de pinos digitais.
Exemplo:
O cdigo a seguir l uma tenso CC no pino analgico A5 (pino 19) e envia esse valor digitalizado para
controlar o brilho de um led no pino PWM 10:
void setup( ) { } // essa funo pode fcar vazia se no h confgurao
void loop( ) {
analogWrite(10,analogRead(A5)/4); // converso de 0-1023 para 0-255 pela diviso por 4.
}


Pinos 0 a 5: esses 6 pinos aceitam
tenses entre zero e 5 volts CC que vo
ao conversor A/D de 10 bits no microcon
trolador do Arduino. O pino AREF, numa
das barras de pinos digitais, a entrada
de tenso de referncia para esse conversor.
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 16
www.revistadoarduino.com.br
Funo Exemplo Notas
Serial.begin(taxa)
Essa funo habilita a porta serial e
fxa a taxa de transmisso e recepo
em bits por segundo entre o computa-
dor e o Arduino.
Serial.begin(9600);
Nesse exemplo essa funo fxa a
taxa de comunicao em 9600 bps.
Os pinos digitais 0 e 1 no podem
ser utilizados como entrada ou
como sada de dados quando a porta
serial habilitada por essa funo.
Essa funo vai sem-
pre dentro da funo
setup( ).
Serial.end( )
Desabilita a porta serial para permitir o uso dos pinos digitais 0 e 1 para
entrada ou sada de dados.
Essa funo tambem
deve ser escrita den-
tro da funo setup( ).
Serial.available( )
A funo Serial.available( ) retorna
o nmero de bytes disponveis para
leitura no buffer da porta serial.
int total = Serial.available( );
Aqui a varivel inteira total vai
guardar o nmero de caracteres
que esto disponveis para leitura
na porta serial.
O valor 0 retornado
quando no h nenhuma
informao para ser
resgatada na porta
serial.
Serial.read( )
A funo Serial.read( ) l o primeiro
byte que est no buffer da porta se-
rial.
int valor = Serial.read( );
Aqui a varivel inteira valor vai
guardar o primeiro byte (caracter)
disponvel na porta serial.
O valor -1 retornado
quando no h nenhuma
informao para ser
resgatada na porta
serial.
Serial.print(valor,formato)
Essa funo envia para a porta se-
rial um caracter ASCII, que pode ser
capturado por um terminal de comuni-
cao. O segundo parmetro, formato,
opcional e especifca com quantas ca-
sas decimais ou com que base numrica
vai ser o nmero transmitido.
Serial.print(1.23456); // transmite 1.23 (default)
Serial.print(1.23456,3); // transmite 1.234
Serial.print(Al Mundo!); // transmite a frase (string)
Serial.print(A); // transmite o caracter A
Serial.print(A,BIN); // transmite 01000001
Serial.print(A,OCT); // transmite o octal 101
Serial.print(A,HEX); // transmite o hexa 41
Serial.print(A,DEC); // transmite o decimal 65
Serial.println(valor,formato)
Como a anterior essa funo envia para a porta serial um caracter ASCII com os mesmos parmetros
opcionais de formato, porem acrescenta ao fnal da transmisso o caracter Carriage Return (retorno
ao incio da linha) e o caracter New Line (mudana para a prxima linha).
B.3 - A PORTA SERIAL DO ARDUINO E SUAS FUNES EM C

O conector USB: por meio desse conector USB
fmea do tipo A que o Arduino se comunica atraves de
um cabo a um computador ou a outros dispositivos que tenham
tambem uma interface USB. tambem por esse conector que
o Arduino recebe 5 volts diretamente da fonte de alimenta-
o do computador.
www.revistadoarduino.com.br
Joo Alexandre da Silveira pgina 17
Todas essas funes em C para comunicao serial podem se testadas com o cdigo abaixo e ativan-
do o Terminal de Comunicao do Arduino:
void setup( ) {
Serial.begin(9600); //inicia a porta serial em 9600 bps
}
void loop( ) {
Serial.print(Retorno de available( ): ); //envia frase ao terminal
Serial.println(Serial.available()); //transmite total de bytes disponveis
delay(1000); //pausa 1 seg
Serial.print(Retorno de read( ): ); //envia frase
Serial.println(Serial.read( )); //transmite primeiro byte disponvel na porta
delay(1000); //pausa 1 seg.
}
O Terminal Serial do Arduino mostrar inicialmente todo segundo o retorno da funo available(
), que ser 0, e o da funo read( ), que ser -1. Isso ocorre porque nenhum dado est disponvel
na porta serial do computador. Entre no Terminal do Arduino e transmita, por exemplo, as letras
ABCDE juntas (digite no campo ao lado do boto Send) e observe que a funo available( ) informa
inicialmente que existem 5 caracteres no buffer para ser enviados; e a funo read( ) mostra o
cdigo ASCII decimal 65 do primeiro deles, que corresponde letra A. Os outros caracteres vo
sendo enviados sequencialmente enquanto available( ) vai decrementando at 0 de novo.
B.4 - OS PINOS DE ALIMENTAO Ficam na barra com 6 pinos, marcada
como POWER, localizada ao lado dos pinos analgicos. O primeiro pino dessa barra, RESET, quando
forado ao potencial de terra serve para resetar o Arduino. Do outro lado, Vin um pino que tambem
pode servir para alimentar o Arduino se nele for aplicada uma tenso entre 9 e 15 volts.

Pinos 3V3, 5V e Gnd: dos 6 pinos dessa
barra somente os quatro do meio servem para
alimentar um circuito externo conectado ao
Arduino: o pino de 5V e o terra (os dois pinos
Gnd entre 5V e Vin); e o pino 3V3 que disponibiliza
essa tenso com uma corrente mxima de 50mA.
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 18
www.revistadoarduino.com.br
Do mesmo autor dessa Cartilha de Programao em C:
Veja no site abaixo o ndice e os primeiros captulos do livro.

Você também pode gostar