Você está na página 1de 23

Joo Alexandre da Silveira

ARDUINO
Cartilha para Programao em C

Para Interfaces Simples


de Hardware - Edio 1.0

Pinos Digitais

usados para deteo


ou transmisso de

controles digitais
Funes em C:
pinMode( )
digitalRead( )
digitalWrite( )
analogWrite( )
attachInterrupt( )
pulseIn( )

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

Pinos de Alimentao

usados para alimentao de


circuitos externos e reset
do Arduino

Funo em C:
analogRead( )

Esse material de domnio pblico e pode ser livremente distribudo e impresso


desde que sem modificaes em seu contedo.

www.revistadoarduino.com.br
www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina II

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 modificaes 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 iniciantes em programao do ARDUINO para criao de interfaces simples de hardware.
Ele resume em tabelas, imagens e grficos 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 principais funes; a seguir uma breve introduo sobre constantes, variveis, matrizes,
funes de matemtica e tempo e, por fim, as funes de controle de fluxo 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 funes 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 notificado sobre uma nova edio desta Cartilha.

Joo Alexandre da Silveira

janeiro de 2012

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina IV

NDICE

MAPA DAS ENTRADAS E SADAS DO ARDUINO


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
delay( )
delayMicroseconds( )
millis( )
random( )
abs( )
map( )


A.5 - FUNES PARA CONTROLE DE FLUXO
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
Serial.begin( )
Serial.end( )
Serial.available( )
Serial.read( )
Serial.print( )
Serial.println( )

16

B.4 - OS PINOS DE ALIMENTAO 17

www.revistadoarduino.com.br

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina 2

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

Funes em linguagens de programao

so como sub-rotinas ou procedimentos;


so pequenos blocos de programas usados 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.

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.

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 definidos
entre as chaves { e } os procedimentos que a funo vai executar.

loop( ): A funo loop( ) chamada

logo a seguir e todas as funes embarcadas nela so repetidamente executadas. Ela fica lendo os pinos de entrada
do Arduino e comandando os pinos de
sada e a porta serial.

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

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( ) fica transmitindo a frase Hello World! pela porta serial a cada 2 segundos.
*/
void setup( ) {

Serial.begin(9600);
}
void loop( ) {

Serial.println( Hello World! );

delay(2000);
}

// inicializa a porta serial


// transmite frase

A.1 - CONSTANTES E VARIVEIS


CONSTANTES so

TRUE/FALSE so constantes booleanas que definem estados lgicos.

Verdadeiro qualquer valor que no seja zero. Falso sempre o valor zero.

valores predefinidos que


nunca podem ser altera- HIGH/LOW essas constantes definem as tenses nos pinos digitais do
dos. Na linguagem C do Arduino. Alto uma tenso de 5 volts; baixo o terra (ou 0 volt).
Arduino so 3 os grupos
de constantes; os dois
INPUT/OUPUT so constantes programadas pela funo pinMode( )
componentes de cada
para os pinos do Arduino; eles podem ser entradas (de sensores) ou podem
grupo sempre podem
ser representados pelos ser sadas (de controle).
nmeros binrios 1 e 0.

VARIVEIS so

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 Global, 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.

posies na memria de
programa do Arduino
marcadas com um nome
e o tipo de informao
que iro guardar. Essas
posies podem estar
Declarao da Varivel como as funes, toda varivel deve ser
vazias ou podem recedeclarada antes de ser chamada. Essa declarao consiste em atribuir
ber um valor inicial. Os previamente um tipo e um nome varivel.
valores das variveis podem ser alterados pelo
Tipos de variveis:
programa.

byte - esse tipo armazena 8 bits (0-255);


int - armazena nmeros inteiros de at 16 bits;
long - armazena nmeros inteiros de at 32 bits;
float - variveis deste tipo podem armazenar nmeros fracionrios de at
32 bits.

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina 4

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

Declarao de uma Matriz I As matrizes, como as variveis e

de variveis do mesmo tipo,


portanto so posies na
memria de programa, com
endereos que podem ser
acessados por meio de um
identificador, chamado de
ndice. A primeira posio de
uma matriz sempre a de
ndice 0.

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


Smbolos compostos so aqueles que combinam os smbolos aritOperaes Aritmticas mticos entre si e com o sinal de atribuio:
x ++
// x=x+1
e lgicas as 4 operaes
x --
// x=x-1
aritmticas, diviso, multiplicao, adio e subtrao,
so representadas pelos
smbolos: /, *, + e -, respectivamente, separando os
operandos. E so 3 os operadores lgicos na linguagem do
Arduino que so usados para
comparar duas expresses e
retornar a constante TRUE/
FALSE.

x
x
x
x

+= y
-= y
*= y
/= y

// x=x+y
// x=x-y
// x=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

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina 6

A.4 - FUNES MATEMTICAS E DE TEMPO


Funo

Exemplo

Notas

delay(ms)

delay(1000);

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)

delayMicroseconds(1000);

As mesmas observaes
acima para a funo
delay(ms) so vlidas aqui.

millis( )

long total = millis( );

Essa varivel vai ser resetada depois de aproximadamente 9 horas.

random(min,max)

int valor = random(100,400);


varivel valor vai ser
atribuido um nmero inteiro
qualquer entre 100 e 400.

O parmetro min opcional e se excludo o limite


mnimo 0. No exemplo
varivel valor poder ser
qualquer nmero inteiro
entre 0 e 400.

abs(x)

float valor = abs(-3.14);


varivel valor vai ser
atribudo o nmero em ponto
flutuante (e sem sinal) 3.14.

map(valor,min1,max1,min2,max2)

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.

Essa funo pausa o programa por um


perodo em milissegundos indicado pelo
parmetro entre parnteses.

Essa funo pausa o programa por um


perodo em microssegundos indicado pelo
parmetro entre parnteses.

Retorna o nmero de milissegundos desde


que o Arduino comeou a executar o programa corrente.

Gera nmeros pseudo-aleatrios entre


os limites min e max especificados como
parmetros.

Retorna o mdulo ou valor absoluto do


nmero real passado como parmetro.

A funo map( ) converte uma faixa de


valores para outra faixa. O primeiro parmetro valor a varivel que ser convertida; 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.

Com esse parmetro o programa vai pausar durante 1


segundo (1000 ms).

Com esse parmetro o programa vai pausar durante 1


ms (1000 us).

Aqui a varivel inteira longa


(de 32 bits) total vai guardar o tempo em ms desde
que o Arduino foi inicializado.

www.revistadoarduino.com.br

Com essa funo possvel reverter uma


faixa de valores, exemplo: int valor =
map(x,1,100,100,1);

Joo Alexandre da Silveira

pgina 7

A.5 - FUNES PARA CONTROLE DE FLUXO

if um controle de fluxo 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 resultado, mesmo negativo, diferente de zero. Falso um resultado zero.
if (expresso) {

bloco de instrues; // se expresso for verdadeira, bloco de instrues executado
}

da instruo
anterior

O comando if

da instruo
anterior

O comando if...else

NO

NO

EXPRESSO
verdadeira?

EXPRESSO
verdadeira?

SIM

SIM

BLOCO DE
INSTRUES

para a prxima
instruo

BLOCO DE
INSTRUES 1

ELSE
BLOCO DE
INSTRUES 2

para a prxima
instruo

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
}

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina 8

if...else if E de novo ao se acrescentar agora o comando if...else no loop do comando if podese 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.
da instruo
anterior

O comando switch...case

da instruo
anterior

O comando if...else if

EXPRESSO
EXPRESSO 1
verdadeira?

NO

SIM
BLOCO DE
INSTRUES 1

1?

ELSE IF
EXPRESSO 2
verdadeira?

SIM

BLOCO DE
INSTRUES 1

NO

NO

2?
ELSE

BLOCO DE
INSTRUES 2

SIM

BLOCO DE
INSTRUES 3

SIM

BLOCO DE
INSTRUES 2

NO

3?

SIM

BLOCO DE
INSTRUES 3

NO
BLOCO DE
INSTRUES 4
(default)

para a prxima
instruo

para a prxima
instruo

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;
}

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

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.

da instruo
anterior

O comando while

LOOP

EXPRESSO
verdadeira?
NO
para a prxima
instruo

BLOCO DE
INSTRUES

da instruo
anterior

O comando do...while

BLOCO DE
INSTRUES

SIM
EXPRESSO
verdadeira?

LOOP

SIM

NO
para a prxima
instruo

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.

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina 10

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 previamente 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 decrementado) da varivel cada vez que o bloco de instrues executado. Observe que cada parmetro entre
parnteses separado por ponto e vrgula.

da instruo
anterior

O comando for

inicializao
VARIVEL
do contador

Exemplo:

CONTADOR
LOOP
BLOCO DE
INSTRUES

EXPRESSO
verdadeira?

SIM

for (int i = 0; i <= 10; i++) {


println (contador);
delay(1000);
}
Nesse exemplo a varivel de controle 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.

NO
para a prxima
instruo

www.revistadoarduino.com.br

Joo Alexandre da Silveira

pgina 11

O operador ternrio ? possvel simplificar 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 ficaria assim:
int x = 8;
if (x > 10) {
y = 15;
}
else
y = 20;

da instruo
anterior

O operador ternrio

EXPRESSO

verdadeira ?

SIM

NO
INSTRUO 2

INSTRUO 1

para a prxima
instruo

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

MAPA DAS ENTRADAS E


SADAS DO ARDUINO

pgina 12

Pinos Digitais

usados para deteo


ou transmisso de

controles digitais

[E suas Funes na linguagem do Arduino]

Funes em C:
pinMode( )
digitalRead( )
digitalWrite( )
analogWrite( )
attachInterrupt( )
pulseIn( )

Porta USB - usada


para comunicao serial
com um computador
Funes em C:
begin( )
end( )
available( )
read( )
print( )
println( )

Pinos de Alimentao

Pinos analgicos
usados para leitura de
sinais de sensores

usados para alimentao de


circuitos externos e reset
do Arduino

www.revistadoarduino.com.br

Funo em C:
analogRead( )

Joo Alexandre da Silveira

pgina 13

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

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.

Funo

Exemplo

Notas

pinMode(pino,modo)

pinMode(2,OUTPUT);

Essa funo sempre


escrita dentro da
funo setup( ).

digitalRead(pino)

int chave = digitalRead(3);

digitalWrite(pino,valor)

digitalWrite(2,HIGH);

Serve para estabelecer a direo do


fluxo 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.
Uma vez configurado 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.

Para enviar um nvel lgico para qualquer


pino digital do Arduino utiliza-se essa
funo. Dois parmetros so requeridos: o nmero do pino e o estado lgico
(HIGH/LOW ) em que esse pino deve
permanecer.

Aqui o pino 2 selecionado para


transmitir informaes do Arduino
para um circuito externo qualquer.
Para configurar esse pino como entrada, o segundo parmetro dessa
funo deve ser INPUT.

Nesse exemplo a varivel inteira


chave vai guardar o estado lgico
(verdadeiro/falso) presente no
pino digital 3.

Aqui uma tenso de 5 volts colocada no pino 2. Para enviar terra


para esse pino o segundo parmetro dever ser LOW.

www.revistadoarduino.com.br

necessrio configurar previamente o


pino como sada com a
funo pinMode( ).

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina 14

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

pinMode(3,INPUT);
}
void loop() {

int chave = digitalRead(3);

digitalWrite(2,chave);
}

// led no pino 2 como sada


// chave no pino 3 como entrada
// varivel chave guarda estado do pino 3
// estado de chave passado para pino 2.

O cdigo dentro da funo loop( ) acima pode ainda ser simplificado 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)

analogWrite(10,128);

Modulao por Largura de Pulsos, ou PWM


(Pulse Width Modulation) na lingua inglesa,
uma tcnica usada
para gerar tenses
analgicas a partir de
uma sequncia de pulsos
digitais.

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

Com esses parmetros uma


tenso analgica de 2,5 volts
vai aparecer no pino 10. No
necessrio configurar um pino
PWM como sada com a funo
pinMode( ) quando se chama
funo analogWrite( ).

attachInterrupt(pino,funo,modo) attachInterrupt(0,conta LOW - dispara a interrupo quando o pino


Essa funo uma rotina de servio de
dor,RISING);
interrupo, ou ISR (Interrupt Service
Routine) em ingls. Toda vez que ocorrer
uma interrupo por hardware no pino digital 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.

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 parmetro 1 monitora o pino 3.

est em 0;
CHANGE - dispara sempre 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)

pulseIn(4,HIGH);

Uma aplicao interessante 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.

Essa funo mede a largura em microssegundos de um pulso em qualquer pino digital. 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 especificado.

Aqui essa funo vai monitorar 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 exemplo, for passado o valor 100
como terceiro parmetro, a
medida da largura do pulso s
ser disparada aps 100 uS.

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 configurados com a funo pinMode( ).

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.

Funo

Exemplo

analogRead(pino)

int sensor = analogRead(A0); Os pinos analgicos so

Essa funo l o nvel analgico


presente no pino indicado pelo
parmetro entre parnteses e,
aps a converso para o seu equivalente em bits, o guarda em uma
varivel determinada pelo programador.

Aqui a varivel inteira sensor vai


armazenar a tenso analgica convertida 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 tenso de 2,5 volts no pino A0 vai fazer
a varivel sensor guardar o valor
inteiro 512.

Notas
reconhecidos pela linguagem C do Arduino tanto
como A0 a A5 como 14
a 19. Assim, a mesma
expresso acima pode ser
escrita tambem da seguinte forma: int sensor
= analogRead(14);

Uma observao importante em relao a esses pinos analgicos que eles podem ser configurados
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( ) { }
void loop( )
{

analogWrite(10,analogRead(A5)/4);
}

// essa funo pode ficar vazia se no h configurao


// converso de 0-1023 para 0-255 pela diviso por 4.

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina 16

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 alimentao do computador.

Funo

Exemplo

Notas

Serial.begin(taxa)

Serial.begin(9600);
Nesse exemplo essa funo fixa 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 sempre dentro da funo


setup( ).

Essa funo habilita a porta serial e


fixa a taxa de transmisso e recepo
em bits por segundo entre o computador e o Arduino.

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 dentro da funo setup( ).

Serial.available( )

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

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.

A funo Serial.available( ) retorna


o nmero de bytes disponveis para
leitura no buffer da porta serial.

A funo Serial.read( ) l o primeiro


byte que est no buffer da porta serial.

Serial.print(valor,formato)

Serial.print(1.23456);
// transmite 1.23 (default)
Serial.print(1.23456,3);
// transmite 1.234
Essa funo envia para a porta seSerial.print(Al
Mundo!);
// transmite a frase (string)
rial um caracter ASCII, que pode ser
Serial.print(A);
// transmite o caracter A
capturado por um terminal de comuniSerial.print(A,BIN);
//
transmite 01000001
cao. O segundo parmetro, formato,
Serial.print(A,OCT);
//
transmite o octal 101
opcional e especifica com quantas caSerial.print(A,HEX);
//
transmite o hexa 41
sas decimais ou com que base numrica
Serial.print(A,DEC);
//
transmite o decimal 65
vai ser o nmero transmitido.

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 final da transmisso o caracter Carriage Return (retorno
ao incio da linha) e o caracter New Line (mudana para a prxima linha).

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 ativando o Terminal de Comunicao do Arduino:
void setup( ) {
Serial.begin(9600);
}
void loop( ) {
Serial.print(Retorno de available( ): );
Serial.println(Serial.available());
delay(1000);
Serial.print(Retorno de read( ): );
Serial.println(Serial.read( ));
delay(1000);
}

//inicia a porta serial em 9600 bps


//envia frase ao terminal
//transmite total de bytes disponveis
//pausa 1 seg
//envia frase
//transmite primeiro byte disponvel na porta
//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.

www.revistadoarduino.com.br

ARDUINO - Cartilha para Programao em C - Edio 1.0

pgina 18

Do mesmo autor dessa Cartilha de Programao em C:

Veja no site abaixo o ndice e os primeiros captulos do livro.


www.revistadoarduino.com.br

Você também pode gostar