You are on page 1of 25

INSTITUTO FEDERAL DO ESPIRITO SANTO CAMPUS-SERRA ENGENHARIA DE CONTROLE E AUTOMAO

MARCO ANTONIO DE SOUZA LEITE CUADROS

MANUAL DE PROGRAMAO BSICO DO ARDUINO

SERRA
2011

O que queres que os homens faam por ti, faa igualmente por eles (Jesus Cristo).

Para essa grande mulher que respeito, admiro e amo, minha me Rosa Cuadros. Para minha esposa Anina e minhas filhas Luana e Laila, porque elas so a inspirao da minha vida.

Sumrio

Lista de Figuras ................................................................................................... 5 Lista de Tabelas ................................................................................................... 6 Captulo 1: Conceitos bsicos do arduino .................................................... 7

1.1 Estrutura bsica de um programa arduino .................................................................. 7 1.2 Exemplo 1: Pisca-Pisca com a funo delay ................................................................. 8 1.3 Simulao de um programa arduino no Proteus ......................................................... 9 1.4 Declarao de variveis ............................................................................................ 11 1.5 Operadores .............................................................................................................. 12 1.5.1 Operadores aritmticos............................................................................................ 12 1.5.2 Operadores de comparao ..................................................................................... 13 1.5.3 Operadores lgicos ................................................................................................... 13 1.6 Exemplo 2: Controle do nvel com boias ................................................................... 14

Lista de Figuras

Figura 1 - Configurao da placa de desenvolvimento .............................................................. 8 Figura 2 Partes do ambiente de programao do arduino ....................................................... 9 Figura 3 Circuito de simulao no Proteus ............................................................................ 10 Figura 4 Edio do uC ATMEL no Proteus .......................................................................... 11 Figura 5 Exemplo 2: Controle de Nvel com bias ............................................................... 14 Figura 6 Circuito eletrnico no Proteus Exemplo 2 ........................................................... 15 Figura 7 Circuito no Proteus Uso bsico do display de 7 segmentos ................................. 16 Figura 8 Circuito no Proteus Contador no display de 7 segmentos ................................... 18

Lista de Tabelas

Tabela 1 Tipos de variveis usadas no arduino ..................................................................... 11

Captulo 1:

Conceitos bsicos do arduino

O Arduino uma plataforma de hardware livre, usa um microcontrolador ATMEL AVR. O objetivo desta plataforma ser uma ferramenta de fcil uso e assim acessar a uma maior quantidade de usurios. O projeto iniciou-se na cidade de Ivrea, Itlia, em 2005, com o intuito de interagir em projetos escolares de forma a ter um oramento menor que outros sistemas de prototipagem disponveis naquela poca (WikiPedia, 2011). As placas de desenvolvimento so compostas por um controlador ATMEL AVR, entradas e sadas digitais e analgicas, interfaces de comunicao seriais e/ou USB, alm de possuir extenses como: modens GPRS, controladores de motores, interfaces de comunicao (Ethernet, XBee), para LCDs, tocadores MP3 ente outros. As extenses mencionadas so chamadas comumente de Shields. O Integrated Development Environment (IDE) ou Ambiente Integrado de Desenvolvimento do arduino uma aplicao escrita em Java. O IDE tem uma biblioteca chamada Wiring que permite programar em C/C++. Nesta seo estudaremos a estrutura bsica de um programa arduino e a declarao de vrios tipos de variveis.

1.1 Estrutura bsica de um programa arduino


A estrutura bsica da de um progrma arduino simples e est composta por duas funes: o void setup() e o void loop(). Na primeira funo feita a configurao: declarao de variveis, configurao dos pinos e da porta serial entre outros; a funo necessriamente deve ser declarada mesmo sem ter cdigo a executar; esta funo executada s uma vez logo aps a ligao do microcontrolador. A segunda funo (loop()) contm o cdigo que deve ser executado ciclicamente. Exemplo:
void setup() { //cdigo de configurao e declarao de variveis } void loop() { //cdigo a ser executado ciclicamente }

1.2 Exemplo 1: Pisca-Pisca com a funo delay


O primeiro passo para poder programar um arduino baixar o software de programao, que disponibilizado gratuitamente no site

http://www.arduino.cc/en/Main/Software, logo de descompactar e instalar abra o aplicativo. Salvar o programa como Pisca_Pisca e configurar o programa com a placa de desenvolvimento usada, neste caso o Arduino uno

Figura 1 - Configurao da placa de desenvolvimento Os comentrios feitos anteriormente podem ser consolidados atravs do seguinte exemplo:
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(100); // digitalWrite(13, LOW); delay(100); //

// liga o led espera 100 mseg // desliga o led espera 100 mseg

9 Para confirmar se o cdigo est correto selecione a opo

Sketch/(Verify/Compile) ou pressionar as teclas Ctrl+R. Na Figura 2 observa-se a mensagem Done ompiling na barra de status o que indica que o programa no tem erros.

Figura 2 Partes do ambiente de programao do arduino

1.3 Simulao de um programa arduino no Proteus


O software Proteus apresenta a possibilidade de simular o cdigo compilado dos microcontroladores ATMEL, sendo assim possvel simular um programa do IDE do arduino no proteus, tornando o estudo mais didtico. Entretanto, no IDE do arduino se usa como referncias das pinagens a numerao das placas de desenvolvimento que no necessariamente a mesma numerao do microcontrolador; sendo assim se faz necessrio conhecer a correspondncia das pinagens da placa de desenvolvimento usada com as do uC respectivo (Figura 3). Nesta seo o procedimento para simular um programa do arduino no software Proteus ser explicado, considerando que o leitor tenha noes do uso do Proteus. Para tornar a explicao mais prtica o exemplo do Pisca Pisca utilizado.

10

Figura 3 Parte do Circuito da placa de desenvolvimento Arduino Uno Para simular o exemplo anterior necessrio conhecer todos os componentes a serem usados, a placa Arduino Uno usa o microcontrolador ATMEL 328 com um clock de 16 MHz, sendo que o pino 13 da placa de desenvolvimento corresponde ao pino 19 do microcontrolador usado. Para realizar a simulao montado o circuito da Figura 3.

Figura 4 Circuito de simulao no Proteus

11 Como resultado da compilao ser gerado o arquivo Pisca_Pisca.cpp.hex, o caminho deste arquivo deve de ser especificado na edio do uC usado no proteus, como se mostra na Figura 4.

Figura 5 Edio do uC ATMEL no Proteus

1.4 Declarao de variveis


Qualquer varivel deve ser declarada antes de ser usada. A declarao de uma varivel comea pela definio do seu tipo, vrios tipos usados no arduino so definidos na Tabela 1. Tabela 1 Tipos de variveis usadas no arduino Tipo de Varivel boolean char byte word int unsigned int long Nmero de bits 1 8 (-128 a 127) 8 (0 a 255) 16 (0 a 65535) 16 (-32.768 a 32767) 16 (0 a 65535) 32 (2.147.483.648 a -2.147.483.647) Comentrios Verdadeiro (1) ou Falso (0) Usado para armazenar caracteres ASCII

12

unsigned long Float double

32 32 32

(0 a 4.294.967.295) Nmeros reais - 6 dgitos de preciso Nmeros reais - 10 dgitos de preciso

Para os programadores tambm interessante a declarao de constantes, para estes casos o comando #define pode ser bastante usado, sendo sua sintaxe #define NomeDaConstante valor Exemplo:
#define PinoDaLampada1 5 // O compilador substituir cada meno de PinoDaLampada1 pelo valor de 5.

Outra opo para declarar constantes o comando const que no permite a duplicidade do uso do nome da constante no programa. Quando o programador use o nome da constante novamente para outra varivel o compilador ir indicar um erro na programao efeito que no acontece com o comando #define. Exemplo:
const float PI=3.14;

Existem constantes predefinidos no IDE do arduino como as lgicas FALSE (0) e TRUE (1). As constantes HIGH e LOW para definir os estados dos pinos do uC. No podemos deixar de citar as constantes INPUT e OUTPUT usados no inicio do programa para definir a direo dos pinos (entrada ou sada) atravs da funo pinMode; no exemplo 1 podese observar a aplicao destas constantes e da funo pinMode. Exemplo:
If (d == FALSE){ digitalWrite(13,HIGH);//sada 13 em 1 (5V) }

1.5 Operadores
1.5.1 Operadores aritmticos Os operadores aritmticos usados no arduino so a soma, resta, multiplicao e diviso. As operaes so realizadas considerando os tipos de dados usados, por exemplo, se X=A/B sendo que A (10) e B(4) foram definidos como int o resultado seria 2, mas se

13 fossem declarados como float ou double X seria 2.5. Entretanto se as variveis usadas so de diferentes tipos, para o clculo ser usado o tipo de dado que armazene maior informao. Exemplo:
A=b+c; G=f-10; K=m*1.5; L=A/2;

Existem tambm operadores de incremento ou decremento unitrio alm de operadores de atribuio. Exemplo:
x++; // equivalente a x=x+1 x--; //equivalente a x=x-1 x+=y; //equivalente a x=x+y x*=y; // equivalente a x=x*y x/=y/ //equivalente a x=x/y

1.5.2

Operadores de comparao Os operadores de comparao so usados para testar se uma condio verdadeira

ou falsa. Exemplo:
X==Y X!=Y X < Y X <= Y X > Y X >= Y // // // // // // X X X X X X igual que Y diferente a Y menor que Y menor ou igual que Y maior que Y maior ou igual que Y

1.5.3

Operadores lgicos Os operadores lgicos so normalmente usados para comparar expresses de

forma a retornar o valor de verdadeiro (1) ou falso (0). Existem 3 operadores lgicos AND(&&), OR(||) e NOT (!), usados comumente com a declarao if. Exemplos:
if (A>B && C==5) if (A!=B || B<3) if (!B)

14

1.6 Exemplo 2: Controle do nvel com bias

Resolver o seguinte problema: Fazer o Projeto, para o controle da Bomba B1, sendo que o nvel sempre estar entre S1 e S2 (sensores bia). Quando o nvel atinge o sensor S2 o seu contato fecha, e quando o nvel fica diminui muito S1 abre.

S2

B1

S1

Figura 6 Exemplo 2: Controle de Nvel com bias Soluo:


boolean S1; boolean S2; void setup() { pinMode(11, INPUT); pinMode(12, INPUT); pinMode(13, OUTPUT); } void loop() { S1=digitalRead(11); S2=digitalRead(12); if (S1 && S2){ digitalWrite(13, LOW); // liga a bomba B1 } if (!S1){ digitalWrite(13, HIGH); // desliga a bomba B1 }

15

Figura 7 Circuito eletrnico no Proteus Exemplo 2

1.7 Exemplo 3: Display de 7 segmentos


Fazer um projeto de forma que se tenham 3 botes, pressionando o boto S1 o nmero 1 deve ser visualizado no display, com S2 o nmero 3 e com S3 todos os segmentos devem estar apagados.
int ledDisplay[] = { 2, 3, 4, 5, 6, 7,8 }; boolean S1, S2, S3; void setup() { for (int i=0; i<=7; i++) { pinMode(ledDisplay[i], OUTPUT); } pinMode(11, INPUT); pinMode(12, INPUT); pinMode(13, INPUT); } void loop() { S1=digitalRead(11); S2=digitalRead(12); S3=digitalRead(13); if (S1){//Escrita de 1 digitalWrite(3, HIGH); digitalWrite(4, HIGH); } if (S2){ digitalWrite(2, HIGH);

16
digitalWrite(3, digitalWrite(4, digitalWrite(5, digitalWrite(8, HIGH); HIGH); HIGH); HIGH);

} if (S3){ //Apaga o Display for (int i=2; i<=8; i++) { digitalWrite(i, LOW); } // liga a bomba B1 }

Figura 8 Circuito no Proteus Uso bsico do display de 7 segmentos

1.8 Exemplo 4: Contador no display de 7 segmentos


O objetivo neste exemplo criar um programa que ao pressionar a chave S1 a contagem de 0 incrementando de um em um at 9 comece a ser mostrada no display, com intervalos de 1 seg.
int ledDisplay[] = { 2, 3, 4, 5}; int i0; const byte numero[10][4]={{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 1, 0, 0}, {0, 1, 0, 1}, {0, 1, 1, 0}, {0, 1, 1, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}}; boolean S1, S2, S3; void setup() {

17
for (int i=0; i<=3; i++) { pinMode(ledDisplay[i], OUTPUT); } pinMode(11, INPUT); pinMode(12, INPUT); pinMode(13, INPUT);

void loop() { S1=digitalRead(11); S2=digitalRead(12); S3=digitalRead(13); if (S1){ for (int i=0; i<=9; i++) {//Incrementando i0=0; for (int i1=3; i1>=0; i1--) { digitalWrite(ledDisplay[i0], numero[i][i1]); i0+=1; } delay(1000); } } if (S2){ for (int i=9; i>=0; i--) {//Decrementando i0=0; for (int i1=3; i1>=0; i1--) { digitalWrite(ledDisplay[i0], numero[i][i1]); i0+=1; } delay(1000); } } }

18

Figura 9 Circuito no Proteus Contador no display de 7 segmentos Referncias Andrew Fitzgibbon, Mauricio Pilu, and Robert B. Fisher (1999). Direct Least Square Fitting of Ellipses. IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 21, No. 5, May 1999. Ang,K.H., Chong,G. and LiY. (2005). PID Control System Analysis, Design, and Technology, IEEE Transactions On Control Systems Technology, vol. 13, no. 4. Armstrong-Hlouvry, B.; Dupont P., and C. C. De Wit (1994). A survey of models, analysis tools and compensation methods for the control of machines with friction. Automatica., 30(7):1083.1138. http://pt.wikipedia.org/wiki/Arduino#Hist.C3.B3ria. Acesso em 15/10/20111

Captulo 2: Controle do tempo sem delay, entrada analgica e comunicao serial.

2.1 Exemplo 5: Semforo sem delay


Uma alternativa do uso da funo delay o uso da funo millis que retorna o valor do tempo em milisegundos (satura em aprx. 50 dias) a partir do inicio da operao do uC. Para ter a diferena de tempo entre um instante e outro, o valor do instante inicial memorizado e a diferena entre o instante atual e o anterior continuamente comparado. Neste exemplo a lmpada vermelha e verde ficam 4 seg. cessa e a lmpada vermelha 2 seg.
const int LampVerde = 2, LampAmarela = 3, LampVermelha = 4; int EstadoSemaforo=0, EVerde=0, EAmarela=0, EVermelha=0; long TempoAnterior = 0; void setup() { pinMode(LampVerde, OUTPUT); pinMode(LampAmarela, OUTPUT); pinMode(LampVermelha, OUTPUT); } void loop() { unsigned long TempoAtual = millis(); if((TempoAtual - TempoAnterior > 4000) && (EstadoSemaforo == 0)){ TempoAnterior = TempoAtual; EVerde = 1; EAmarela=0; EVermelha=0; EstadoSemaforo=1; } if((TempoAtual - TempoAnterior > 4000) && (EstadoSemaforo == 1)){ TempoAnterior = TempoAtual; EVerde = 0; EAmarela=1; EVermelha=0; EstadoSemaforo=2; } if((TempoAtual - TempoAnterior > 2000) && (EstadoSemaforo == 2)){ TempoAnterior = TempoAtual; EVerde = 0; EAmarela=0; EVermelha=1; EstadoSemaforo=0; } digitalWrite(LampVerde, EVerde); digitalWrite(LampAmarela, EAmarela); digitalWrite(LampVermelha, EVermelha); }

20

Figura 10 Circuito no Proteus - Exemplo 5: Semforo

2.2 Exemplo 6: Entrada analgica e LCD


int EnAnC0 = A0; // Entrada Analgica no canal 0 int ValorEnAnC0 = 0; // Varivel para armazenar o valor de EnAnCo // Libraria do LCD #include <LiquidCrystal.h> // Inicializa a libraria com o nmero de interface dos pinos LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // Configura o nmero de colunas e filas do LCD lcd.begin(16, 2); // Imprime uma mensagem no LCD lcd.print("Ent.An.Canal 0:!"); } void loop() { // Leitura do valor analgico ValorEnAnC0 = analogRead(EnAnC0); // Inicia o cursor na coluna 0 e linha 1 (Desde que se tem linha 0 e 1) lcd.setCursor(0, 1); // Imprime o valor da entrada analgica lcd.print(ValorEnAnC0); }

21

22

2.3 Exemplo 7: Comunicao Serial - Escrita


No seguinte exemplo o leitor poder observar a forma de enviar um dado atravs da porta serial, neste caso a leitura do sinal analgico do canal 0 apresentado simultaneamente no LCD 16x2 e disponibilizada atravs da porta serial. A porta serial TTL do arduino transformada ao padro RS232 usando o max232, como se observa na Figura 11. O exemplo a seguir se comunica a uma taxa de 9600bps e por defeito as caractersticas so: data bits: 8, parity:none e stop bits: 1.
int EnAnC0 = A0; // Entrada Analgica no canal 0 int ValorEnAnC0 = 0; // Varivel para armazenar o valor de EnAnCo long TempoAnterior = 0; // Libraria do LCD #include <LiquidCrystal.h> // Inicializa a libraria com o nmero de interface dos pinos LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // Configura o nmero de colunas e filas do LCD lcd.begin(16, 2); // Imprime uma mensagem no LCD lcd.print("Ent.An.Canal 0:!"); Serial.begin(9600); } void loop() { // Leitura do valor analgico ValorEnAnC0 = analogRead(EnAnC0); // Inicia o cursor na coluna 0 e linha 1 (Desde que se tem linha 0 e 1) lcd.setCursor(0, 1); // Imprime o valor da entrada analgica lcd.print(ValorEnAnC0); unsigned long TempoAtual = millis(); if(TempoAtual - TempoAnterior > 2000){ TempoAnterior = TempoAtual; Serial.print("Canal 0"); Serial.print(ValorEnAnC0, DEC); Serial.println(); } }

23

Figura 11 Ciruito no Proteus Exemplo 7: Comunicao serial

2.4 Exemplo 8: Comunicao serial bidirecional Leitura e escrita


int EnAnC0 = A0; // Entrada Analgica no canal 0 int ValorEnAnC0 = 0; // Varivel para armazenar o valor de EnAnCo long TempoAnterior = 0; // Libraria do LCD #include <LiquidCrystal.h> // Inicializa a libraria com o nmero de interface dos pinos LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // Configura o nmero de colunas e filas do LCD lcd.begin(16, 2); // Imprime uma mensagem no LCD lcd.print("Ent.An.C0:"); Serial.begin(9600); } void loop() { // Leitura do valor analgico ValorEnAnC0 = analogRead(EnAnC0); // Inicia o cursor na coluna 0 e linha 1 (Desde que se tem linha 0 e 1) lcd.setCursor(11, 0); // Imprime o valor da entrada analgica lcd.print(ValorEnAnC0); unsigned long TempoAtual = millis(); if(TempoAtual - TempoAnterior > 2000){ TempoAnterior = TempoAtual; Serial.print("Canal 0:");

24
Serial.print(ValorEnAnC0, DEC); Serial.println(); if (Serial.available()) { char enByte = Serial.read(); lcd.setCursor(0, 1); lcd.print("Ent.Port.Ser:"); lcd.print(enByte); lcd.print(" "); }

2.5 Exemplo 9: Uso do PWM


int EnAnC0 = A0; // Entrada Analgica no canal 0 int ValorEnAnC0 = 0; // Varivel para armazenar o valor de EnAnCo int pinoPWM = 9; int PorPWM=0; // Libraria do LCD #include <LiquidCrystal.h> // Inicializa a libraria com o nmero de interface dos pinos LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // Configura o nmero de colunas e filas do LCD lcd.begin(16, 2); // Imprime uma mensagem no LCD lcd.print("Ent.An.C0:"); pinMode(pinoPWM, OUTPUT); } void loop() { // Leitura do valor analgico

25
ValorEnAnC0 = analogRead(EnAnC0); // Inicia o cursor na coluna 0 e linha 1 (Desde que se tem linha 0 e 1) lcd.setCursor(11, 0); // Imprime o valor da entrada analgica lcd.print(ValorEnAnC0); lcd.setCursor(0, 1); lcd.print("PWM (%):"); PorPWM=ValorEnAnC0/4*100/255; lcd.print(PorPWM); lcd.print(" "); analogWrite(pinoPWM, ValorEnAnC0/4);

You might also like