Você está na página 1de 23

Joo Alexandre da Silveira

ARDUINO
Cartilha para Programao em C

Para Interfaces Simples Pinos Digitais
de Hardware - Edio 1.0 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: Pinos analgicos


begin( ) usados para leitura de
end( ) sinais de sensores
available( )
read( ) Pinos de Alimentao Funo em C:
print( ) usados para alimentao de analogRead( )
println( ) circuitos externos e reset
do Arduino

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 inici-
antes 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 prin-
cipais 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 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 notificado sobre uma nova edio desta Car-
tilha.


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 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
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 Declarao da Funo toda fun-


so como sub-rotinas ou procedimentos; o deve ser declarada antes de ser
so pequenos blocos de programas usa- chamada atribuindo-lhe um tipo e um
dos para montar o programa principal. nome seguido de parnteses, onde sero
Elas so escritas pelo programador para colocados os parmetros de passagem
realizar tarefas repetitivas, ou podem ser da funo. Depois do nome so definidos
importadas prontas para o programa em
forma de bibliotecas. entre as chaves { e } os procedimen-
tos que a funo vai executar.

loop( ): A funo loop( ) chamada


setup( ): Essa a primeira funo a logo a seguir e todas as funes embar-
ser chamada quando o programa inicia. cadas nela so repetidamente executa-
E executada apenas nessa primeira das. Ela fica lendo os pinos de entrada
vez. Esta uma funo de preparao: do Arduino e comandando os pinos de
ela dita o comportamento dos pinos do sada e a porta serial.
Arduino e inicializa 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 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

TRUE/FALSE so constantes booleanas que definem estados lgicos.


CONSTANTES so 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
componentes de cada INPUT/OUPUT so constantes programadas pela funo pinMode( )
grupo sempre podem para os pinos do Arduino; eles podem ser entradas (de sensores) ou podem
ser representados pelos ser sadas (de controle).
nmeros binrios 1 e 0.

Escopo da Varivel o limite ou abrangncia da varivel. Uma variv-


VARIVEIS so el pode ser declarada em qualquer parte do programa. Se for declarada
posies na memria de logo no incio, antes da funo setup( ), ela tem o escopo de Varivel Glob-
programa do Arduino al, e porisso ela pode ser vista e usada por qualquer funo no programa.
marcadas com um nome Se declarada dentro de uma funo ela tem o escopo de Varivel Local, e
e o tipo de informao s pode ser usada por essa funo.
que iro guardar. Essas
posies podem estar Declarao da Varivel como as funes, toda varivel deve ser
vazias ou podem rece- declarada antes de ser chamada. Essa declarao consiste em atribuir
ber um valor inicial. Os previamente um tipo e um nome varivel.
valores das variveis po-
dem ser alterados pelo
programa. 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;
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

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


MATRIZES so colees as funes, devem ser declaradas com um tipo e um nome seguido de
de variveis do mesmo tipo, colchetes; e podem tambm ser inicializadas com os valores entre as
portanto so posies na chaves. Exemplo:
memria de programa, com
endereos que podem ser int nomeMatriz [ ] = { 16,32,64,128, ... };
acessados por meio de um
identificador, chamado de Declarao de uma Matriz II Pode-se tambem declarar
ndice. A primeira posio de somente o tipo, o nome e o tamanho da matriz, deixando para o
uma matriz sempre a de programa o armazenamento de variveis nas posies, ou ndices, da
ndice 0. 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 arit-


Operaes Aritmticas mticos entre si e com o sinal de atribuio:
e lgicas as 4 operaes x ++ // x=x+1
x --
aritmticas, diviso, multi- // x=x-1
plicao, adio e subtrao, x += y // x=x+y
so representadas pelos x -= y // x=x-y
smbolos: /, *, + e -, respec- x *= y // x=x*y
tivamente, separando os x /= y // x=x/y
operandos. E so 3 os opera-
dores lgicos na linguagem do Operadores de comparao comparam uma varivel com
Arduino que so usados para uma constante, ou variveis entre si. So usados para testar se uma
comparar duas expresses e condio verdadeira.
retornar a constante TRUE/ x == y // x igual a y
FALSE. 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 pausa o programa por um Com esse parmetro o pro- essa funo est ativa
perodo em milissegundos indicado pelo grama vai pausar durante 1 qualquer outra funo no
parmetro entre parnteses. segundo (1000 ms). programa suspensa;
equivalente ao HALT em
Assembly. Somente as
interrupes de hardware
podem parar essa funo.

delayMicroseconds(us) delayMicrosec- As mesmas observaes


Essa funo pausa o programa por um onds(1000); acima para a funo
perodo em microssegundos indicado pelo Com esse parmetro o pro- delay(ms) so vlidas aqui.
parmetro entre parnteses. grama vai pausar durante 1
ms (1000 us).

millis( ) long total = millis( ); Essa varivel vai ser rese-


Retorna o nmero de milissegundos desde Aqui a varivel inteira longa tada depois de aproxima-
que o Arduino comeou a executar o pro- (de 32 bits) total vai guar- damente 9 horas.
grama corrente. dar o tempo em ms desde
que o Arduino foi inicial-
izado.
random(min,max) int valor = ran- O parmetro min opcio-
Gera nmeros pseudo-aleatrios entre dom(100,400); nal e se excludo o limite
os limites min e max especificados como varivel valor vai ser mnimo 0. No exemplo
parmetros. atribuido um nmero inteiro varivel valor poder ser
qualquer entre 100 e 400. qualquer nmero inteiro
entre 0 e 400.

abs(x) float valor = abs(-3.14);


Retorna o mdulo ou valor absoluto do varivel valor vai ser
nmero real passado como parmetro. atribudo o nmero em ponto
flutuante (e sem sinal) 3.14.

map(valor,min1,max1,min2,max2) int valor = map(analog Com essa funo pos-


A funo map( ) converte uma faixa de Read(A0),0,1023,0,255)); svel reverter uma
valores para outra faixa. O primeiro par- A varivel valor vai guardar faixa de valores, ex-
metro valor a varivel que ser converti- a leitura do nvel analgico emplo: int valor =
da; o segundo e o terceiro parmetros so no pino A0 convertida da map(x,1,100,100,1);
os valores mnimo e mximo dessa varivel; faixa de 0-1023 para a faixa
o quarto e o quinto so os novos valores 0-255.
mnimo e mximo da variavel valor.

www.revistadoarduino.com.br
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 resul-
tado, mesmo negativo, diferente de zero. Falso um resultado zero.
if (expresso) {
bloco de instrues; // se expresso for verdadeira, bloco de instrues executado
}

da instruo O comando if da instruo O comando if...else


anterior anterior

NO NO
EXPRESSO EXPRESSO
verdadeira? verdadeira?

SIM SIM ELSE

BLOCO DE BLOCO DE BLOCO DE


INSTRUES INSTRUES 1 INSTRUES 2

para a prxima para a prxima


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

da instruo O comando switch...case


da instruo O comando if...else if anterior
anterior

EXPRESSO
EXPRESSO 1
NO
verdadeira?
SIM
BLOCO DE
1? INSTRUES 1
SIM ELSE IF
NO
NO
BLOCO DE
INSTRUES 1 EXPRESSO 2 SIM
verdadeira? BLOCO DE
2? INSTRUES 2

SIM
ELSE NO
SIM
BLOCO DE
BLOCO DE
INSTRUES 2
BLOCO DE
INSTRUES 3
3? INSTRUES 3

NO
BLOCO DE
INSTRUES 4
(default)

para a prxima
instruo para a prxima
instruo

if (expresso1) { switch (expresso) {


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

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
da instruo
anterior O comando while
anterior O comando do...while

BLOCO DE
BLOCO DE INSTRUES LOOP
LOOP INSTRUES

SIM
EXPRESSO SIM
verdadeira? EXPRESSO
verdadeira?

NO
NO

para a prxima
instruo 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 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.

da instruo O comando for


anterior

inicializao
VARIVEL
do contador

Exemplo:
for (int i = 0; i <= 10; i++) {
println (contador);
CONTADOR delay(1000);
}
LOOP
Nesse exemplo a varivel de con-
BLOCO DE trole i do contador inicializada
INSTRUES com 0; o contador testado e se o
valor nele acumulado for menor
SIM que 10 seu valor enviado para o
EXPRESSO Terminal, e depois de 1 segundo, o
verdadeira? 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 O operador ternrio
anterior

EXPRESSO
verdadeira ?

SIM NO

INSTRUO 1 INSTRUO 2

para a prxima
instruo

www.revistadoarduino.com.br
ARDUINO - Cartilha para Programao em C - Edio 1.0 pgina 12

MAPA DAS ENTRADAS E


SADAS DO ARDUINO Pinos Digitais
usados para deteo
ou transmisso de
[E suas Funes na linguagem do Arduino] controles digitais

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

Porta USB - usada


para comunicao serial
com um computador
Pinos analgicos
Funes em C: usados para leitura de
begin( ) sinais de sensores
end( ) Pinos de Alimentao
available( ) usados para alimentao de
Funo em C:
read( ) circuitos externos e reset
analogRead( )
print( ) do Arduino
println( )

www.revistadoarduino.com.br
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 configura-
dos pela funo pinMode( ) para detetarem ou transmitirem nveis lgicos digitais (verdadeiro/falso,
1/0 ou HIGH/LOW).

Pinos AREF e GND: o pino Pinos 3, 5 e 6 e 9 a11 (PWM):


AREF a entrada de tenso de 6 pinos dos 14 pinos digitais podem ser
referncia para o conversor usados para gerar sinais analgicos com a
A/D do Arduino; o pino GND funo analogWrite( ) utilizando a tcnica
o terra, comum a todos os de Modulao por Largura de Pulso (PWM).
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
Serve para estabelecer a direo do Aqui o pino 2 selecionado para escrita dentro da
fluxo de informaes em qualquer dos 14 transmitir informaes do Arduino funo setup( ).
pinos digitais. Dois parmetros devem para um circuito externo qualquer.
ser passados funo: o primeiro indica Para configurar esse pino como en-
qual pino vai ser usado; o segundo, se trada, o segundo parmetro dessa
esse pino vai ser entrada ou se vai ser funo deve ser INPUT.
sada dessas informaes.

digitalRead(pino) int chave = digitalRead(3);


Uma vez configurado um certo pino Nesse exemplo a varivel inteira
como entrada com a funo pinMode( ), chave vai guardar o estado lgico
a informao presente nesse pino pode (verdadeiro/falso) presente no
ser lida com a funo digitalRead( ) e pino digital 3.
armazenada numa varivel qualquer.

digitalWrite(pino,valor) digitalWrite(2,HIGH); necessrio con-


Para enviar um nvel lgico para qualquer Aqui uma tenso de 5 volts colo- figurar previamente o
pino digital do Arduino utiliza-se essa cada no pino 2. Para enviar terra pino como sada com a
funo. Dois parmetros so requeri- para esse pino o segundo parmet- funo pinMode( ).
dos: o nmero do pino e o estado lgico ro dever ser LOW.
(HIGH/LOW ) em que esse pino deve
permanecer.

www.revistadoarduino.com.br
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); // 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 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 Lar-
O Arduino pode gerar tenses analgicas Com esses parmetros uma gura de Pulsos, ou PWM
em 6 de seus 14 pinos digitais com a funo tenso analgica de 2,5 volts (Pulse Width Modula-
analogWrite( ). Dois parmetros devem vai aparecer no pino 10. No tion) na lingua inglesa,
ser passados funo: o primeiro indica em necessrio configurar um pino uma tcnica usada
qual pino ser gerada a tenso; o segundo PWM como sada com a funo para gerar tenses
determina a amplitude dessa tenso, e pinMode( ) quando se chama analgicas a partir de
deve ter valores entre 0 (para 0 volt) e funo analogWrite( ). uma sequncia de pulsos
255 (para 5 volts). digitais.

attachInterrupt(pino,funo,modo) attachInterrupt(0,conta LOW - dispara a inter-


Essa funo uma rotina de servio de dor,RISING); rupo quando o pino
interrupo, ou ISR (Interrupt Service Nesse exemplo a funo est em 0;
Routine) em ingls. Toda vez que ocorrer contador vai ser chamada CHANGE - dispara sem-
uma interrupo por hardware no pino digi- quando o Arduino detetar uma pre que o pino muda de
tal 2 ou no 3 do Arduino uma outra funo, mudana do nvel LOW para estado (de 0 para 1, ou
criada pelo programador, vai ser chamada. o nvel HIGH em seu pino 2. vice-versa);
O terceiro parmetro, modo, informa Nessa ISR o parmetro 0 RISING - somente
como a interrupo vai ser disparada, se monitora o pino 2, o parmet- quando o pino muda de 0
na borda de subida do pulso detetado no ro 1 monitora o pino 3. para 1;
pino do Arduino, se na borda de descida, se FALLING - somente
quando o pulso for baixo ou se na mudana quando o pino muda de 1
de nvel desse pulso. para 0.

pulseIn(pino,valor,espera) pulseIn(4,HIGH); Uma aplicao interes-


Essa funo mede a largura em microsse- Aqui essa funo vai monito- sante para essas duas
gundos de um pulso em qualquer pino digi- rar o pino 4, e quando o nvel ltimas funes pode
tal. O parmetro valor diz funo que nesse pino mudar de LOW ser vista no meu livro
tipo de pulso deve ser medido, se HIGH para HIGH a sua largura vai Experimentos com o
ou LOW. O parmetro espera (time out) ser medida at que seu nvel Arduino, no captulo que
opcional e se passado funo faz com que volte para LOW. Se, por ex- mostra como montar um
a medida do pulso s comece aps o tempo emplo, for passado o valor 100 contador de dois dgitos
em microssegundos ali especificado. como terceiro parmetro, a com mostradores de
medida da largura do pulso s 7-segmentos.
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 Notas


analogRead(pino) int sensor = analogRead(A0); Os pinos analgicos so
Essa funo l o nvel analgico Aqui a varivel inteira sensor vai reconhecidos pela lingua-
presente no pino indicado pelo armazenar a tenso analgica con- gem C do Arduino tanto
parmetro entre parnteses e, vertida para digital presente no pino como A0 a A5 como 14
aps a converso para o seu equiva- A0. Essa informao vai ser um valor a 19. Assim, a mesma
lente em bits, o guarda em uma inteiro entre 0 (para 0 volt no pino) expresso acima pode ser
varivel determinada pelo pro- e 1023 (se 5 volts no pino). Uma ten- escrita tambem da se-
gramador. so de 2,5 volts no pino A0 vai fazer guinte forma: int sensor
a varivel sensor guardar o valor = analogRead(14);
inteiro 512.

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( ) { } // essa funo pode ficar vazia se no h configurao


void loop( ) {
analogWrite(10,analogRead(A5)/4); // 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 alimenta-
o do computador.

Funo Exemplo Notas


Serial.begin(taxa) Serial.begin(9600); Essa funo vai sem-
Essa funo habilita a porta serial e Nesse exemplo essa funo fixa a pre dentro da funo
fixa a taxa de transmisso e recepo taxa de comunicao em 9600 bps. setup( ).
em bits por segundo entre o computa- Os pinos digitais 0 e 1 no podem
dor e o Arduino. ser utilizados como entrada ou
como sada de dados quando a porta
serial habilitada por essa funo.

Serial.end( ) Essa funo tambem


Desabilita a porta serial para permitir o uso dos pinos digitais 0 e 1 para deve ser escrita den-
entrada ou sada de dados. tro da funo setup( ).

Serial.available( ) int total = Serial.available( ); O valor 0 retornado


A funo Serial.available( ) retorna Aqui a varivel inteira total vai quando no h nenhuma
o nmero de bytes disponveis para guardar o nmero de caracteres informao para ser
leitura no buffer da porta serial. que esto disponveis para leitura resgatada na porta
na porta serial. serial.

Serial.read( ) int valor = Serial.read( ); O valor -1 retornado


A funo Serial.read( ) l o primeiro Aqui a varivel inteira valor vai quando no h nenhuma
byte que est no buffer da porta se- guardar o primeiro byte (caracter) informao para ser
rial. disponvel na porta serial. resgatada na porta
serial.

Serial.print(valor,formato) Serial.print(1.23456); // transmite 1.23 (default)


Essa funo envia para a porta se- Serial.print(1.23456,3); // transmite 1.234
rial um caracter ASCII, que pode ser Serial.print(Al Mundo!); // transmite a frase (string)
capturado por um terminal de comuni- Serial.print(A); // transmite o caracter A
cao. O segundo parmetro, formato, Serial.print(A,BIN); // transmite 01000001
opcional e especifica com quantas ca- Serial.print(A,OCT); // transmite o octal 101
sas decimais ou com que base numrica Serial.print(A,HEX); // transmite o hexa 41
vai ser o nmero transmitido. 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 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 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.

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