Escolar Documentos
Profissional Documentos
Cultura Documentos
CartilhadoArduino Ed1 PDF
CartilhadoArduino Ed1 PDF
ARDUINO
Cartilha para Programao em C
Pinos Digitais
Pinos analgicos
Pinos de Alimentao
Funo em C:
analogRead( )
www.revistadoarduino.com.br
www.revistadoarduino.com.br
pgina II
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
pgina IV
NDICE
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
pgina V
while
do...while
for
switch...case
operador ternrio ?
16
www.revistadoarduino.com.br
www.revistadoarduino.com.br
pgina 2
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( ).
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.
www.revistadoarduino.com.br
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);
}
Verdadeiro qualquer valor que no seja zero. Falso sempre o valor zero.
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
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.
www.revistadoarduino.com.br
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
www.revistadoarduino.com.br
pgina 5
x
x
x
x
+= y
-= y
*= y
/= y
// x=x+y
// x=x-y
// x=x*y
// x=x/y
www.revistadoarduino.com.br
pgina 6
Exemplo
Notas
delay(ms)
delay(1000);
delayMicroseconds(us)
delayMicroseconds(1000);
As mesmas observaes
acima para a funo
delay(ms) so vlidas aqui.
millis( )
random(min,max)
abs(x)
map(valor,min1,max1,min2,max2)
www.revistadoarduino.com.br
pgina 7
if um controle de fluxo usado para selecionar uma ou mais instrues baseado no resultado de um
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 (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
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;
}
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
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;
}
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
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
NO
para a prxima
instruo
www.revistadoarduino.com.br
pgina 11
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
pgina 12
Pinos Digitais
Funes em C:
pinMode( )
digitalRead( )
digitalWrite( )
analogWrite( )
attachInterrupt( )
pulseIn( )
Pinos de Alimentao
Pinos analgicos
usados para leitura de
sinais de sensores
www.revistadoarduino.com.br
Funo em C:
analogRead( )
pgina 13
Funo
Exemplo
Notas
pinMode(pino,modo)
pinMode(2,OUTPUT);
digitalRead(pino)
digitalWrite(pino,valor)
digitalWrite(2,HIGH);
www.revistadoarduino.com.br
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);
}
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);
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);
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.
www.revistadoarduino.com.br
pgina 15
Funo
Exemplo
analogRead(pino)
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);
}
www.revistadoarduino.com.br
pgina 16
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.
Serial.end( )
Desabilita a porta serial para permitir o uso dos pinos digitais 0 e 1 para
entrada ou sada de dados.
Serial.available( )
O valor 0 retornado
quando no h nenhuma
informao para ser
resgatada na porta
serial.
Serial.read( )
O valor -1 retornado
quando no h nenhuma
informao para ser
resgatada na 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
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);
}
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.
www.revistadoarduino.com.br
pgina 18