Vous êtes sur la page 1sur 21

Sumrio

Introduo.............................................................................................................................................2 O Programa...........................................................................................................................................3 A sintaxe..........................................................................................................................................3 Colocando a mo na massa...................................................................................................................3 A Protoboard....................................................................................................................................3 Projeto 1: Piscar um LED................................................................................................................4 Converso numrica........................................................................................................................5 lgebra booleana.............................................................................................................................6 Projeto 2: Semforo.........................................................................................................................7 A funo tone..................................................................................................................................9 Comunicao Serial............................................................................................................................10 Entradas e sadas analgicas...............................................................................................................10 Sadas analgicas...........................................................................................................................10 Entradas Analgicas.......................................................................................................................11 Projeto 3: Controle de luminosidade............................................................................................12 Motores DC....................................................................................................................................13 Projeto 4: Verificao de superfcie...............................................................................................13 Projetos extras....................................................................................................................................14 Projeto Extra 1: Semforo..............................................................................................................14 Projeto extra 2: Controle de luminosidade....................................................................................16 Proposta de implementao dos exerccios........................................................................................19 Bibliografia e materiais para consulta................................................................................................20

Alan Vitor Fonseca, Grupo Colmia


Minicurso Arduino, Junho 2012, Joinville-SC Apoio - Daniel Scheidemantel Camargo e Brunno Prado Centro de Cincias Tecnolgicas - Universidade do Estado de Santa Catarina

Introduo
Aprender eletrnica no uma tarefa simples, exige muito tempo e dedicao, conciliar isso com o resto das nossas atividades dirias acaba sendo um desafio. Tudo isso junto com os altos custos envolvidos acabam por inviabilizar a criao de dispositivos eletrnicos para muitas pessoas. Pensando nisso o co-fundador do Arduino Massimo Banzi do Interaction Design Institute Ivrea na Itlia mobilizou um grupo de pessoas a fim de criar uma soluo para este problema mais barata e fcil de usar do que as j existentes na poca. Eles decidiram fazer isso como um projeto de cdigo aberto, assim todos poderiam ajudar e contribuir. Dessa ideia surgiu o Arduino. Arduino uma plataforma open-source de prototipagem com software e hardware flexvel e fcil de usar. De uma forma menos tcnica, Arduino um conjunto de ferramentas que possibilitam a criao de aparelhos eletrnicos onde a ideia fazer com que as pessoas possam fazer o que quiser com eletrnica, no necessariamente aprendendo tudo antes. E como querer fazer a sua camisa piscar, bem difcil fazer se voc quer aprender eletrnica, mas com o Arduino voc pode fazer isso em poucos minutos. Para entender melhor como funciona o Arduino vejamos o que um microcontrolador:

Microcontroladorbasicamenteumcircuitointegrado

contendo um microprocessador e todos os perifricosessenciaisaoseufuncionamentocomo memoriaeperifricosdeentradaesada. Omicrocontroladorexecutaumprogramaespecifico contendo instrues para que uma certa entrada sejaprocessadagerandoumasadacorrespondente. O Arduino torna fcil a criao de programas, a colocao do programa em um microcontrolador (ATmega8, ATmega168, ATmega328, entre outros, dependendo da verso da placa) e utilizao de suas portas de entrada ou sada. Uma das grandes vantagens do Arduino o seu licenciamento sendo GPL para a IDE Java, LGPL para as bibliotecas em C/C++ e Creative Commons Atribution Share-Alike para os Esquemas da placa. Por isso qualquer pessoa pode contribuir criando uma biblioteca para simplificar um processo complexo, tornando o mesmo extremamente simples, ou ento criando verses da placa para algum objetivo especifico ou at mesmo criando exemplos e tutoriais. Isso faz com que com uma simples pesquisa na internet traga inmeras solues para o que precisamos.

O Programa
Vamos criar o nosso programa na prpria IDE do Arduino que usa uma linguagem baseada em C/C++.

A sintaxe
Diferente da linguagem C original, a que usaremos ter algumas diferenas, por exemplo, aqui no teremos uma funo principal - int main() - mas, basicamente teremos um programa da forma:

void setup() usadaparafazeraconfigurao,comodizer


seumpinoseraentradaousadaeconfigurara comunicaoserial.(executadoumaveznoiniciodoprograma) pelomicrocontrolador. Este o esqueleto bsico de um programa, porem como em C podemos incluir bibliotecas diferentes, declarar variveis globais, escrever outras funes fora das citadas acima, entre outras funcionalidades.

void loop() usadaparaescreverarotinaaserexecutada

Colocando a mo na massa
A Protoboard
A protoboard uma placa usada para criao de prottipos ou circuitos experimentais onde os componentes e as conexes podem variar sem a necessidade de solda. uma matriz de contato, com furos tendo conexes verticais e horizontais. Ela funciona de forma que ao conectarmos um fio no primeiro furo da coluna vertical, este estar em curto circuito com qualquer outro fio conectado na coluna, ou seja, como se conectssemos diretamente todos os fios da coluna. Com as linhas horizontais o funcionamento o mesmo. Vamos agora escrever o nosso primeiro programa, mas como o Arduino no fica somente na tela do PC, vamos criar um projeto bem simples e trabalhar em cima dele.

Projeto 1: Piscar um LED


Comeamos ento por um projeto clssico, Pisca LED , ou seja, queremos fazer um LED ficar aceso por um tempo, depois apagar e assim por diante. Para comear a escrever o programa precisamos saber em que pinos do Arduino estaro conectados nossos componentes, nesse caso, somente o LED, ento vamos ao nosso circuito eltrico: Agora, com a parte do hardware j montada, vamos para o programa:

Como conectamos nosso LED no pino 10 do Arduino, vamos declarar uma varivel do tipo inteiro para guardarmos o numero do pinos em que o LED esta
(esta sera uma varivel global)

int LED = 10;

Agora vamos configurar o pino 10 como uma sada Escrevemos agora a rotina para acender, esperar algum tempo e depois apagar o LED Declaramos a funo loop Setamos o pino do LED para nvel logico alto Esperamos um tempo (1000 ms) Setamos o pino do LED para nvel logico baixo Esperamos um tempo (1000 ms) Fechamos a funo loop

void setup(){ pinMode(LED,OUTPUT); }

void loop(){ digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); }

Vejamos o que as linhas mais relevantes significam: pinMode(pino, modo) digitalWrite(pino, valor) delay(tempo) Configura um pino especifico para se comportar como uma entrada ou uma sada. Escreve em um pino digital o valor logico Alto ou Baixo. Pausa o programa durante um certo tempo especificado em milisegundos.

Obs.: No prprio site do Arduino ( http://Arduino.cc/en/Reference/HomePage ) podemos encontrar referencia sobre a linguagem utilizada, o site traz , entre outras coisas, referencia sobre a sintaxe, operadores e funes. Antes de irmos para o prximo projeto vamos ver algumas noes de converso numrica e lgebra booleana.

Converso numrica
Apesar de que na IDE do Arduino as funes so feitas de forma a facilitar ao mximo o uso dos nmeros e valores usados, ainda em alguns casos necessrio sabermos fazermos a converso de base de um numero. Mas o que a base de um numero? - De uma forma fcil, a base de um numero o total de smbolos que usamos para escrev-lo, ou seja, a base em que mais usamos, a decimal, temos 10 smbolos(0 a 9) para escrever os nmeros que desejarmos e na base binaria 2 smbolos (0 e 1). Como os microcontroladores e at mesmo os computadores, internamente s entendem nmeros na base binaria, importante que saibamos escrever nmeros decimais em pelo menos mais duas bases, a binaria e a hexadecimal, que tambm e largamente usada nesse meio.
Converso com base decimal para uma base qualquer: podemos fazer isso por meio das divises sucessivas:

vamos converter o numero 4710(base 10) para a base hexadecimal(base 16) 47/16 = 2 , resto: 1510 = F16
2/16 = 0 , resto: 210 = 216 Dividimos o numero pela base em que queremos transformar, no caso 16, at que o numero zere.

Dai tiramos o nosso numero na base hexadecimal 2F16.


Converso com base decimal para uma base qualquer: podemos fazer isso multiplicando cada algarismo do numero por potencias de sua base elevadas a ordem significativa do numero, e depois somando todos eles.

Vamos converter agora o numero 2F16 para a base decimal: 2F16 = 2*161 + 15*160 = 32 + 15 = 4710. (visto que F16 = 1510).

Converso com base hexadecimal e binaria: essa converso fica fcil ao sabermos que, em ordem, cada 4 algarismos binrios equivalem a um algarismo hexadecimal, e vice e versa. Valor Numrico Nmero Binrio Nmero Hexadecimal 8421 0010 2 8421 0110 6 Portanto 2616 = 1001102

lgebra booleana
Antes de tudo devemos ter em mente:
Sistemasdigitaisusamalogicabinariadeformaqueoszeroseunssoos nveislgicosnasentradasousadasdos dispositivos,osquaistrabalhamcombaixastenses, nocasodosmicrocontroladoresdaAtmel,5V(entre 1.85.5V),portantoumaentradanafaixaprxima 0Ventendidacomonvellogicobaixo(LOW),juma faixaemtornode5Veentendidacomonvellogico alto(HIGH).

Na lgebra booleana trabalhamos com esses nveis lgicos de forma que 0 significa falso e 1, verdadeiro, e usamos algumas operaes logicas:

OR AND NOT NAND NOR XOR

Ou E No No AND No OR Exclusive OR

+ * ~ AND invertido(barrado) OR invertido(barrado)

Por exemplo, se tivermos como entrada 3 sinais lgicos, verdadeiro, falso e verdadeiro de novo, e queremos realizar entre eles uma operao logica AND, temos:
verdadeiro AND falso AND verdadeiro = falso

da mesma forma que:


1*0*1 = 0.

Assim como a operao OR: verdadeiro OR falso OR verdadeiro = verdadeiro 1+0+1 = 1. Obs.: Observe que estamos executando uma operao logica soma e no uma soma como estamos acostumados, portanto aqui 1+1 = 1. A operao logica NOT inverte o nvel logico, ou seja o que era 0 vira 1 e vice e vera, e representada por uma barra em cima da funo logica:
(verdadeiro OR falso)AND verdadeiro = (verdadeiro NAND falso)AND verdadeiro = falso (1+0)*1 = 1*1 = 0*1 = 0.

J a funo XOR e dada como: a b = ab + ba .

Projeto 2: Semforo
Nosso objetivo aqui fazer um programa que controle o transito de veculos em uma rua. Teremos um semforo convencional de veculos com os 3 passos mostrados ao lado. Sendo que para efeito experimental deixaremos o sinal em vermelho e verde por 5 segundos e amarelo por 1 segundo. Tambm teremos um boto que ao pressionarmos o sinal ira impedir a passagem de veculos, isso , caso o sinal esteja verde ele deve ir imediatamente para amarelo e depois para vermelho. 1 2 3

Para isso usaremos algo chamado interrupo externa, que caso ocorra ela ira desviar o programa de sua execuo atual, realizar alguma ao( uma funo no nosso caso), e depois continuar o programa normalmente. Uma interrupo pode ser atribuda a um pino do Arduino atravs da funo: attachInterrupt(canal, funo, modo) , onde: canal : indica o pino a ser usado pela interrupo canal 0 para o pino 2 e 1 para o pino 3. funo : a funo que sera executada quando ocorre a interrupo. modo : o tipo da interrupo, que pode ser: LOW : interrupo dada quando o pino estiver com nvel logico baixo. CHANGE : interrupo dada quando o pino muda de nvel logico. RISING : interrupo dada quando o nvel logico vai de 0 para 1. FALLING : interrupo dada quando o nvel logico vai de 1 para 0. Vamos ento ao hardware, que sera montado com LEDs e um pushbutton:

O programa fica assim: int passo = 1; int vermelho = 12, amarelo = 11, verde = 10; int botao = 2; void setup(){ attachInterrupt(0, irVermelho,FALLING); Varivel global para armazenar o passo atual. Declarao dos LEDs usados conforme o circuito. Declarao do boto conforme o circuito. Aqui temos a funo de configurao. Vinculamos a funo irVermelho() com uma interrupo externa na borda de descida do canal 0 ( no pino 2). Configuramos o pino do boto como entrada. Configuramos os pinos dos LEDs como sadas digitais.

pinMode(botao,INPUT); pinMode(verde,OUTPUT); pinMode(amarelo,OUTPUT); pinMode(vermelho,OUTPUT); } void irVermelho(){ p1(); passo = 1; return; } void p3(){ digitalWrite(vermelho,LOW); digitalWrite(amarelo,HIGH); digitalWrite(verde,LOW); return; } void p2(){ digitalWrite(vermelho,LOW); digitalWrite(amarelo,LOW); digitalWrite(verde,HIGH); return; } void p1(){ digitalWrite(vermelho,HIGH); digitalWrite(amarelo,LOW); digitalWrite(verde,LOW); return; }

Essa funo liga o LED vermelho e desliga os outros, e retorna o passo para o primeiro*.

Funo para colocar os LEDs no passo 3.

Funo para colocar os LEDs no passo 2.

Funo para colocar os LEDs no passo 1.

void loop(){ if(passo == 1){ p1(); passo = 2; delay(5000); } if(passo == 2){ p2(); passo = 3; delay(5000); } if(passo == 3){ p3(); passo = 1; delay(1000); } }

Funo loop aquela executada sempre que o microcontrolador estiver alimentado. Aqui caso a varivel que guarda o passo atual estiver em 1, executamos a funo que coloca os LEDs no passo 1, ento mudamos a varivel passo para indicar o novo passo e esperamos 5.000ms ou 5s. Faz o mesmo que o anterior porem para o segundo passo.

Executa o mesmo para o terceiro passo, porem agora esperando apenas 1 segundo no sinal amarelo.

* Em uma situao normal poderamos executar p1() e esperar 5s na prpria funo de interrupo e depois ir direto para o passo 2, porem aqui a funo delay() no funciona. Nesse caso como o tempo pequeno quase no vemos problema, porem quando o boto pressionado o passo 1 fica por mais tempo ( o tempo que o programa j estava esperando no passo em que estava mais o tempo de 5 segundos de p1() ). Como exerccio para o minicurso tente resolver este problema. No final da apostila temos mais um projeto com semforo mais prximo realidade com esse problema resolvido. Esta somente uma forma de fazer o programa, poderamos, por exemplo mudar os estados dos LEDs na funo loop ao invs de criar funes separadas para isso. A logica de programao muito importante nesses casos. Podemos resolver um problema aparentemente muito difcil de uma forma fcil se usarmos a logica certa. A funo tone Esta funo gera uma onda quadrada em uma sada do Arduino com uma frequncia especificada, vejamos como a funo: tone(pino, frequncia, durao), onde a durao um argumento opcional. Obs.: Nas placas do Arduino que usam o microcontrolador Atmega8, se usado, o argumento durao causa um erro no programa. Podemos usar ento a funo noTone(pino). Com essa funo podemos criar sons, sabendo a frequncia de uma nota musical por exemplo podemos facilmente toc-la em um auto falante ou um piezo-eltrico ligado ao Arduino.

Comunicao Serial
Alm de funes prontas, o Arduino possui, na sua prpria IDE, o Serial Monitor que uma interface para fazer o debug de programas, enviar e receber dados de forma serial. Nas placas do Arduino que possuem conexo USB, essas podem ser usadas para fazer a comunicao serial com um computador por exemplo. Vejamos ento como fazer isso. Primeiro devemos fazer a configurao para a comunicao serial, atravs da funo: Serial.begin(taxa) , onde: taxa: a taxa de transmisso de dados, em bits por segundo(baud). Agora podemos enviar dados com as funes Serial.print(), Serial.println() e Serial.write(), e ler os dados recebidos com Serial.read() e Serial.peek(). Para checar se h dados recebidos podemos usar a funo Serial.available(), que retorna no numero de bytes disponveis para leitura.

Entradas e sadas analgicas


Vejamos a seguir como podemos usar as entradas e sadas analgicas do Arduino. Sadas analgicas As sadas analgicas do Arduino usam PWM ou Modulao por largura de pulso, em portugus para variar a transferncia de potencia em um pino especifico. Vejamos ento como funciona o PWM. Quando temos o nivel logico 1 em um pino do Arduino e mudamos para 0, temos um sinal como na figura a esquerda: J quando variamos repetidamente a mudana de nvel logico temos algo como na figura a direita, o que caracteriza uma onda quadrada, nesse caso se considerarmos um perodo, veremos que o pino transferiu a metade da potencia que transmitiria se estivesse o tempo todo em nvel logico 1. O PWM consiste em manipularmos o tempo, em cada perodo, que ficaremos em cada um dos nveis lgicos.

10

Nesse caso, por exemplo temos 75 por cento de potencia transferida, porem no Arduino o perodo dessas ondas muito baixo, fazendo com que a frequncia seja alta(aproximadamente 490 Hz), portanto, se estivermos com um LED conectado a esse pino, no o veremos piscar, mas sim com 75% de sua luminosidade total. Em motores DC podemos controlar a velocidade do motor atravs de PWM. O Arduino possui alguns pinos que podem ser usados como PWM, e para isso usamos a funo: analogWrite(pino, valor) , onde: pino : pino de sada do PWM. valor : valor entre 0 ( 0%) e 255 ( 100%) que determina a porcentagem em que o sinal estar ativo. Obs.: No e preciso declarar o pino como sada(usando pinMode()) para us-lo PWM. Entradas Analgicas Um pino de entrada analgica tem a funo de ler a tenso nele colocada e transformar esse valor em um numero inteiro, no caso do Arduino teremos a preciso de 10 bits, ou seja 1024 valores possveis, sendo 0 para 0V e 1023 para 5V. A funo usada para leitura analgica no Arduino e a seguinte: analogRead(pino) , onde pino indica o pino o qual sera feito a leitura. Essa funo retorna um valor inteiro de 0 a 1023 correspondente a leitura feita. Como funciona

No ensino mdio voc j deve ter estudado alguns circuitos com resistores e viu que a corrente que circula em um circuito dada por V i= , onde Re a resistncia equivalente do circuito, ou ento Re que a diferena de potencial V nos polos de um resistor V R =Ri . Sabendo isso vejamos como ira ficar a tenso que iremos ler no Arduino: V V = Re R1+R LDR A tenso que estaremos lendo esta nos polos de R LDR , assim: R LDR V V LDR = R LDR i = R LDR ou V LDR = V R1 +R LDR R1 +RLDR Isso o que chamamos de divisor de tenso entre R1 e RLDR . Assim, como R LDR varia conforme a luz que incide no LDR, podemos variar V LDR A corrente que circula no circuito : i =
Em um teste feito em uma sala qualquer quando o LDR era submetido a muita luz obtivemos uma resistncia de 500, e sem luz de 90.000,

11

com esses dados a leitura V LDR mostrada no grfico a esquerda, e como o Arduino possui um conversor analgico/digital de 10 bits, ou seja, vai do decimal 0 ao 1023, podemos ver a leitura no grfico a direita.

Projeto 3: Controle de luminosidade Para este projeto queremos controlar a luminosidade em um local, de forma que teremos um boto que liga/desliga o sistema de iluminao. Quando o sistema estiver ligado usaremos um LDR para verificar a luminosidade no local, quanto menor, a luz (LED) devera ter uma intensidade maior.

Boto

Liga/Desliga o sistema de iluminao

LDR

Usado como sensor de luminosidade.

LED

Iluminao.

Esse projeto fica como exerccio para o minicurso. Uma resoluo possvel se encontra no final desse material.

12

Motores DC Quando falamos de motores eltricos e Arduino, comum ouvirmos falar nos Servomotores, o qual temos uma livraria com varias funes prontas para trabalharmos com eles. Esses motores so encontrados geralmente de forma que funcionam ligados diretamente aos pinos do Arduino. Porem quando falamos de motores em geral, como o Arduino no fornece uma corrente e voltagem muito altas, na maioria dos casos, teremos de fazer um circuito auxiliar para fazer o motor funcionar e no trazer nenhum risco a placa, como queimar algum componente. Esse circuito pode ser feito com transistores, como na figura abaixo: Onde o ULN2003 um CI que possui um conjunto de transistores Darlington. Simplificadamente um transistor um componente que serve para amplificar o nosso sinal, por exemplo, queremos usar um motor de 12V e 0,2A, como o Arduino s pode fornecer 5V e alguns mA no teremos potencia o suficiente para fazer o motor funcionar somente com o Arduino, ai que entra o transistor. Um transistor possui 3 pinos, uma base, um coletor e um emissor, no caso do ULN2003, as entradas(base) so barradas, ou seja, seu sinal invertido, portanto se o alimentarmos com 12V (coletor), e tivermos nvel logico 0 na entrada ento teremos 12V na sada(emissor), e no caso de nvel logico 1 na entrada teremos uma sada de 0V. Projeto 4: Verificao de superfcie Voc j deve ter visto aqueles robs que seguem uma linha no cho em competies ou at mesmo em industrias. Veremos nesse projeto o principio de uso desses robs. Na figura a esquerda temos sensores e um emissor de luz infravermelha, eles so usados, por exemplo, nas TVs, onde o controle remoto o transmissor e um sensor junto a TV o receptor infravermelho. Voc tambm j deve ter ouvido falar que a cor preta no reflete os raios de luz, isso tambm ocorre com o infravermelho, quando temos um arranjo como na figura ao lado, os raios de luz infravermelha saem do emissor, refletem no obstaculo e chegam at o receptor. Se esse objeto for de cor preta a reflexo sera bem menor do que se ele for de cor branca, com isso podemos distinguir, por exemplo, uma linha escura em um cho claro. O objetivo desse projeto e distinguir um objeto branco de um preto atravs desses sensores. Este projeto tambm fica como exerccio para o minicurso, uma possvel implementao esta no final desse material.

13

Projetos extras
Projeto Extra 1: Semforo
Nosso objetivo aqui fazer um programa que controle o transito como no projeto 2 porem agora teremos um grupo veicular e um de pedestres. O semforo sera como mostrado abaixo, onde o sinal com 3 cores o veicular e o com 2 cores o dos pedestres, e obedecendo as regras convencionais de um semforo.

2/3

Porem, alm disso, teremos um boto que quando pressionado reduzira o tempo que o pedestre tem de esperar para passar. Vamos ento ao hardware, que sera montado com LEDs e um pushbutton:

14

O programa fica assim: int tempo = 0; void reduzTempo(){ if(tempo >= 10 && tempo <=19)tempo = 19; } void setup(){ attachInterrupt(0, reduzTempo,FALLING); Varivel global para armazenar o tempo. Funo para reduzir o tempo de espera caso seja apertado o boto. Aqui a nossa funo de configurao Vinculamos nossa funo reduzTempo() com uma interrupo externa na borda de descida do canal 0 ( no pino 2). Configuramos os pinos de 8 a 12(LEDs) como sadas digitais. Configuramos o pino 4(pushbutton) como entrada digital. Funo para colocar os LEDs no passo 3. // Vermelho // Amarelo // Verde // Pedestre - Seguir // Pedestre - Parar

for(int i = 8 ; i <=12 ; i++){ pinMode(i,OUTPUT); } pinMode(4,INPUT); } void p3(){ digitalWrite(12,LOW); digitalWrite(11,HIGH); digitalWrite(10,LOW); digitalWrite(9,LOW); digitalWrite(8,HIGH); return; } void p2(){ digitalWrite(12,LOW); digitalWrite(11,LOW); digitalWrite(10,HIGH); digitalWrite(9,LOW); digitalWrite(8,HIGH); return; } void p1(){ digitalWrite(12,HIGH); digitalWrite(11,LOW); digitalWrite(10,LOW); digitalWrite(9,HIGH); digitalWrite(8,LOW); return; }

Funo para colocar os LEDs no passo 2.

Funo para colocar os LEDs no passo 1.

15

void piscaVermelho(){ for(int x = 0; x<= 3;x++){ digitalWrite(8,HIGH); delay(500); digitalWrite(8,LOW); delay(500); } return; } void addTempo(){ delay(1000); tempo++; if(tempo > 22) tempo = 0; return; } void loop(){ if(tempo == 0)p1();

Funo para piscar 3 vezes o LED que indica para os pedestres pararem.

Funo usada para adicionar 1 segundo (1000ms) na varivel que guarda o tempo.

Funo loop aquela executada sempre que o microcontrolador estiver alimentado. Para o tempo entre 0 e 9 segundos colocamos os sinais na posio 1. Para o tempo entre 10 e 19 segundos,piscamos o LED vermelho e depois mudamos os sinais para a posio 2. Para o tempo entre 20 e 22 segundos colocamos os sinais na posio 3. Executamos a funo para adicionar um segundo a cada loop.

if(tempo == 10){ digitalWrite(9,LOW); piscaVermelho(); p2(); } if(tempo == 20)p3(); addTempo(); }

Esta somente uma forma de fazer o programa, poderamos, por exemplo mudar os estados dos LEDs na funo loop ao invs de criar funes separadas para isso. A logica de programao muito importante nesses casos, no programa acima, consideramos que o tempo do ciclo no sair da faixa citada, e que no haja erro na sua adio, se pulssemos do segundo 9 para o 11 , por exemplo, no teramos a mudana dos sinais para os segundo estado. Projeto extra 2: Controle de luminosidade Para este projeto queremos controlar a luminosidade em um local, de forma que teremos 2 botes, um deles liga/desliga o sistema de iluminao, e o outro quando pressionado iniciara ou adicionara tempo um timer que desligara a iluminao quando o tempo terminar. Quando o sistema estiver ligado usaremos um LDR para verificar a luminosidade no local, quanto menor, a luz (LED) devera ter uma intensidade maior.

16

Boto 1

Liga/Desliga o sistema de iluminao

Boto 2

Seta um timer para desligar o sistema.

LDR

Usado como sensor de luminosidade.

LED

Iluminao.

Circuito usado no projeto:

Cdigo fonte: Inicializao das variveis: Tempo do timer. Tempo decorrido durante o timer. Tempo de segurana contra mau contato.

volatile float tempo = 0; volatile float tempoDecorrido = 0; volatile unsigned long tmpseg = 0; volatile boolean ligado = false; void timer(){ if(millis() > tmpseg+500){ tmpseg = millis(); tempo+=10000; if(tempo >=50000){ tempo = 0; tempoDecorrido = 0; } } return; }

Essa parte garante que o boto s de efeito se apertado depois de 500 ms, isso previne contra mal contato nos fios. Aqui adicionamos 10s a varivel tempo a cada vez que apertarmos o boto, e zeramos ela caso passe de 5x pressionadas.

17

void ligar(){ if(millis() > tmpseg+500){ tmpseg = millis(); ligado = !ligado; tempo = 0; tempoDecorrido = 0; } return; } void setup(){ attachInterrupt(0,timer,RISING); attachInterrupt(1,ligar,FALLING); } void loop(){

Segue o mesmo da funo timer. Aqui invertemos o valor da varivel booleana ligado a cada vez que pressionamos o boto, e zeramos as outras variveis.

Pino 2 boto timer. Pino 3 boto ligar.

if(ligado){ Faz a leitura do LDR. int ldr = analogRead(4); int luminosidade = map(ldr,320,830,0,255); Ajusta o valor da converso AD para o PWM. Escreve o valor ajustado para a luminosidade do analogWrite(11,luminosidade); LED. if(tempo > 0){ if(tempoDecorrido < tempo){ delay(100); tempoDecorrido+=100; }else{ ligado = false; } } }else{ analogWrite(11,0); } } Nessa parte verificamos se o timer esta ativado ( tempo >0), caso isso ocorra: Adicionamos 100 a varivel tempoDecorrido para cada 100 milisegundos. E caso tempoDecorriso seja maior que o tempo do timer desligamos o sistema. Caso a varivel ligado seja false desligamos o sistema.

18

Proposta de implementao dos exerccios


Projeto 4: Circuito usado no projeto:

Cdigo fonte: int receptor = 2; int claro = 550; int escuro = 190; String Cor = "",Verificar = ""; void setup(){ Serial.begin(9600); } void loop(){ int x = analogRead(receptor); if(x > claro)Cor = "Objeto Claro"; if(x < escuro)Cor = "Objeto Escuro"; if(x < claro && x > escuro) Cor = "Aproxime o Objeto"; if(Cor != Verificar){ Serial.println(Cor); Verificar = Cor; } delay(500); }

Ligamos o receptor IR no pino 2 (entrada analgica). A leitura do receptor foi de 550+ para objetos claros, E foi de 190- para objetos escuros. Inicializamos as strings para enviar serialmente para o PC. Inicializamos a comunicao serial na funo setup.

Lemos a entrada analgica ligada ao receptor. Caso a leitura seja 550+ a string guardara Objeto Claro Caso seja 190- guardara Objeto Escuro Caso o valor esteja entre 190 e 550 pediremos para aproximar um objeto. Aqui verificamos se a string a ser enviada a mesma que a anterior, caso sim evitamos a repetio da cor do objeto, caso no enviamos serialmente a cor do objeto. Esperamos um tempo para prevenir rudos na leitura.

19

Bibliografia e materiais para consulta


http://www.arduino.cc/ http://vimeo.com/31389230

http://www.tecmundo.com.br/android/10098-arduino-a-plataforma-open-source-quevai-automatizar-a-sua-vida.htm

20