Вы находитесь на странице: 1из 36

Universidade Federal Fluminense UFF Escola de Engenharia TCE es TGT Curso de Engenharia de Telecomunica co

o Tutorial PET Programa de Educa ca Grupo PET-Tele

Tutoriais PET-Tele

Introdu c ao ao kit de desenvolvimento Arduino


(Versa o: A2013M06D20)

Autores: Roberto Brauer Di Renna (2013) Rodrigo Duque Ramos Brasil (2013) Mathyan Motta Beppu (2010) Erika Guimar aes Pereira da Fonseca (2010) Tutor: Alexandre Santos de la Vega Niter oi RJ Junho / 2013

Sum ario
1 Introdu c ao ao Arduino 2 Caracter sticas do kit Duemilanove 2.1 Caracter sticas b asicas . . . . . . . 2.2 Alimenta c ao . . . . . . . . . . . . . 2.3 Mem oria . . . . . . . . . . . . . . . 2.4 Entrada e Sa da . . . . . . . . . . . 2.5 Comunica c ao serial . . . . . . . . . 2.6 Programa ca o . . . . . . . . . . . . 2.7 Reset Autom atico . . . . . . . . . . 2.8 Prote c ao contra sobrecorrente USB 2 4 4 4 5 5 6 6 6 7 8 8 9 10

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

3 Programa c ao do Arduino 3.1 Linguagem de refer encia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Fun co es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Instala c ao da IDE do Arduino e das suas bibliotecas 12 4.1 Arduino para Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4.2 Arduino para GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5 Exemplos de projetos 5.1 Exemplo 1 - Acionamento de LED interno . 5.2 Exemplo 2 - Acionamento de LEDs externos 5.3 Exemplo 3 - Capac metro . . . . . . . . . . 5.4 Exemplo 4 - Controle de servomotor . . . . 5.5 Exemplo 5 - Teclado virtual . . . . . . . . . 5.6 Exemplo 6 - Jogo Genius . . . . . . . . . . . 5.7 Exemplo 7 - Alarme . . . . . . . . . . . . . 5.8 Exemplo 8 - Controle remoto . . . . . . . . 6 Refer encias bibliogr acas 14 14 16 18 21 23 26 31 33 35

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

Cap tulo 1 Introdu c ao ao Arduino


O Arduino faz parte do conceito de hardware e software livre e est a aberto para uso e contribui c ao de toda sociedade. O conceito Arduino surgiu na It alia, em 2005, com o objetivo de criar um dispositivo que fosse utilizado em projetos/prot otipos constru dos de uma forma menos dispendiosa do que outros sistemas dispon veis no mercado. Ele pode ser usado para desenvolver artefatos interativos stand-alone ou conectados ao computador, utilizando diversos aplicativos, tais como: Adobe Flash, Processing, Max/MSP, Pure Data ou SuperCollider. O Arduino foi projetado com a nalidade de ser de f acil entendimento, de f acil programa ca o e de f acil aplica c ao, al em de ser multiplataforma, podendo ser congurado em ambientes Linux, Mac OS e Windows. Al em disso, um grande diferencial deste dispositivo e ser mantido por uma comunidade que trabalha na losoa open-source, desenvolvendo e divulgando gratuitamente seus projetos. O equipamento e uma plataforma de computa c ao f sica: s ao sistemas digitais ligados a sensores e atuadores, que permitem construir sistemas que percebam a realidade e respondem com a co es f sicas. Ele e baseado em uma placa microcontrolada, com acessos de Entrada/Sa da (I/O), sobre a qual foi desenvolvida uma biblioteca de fun co es que simplica a sua programa ca o, por meio de uma sintaxe similar a ` das linguagens C e C++. O Arduino utiliza o microcontrolador Atmega. Um microcontrolador (tamb em denominado MCU) e um computador em um chip, que cont em um microprocessador, mem oria e perif ericos de entrada/sa da. Ele pode ser embarcado no interior de algum outro dispositivo, que, neste caso, e o Arduino, para que possa controlar suas fun co es ou a co es. Em resumo, o Arduino e um kit de desenvolvimento, que pode ser visto como uma unidade de processamento capaz de mensurar vari aveis do ambiente externo, transformadas em um sinal el etrico correspondente, atrav es de sensores ligados aos seus terminais de entrada. De posse da informa ca o, ele pode process a-la computacionalmente. Por m, ele pode ainda atuar no controle ou no acionamento de algum outro elemento eletro-eletr onico conectado ao terminal de sa da. A Figura 1.1 apresenta um diagrama de blocos de uma cadeia de processamento utilizando o Arduino.

Figura 1.1: Diagrama de blocos de uma cadeia de processamento utilizando o Arduino.

Uma vez que o Arduino e baseado em um microcontrolador e, portanto, e program avel, torna-se poss vel criar diversas aplica co es diferentes com uma certa facilidade. Al em disso, o pr oprio equipamento pode ser reutilizado, atrav es de uma nova programa ca o. Por sua vez, a sua programa c ao e simplicada pela exist encia de diversas fun c oes que controlam o dispositivo, com uma sintaxe similar ` a de linguagens de programa ca o comumente utilizadas (C e C++). Assim sendo, em um ambiente prossional, as caracter sticas do Arduino fazem dele uma boa ferramenta de prototipa c ao r apida e de projeto simplicado. Por outro lado, em um ambiente acad emico, ele pode ser perfeitamente utilizado como ferramenta educacional, uma vez que n ao requer do usu ario conhecimentos profundos de eletr onica digital nem da programa ca o de dispositivos digitais espec cos.

Cap tulo 2 Caracter sticas do kit Duemilanove


O kit Arduino Duemilanove (2009 em italiano) e uma placa baseada no microcontrolador ATmega168 ou ATmega328. Ele 14 pinos de entrada/sa da digital (dos quais 6 podem ser utilizados como sa das PWM), 6 entradas anal ogicas, um oscilador a cristal de 16 M Hz , conex ao USB, uma tomada de alimenta ca o, um conector ICSP e um bot ao de reinicializa ca o (reset ). Para sua utiliza ca o, basta conect a-lo a um computador com um cabo USB ou lig a-lo com um adaptador AC/DC ou a uma bateria.

2.1

Caracter sticas b asicas

A Tabela 2.1 apresenta as caracter sticas b asicas do Arduino Duemilanove. Microcontrolador ATmega328 / ATmega168 Pinos de entrada anal ogica 6 Pinos de I/O digitais 14 (dos quais 6 podem ser sa das PWM) Tens ao operacional 5V Tens ao de alimenta ca o (recomendada) 7 12 V Tens ao de alimenta ca o (limites) 6 20 V Corrente cont nua por pino de I/O 40 mA Corrente cont nua para o pino 3.3 V 50 mA Mem oria ash 32 KB (2KB usados para o bootloader ) / 16 KB SRAM 2 KB EEPROM 1 KB Freq u encia de clock 16 M Hz Tabela 2.1: Caracter sticas b asicas do Arduino Duemilanove.

2.2

Alimenta c ao

O Arduino Duemilanove pode ser alimentado pela conex ao USB ou por qualquer fonte de alimenta c ao externa. A fonte de alimenta c ao e selecionada automaticamente. A alimenta c ao externa (n ao-USB) pode ser tanto de uma fonte ou de uma bateria. A fonte pode ser conectada com um plug de 2, 1 mm (centro positivo) no conector de alimenta ca o.

Cabos vindos de uma bateria podem ser inseridos nos pinos GN D (terra) e Vin (entrada de tens ao) do conector de alimenta c ao. A placa pode operar com uma alimenta c ao externa de 6 a 20 V. Entretanto, se a alimenta ca o for inferior a 7 V o pino 5 V pode fornecer menos de 5 V e a placa pode car inst avel. Se a alimenta c ao for superior a 12 V o regulador de tens ao pode superaquecer e avariar a placa. A alimenta c ao recomendada e de 7 a 12 V. Os pinos de alimenta ca o s ao: Vin : entrada de alimenta ca o para a placa Arduino quando uma fonte externa for utilizada. Voc e pode fornecer alimenta ca o por este pino ou, se usar o conector de alimenta ca o, acessar a alimenta ca o por este pino; 5V: A fonte de alimenta ca o utilizada para o microcontrolador e para outros componentes da placa. Pode ser proveniente do pino Vin atrav es de um regulador on-board ou ser fornecida pelo USB ou outra fonte de 5 V; 3V3: alimenta c ao de 3, 3 V fornecida pelo circuito integrado FTDI (controlador USB). A corrente m axima e de 50 mA; GND (ground): pino terra.

2.3

Mem oria

O ATmega328 tem 32 KB de mem oria ash (onde s ao armazenados os programas), al em de 2 KB de SRAM (onde cam as vari aveis) e 1 KB of EEPROM (esta u ltima pode ser lida e escrita atrav es da biblioteca EEPROM e guarda os dados permanentemente, mesmo que desliguemos a placa). A mem oria SRAM e apagada toda vez que desligamos o circuito.

2.4

Entrada e Sa da

Cada um dos 14 pinos digitais do Duemilanove pode ser usado como entrada ou sa da, usando as fun c oes de pinMode(), digitalWrite(), e digitalRead(). Eles operam com 5 V. Cada pino pode fornecer ou receber um m aximo de 40 mA e tem um resistor pull-up interno (desconectado por padr ao) de 20-50 k. Al em disso, alguns pinos t em fun co es especializadas: Serial: 0 (RX) e 1 (TX). Usados para receber (RX) e transmitir (TX) dados seriais TTL. Estes pinos s ao conectados aos pinos correspondentes do chip serial FTDI USB-to-TTL. PWM: 3, 5, 6, 9, 10, e 11. Fornecem uma sa da anal ogica PWM de 8 bits com a fun ca o analogWrite(). SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Estes pinos suportam comunica c ao SPI, que embora compat vel com o hardware, n ao est a inclu da na linguagem do Arduino. LED: 13. H a um LED j a montado e conectado ao pino digital 13. O Duemilanove tem 6 entradas anal ogicas, cada uma delas est a ligada a um conversor anal ogico-digital de 10 bits, ou seja, transformam a leitura anal ogica em um valor dentre 1024 possibilidades (exemplo: de 0 a 1023). Por padr ao, elas medem de 0 a 5 V, embora seja poss vel mudar o limite superior usando o pino AREF e um pouco de c odigo de baixo n vel. Adicionalmente alguns pinos t em funcionalidades especializadas:

I2C: 4 (SDA) e 5 (SCL). Suportam comunica ca o I2C (TWI) usando a biblioteca Wire. AREF. refer encia de tens ao para entradas anal ogicas. Usados com analogReference(). Reset. Envie o valor LOW para reiniciar o microcontrolador. Tipicamente utilizados para adicionar um bot ao de reset aos shields (placas que podem ser plugadas ao Arduino para extender suas capacidades) que bloqueiam o que h a na placa.

2.5

Comunica c ao serial

Com o Arduino Duemilanove a comunica ca o com um computador, com outro Arduino ou com outros microcontroladores e muito simplicada. O ATmega328 permite comunica ca o serial no padr ao UART TTL (5 V), que est a dispon vel nos pinos digitais 0 (RX) e 1 (TX). Um chip FTDI FT232RL na placa encaminha esta comunica ca o serial atrav es da USB e os drivers FTDI (inclu do no software do Arduino) fornecem uma porta virtual para o software no computador. O software Arduino inclui um monitor serial que permite que dados simples de texto sejam enviados e recebidos a ` placa Arduino. Os LEDs RX e TX da placa piscam quando os dados est ao sendo transferidos ao computador pelo chip FTDI e h a conex ao USB (mas n ao quando h a comunica ca o serial pelos pinos 0 e 1). A biblioteca SoftwareSerial permite comunica ca o serial por quaisquer dos pinos digitais do Duemilanove. O ATmega328 tamb em oferece suporte aos padr oes de comunica c ao I2C (TWI) e SPI. O software do Arduino inclui uma biblioteca Wire para simplicar o uso do barramento I2C. Para usar a comunica ca o SPI, veja o manual do ATmega328.

2.6

Programa c ao

O ambiente de programa ca o mais indicado e o do software Arduino, que pode ser baixado no seguinte site: http://www.arduino.cc/en/Main/Software. Mais detalhes sobre a programa c ao do Ardu no ser ao apresentados no Cap tulo 3.

2.7

Reset Autom atico

Algumas vers oes anteriores do Arduino requerem um reset f sico (pressionando o bot ao de reset na placa) antes de carregar o programa a ser compilado, denominado de sketch. O Arduino Duemilanove e projetado de modo a permitir que isto seja feito atrav es do software que esteja rodando no computador conectado. Uma das linhas de controle de hardware (DTR) do FT232RL est a conectada ao reset do ATmega328 via um capacitor de 100 F . Quando esta linha e colocada em n vel l ogico baixo, o sinal cai por tempo suciente para reiniciar o chip. O software Arduino usa esta caracter stica para permitir carregar o programa simplesmente pressionando o bot ao upload no ambiente Arduino. Isto signica que o bootloader pode ter um timeout mais curto, j a que a ativa ca o do DTR (sinal baixo) pode ser bem coordenada com o in cio do upload. Estas congura c oes t em outras implica co es. Quando o Duemilanove est a conectado a um computador rodando Mac OS X ou GNU/Linux, ele reinicia toda vez que a conex ao e feita por software (via USB). No pr oximo meio segundo aproximadamente, o bootloader estar a rodando no Duemilanove. Considerando que e programado para ignorar qualquer coisa a n ao ser um upload de um novo c odigo, ele interceptar a os primeiros bytes de dados sendo enviados para a

placa depois que a conex ao e aberta. Se um sketch rodando na placa recebe congura co es de uma vez ou outros dados ao iniciar, assegure-se que o software que esteja comunicando espere um segundo depois de aberta a conex ao antes de enviar estes dados. O Duemilanove tem uma trilha que pode ser cortada para desabilitar o auto-reset e pode ser ressoldada para reativ a-lo, e chamada de RESET-EN, voc e pode tamb em desabilitar o auto-reset conectando um resistor de 110 dos +5 V at e o sinal de reset.

2.8

Prote c ao contra sobrecorrente USB

O Arduino Duemilanove tem um polifus vel que protege a porta USB do seu computador contra curtocircuito e sobrecorrente. Apesar da maioria dos computadores possu rem prote c ao interna pr opria, o fus vel proporciona uma prote c ao extra. Se mais de 500 mA forem aplicados na porta USB, o fus vel ir a automaticamente interromper a conex ao at e que o curto ou a sobrecarga seja removida.

Cap tulo 3 Programa c ao do Arduino


Nesse cap tulo iremos fazer uma pequena introdu ca o sobre como s ao estruturados os programas para o Arduino, conhecendo a linguagem usada como refer encia e suas principais fun c oes. E por m veremos as funcionalidades extras que o uso de bibliotecas nos proporciona.

3.1

Linguagem de refer encia

Os programas para o Arduino s ao implementados tendo como refer encia a linguagem C++. Preservando sua sintaxe cl assica na declara ca o de vari aveis, nos operadores, nos ponteiros, nos vetores, nas estruturas e em muitas outras caracter sticas da linguagem. Com isso temos as refer encias da linguagem, essas podem ser divididas em tr es partes principais: As estruturas, os valores (vari aveis e constantes) e as fun c oes. As estruturas de refer encias s ao: Estruturas de controle (if, else, break, ...) Sintaxe b asica (#dene, #include, ; , ...) Operadores aritm eticos e de compara c ao (+, -, =, ==, !=, ...) Operadores booleanos (&&, ||, !) Acesso a ponteiros (*, &) Operadores compostos (++, , +=, ...) Operadores de bits (|, , , ...) Os valores de refer encias s ao: Tipos de dados(byte, array, int , char , ...) Convers oes(char(), byte(), int(), ...) Vari avel de escopo e de qualica c ao (variable scope, static, volatile, ...) Utilit arios (sizeof(), diz o tamanho da vari avel em bytes ) bom citar que o software que vem no Arduino j E a prov e v arias fun co es e constantes para facilitar a programa ca o, tais como:

setup() loop() Constantes (HIGH | LOW , INPUT | OUTPUT , ...) Bibliotecas (Serial, Servo, Tone, etc.)

3.2

Fun c oes

As fun co es s ao refer encias essenciais para o desenvolvimento de um projeto usando o Arduino, principalmente para os iniciantes no assunto. Essas fun co es j a implementadas e dispon veis em bibliotecas direcionam e exemplicam as funcionalidades b asicas do microcontrolador. Temos como fun co es b asicas e de refer encias as seguintes fun co es: Digital I/O pinMode() digitalWrite() digitalRead() Anal ogico I/O analogReference() analogRead() analogWrite() - PWM Avan cado I/O tone() noTone() shiftOut() pulseIn() Tempo millis() micros() delay() delayMicroseconds() Matem atica min() max() abs() constrain() map() pow() ***s o do C/C++ sqrt() ***s o do C/C++ Trigonom etrica sin() ***s o do C/C++ cos() ***s o do C/C++ tan() ***s o do C/C++ N umeros aleat orios randomSeed() random() bits e Bytes lowByte() highByte() bitRead() bitWrite() bitSet() bitClear() bit() Interrup co es externas attachInterrupt() detachInterrupt() Interrup co es interrupts() noInterrupts() Comunica ca o Serial

3.3

Bibliotecas

O uso de bibliotecas nos proporciona um horizonte de programa ca o mais amplo e diverso quando comparado a utiliza ca o apenas de estruturas, valores e fun co es. Isso e percept vel quando analisamos os assuntos que s ao abordados por cada biblioteca em espec co. Lembrando sempre que, para se fazer uso de uma biblioteca, esta j a deve estar instalada e dispon vel na sua m aquina. Temos as seguintes bibliotecas de refer encia: EEPROM - para reprogramar a mem oria de armazenamento permanente. Ethernet - para se conectar a uma rede Ethernet usando o Arduino Ethernet Shield. Firmata - para se comunicar com os aplicativos no computador usando o protocolo Firmata. LiquidCrystal - para controlar telas de cristal l quido (LCDs). Servo - para controlar servomotores. SPI - para se comunicar com dispositivos que utilizam a Serial Peripheral Interface (SPI). SoftwareSerial - para a comunica ca o serial em qualquer um dos pinos digitais. Stepper - para controlar motores de passo. Wire (Two Wire Interface TWI/I2C) - para enviar e receber dados atrav es de uma rede de dispositivos ou sensores. Temos como refer encia tamb em, o uso de bibliotecas mais espec cas. O que e de extrema import ancia quando se faz o uso do arduino com um enfoque em uma determinada a rea. Como por exemplo: Comunica c ao (redes e protocolos) Messenger - para o processamento de mensagens de texto a partir do computador. NewSoftSerial - uma vers ao melhorada da biblioteca SoftwareSerial. OneWire -dDispositivos de controle que usam o protocolo OneWire. PS2Keyboard -ler caracteres de um PS2 teclado. Simple Message System - enviar mensagens entre Arduino e o computador. SSerial2Mobile - enviar mensagens de texto ou de e-mail, usando um telefone celular. Webduino - biblioteca que cria um servidor Web (para uso com o Arduino Ethernet Shield ). X10 - envio de sinais X10 nas linhas de energia AC. XBee - para se comunicar via protocolo XBee. SerialControl - controle remoto atrav es de uma conex ao serial.

10

Sensoriamento Capacitive Sensing - Transformar dois ou mais pinos em sensores capacitivos. Debounce - Leitura de ru dos na entrada digital. Gera c ao de Frequ encia e de Audio Tone - Gerar ondas quadradas de freq u encia de audio em qualquer pino do microcontrolador. Temporiza c ao DateTime - Uma biblioteca para se manter informado da data e hora atuais do software. Metro - Ajuda ao programador a acionar o tempo em intervalos regulares. MsTimer2 - Utiliza o temporizador de 2 de interrup ca o para desencadear uma a c ao a cada N ms. Utilidades TextString (String) - Manipular strings PString - uma classe leve para imprimir em buers. Streaming - Um m etodo para simplicar as declara c oes de impress ao.

11

Cap tulo 4 Instala c ao da IDE do Arduino e das suas bibliotecas


Neste cap tulo iremos explicar como instalar a IDE e conectar a placa Arduino ao computador para sua programa c ao. Junto com a placa Arduino voc e deve ter um cabo USB tipo AB para poder conect a-lo ao computador.

4.1

Arduino para Windows

Primeiramente deve-se baixar o ambiente para o Arduino que pode ser encontrado no seguinte site: http://www.arduino.cc/en/Main/Software, em Download clique em Windows e baixe o arquivo arduino-0018.zip (ou mais novo), ser a necess ario um programa capaz de descompactar o arquivo (exemplos: WinZip, WinRAR, etc.). Certique-se de preservar a estrutura da pasta. D e um duplo clique na pasta para abr -la, haver a uns arquivos e sub-pastas, clique no aplicativo arduino, este ser a seu ambiente de desenvolvimento. Conecte a placa ao computador atrav es do cabo USB, o LED verde na placa nomeado por PWR deve ascender, ele indica que a placa est a ligada. O arduino seleciona automaticamente a fonte de alimenta ca o adequada. Quando se conecta a placa, o Windows dever a iniciar o processo de instala ca o do driver. No Windows vista, o driver deve ser baixado e instalado automaticamente. No Windows XP o assistente Adicionar Novo Hardware ser a aberto: Quando o Windows perguntar se pode se conectar ao Windows Update para procurar o software selecione n ao, clique em Avan car. Selecione personalizar, logo ap os selecione instalar e clique em Avan car. Certique-se de procurar o melhor driver, desmarque a pesquisa de m dia remov vel; selecione Incluir este local na pesquisa e procure os drivers /FTDI USB Drivers nos diret orios de distribui ca o do Arduino. Clique em Avan car. O assistente ir a procurar o driver e em seguida, dizer que um hardware foi encontrado. Clique em Concluir. O assistente de novo hardware abrir a novamente, fa ca todos os passos da mesma maneira, desta vez, uma porta serial USB ser a encontrada.

12

4.2

Arduino para GNU/Linux

Para a instala ca o da IDE e suas bibliotecas no sistema operacional Linux, assim como feito para o Windows, podemos baixar o arquivo compactado atrav es do seguinte site: http://www.arduino.cc/en/Main/Software. Apenas vale resaltar que neste sistema operacional temos um tratamento diferente com rela ca o a manipula ca o de pastas e diret orios, agora o arquivo baixado e tar.gz. Al em desta forma de instala ca o, temos uma outra mais objetiva para executar o mesmo procedimento, esta u ltima usando apenas o terminal. Veremos um passo a passo deste procedimento usando o Linux Ubuntu. Links usados: http://www.arduino.cc/playground/Linux/Ubuntu https://launchpad.net/ arduino-ubuntu-team/+archive/ppa https://launchpad.net/+help/soyuz/ppa-sources-list.html Passo a Passo da instala c ao no Ubuntu O primeiro passo e com o terminal aberto digitar o comando: sudo add-apt-repository ppa:arduino-ubuntu-team/ppa Com o t ermino do primeiro passo executamos o segundo comando digitando: sudo aptitude update E por m executamos o u ltimo comando digitando: sudo aptitude install arduino Ap os estes tr es passos a IDE est a instalada e pode ser acessada pelo menu aplicativos/desenvolvimento/arduino Para obter informa co es para outras distribui co es de Linux, pesquisar no seguinte website : http://www.arduino.cc/en/Main/Software. Para Mac OS, pesquisar em http://www.arduino.cc/en/Guide/MacOSX.

13

Cap tulo 5 Exemplos de projetos


Neste cap tulo iremos ver alguns exemplos de aplica c oes simples com o Arduino. Com uma pequena base sobre a linguagem de programa c ao C para Arduino, podemos come car a fazer e explicar exemplos, mesmo para quem n ao possua uma grande infraestrutura possa realiz a-lo.

5.1

Exemplo 1 - Acionamento de LED interno

Come caremos com o exemplo Blink, que j a vem no aplicativo. Para encontrar o exemplo clique em File Examples Digital Blink. O programa tem como objetivo acender e apagar o LED de um em um segundo. Para compilar este exemplo n ao e necess ario de nenhuma outra infraestrutura que n ao o pr oprio Arduino. Primeiramente, vamos criar uma vari avel chamada ledPin que armazenar a o n umero da porta onde o LED est a conectado (vari avel do tipo inteiro): int ledPin = 13;

Assim quando nos referirmos a ` vari avel ledPin estaremos nos referindo a ` sa da 13. O seguinte passo e classicar o ledPin como pino de Sa da, isto e feito da seguinte maneira: void setup() { pinMode(ledPin, OUTPUT); } A fun c ao pinMode() tem como primeiro par ametro o pino e como segundo par ametro se ele e pino de entrada ou sa da. Agora come caremos a escrever o processamento. O programa rodar a em um loop, pois n ao h a ocorr encias ou interfer encias que mudem o estado. Dentro do loop ter a uma fun c ao que far a o LED car aceso por 1 segundo e depois car apagado por mais um segundo, ap os isso volta ao loop. Escreva da seguinte maneira: void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }

14

A fun c ao digitalWrite() escreve uma informa ca o digital, ou seja, 0 (LOW) ou 1 (HIGH). Seu primeiro par ametro e o pino de sa da, que no caso e o ledPin. O segundo par ametro eo estado, que no caso e a sa da, HIGH ou LOW. Quando uma porta digital est a em estado baixo (LOW), ela ca com 0V, j a quando est a em estado alto (HIGH), ca em 5 V. A fun c ao delay() e um atraso que se d a para a continua ca o da leitura do programa, logo como foi escrito que o ledPin estar a aceso, s o ap os um segundo, ou como est a escrito 1000 ms, ir a ler a linha seguinte que escreve que a sa da do ledPin e baixa, e o mesmo ocorre mais uma vez. Antes de fazer o upload do programa, primeiro deve-se escolher a porta USB em que o Arduino se encontra. Para isso v a em Tools Serial Port porta, onde porta e o nome da porta onde est a ligado o Arduino (/dev/ttyUSB*, no caso de GNU/Linux, COM* em Windows). Para saber em qual porta o Arduino se encontra, fa ca por tentativa e erro, logo escolha um e tente rodar, caso n ao rode, e o outro. Outro passo que deve-se fazer e escolher o modelo da placa, para isso v a em Tools Board e o modelo da sua placa. Agora sim para fazer o upload, clique em Upload, como mostra a Figura 5.1.

Figura 5.1: Icone Upload.

15

5.2

Exemplo 2 - Acionamento de LEDs externos

Neste exemplo, exploraremos melhor as sa das digitais. Neste exemplo ser ao necess arios 10 LEDs para sua execu c ao. Os LEDs ascender ao em seq u encia e car ao acesos por 1 segundo, at e que o u ltimo apagar a e todos os outros em seq u encia apagar ao. Para a confec c ao do projeto ligue o positivo dos LEDs nos pinos digitais de 2 e 11 e a outra ponta em um protoboard, no lado negativo dos LEDs ligue resistores de 150 , em s erie, e a outra ponta de todos os resistores no terra do Arduino, GND na placa. Assim como na Figura 5.2.

Figura 5.2: Circuito Exemplo 2. As primeiras linhas de comando s ao para declara c ao de vari aveis, iremos precisar de uma vari avel constante e inteira de valor 10, em nosso caso chamamos de ledCount. Outra vari avel necess aria e um vetor com 10 posi c oes, enumerados de 2 e 11, que s ao os n umeros dos pinos de sa da digital que ser ao utilizados que tamb em possuem valores inteiros, chamamos o vetor de ledPin. A seguir vem a declara ca o a ser feita: const int ledCount = 10; int ledPins[] = { 2, 3, 4, 5, 6, 7,8,9,10,11 }; Agora com as vari aveis declaradas vamos denir o vetor ledPins como pinos de sa da , para isso utilizaremos um loop, da seguinte maneira:

void setup() { for (int thisLed = 0; thisLed < ledCount; thisLed++) { pinMode(ledPins[thisLed], OUTPUT); } } Na primeira posi c ao do for declaramos uma vari avel que inicia em 0. Na segunda posi ca o damos a condi ca o para o for, e na terceira a cada vez que e vericada a condi ca o do for, com execu c ao da primeira, e acrescido 1 ao valor de thisLed, que e a vari avel que utilizaremos para

16

chamar as determinadas posi c oes do vetor ledPins. A fun c ao pinMode(), como vista no exemplo anterior, est a declarando que o vetor ledPins e um vetor de sa da de dados. Agora ser a iniciado um loop, que far a com que o programa sempre rode, dentro dele ter a um for que acender a todos os LEDs seq uencialmente, com um intervalo de 1 segundo (1000 ms) entre cada LED. O corpo do programa ca da seguinte maneira:

void loop() { for (int thisLed = 0; thisLed < ledCount; thisLed++) { digitalWrite(ledPins[thisLed], HIGH); delay(1000); } delay(1000); Perceba que o for e da mesma maneira que o u ltimo, pois a id eia e sempre se referir a `s posi co es do vetor, a diferen ca aqui e que para cada posi c ao estamos acendendo um LED, usando a fun ca o digitalWrite(). A fun c ao delay() foi utilizada para que seja mais f acil de visualizar que cada LED acende de cada vez, e que ap os todos os LEDs acenderem, todos cam acesos por mais um segundo. Agora ser a feito o mesmo, mas para apagar os LEDs, como mostra a seguir: for (int thisLed = 9; thisLed >= 0; thisLed--) { digitalWrite(ledPins[thisLed], LOW); delay(1000); } delay(1000); } A vari avel thisLed, utilizada apenas no for, come ca com valor 9 e e decrescida de 1 at e que chegue em 0, logo os LEDs apagar ao do u ltimo a acender para o primeiro, e permanecer a apagado por 1 segundo. Este foi o segundo exemplo, perceba que e poss vel modic a-lo com o que j a foi aprendido, fazendo com que ele apague na mesma ordem que acende, ou fazendo qualquer outra mudan ca desejada.

17

5.3

Exemplo 3 - Capac metro

Neste exemplo utilizaremos a entrada anal ogica e a sa da serial na confec ca o de um capac metro. Para isso ser a necess ario um resistor, que pode ter qualquer valor que chamaremos de R1, um resitor de 220, um capacitor, um protoboard e um o. Ligue o positivo do capacitor em um ponto comum e o negativo no terra, o resistor R1 entre o +5 da placa e o ponto comum, ligue o outro resistor, que chamaremos de R2 e tem o valor de 220 entre o ponto comum e o pino 11, que e o pino que ir a descarregar o capacitor. Ligue o o do ponto comum a entrada anal ogica.

Figura 5.3: Circuito Exemplo 3. Iremos calcular o valor do capacitor medindo o tempo de carga. Sabemos que o valor de uma constante de tempo ( s) e igual ao valor de uma resist encia (R ) multiplicado pelo valor de uma capacit ancia (C F ), e que a tens ao no capacitor em uma constante de tempo (vC ( )) e de 63,2% do seu valor m aximo. Podemos calcular a capacit ancia, pois como sabemos o valor da fonte fornecida pelo arduino, que e de 5 V , basta calcularmos 63, 2% de sua tens ao e quando a tens ao no capacitor encontrar este valor basta divid -la pelo valor da resist encia R: vC ( ) = 0, 632 Vmax = RC , onde Vmax e a tens ao m axima. A programa ca o come ca com a declara c ao de vari aveis, ou seja, um pino anal ogico para medir tens ao no capacitor, um pino de carga e um de descarga do capacitor e um pino com o valor de R1, como podemos ver no exemplo a seguir: #define analogPin 0 #define chargePin 13 #define dischargePin 11 #define resistorValue R1 unsigned long startTime; unsigned long elapsedTime; float microFarads; float nanoFarads; Perceba que o valor de R1 deve ser substitu do pelo valor escolhido.

18

Devemos ajustar o pino 13 como pino de sa da, como j a foi feito em exemplos anteriores, e iniciar a sa da serial a m de depurar erros: void setup(){ pinMode(chargePin, OUTPUT); digitalWrite(chargePin, LOW); Serial.begin(9600); } No decorrer do desenvolvimento da apostila ainda n ao hav amos mencionado a comunica c ao serial. No pr oprio compilador arduino-0018 existe uma interface que lhe proporciona observar a sa da e entrada na pr opria tela do computador, a Figura5.4 abaixo mostra onde ter acesso a esse recurso.

Figura 5.4: Icone Comunica c ao serial. Em nosso caso utilizamos a freq u encia de transfer encia de dados de 9600B/s, mas e poss vel selecionar outros valores j a pr e-determinados pelo programa que podem ser observados quando se abre a comunica c ao serial. Iniciaremos o loop do programa fornecendo energia ao pino de carga do capacitor e acionando o startTime, que e a vari avel que ir a temporizar o tempo de carga do capacitor. Para poder calcular os 63,2% da carga teremos que fazer uma convers ao, pois o m da escala e de 1023, logo 63,2% disso corresponde e 647, que e a porcentagem da tens ao m axima no capacitor. Enquanto a entrada do pino anal ogico n ao equivaler a esta porcentagem de tempo n ao ocorre nada, apenas a contagem de tempo de carga do capacitor, que j a esta sendo feita pela vari avel startTime. Quando esta porcentagem e ultrapassada mede-se a capacit ancia dividindo o tempo de carga pelo valor de R1. Como e usual que valores de capacit ancia sejam baixos, na ordem de mili a nano Farad, e mais agrad avel que se expresse o valor em mili ou nano Farad, ou seja, multiplique o valor da capacit ancia por 1000 e acrescente o mF no nal, caso mesmo com este procedimento o valor ainda seja menor que 1, podemos utilizar outras escalas (micro, nano, etc.). A programa c ao referida pode ser observada a seguir: void loop(){ digitalWrite(chargePin, HIGH); startTime = millis();

// coloque HIGH em chargePin

while (analogRead(analogPin) < 648) { } elapsedTime = millis() - startTime; microFarads = ((float)elapsedTime / resistorValue) * 1000;

19

Serial.print(elapsedTime); Serial.println(" ms"); if (microFarads > 1) { Serial.print((long)microFarads); Serial.println(" mF"); } else { nanoFarads = microFarads * 1000.0; Serial.print((long)nanoFarads); Serial.println(" nF"); } O programa j a est a quase conclu do, basta fazer a descarga do capacitor. Para isso desligue o chargePin, ajuste dischargePin como sa da, coloque LOW at e que o capacitor esteja descarregado, e volte a ajustar o dischargePin como entrada, da seguinte maneira: digitalWrite(chargePin, LOW); pinMode(dischargePin, OUTPUT); digitalWrite(dischargePin, LOW); while (analogRead(analogPin) > 0) { } pinMode(dischargePin, INPUT); }

20

5.4

Exemplo 4 - Controle de servomotor

Este exemplo ilustra o uso de uma das sa das PWM (Pulse-Width Modulation - Modula c ao por Largura de Pulso) do Arduino com um servomotor. Qualquer servo com um terminal de controle compat vel pode ser utilizado. Aqui usaremos um polar rotor do tipo usado em antenas parab olicas. Primeiramente e importante saber o que e PWM e o que e poss vel fazer. PWM e um mecanismo que permite controlar o per odo c clico da freq u encia da alimenta c ao.

Figura 5.5: Exemplos de sinais PWM. Suas aplica c oes s ao diversas e abrangem tanto usos industriais quanto dom esticos. Em ind ustrias, o PWM pode ser usado para controlar elevadores de carga, esteiras rolantes e guinchos. J a em aplica co es dom esticas, pode ser usado para controle de ilumina ca o, port oes e cortinas. Iremos utilizar a entrada manual comandada por um potenci ometro linear de 100 k. O motor possui 3 os: um vermelho, um preto e um branco. Os os preto e vermelho correspondem ao negativo e positivo da alimenta ca o, respectivamente, e neste exemplo podemos conect a-los diretamente aos pinos de alimenta c ao do Arduino. O vermelho e conectado ao pino 5 V , e o preto a qualquer um dos pinos GND. O o branco e o terminal de controle, e deve ser conectado a uma das sa das digitais com PWM, qualquer um dos pinos 3, 5, 6, 9, 10 ou 11. No exemplo usaremos o 10. O potenci ometro linear de 100 k e conectado tendo um dos seus pinos extremos ligado ao GND, o outro extremo ao pino AREF, que fornece a tens ao de refer encia, e o pino central conectado a qualquer uma das entradas anal ogicas, utilizaremos o pino 1. Desta vez usaremos uma biblioteca para suporte de servos, logo no in cio do programa deveremos import a-la. Deveremos criar um objeto do tipo servo que ser a utilizado para controle, da seguinte maneira: #include <Servo.h> Servo meuservo;

21

Figura 5.6: Circuito Exemplo 4. A seguir, e feita a parte de declara ca o de vari aveis. Iremos declarar um pino para o potencio metro e servo, e uma vari avel inteira para o valor lido do potenci ometro. Tamb em deveremos iniciar o servo, que em nosso caso est a conectado ao pino 10, como vemos a seguir: int potpin = 1; int val; void setup() { meuservo.attach(10); } Quando lermos a entrada do potenci ometro, teremos que converter seu valor para graus para podermos controlar em graus quanto o motor ir a girar, para isto utilizaremos a fun ca o map(). Ap os isto apenas devemos enviar a informa c ao para o motor e esperar alguns milissegundos para a movimenta ca o do motor. void loop() { val = analogRead(potpin); val = map(val, 0, 1023, 0, 180); meuservo.write(val); delay(500); }

22

5.5

Exemplo 5 - Teclado virtual

Neste exemplo, faremos um teclado virtual. Ser ao necess arios um resistor de 330 e um autofalante. Teclas do computador emitir ao comandos para que o autofalante reproduza as notas musicais. A montagem do circuito e bem simples. Ligue o ground do autofalante no pino Gnd do Arduino. Coloque o resistor em uma protoboard e ligue o positivo do autofalante em uma ponta. Feche o circuito ligando a outra ponta do resistor a uma porta digital de sua prefer encia (de 2 ` a 13). O exemplo seguir a com a porta de n umero 10 (dez).

Figura 5.7: Circuito Exemplo 5. As primeiras linhas de comando s ao de declara c ao de vari aveis. O comando #dene permite que denamos o nome que desejemos a um valor de uma constante antes do programa ser compilado. Logo, temos que: #define #define #define #define #define #define #define NOTA_DO NOTA_RE NOTA_MI NOTA_FA NOTA_SOL NOTA_LA NOTA_SI 262 294 330 349 392 440 494

onde NOTA_DO foi o nome escolhido para a nota d o, e 262 Hz e a freq u encia da nota musical. Ao longo da pr atica, explicaremos o porqu e de usar essa freq u encia. int pinoAudio = 10; int nota; onde pinoFalante e nota s ao nome de vari aveis do tipo inteiro, e a pinoAudio recebeu o valor 10, pois usaremos o pino 10 no projeto. Como queremos fazer com que tenha comunica ca o entre o teclado e o circuito, devemos estabelecer a taxa com que os dados ser ao transmitidos. Para isso, usamos a taxa padr ao, que e de 9600 ms.

23

void setup() { Serial.begin(9600); Para n ao congestionar as portas, devemos esvaziar o buer associado a ` porta de entrada, assim como esvaziaremos o buer associado ` a porta de sa da no nal do c odigo. Tamb em denimos o pinoAudio como sa da. Serial.flush(); pinMode(pinoAudio, OUTPUT); } Na fun c ao void loop() criaremos uma s erie de condi c oes. A primeira delas, dada por if (Serial.available()>0), e uma condi ca o que faz com que o c odigo funcione apenas caso o usu ario digite algo. Se isso ocorrer, a fun ca o Serial.available retornar a um valor maior que 0 e a condi ca o ser a satisfeita. E importante lembrar que, para digitar algo, deve-se selecionar a guia Tools do Arduino, Serial Monitor. \verb+void loop() { if (Serial.available()>0){ Decidimos por usar a vari avel nota para receber qual tecla fora pressionada. Dessa forma, temos essa linha de c odigo: nota=Serial.read(); Para que que mais claro se a tecla foi pressionada e reconhecida, colocaremos a seguinte linha de c odigo, que retornar a a tecla digitada: Serial.println(nota); Agora, faremos as condi c oes que determinar ao qual tecla ir a corresponder a qual nota musical. Para isso, devemos saber qual n umero correponde a cada tecla do teclado. No exemplo, decidimos fazer com que as 7 notas musicais correspondessem a `s teclas de 1 a 7 do teclado, que correspondem ` a numera ca o de 49 a 55. Para que possamos ter o efeito da nota musical, usamos a fun c ao tone. Tone gera uma onda quadrada de uma freq u encia espec ca e ciclo de trabalho (duty-cycle ) de 50% em um pino. A dura c ao pode ser especicada, mas, por outro lado, a onda continua enquanto a fun c ao noTone() n ao for utilizada. poss E vel realizar esse trecho de c odigo de diversas formas. No entanto, vamos usar a mesma sintaxe dos outros exemplos. S ao 7 notas musicais, apenas uma ser a exemplicada, as outras necessitam apenas trocar o valor da correspondente a ` tecla e o nome dado a ` nota musical. if (nota==49){ /* nota sera emitida quando a tecla 1 for apertada */ tone(pinoAudio, NOTA_DO); delay(500); noTone(pinoAudio); }

24

Temos um teste onde comparamos a vari avel nota que recebeu o valor da tecla, e o j a determinado no c odigo para a estrutura if. A fun c ao tone faz refer encia ao pino escolhido, ` a nota musical, no caso a DO. Escolhemos que cada nota tenha dura c ao de meio segundo. Logo colocamos um atraso de 500 ms e paramos o som com a fun c ao noTone. Terminamos o c odigo desta forma, onde o Serial.flush, como dito anteriormente, est a presente para que, a cada tecla digitada, possamos esvaziar a porta de sa da. Serial.flush(); } }

25

5.6

Exemplo 6 - Jogo Genius

Um jogo muito famoso na d ecada de 1980, que buscava estimular a mem oria do jogador atrav es de cores e sons, e o Genius. O Exemplo 6 trata de uma adapta ca o desse jogo para o Arduino. Precisaremos de 4 bot oes, 8 resistores de 330 e 4 LEDs (de prefer encia de cores diferentes). Al em de um autofalante. A montagem do circuito e bem simples, por em como temos uma quantidade maior de os das pr aticas anteriores, e necess aria aten ca o na montagem. Ligue o ground do autofalante em um canto da primeira e segunda leiras da protoboard, e o positivo na porta digital 7 do Arduino. Feito isso, come caremos a montar o circuito. Na ponta oposta aonde fora ligado o ground do autofalante, ligue o pino Gnd do Arduino. Fa ca uma conex ao com um o menor entre a primeira e segunda leiras da protoboard com o outro bloco. Monte cada LED da forma com que o Gnd passe pelo lado inteiro do LED, passando por um resistor, e fechando em alguma porta do Arduino. Repita o processo at e terminarem os LEDs. Feito isso, faremos o mesmo esquema do outro lado, trocando apenas os LEDs pelos bot oes.

Figura 5.8: Circuito Exemplo 6. Primeiramente, vamos denir as vari aveis. Para que possamos emitir sons, iremos usar os mesma fun c ao do Exemplo 5, a tone. Desta forma, deniremos os tons que ser ao emitidos quando apertamos os bot oes, os originais do Genius. #define #define #define #define NOTE_D4 NOTE_G4 NOTE_A4 NOTE_A5 294 392 440 880

Agora iremos criar vari aveis para facilitar nossa linha de pensamento, e o programa em si. Ao inv es de criarmos uma vari avel para cada tom, iremos criar um vetor, que facilitar a no momento de sortearmos.

26

Para que tenhamos um sorteio bem variado, faremos um vetor de 0 a 100. Criaremos uma vari avel para que contemos em qual rodada estamos, para que facilite a intera c ao tons-LEDs. Al em disso, criaremos uma vari avel para indicar o passo atual da seq u encia. int tons[4] = { NOTE_A4, NOTE_G4, NOTE_D4 ,NOTE_A5}; int sequencia[100] = {}; int rodada_atual = 0; int passo_atual_na_sequencia = 0; Criaremos as vari aveis que receber ao quais portas os LEDs, bot oes e autofalante est ao ligados. Al em de mais duas vari aveis de controle, a botao pres- sionado para indicar se algum bot ao fora pressionado e a perdeu_o_jogo para terminar a partida. int pinoAudio = 7; int pinosLeds[4] = { 8, 9,10,11 }; int pinosBotoes[4] = {2,3,4,5}; int botao_pressionado = 0; int perdeu_o_jogo = false; Na fun c ao void setup() iremos denir quais pinos ser ao de entrada e de sa da, al em de usarmos a fun ca o rand omica randomSeed, que gera um valor vari avel entre 0 e 1023. Ela ser a importante para que o jogo n ao que repetitivo. void setup() { for (int i = 0; i <= 3; i++) { pinMode(pinosLeds[i], OUTPUT); } for (int i = 0; i <= 3; i++) { pinMode(pinosBotoes[i], INPUT); } pinMode(pinoAudio, OUTPUT); randomSeed(analogRead(0)); } Note que, como denimos os bot oes e LEDs como vetores, na fun ca o void setup() utilizaremos a estrutura de controle for para atribuir valores iniciais para tais vetores. Agora come caremos a montar a estrutura do jogo propriamente dita, inicializando o loop. void loop() { if (perdeu_o_jogo) { int sequencia[100] = {};

27

rodada_atual = 0; passo_atual_na_sequencia = 0; perdeu_o_jogo = false; } Primeiramente, faremos uma condi c ao onde zeramos todas as vari aveis caso o jogador perca a partida. Para a condi ca o ser verdadeira, como explicado acima, usaremos a vari avel booleana perdeu_o_jogo. Onde ela assumir a o valor true caso o usu ario seja derrotado pela m aquina. Como nesse exemplo n ao inclu mos um display, para informar que come car a o jogo, vamos colocar um som de in cio para anunciar que e a primeira rodada. if (rodada_atual == 0) { tocarSomDeInicio(); delay(500); } Depois disso, devemos inicializar a pr oxima rodada, reproduzir a seq u encia e aguardar o jogador clicar os bot oes. H a um atraso de 1 segundo entre cada jogada. proximaRodada(); reproduzirsequencia(); aguardarJogador(); delay(1000); } OBS.: Note que aqui termina nossa fun c ao Void loop(). At e aqui, criamos a primeira rodada, onde apenas uma luz foi acesa. Em seguida, vamos adicionar mais um luz para cada rodada com a fun ca o void proximaRodada(). Sorteamos um dos LEDs a serem acesos, atrav es da fun ca o random(), e completamos a fun c ao void atribuindo ao nosso vetor seq u encia qual foi o valor sorteado. void proximaRodada() { int numero_sorteado = random(0, 3); sequencia[rodada_atual++] = numero_sorteado; } Anteriormente, criamos a seq u encia. Agora, iremos reproduz -la. Usaremos a estrutura de repeti ca o for para que os pinos de sa da adequados sejam acionados. void reproduzirsequencia() { for (int i = 0; i < rodada_atual; i++) { tone(pinoAudio, tons[sequencia[i]]); digitalWrite(pinosLeds[sequencia[i]], HIGH); delay(500); noTone(pinoAudio); digitalWrite(pinosLeds[sequencia[i]], LOW); delay(100); } noTone(pinoAudio); }

28

Neste ponto, iremos vericar se o jogador acertou ou errou a seq u encia. Caso tenha errado, o programa para e voltamos para o in cio. Caso contr ario, o programa continua, zerando o passo da seq u encia. void aguardarJogador() { for (int i = 0; i < rodada_atual; i++) { aguardarJogada(); verificarJogada(); if (perdeu_o_jogo) { break; } passo_atual_na_sequencia++; } passo_atual_na_sequencia = 0; } Neste trecho de c odigo temos o complemento do anterior, onde aqui damos o comando para importante destacar que quando que os a udios e os LEDs sejam acionados quando requeridos. E atribu mos a ` vari avel botao_pressionado o valor de i, usamos esse valor para que o programa associe corretamente qual LED ser a aceso e qual som dever a ser reproduzido. void aguardarJogada() { boolean jogada_efetuada = false; while (!jogada_efetuada) { for (int i = 0; i <= 3; i++) { if (digitalRead(pinosBotoes[i]) == HIGH) { // Dizendo qual foi o botao pressionado. botao_pressionado = i; tone(pinoAudio, tons[i]); digitalWrite(pinosLeds[i], HIGH); delay(300); digitalWrite(pinosLeds[i], LOW); noTone(pinoAudio); jogada_efetuada = true; } } delay(10); } } Por u ltimo, temos a fun ca o void verificarJogada(), que cria a condi ca o para que, caso o jogador perca, todos os LEDs pisquem rapidamente, indicando isso. void verificarJogada() { if (sequencia[passo_atual_na_sequencia] != botao_pressionado) {

29

for (int i = 0; i <= 3; i++) { tone(pinoAudio, tons[i]); digitalWrite(pinosLeds[i], HIGH); delay(200); digitalWrite(pinosLeds[i], LOW); noTone(pinoAudio); }

tone(pinoAudio, tons[2]); for (int i = 0; i <= 3; i++) { digitalWrite(pinosLeds[0], HIGH); digitalWrite(pinosLeds[1], HIGH); digitalWrite(pinosLeds[2], HIGH); digitalWrite(pinosLeds[3], HIGH); delay(100); digitalWrite(pinosLeds[0], LOW); digitalWrite(pinosLeds[1], LOW); digitalWrite(pinosLeds[2], LOW); digitalWrite(pinosLeds[3], LOW); delay(100); } noTone(pinoAudio); perdeu_o_jogo = true; } } E, por m, temos o c odigo para reiniciar o jogo. void tocarSomDeInicio() { tone(pinoAudio, tons[0]); digitalWrite(pinosLeds[0], digitalWrite(pinosLeds[1], digitalWrite(pinosLeds[2], digitalWrite(pinosLeds[3], delay(500); digitalWrite(pinosLeds[0], digitalWrite(pinosLeds[1], digitalWrite(pinosLeds[2], digitalWrite(pinosLeds[3], delay(500); noTone(pinoAudio); }

HIGH); HIGH); HIGH); HIGH); LOW); LOW); LOW); LOW);

30

5.7

Exemplo 7 - Alarme

O Arduino tamb em pode simular um alarme. Utilizando um emissor e um receptor infravermelho, h a uma transmiss ao de dados. Dessa forma, podemos vericar os dados (no programa, s ao representados por n umeros inteiros) e mandar o Arduino se comportar de alguma forma, caso ocorra alguma altera c ao brusca no valor. Essa altera c ao brusca no valor se d a, geralmente, quando h a um obst aculo entre o emissor e o receptor IR. A montagem do circuito n ao e muito mais avan cada do que nos outros exemplos, apenas inseriremos o transmissor e o receptor infravermelho. No circuito montado, liga-se um buzzer em s erie com uma resist encia. Por sinal, nessa atividade deveremos ligar todos os equipamentos em s erie com uma resist encia (LEDs, emissor e receptor IR e buzzer ). O transmissor e o receptor infravermelho dever ao ser ligados em paralelo e, nesse exemplo, recebendo 5 V . Repare que, para facilitar, jogamos o ground de todos os equipamentos para o mesmo o no nal.

Figura 5.9: Circuito do Exemplo 7. Primeiramente, vamos denir as vari aveis. Reparem que sensor, ledam, ledvm e som corao vari aveis respondem ao n umero da porta de cada equipamento, enquanto u e sensor valor s que ser ao utilizadas para ns operacionais durante o c odigo. E importante ressaltar que sensor indica a porta da sa da anal ogica. const int const int const int const int int u=0; sensor = 2; ledam = 13; ledvm= 12; som= 11;

int sensor_valor = 0; Agora deniremos as portas de sa da e o in cio do Serial. void setup() { pinMode(ledam, OUTPUT); pinMode(ledvm, OUTPUT);

31

pinMode(som, OUTPUT); Serial.begin(9600); } Agora come ca a fun ca o de loop. Captaremos as informa co es sendo transmitidas atrav es da fun c ao analogRead(sensor), que s ao n umeros inteiros, e armazenaremos na vari avel sensor valor. Com Serial.print(sensor valor), vericaremos na janela do Serial Monitor o valor num erico de sensor valor. A seguir, se sensor valor ultrapassar 1000, e porque houve interrup c ao na transmiss ao de dados e, portanto, o alarme deve ser acionado. Normalmente, o valor de transmiss ao varia entre 800 e 950 se n ao houver interrup c ao e maior que 1010 se houver. No entanto, esse valor pode ser DIFERENTE caso n ao se use 5 V ou coloquem um circuito com mais ou menos resist encias em s erie com o emissor e/ou receptor. Esse programa foi feito para o circuito montado na imagem. Portanto, se o valor de transmiss ao interrompida for diferente desses padr oes, voc e dever a alterar o valor no comando de ao no Serial decis ao if (sensor valor>1000). Lembrando que podemos ver o valor de trasmiss Monitor. void loop() { sensor_valor = analogRead(sensor); Serial.print(sensor_valor); Serial.print("\n"); if (sensor_valor>1000) { u=1; } if (u==1){ tone(som, 2000); digitalWrite(ledam, delay(100); digitalWrite(ledam, digitalWrite(ledvm, delay(100); digitalWrite(ledvm, } Serial.flush(); } Como podemos ver, caso o alarme seja acionado, ele piscar a as luzes e emitir a um som at e que o bot ao reset do Arduino seja apertado.

HIGH); LOW); HIGH); LOW);

32

5.8

Exemplo 8 - Controle remoto

Em casa, controlar v arios aparelhos eletr onicos atrav es de apenas um controle remoto pode ser um desejo de muitos. O conceito de casa inteligente visto em muitos lmes, pode ser realizado, at e certo ponto, utilizando um ou mais Arduinos. Neste exemplo, daremos um exemplo b asico de controlar um LED atrav es de um controle remoto. O circuito e relativamente simples, envolvendo apenas um LED, um receptor infravermelho e uma resist encia.

Figura 5.10: Circuito do Exemplo 8. Quando apertamos um bot ao do controle remoto, ele envia um valor via infravermelho. Dessa forma, se utilizarmos um receptor infravermelho, podemos conseguir ler esse valor. Precisamos baixar a biblioteca com as fun co es necess arias para utilizar esse receptor infravermelho, chamada NECIRrcv. Ela est a dispon vel para download em: https://www.dropbox.com/ sh/53bp7fo211hxbba/iYnG2cqfhN/Biblioteca%20NECIRrcv%20para%20controle%20remoto. Primeiramente, precisamos incluir no programa a biblioteca que baixamos, que se d a atrav es de #include <NECIRrcv.h>. Em seguida, denimos as vari aveis e enviamos a porta que est a ligado o receptor infravermelho para a biblioteca trabalhar em cima disso (que est a presente em NECIRrcv ir(InfraVermelho);. #include <NECIRrcv.h> #define InfraVermelho 10 unsigned long int capturaCodigo = 0; int estado = 0; int led = 7; NECIRrcv ir(InfraVermelho); Agora, deniremos as congura c oes (como sa das, iniciar o Serial e o infravermelho). void setup(){ pinMode(led, OUTPUT);

33

Serial.begin(9600); Serial.flush(); ir.begin() ; } Na fun ca o de loop, iremos vericar se o receptor recebeu algum sinal infravermelho atrav es de if (ir.available()>0). Se receber algum sinal, capturaremos o valor atrav es de ir.read() e armazenaremos na vari avel capturaCodigo. Em seguida, imprimiremos o valor no Serial. No controle utilizado, a tecla Power enviava o valor 4278238976 via infravermelho. Como quer amos ligar o LED atrav es desse bot ao, zemos uma condi ca o para a luz acender caso fosse recebido esse valor. Para que fosse permitido apagar utilizando o mesmo bot ao, criamos uma vari avel de estado chamada estado para vericar se o LED estava aceso ou apagado e mudamos o valor da vari avel, caso a l ampada mudasse seu estado. void loop() { if (ir.available()>0) { capturaCodigo = ir.read(); Serial.println(capturaCodigo); if (capturaCodigo == 4278238976){ if (estado ==0) { digitalWrite(led, HIGH); estado = 1; } else { digitalWrite(led, LOW); estado = 0; } Serial.println(estado); } } Serial.flush(); }

34

Cap tulo 6 Refer encias bibliogr acas


Sites: http://www.sabereletr^ onica.com.br/secoes/leitura/1307 Acessado em: 09/10/2010. http://arduino.cc/en/Reference/HomePage Acessado em: 09/10/2010. http://www.arduino.cc Acessado em: 09/10/2010. http://www.arduino.cc/en/Reference/AttachInterrupt Acessado em: 09/10/2010. http://projeto39.wordpress.com/o-arduino-duemilanove/ Acessado em: 09/10/2010.

35

Вам также может понравиться