Você está na página 1de 21

Agrupamentos de Escolas Augusto Cabrita

Manual de Programao para


Arduino
Lus Dourado e Mrio Afonso

Introduo
Este pequeno manual destina-se apenas a ser utilizado como uma lista, de acesso rpido, de
algumas das instrues mais utilizadas na programao da placa Arduino. Assim, deve
considerar-se apenas como uma pequena introduo programao da placa. Para aqueles
que pretendem explorar todos os recursos da Arduino recomenda-se outros manuais que
podem ser encontrados com grande facilidade na Internet.
A Placa Arduno
Para melhor compreender o mtodo de programao da placa Arduino deve comear-se por
entender como ele interage com o exterior. Deste modo, o primeiro passo deve consistir em
conhecer as suas portas, ou pinos, e quais as suas caratersticas.
A seguinte figura ilustra os componentes mais importantes para a compreenso dos mtodos
de programao para a entrada e sada de dados.

Pinos Digitais pinos usados para a entrada/sada de sinais digitais


Pinos Analgicos- pinos usados para a entrada de sinais analgicos
Porta Serie porta que permite a ligao da placa Arduino ao computador

Estrutura bsica de um programa Arduino

A linguagem de programao para Arduino , inspirada na linguagem C, assenta numa estrutura


bastante simples. Como tal, um programa para Arduino sempre composto por duas funes
essenciais: setup() e loop(). O seguinte exemplo, apesar de muito simples, demonstra como
estruturado um programa para Arduino:

/*
* Ol Mundo!
*
* isto o ol Mundo para Arduino.
* a mensagem ser apresentada no ecr do computador
*/

void setup()
// executado uma vez. Quando o programa inicia
{
Serial.begin(9600);
// define a velocidade da porta 9600 bps
}
void loop()
// repete infinitamente
{
Serial.println("Ol Mundo!"); // escreve a mensagem e salta linha
delay(1000);
}

Esquema geral de um programa para Arduino

Declarao de variveis globais;


Void setup() {
Instruo 1; // conjunto de instrues a serem
Instruo 2; // executadas apenas uma vez como a iniciao dos pinos a utilizar
()
}
Void loop() {
Instruo 3; // conjunto de instrues executadas
Instruo 4; // num ciclo
()
}

A Funo setup()
Consiste na primeira funo a ser executada num programa Arduino e chamada apenas uma
vez. Este bloco essencialmente dedicado a iniciar os pinos digitais e analgicos, e tambm a
porta serie.

A funo loop()
Define o corpo principal do programa. Assim, todas as instrues que interagem com os pinos,
ciclos, operaes matemticas, entre outras, so colocadas no interior desta funo. Isto no
faz regra, se se optar por criar subfunes para melhor modular o programa. No entanto, a
chamada a essas subfunes deve constar dentro desta funo principal.
Tal como o seu nome indica, todas as instrues contidas nesta funo so repetidas de forma
cclica.

Smbolos
{ } Chavetas: contm as instrues que a funo deve executar
; - Ponto e vrgula: define o fim de uma instruo
// - Duas barras: comentrio de linha
/* */ - Barra e asterisco: comentrio com vrias linhas

Constantes
So valores predefinidos que nunca podem ser alterados.
Existem 3 tipos de constantes:
TRUE/FALSE constantes booleanas
HIGH/LOW define a tenso dos pinos digitais (high 5 volts; low 0 volts)
INPUT/OUTPUT constantes definidas pela funo pinMode():
input para entrada no pino e output para sada do pino

Exemplos:
pinMode (10,OUTPUT);
digitalWrite(13, HIGH);

Variveis
Variveis Globais So variveis que que podem ser usadas em qualquer funo do programa
Qualquer varivel tem de ser declarada antes de ser chamada. Por isso, a sua definio
efetuada antes do bloco setup().
A declarao consiste em definir um tipo e um nome varivel.

Tipos de Variveis
byte 8 bits (0-255)
int nmero inteiro at 16 bits
long nmero inteiro at 32 bits
float nmero real at 32 bits
boolean valor lgico que pode assumir dois estados: true ou false
char- apenas armazena um nico carcter. Guarda o valor decimal correspondente a um
determinado carter na tabela ASCII.

Exemplos:
char exemplo = A;

/ /varivel exemplo do tipo char com o carter A

char exemplo = 78;

// corresponde ao carter N, segundo a tabela ASCII

byte exemplo = 1; // armazena o valor 1 em decimal

Matrizes
Chama-se matriz, ou array, a um conjunto de variveis do mesmo tipo. Um valor est
armazenado num determinado espao de memria que representado por um identificador
denominado de ndice. O primeiro elemento de uma matriz tem o ndice 0.
Sintaxe:
Tipo_de_varivel nome_variavel[ndice] = valor;
Declarao de uma matriz:
Int vetor[] = {16,17,10,45};
Declarao de uma matriz (outra forma):
Int vetor [3];
Escrever numa matriz:
Vetor [3] = 12; //guarda na 4 posio o valor 12
Ler de uma matriz
Int x =vetor[4];

Operadores

Aritmticos
+
*
/

Adio
Subtrao
Multiplicao
Diviso

&&
||
!

E (and)
Ou (or)
No (not)

==
!=
<
>
<=
>=

Igual
Diferente
Menor
Maior
Menor ou igual
Maior ou igual

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

x=x+1
X=x-1
x=x+y
x=x-y
x=x*y
x=x/y

Lgicos

Relacionais

Smbolos compostos

Funes de tempo

Funo

delay(ms)

delayMicroseconds(us)

millis()

Descrio
Notas
Pra
a
execuo
do
programa
por
um
determinado perodo de
1 segundo = 1000ms
tempo,
dado
em
milissegundos
Pra
a
execuo
do
programa
por
um
determinado perodo de
1 ms = 1000us
tempo,
dado
em
microssegundos
Retorna um nmero, em long valor = millis()
milissegundos, desde que o valor-varivel do tipo long
programa est em execuo que guarda o tempo desde
que o programa est em
execuo

Funes matemticas

Funo
random(min,max)
abs(x)
min(valor1, valor2)
max(valor1, valor2)
Sqrt(valor)

Descrio
Funo que permite gerar
nmeros aleatrios.
Devolve o valor absoluto de
um nmero real
Devolve o menor de dois
valores
Devolve o maior de dois
valores
Devolve a raiz quadrada de
valor

Notas
min Valor mnimo possvel
(opcional- 0)
max valor mximo possvel
Var_modulo = abs(valor)
Var_menor = min(5,3)
Var_maior = max(5,3)
Res = sqrt(valor)

Outras funes
Funo

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

Descrio

Notas

Converte uma
faixa de valores
numa outra faixa
definida

Valor varivel que contem o


valor a ser convertido
Min1 e max1 - valores reais
mnimos e mximos da
varivel;
Min2 e max2 valores mnimos
e mximos aps a converso

Exemplo:
Int valor = map(analogRead(A0),0,1023,0,255);
Converte o valor analgico lido pelo pino A0, que pode oscilar entre 0 e 1023, num outro valor
balizado entre 0 e 255;

Pinos Digitais
Consistem em 14 pinos marcados com o ttulo DIGITAL e permitem a entrada e sada de
valores lgicos digitais. Estes valores podem ser representados por 0v ou 5v; verdadeiro ou
falso; I/O; HIGH/LOW. Os pinos 6 a 9 podem ser utilizados para aplicar o mecanismo PWM.

Funo

pinMode(pino,modo)

digitalRead(pino)

Descrio
Serve para definir o pino a
ser utilizado e qual o sentido
do fluxo de informao.
Esta Funo deve constar
sempre dentro da funo
Setup()
Permite ler o valor recebido
por um determinado pino e
coloc-lo numa varivel

digitalWrite(pino,modo)

Permite que um
determinado pino envie um
valor digital para o exterior

analogWrite(pino,valor)

Permite gerar tenses


analgicas em pinos digitais.
Apenas os pinos PWM
suportam esta funo

Notas
Pino - nmero do pino a ser
utilizado;
Modo INPUT para entrada e
OUTPUT para sada

O pino de ser configurado


anteriormente com a funo
pinMode()
Modo HIGH para 5 Volts e 0
volts para LOW
O pino deve ser configurado
anteriormente com a funo
pinMode()
Pino - nmero do pino a ser
utilizado;
Valor- define a amplitude de
tenso que pode ser de 0 (0
volts) a 255 (5 volts).
No necessrio fazer a
iniciao com pinMode()

Exemplo 1:

/*
Pisca
O led acende durante um segundo, depois, apaga durante mais um segundo, repetindo
infinitamente
*/

// Pino 13 j contm um led na prpria Arduino.


// Iniciamos a varivel led com o valor 13 que corresponde ao pino digital 13:
int led = 13;

// a funo setup novamente chamada quando se prime o boto Reset:


void setup() {
// Iniciamos o pino 13 para sada.
pinMode(led, OUTPUT);
}

// repete infinitamente:
void loop() {
digitalWrite(led, HIGH); // Liga o Led (HIGH corresponde a uma sada de 5 volts)
delay(1000);

// espera um segundo

digitalWrite(led, LOW); // desliga o led (LOW corresponde a uma sada de 0 volts)


delay(1000);
}

// espera um segundo

Exemplo 2:

/*
Acende e apaga o led do pino 13, consoante se carrega, ou no, no boto ligado ao pino
digital 2
*/

// Definio dos pinos como constantes


const int buttonPin = 2;

// o nmero do pino do boto

const int ledPin = 13;

// o nmero do pino do led

int buttonState = 0;

// varivel que armazena o estado do boto

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT); // inicia o pino do boto para input:
}

void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}

Porta Serie

A comunicao efetuada atravs da porta USB. Deste modo, possvel a comunicao em


tempo real entre a Arduino e um computador. A transmisso de dados com o PC pode ser
realizada de forma simples com o recurso ferramenta Terminal existente no IDE de
desenvolvimento.
Alm disso, possvel a comunicao com a Arduino recorrendo a linguagens de programao
como Java, Processing, Python, entre outras.

Funces

Serial.begin()

Serial.end()

Serial.available()

Serial.read()

Serial.print(valor,formato)

Serial.println(valor,formato)

Descrio
Notas
Inicia a comunicao Serie e define Pode usar valores como
2400,
9600,
a velocidades de transmisso de 300,
115200,
alm
de
muitos
dados
Desativa a porta serie para que
seja possvel a utilizao dos pinos
digitais 0 e 1 para entrada e sada
de dados
Determina o nmero de bytes que
so recebidos por srie. Assim,
permite determinar se esto a ser
recebidos dados ou no
L o primeiro byte do buffer da
porta serie
Envia para a porta serie dados em
ASCII. O formato especifica o
nmero de casas decimais ou base
numrica do nmero a ser
transmitido
O mesmo que a anterior mas neste
caso salta uma linha

outros. O mais comum


9600
Esta funo deve ser
declarada dentro da
funo setup()

Int val = serial.read();


Val guarda o primeiro
byte disponvel na porta
serial
Retorna o valor -1
quando no h valores
disponveis
Os dados podem ser
vistos
atravs
do
terminal do IDE da
Arduno

Exemplo

void setup() {
// inicializa a porta serie e espera pela sua abertura
Serial.begin(9600);

// imprime um titulo
Serial.println("Tabela ASCII");
}
// primeiro carter '!' corresponde ao valor 33:
int thisByte = 33;
// tambm poderia ser: int thisByte = '!';
void loop() {

// vai escrever o valor ASCII correspondente a 33


Serial.write(thisByte);

Serial.print(", dec: ");


// imprime os dados como string em dec
// mudamos para Serial.print() ou Serial.println()

Serial.print(thisByte);
// tambm se poderia fazer da seguinte forma
// Serial.print(thisByte, DEC);

Serial.print(", hex: ");


// imprime o valor como string em hexadecimal
Serial.print(thisByte, HEX);

Serial.print(", oct: ");


// imprime o valor em octal

Serial.print(thisByte, OCT);

Serial.print(", bin: ");


// imprime o valor em binrio
// e salta uma linha
Serial.println(thisByte, BIN);

// quando imprimir o carter '~' ou 126, pra:


if(thisByte == 126) {
// entra em loop
while(true) {
continue;
}
}
// avana um carter
thisByte++;
}

Pinos analgicos
So constitudos por 6 pinos e esto denominados na placa como ANALOG IN. Estes pinos
esto numerados de 0 a 5 e podem aceitar valores entre 0 a 5 volts. Ao contrrio dos pinos
digitais, que permitem a entrada e sada de valores, os analgicos apenas permitem a receo
de valores. Para situaes em necessrio o envio de valores analgicos, a Arduino recorre a
uma funcionalidade denominada PWM. Este mecanismo consiste em utilizar algumas das
portas digitais (9, 10 e 11) para a simulao de sadas analgicas. A explicao do
funcionamento do PWM foge do contexto deste manual.

analogRead(pino)

L o valor analgico que


entra na porta, permitindo,
ainda, guard-lo numa
varivel.

O mbito dos valores de 0 (0


volts) a 1023 (5 volts).
Os pinos podem ser
representados de A0 a A5 ou 14
a 19

Exemplo 1
/*
L um valor capturado pela porta analgica A0 e apresenta-o no monitor
Ligar o pino A0 ao pino central do potencimetro, um dos laterais a +5V e o outro a gnd
*/

void setup() {
// inicia a porta serie com uma velocidade de 9600 bits por segundo:

Serial.begin(9600);
}
void loop() {
// l o valor que entra na porta analgica 0 (A0)

int sensorValue = analogRead(A0);


// escreve o valor lido

Serial.println(sensorValue);
delay(1);
}

// pausa de 1 milessegundo

Exemplo 2
/*
Entrada analgica
Liga-se o pino analgico 0 ao pino do meio do potencimetro.
Liga-se um pino lateral do potencimetro ao pino 5v da Arduino
Liga-se o outro pino lateral do potencimetro ao pino gnd da Arduino
O potencimetro vai controlar o tempo em que o led se matem aceso ou apagado
*/

int sensorPin = A0;


int ledPin = 13;

// A0 corresponde ao pino analgico 0

// pode ser o led da Arduino

int sensorValue = 0; // variavel que guarda o valor da Arduino

void setup() {
// declara o ledPin para OUTPUT:

pinMode(ledPin, OUTPUT);
}

void loop() {
// L o valor do sensor
sensorValue = analogRead(sensorPin);
// acende o led
digitalWrite(ledPin, HIGH);
// interrompe o processo durante o tempo definido por sensorValue
delay(sensorValue);
// apaga o Led
digitalWrite(ledPin, LOW);
// interrompe o processo durante o tempo definido por sensorValue
delay(sensorValue);
}

Deciso

If
If (expresso) {
conjunto de instrues;
}
A instruo if impe a execuo do conjunto de instrues, se a expresso for verdadeira. Caso
contrrio no executa a instruo

If else
If (expresso) {
conjunto de instrues 1;
}
else {
conjunto de instrues 2;
}
A instruo if impe a execuo do conjunto de instrues 1 , se a expresso for verdadeira.
Caso contrrio executa o conjunto de instrues 2

Switch
Switch (expresso) {
case 1: conjunto de instrues 1;
break;
case 2: conjunto de instrues 2;
break;
case 3: conjunto de instrues 3;
break;
default: conjunto de instrues 4;
}
A instruo switch um teste de deciso mltipla, que numa sequncia de instrues decide a
partir de qual comea a execuo. A execuo do conjunto de instrues n comea quando for
encontrado um valor do case coincidente com o valor da expresso.

Ciclos

While

While (expresso) {
conjunto de instrues;
}
Enquanto a expresso for verdadeira, o corpo do ciclo while executado.

do while

do {
conjunto de instrues;
}
while (expresso);

O ciclo dowhile difere da instruo while pelo facto de o conjunto de instrues ser
executado pelo menos uma vez, dado que o teste expresso s e efetuado aps a concluso
do ciclo.

for
For (varivel; expresso; incremento){
conjunto de instrues;
}
A varivel iniciada normalmente com 0 ou 1. O parmetro expresso deve conter o valor
mximo, ou mnimo, que o contador de atingir. incremento o valor a ser incrementado
varivel cada vez que o bloco de instrues executado.

Exemplo:
for (int i = 0; i <= 10; i++){
serial.println(contador);
delay(1000);
}

Exemplo da utilizao do mecanismo de deciso IF:


/*
Exemplifica a utilizao do IF
L um determinado valor de um potencimetro, ligando ou desligando um led
Consoante esse valor

Pino central do led ligado a A0


Pinos laterais ligados a +5v e gnd
*/

const int analogPin = A0;


const int ledPin = 13;
const int limite = 400; // estabelecido um valor limite

void setup() {
// inicia o pino do led para output:

pinMode(ledPin, OUTPUT);
// inicia a comunicao serie:

Serial.begin(9600);
}
void loop() {
// l o valor do potencimetro:

int analogValue = analogRead(analogPin);


// se ultrapassar o valor limite, acende o led

if (analogValue > limite) {


digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin,LOW);
}
// apresenta no terminal o valor do potencimetro:

Serial.println(analogValue);
delay(1);
}

Exemplo com o ciclo for:


Fazer msica

#define BUZZER 9
int notas[] = { 524, 588, 660, 699, 785, 881, 989 };
void setup() {
pinMode(BUZZER, OUTPUT);
}
void loop() {
for (int i = 0; i < 7; i++) {
tone(BUZZER, notas[i], 1000);
delay(1000);
}
delay(1000);
}

Exemplo de entrada de dados pela porta serial

int led1 = 9;
int led2 = 10;
char var;
void setup() {
Serial.begin(9600);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
var = Serial.read();
switch (var) {
case 'a':
digitalWrite(led1, HIGH);
break;
case 'b':
digitalWrite(led2, HIGH);
break;
}
}
}