Anda di halaman 1dari 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 Funo em C: analogRead( )

Pinos de Alimentao

usados para alimentao de 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 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 A Estrutura Bsica Funes Declarao de funes setup( ) loop( ) Os smbolos {} ; // /*...*/ A.1 - CONSTANTES E VARIVEIS TRUE/FALSE HIGH/LOW INPUT/OUPUT Escopo da Varivel Declarao da Varivel Tipos de variveis A.2 - MATRIZES Declarao de uma Matriz Escrever/Ler uma Matriz A.3 - LGICA E ARITMTICA 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 2 3

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 B.1 - OS PINOS DIGITAIS pinMode( ) digitalRead( ) digitalWrite( ) analogWrite( ) attachInterrupt( ) pulseIn( ) B.2 - OS PINOS ANALGICOS analogRead( ) B.3 - A PORTA SERIAL DO ARDUINO Serial.begin( ) Serial.end( ) Serial.available( ) Serial.read( ) Serial.print( ) Serial.println( ) B.4 - OS PINOS DE ALIMENTAO 13 13

15 16

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.

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.

setup( ): Essa a primeira funo a

loop( ): A funo loop( ) chamada

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.

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-

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.

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.

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

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.

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
delay(ms)
Essa funo pausa o programa por um perodo em milissegundos indicado pelo parmetro entre parnteses.

Exemplo
delay(1000);
Com esse parmetro o programa vai pausar durante 1 segundo (1000 ms).

Notas
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. As mesmas observaes acima para a funo delay(ms) so vlidas aqui.

delayMicroseconds(us)

Essa funo pausa o programa por um perodo em microssegundos indicado pelo parmetro entre parnteses.

delayMicroseconds(1000);

Com esse parmetro o programa vai pausar durante 1 ms (1000 us).

millis( )

Retorna o nmero de milissegundos desde que o Arduino comeou a executar o programa corrente.

long total = millis( );

Aqui a varivel inteira longa (de 32 bits) total vai guardar o tempo em ms desde que o Arduino foi inicializado. int valor = random(100,400); varivel valor vai ser atribuido um nmero inteiro qualquer entre 100 e 400.

Essa varivel vai ser resetada depois de aproximadamente 9 horas.

random(min,max)

Gera nmeros pseudo-aleatrios entre os limites min e max especificados como parmetros.

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)

Retorna o mdulo ou valor absoluto do nmero real passado como parmetro.

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)

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.

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 possvel reverter uma faixa de valores, exemplo: int valor = map(x,1,100,100,1);

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
if (expresso) { bloco de instrues; // se expresso for verdadeira, bloco de instrues executado }

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.

da instruo anterior

O comando if

da instruo anterior

O comando if...else

NO EXPRESSO verdadeira? SIM BLOCO DE INSTRUES EXPRESSO verdadeira? SIM BLOCO DE INSTRUES 1

NO

ELSE BLOCO DE INSTRUES 2

para a prxima instruo

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 if...else if

da instruo anterior

O comando switch...case

EXPRESSO
EXPRESSO 1 verdadeira?

NO

SIM
BLOCO DE INSTRUES 1

ELSE IF
EXPRESSO 2 verdadeira?

1?
NO

SIM

BLOCO DE INSTRUES 1

NO

2?
ELSE
BLOCO DE INSTRUES 3

SIM

BLOCO DE INSTRUES 2

SIM
BLOCO DE INSTRUES 2

NO

3?
NO
BLOCO DE INSTRUES 4 (default)

SIM

BLOCO DE INSTRUES 3

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 inwhile (expresso) { bloco de instrues; } O bloco de instrues ser executado enquanto o parmetro expresso for verdadeiro.

strues at que uma condio inicialmente verdadeira se torne falsa. para isso que serve o comando while. A sua sintaxe a seguinte:

da instruo anterior

O comando while

da instruo anterior

O comando do...while

LOOP

BLOCO DE INSTRUES

BLOCO DE INSTRUES

LOOP

EXPRESSO verdadeira? NO para a prxima instruo

SIM EXPRESSO verdadeira? NO para a prxima instruo

SIM

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
for (varivel; expresso;incremento) { bloco de instrues; }

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:

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 inicializao VARIVEL do contador

O comando for

Exemplo: 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.

CONTADOR LOOP
BLOCO DE INSTRUES

EXPRESSO verdadeira? NO para a prxima instruo

SIM

www.revistadoarduino.com.br

Joo Alexandre da Silveira

pgina 11

O operador ternrio ? possvel simplificar cdigos com comandos if...else em C/


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

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:

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

verdadeira ?

EXPRESSO

SIM
INSTRUO 1

NO
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


[E suas Funes na linguagem do Arduino]

usados para deteo ou transmisso de controles digitais Funes em C: pinMode( ) digitalRead( ) digitalWrite( ) analogWrite( ) attachInterrupt( ) pulseIn( )

Pinos Digitais

Porta USB - usada para comunicao serial com um computador


Funes em C: begin( ) end( ) available( ) read( ) print( ) println( )

Pinos de Alimentao

usados para leitura de sinais de sensores Funo em C: analogRead( )

Pinos analgicos

usados para alimentao de circuitos externos e reset do Arduino

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

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 AREF e GND: o pino

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.

Funo pinMode(pino,modo)
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.

Exemplo pinMode(2,OUTPUT);
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.

Notas
Essa funo sempre escrita dentro da funo setup( ).

digitalRead(pino)

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.

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 requeridos: 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 colocada no pino 2. Para enviar terra para esse pino o segundo parmetro dever ser LOW.

necessrio configurar previamente o pino como sada com a funo pinMode( ).

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

Exemplo
analogWrite(10,128);
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( ).

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

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

pulseIn(pino,valor,espera)

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.

pulseIn(4,HIGH);

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

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

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

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 Serial.begin(taxa)
Essa funo habilita a porta serial e fixa a taxa de transmisso e recepo em bits por segundo entre o computador e o Arduino.

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

Notas
Essa funo vai sempre 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 dentro da funo setup( ). O valor 0 retornado quando no h nenhuma informao para ser resgatada na porta serial. O valor -1 retornado quando no h nenhuma informao para ser resgatada na porta serial.

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. int valor = Serial.read( ); Aqui a varivel inteira valor vai guardar o primeiro byte (caracter) disponvel na porta serial.

Serial.read( )

A funo Serial.read( ) l o primeiro byte que est no buffer da porta serial.

Serial.print(valor,formato)

Serial.print(1.23456); Serial.print(1.23456,3); Essa funo envia para a porta seSerial.print(Al Mundo!); rial um caracter ASCII, que pode ser capturado por um terminal de comuni- Serial.print(A); cao. O segundo parmetro, formato, Serial.print(A,BIN); opcional e especifica com quantas ca- Serial.print(A,OCT); sas decimais ou com que base numrica Serial.print(A,HEX); Serial.print(A,DEC); vai ser o nmero transmitido.

// transmite 1.23 (default) // transmite 1.234 // transmite a frase (string) // transmite o caracter A // transmite 01000001 // transmite o octal 101 // transmite o hexa 41 // 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 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