Oficina Arduino 2012_Educasaen

Page 1

O que é Arduino ? Arduino é uma plataforma de hardware livre, baseado em microprocessador de código aberto, uma placa física em código aberto baseada em um circuito de entradas/saídas simples, e linguagem de programação padrão, que é essencialmente C/C++, sendo uma plataforma completamente personalizável já que todo o seu projeto é aberto aos usuários. O objetivo da criação do Arduino é ter uma plataforma totalmente aberta, tanto hardware como softwares acessíveis, pois além de ter um custo baixo é uma plataforma flexível e de fácil utilização, tanto para profissionais como para interessados na área, visando fornecer uma alternativa para aqueles que não têm alcance a outros microcontroladores, que além do custo elevado e software prioritário, não podem ser personalizados e são mais difíceis de utilizar pois requerem um maior nível de conhecimento técnico. Uma das grandes vantagens do Arduino é o seu nível de personalização, como se trata de uma plataforma aberta, todo o projeto é disponibilizado aos seus usuários no site www.arduino.cc, assim caso o usuário queira ele pode montar o seu próprio Arduino e adicionar ou retirar funcionalidades de acordo com o seu projeto, o mesmo também pode ser feito com a sua IDE (software utilizado para programar o Arduino), que é de código aberto, e funciona nos sistemas operacionais Windows, Macintosh OSX, e Linux, diferente da maioria dos microcontroladores em que suas IDE's funcionam apenas no Windows. Todas essas qualidades fazem o Arduino se tornar uma alternativa muito interessante para o ensino. Descrição da placa Arduino

1 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Os componentes mais básicos da placa Arduino são:       

Entrada usb Entrada de alimentação Pino ICSP Pinos de entrada analógica Pinos digitais Pinos de alimentação Botão reset

Descrição dos componentes básicos Entrada USB A entrada USB da placa Arduino é utilizada para realizar a comunicação entre o Arduino e o computador, através dessa comunicação são enviados os códigos referentes as ações que o Arduino executará, a entrada também é utilizada para o envio e recepção de informações do código em execução, que serão exibidos em um hiperterminal (monitor serial) e além dessas funções a entrada USB também fornece alimentação para a placa Arduino. O padrão do cabo utilizado é USB AB. Entrada de alimentação Caso seja necessário mais alimentação, ou caso haja necessidade da não utilização da alimentação através da entrada USB, a placa Arduino dispõe de uma entrada padrão para adaptadores AC-DC. Pino ICSP Esse pino suporta comunicação SPI (Serial Peripheral Interface Bus ), presente nos modelos de Arduino, Duemilanove e Diecimila, é usado por alguns modelos de shield como por ex. Ethernet Shield. Pinos de entrada analógica A função principal dos pinos de entrada analógica para a maioria dos usuários de Arduino, é a leitura de sensores analógicos, como por exemplo, ldr, sensores de distância, sensores de 2 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


temperatura, os pinos de entrada analógica fazem leituras em valores inteiros em um intervalo de 0-1023 ( conversão 10 bits). Pinos digitais Os pinos digitais são pinos de propósito geral de entrada(input) e saída(output), cada pino tem uma chave interna que pode receber os valores HIGH e LOW, o funcionamento deles é parecido com o de um interruptor que pode estar “ligado” ou “desligado”, assim podemos ligar ou desligar componentes, ex: led. Pinos de alimentação Como mais uma alternativa de alimentação para a placa Arduino, existe o pino VIN (voltage input), através dele e do pino GND a placa pode ser alimentada, ligando uma bateria ou pilhas através de um adaptador diretamente a esses dois pinos, porém cada modelo de Arduino requer um faixa de voltagem diferente, portanto antes usar o pino verifique qual a necessária para alimentar a sua placa corretamente.

Botão reset Utilizado para dar um reset físico no microcontrolador, o botão reset era utilizado em algumas versões anteriores do Arduino como um procedimento antes de enviar um novo código para a placa.

Arduino IDE O Arduino IDE (ambiente de desenvolvimento integrado ou Integrated Development Environment) é o software que nos possibilita escrever códigos e enviá-los para a placa Arduino, através dele é possível verificar quando e aonde há erros no código. O programa fornece ao usuário a opção de salvar o código, podendo assim administrar seus projetos. Também há a interface serial de comunicação, por onde o usuário pode enviar dados do seu projeto e visualizá-los na tela. Dentro do programa são disponibilizados exemplos prontos, desde os de nível básico até o nível avançado, assim o usuário pode ir subindo progressivamente conforme o conhecimento que vai adquirindo. 3 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Programando na IDE Para programar na IDE Arduino utilizaremos duas de suas funções principais, a primeira é o void setup(). Estabelece as configurações iniciais. Nela fazemos as configurações dos componentes e recursos que utilizaremos, por exemplo, para ligar um led, nesse caso o led atuará como um dispositivo de saída, vamos usar a porta digital 13 no exemplo, então dentro da função: Assim teremos por exemplo: pinMode(13, OUTPUT); caso o dispositivo seja de saída pinMode(13, INPUT); caso o dispositivo seja de entrada Ainda em void seteup; para iniciar uma comunicação serial, e criar a possibilidade de enviar os dados obtidos e visualizá-los em um hiper terminal, usamos a função Serial.begin(9600); em que o 9600 representa a velocidade dessa comunicação em bits por segundo, A segunda função void Loop(), nela estabelecemos o controle propriamente dito e a operação que vai”rodar” o tempo no seu Arduino:

4 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Nela podemos, por exemplo, enviar os dados para a serial e imprimi-los e neste caso usamos o comando Serial.print(dados1), onde dados1 é apenas uma variável que representa algum valor medido por algum sensor conectado ao Arduino, que pode ser do tipo inteiro, real, caractere ou string. Alguns comandos: Para escrever e ler através das portas digitais da placa Arduino utilizaremos as seguintes funções: Para leitura nas portas digitais: digitalRead(13), leitura porta 13 Para escrever em uma porta digital: digitalWrite este pode divido em duas parte por se tratar de um comando de saída, já que ela aceita dois valores HIGH e LOW, que podem ser entendidos como ligado e desligado (e na leitura de uma porta digital são recebidos como 1 e 0), e escritos da seguinte maneira para os dois casos: digitalWrite(13, HIGH); digitalWrite(13, LOW); Já para leitura em portas analógicas utilizaremos o seguinte comando: analogRead(13); A IDE Arduino pode ser baixada no seguinte endereço: http://arduino.googlecode.com/files/arduino-0022.zip

Experimento 1: Piscar um led- Blink O experimento a seguir propõe um primeiro contato com o Arduino, aonde um LED será ligado a placa em uma porta digital, e através do código programado nele o LED piscará interruptamente, com um intervalo de alternação entre acender e apagar de 1 segundo. Nesse experimento serão utilizados os seguintes componentes: 1 LED, 1 resistor de 330 Ohm, 2 fios. Definição dos componentes: LED LED é a sigla em inglês para Light Emitting Diode, ou Diodo Emissor de Luz. O led é um diodo semicondutor (junção P-N) que quando energizado emite luz visível.

5 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Obs: O led é um componente que possui polaridade, portanto a sua perna maior deve ser ligada a alimentação e a perna menor “à terra” (GND na placa Arduino) no caso de um led normal de 2 pernas, caso seja um led RGB, que possui 4 pernas, a maior é ligada no terra. Resistor O resistor é um dispositivo cujas principais funções são: dificultar a passagem da corrente elétrica e transformar energia elétrica em energia térmica por efeito joule. Entendemos a dificuldade que o resistor apresenta à passagem da corrente elétrica como sendo resistência elétrica. O material mais comum na fabricação do resistor é o carbono. Para o resistor é válida a expressão:

Que relaciona a resistência oferecida à passagem da corrente elétrica com tensão e corrente elétrica. Devemos lembrar que a unidade da resistência elétrica é o ohm (Ω) relação entre a tensão e a corrente elétrica em ampère. Obs: Diferente do led o resistor não possui polaridade, portanto a ligação de suas pernas não segue alguma determinada ordem. Neste exemplo utilizaremos um circuito simples , com um LED e um resistor (330 em série, conforme indica a figura abaixo Este circuito foi desenhado em um software freeware Fritzing disponível em http://fritzing.org/. Código: void setup() { pinMode(13, OUTPUT); } Void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )

6


Antes de programarmos na IDE do Arduino vamos estimar os valores de resistências que podem ser utilizadas para circuitos desta natureza Calculando o valor mínimo do resistor que deve ser associado: Suponha que para o led acender suporte uma tensão máxima da ordem de 2,0 Volts Considere ainda que a corrente máxima oferecida para as portas digitais é de 20 mA VR+Vled=5,0 VR= 3,0 Volts Para i=20 mA VR=Ri 3/20*10-3 Rmin= 150 ohms

Utilizando “Exemplos do Arduino” Este código também está disponível em exemplos no IDE do Arduino veja na figura abaixo como obtê-lo. Exemplo : Blink

Altere o intervalo de tempo em que o LED fica aceso e o intervalo de tempo que fica apagado! Viu como é fácil!  7 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Anexo: Comando via teclado -_ Função Serial.read() Com o mesmo circuito anterior vamos enviar comandos para acender e apagar o led via teclado

Faça upolad do programa e abra o monitor serial. Digite a “letra” “L” ou “H” e, seguida tecle “enter” para alterar o estado do led

Código int ledPin = 13; //define o pino em que o led está ligado char leitura; //define a variável leitura que corresponde a uma letra o teclado //definido por char void setup() { pinMode(ledPin, OUTPUT); //define que o pino 13 será uma saida Serial.begin(9600); } void loop() { leitura = Serial.read(); // a variável leitura será obtida através do teclado if (leitura == 'L') { digitalWrite(ledPin, LOW); } else if (leitura == 'H') { digitalWrite(ledPin, HIGH); } }

Adicione a linha de programação que permite imprimir no monitor serial o estado do pino 13 Dica: defina uma nova variável, por exemplo, “estadodoled” e para cada condição “if” faça “estadodoled =LOW ou HIGH” em seguida use a função Serial.print( ) (ver em http://arduino.cc/en/Serial/Print) 8 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Anexo: Tipos de Variáveis (as mais utilizadas) Tipo

Descrição

Referencia no site e exemplos

int

Numero inteiro

http://arduino.cc/en/Reference/Int

float

Número fracionário(ponto

http://arduino.cc/en/Reference/Float

flutuante) double

Número fracionário, como mais

http://arduino.cc/en/Reference/Double

precisão char

caractere

http://arduino.cc/en/Reference/Char

boolean

Verdadeiro ou falso

http://arduino.cc/en/Reference/Boolea nVariables

long

Longas maiores que 32 bits

unsigned

Impede que assuma valores

http://arduino.cc/en/Reference/Long

negativos unsigned long

Variáveis longas e sempre

http://arduino.cc/en/Reference/Unsigne

positivas (em geral usada para

dLong

tempo) Numero de 8 bits

http://arduino.cc/en/Reference/Byte

byte

Outras referências http://cppreference.com/wiki/br-pt/data_types http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c320.html http://equipe.nce.ufrj.br/adriano/c/apostila/tipos.htm

9 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Experimento 2: Leitura de porta analógica com um LDR O experimento a seguir propõe um contato mais avançado com o Arduino, que consiste em ligar um LDR a placa Arduino em uma porta analógica e a partir do código fornecido a seguir, ler os valores fornecidos pelo LDR e enviá-los para a porta serial a cada 0,25 segundos. Nesse experimento serão utilizados os seguintes componentes: 1 LDR, 1 resistor de 33Kou 10K, alguns fios. Definição dos componentes: LDR Do inglês “Light Dependent Resistor1”, ou resistor dependente de luz, a resistência do LDR varia de forma inversamente proporcional à quantidade de luz incidente sobre ele, isto é, enquanto o feixe de luz estiver incidindo, o LDR oferece uma resistência muito baixa. Quando este feixe é cortado, sua resistência aumenta, o LDR também é chamado de célula fotocondutiva, ou ainda de fotoresistência, o LDR é um dispositivo semicondutor de dois terminais. Com o LDR pode-se fazer o controle automático de porta, alarme contra ladrão, controle de iluminação em um recinto entre outros. Obs: Assim como o resistor o LDR não possui polaridade, portanto a ligação de seus terminais não segue nenhuma ordem pré-determinada. Monte o circuito com base na figura a abaixo, e faça o upload do código usando a IDE do Arduino.

O valor do resistor que será utilizado é igual a 10 K ou 39 K

1

Indicamos o uso de simuladores para mostrar esta dependência. Um bom simulador está disponível em http://phet.colorado.edu/sims/conductivity/conductivity_pt_BR.jnlp. O uso deste simulador (ou qualquer outro) permitirá aos estudantes melhor compreender o funcionamento de um LDR. É muito importante que o estudante compreenda cada passo do processo de aquisição para um amplo domínio da tecnologia. 10 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Faça upload e abra o monitor serial

Código: int LDR; //declara a variavel void setup(){ pinMode(A0, INPUT); Serial.begin(9600); } void loop(){ LDR = analogRead(A0); Serial.print("Valor lido no LDR:\t"); Serial.println(LDR); delay(250); }

Inserindo a variável tempo: Para a coleta de dados em experimentos, necessitamos da indicação de como a variável evolui com o tempo, ou ainda a relação entre diferentes variáveis. Para que você possa obter a impressão dos dados em colunas das variáveis; “tempo” e “valor para o sensor LDR”, segue o programa abaixo

11 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Código Fonte int LDR; //declara a variável int tempo; void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { tempo= millis(); // base de tempo para a coleta LDR = analogRead(A0); { Serial.print(tempo); Serial.print(" "); // introduz um espaço para as colunas Serial.print(LDR); } Serial.println(); // imprime em linhas delay(250); }

Copiar dados para a construção de gráficos 1º Abra o monitor serial

12 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


2º desabilite a rolagem automática.

3º selecione com o cursor os dados que deseja copiar e transfira para uma planilha de calculo Pronto agora você já pode visualizar o gráfico!! 

13 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Anexo: Conversor AD O que representam os valores lidos na porta analógica?

Para compreender o que representam os valores lidos na porta analógica temos que recorrer a “teoria sobre Conversores analógicos digitais”. Segue um link para um texto com exercícios sobre conversores AD para maior aprofundamento https://skydrive.live.com/?cid=247463ebb52e7e31&sc=documents&id=247463EBB52E7 E31%211851#cid=247463EBB52E7E31&id=247463EBB52E7E31%211855&sc=documents Faremos aqui um breve resumo: O conversor AD do Arduino é um conversor que apresenta 10 bits. O que isso significa? Um sistema digital apresenta apenas duas possibilidades de tensões, próximas de zero (décimos de mV) e que corresponde ao bit 0 e aquela em que a tensão assume o seu valor máximo (da ordem de 5 V) que corresponde ao bit 1. Assim um valor de tensão que varia continuamente entre 0 e 5 V deverá ser expressão em frases binárias para que possa ser processado pelo micro-controlador. Para 10 bits teremos um conjunto de 210 frases binárias= 1024 O Arduino opera com 5V de tensão (ou bem próximo disso).Assim qualquer valor de tensão de teremos que: Para 5 Volts teremos o decimal correspondente 1024 Valor de tensão de entrada teremos X para o decimal 5.....................1024 A0 (V).............Decimal lido Portanto em Volts o valor de A0 será dado por: A0 lido em Volts = (decimal lido) *5/1024

14 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Experimento 3: Visualização gráfica em tempo Real Utilizando o SIMPLOT Vamos apresentar uma opção rápida e simples para visualização gráfica em tempo real utilizando um aplicativo freeware conhecido como SIMPLOT ( http://www.negtronics.com/simplot).

O simplot é um aplicativo de fácil manuseio e muito eficiente para uma visualização gráfica em tempo real de dados nas entradas analógicas do Arduino. Existem varias outras opções tais como o Processing, Phyton e até mesmo em visual básica no Excel. No entanto de todas estas opções o SIMPLOT foi o que me pareceu mais simples e rápido.

Etapas para visualização

1. Baixe o aplicativo disponível no link http://code.google.com/p/pushpak/downloads/list?saved=1&ts=1303180458 Ou ainda em https://skydrive.live.com/?cid=59bcf284a2d396aa&sc=documents&id=59BCF284A2D396AA%21224# na pasta “SIMPLOT VER1-1”

2. Copie o código fonte disponível abaixo e faça upload na IDE do Arduino Se

preferir

baixe

o

arquivo

disponível

no

https://skydrive.live.com/?cid=59bcf284a2d396aa&sc=documents&id=59BCF284A2D396AA%21222

na

link pasta

“simplot_4canais_arduino”

15 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


/* SimPlot Demo Samples Analog Input and sends them over serial port to be plotted in SimPlot. This Demo software uses the default serial port "Serial". Upto to 4 channels of data can be plotted. For details of SimPlot go to www.negtronics.com/simplot */ void setup() { Serial.begin(57600); } int buffer[20]; //Buffer needed to store data packet for transmission int data1; int data2; int data3; int data4; void loop() { //Read Analog channels. You can connect accelerometer, gyro, temperature sensor etc to these channels data1 = analogRead(0); data2 = analogRead(1); data3 = analogRead(2); data4 = analogRead(3); //You can plot upto 4 channels of data. Uncomment only one of the options below plot(data1,data2,data3,data4); //Plots 4 channels of data // plot(data1,data2,data3); //Plots 3 channels of data // plot(data1,data2); //Plots 2 channels of data // plot(data1); //Plots 1 channel of data delay(10); //Read and plot analog inputs every 10ms. } //Function that takes 4 integer values and generates a packet to be sent to SimPlot. void plot(int data1, int data2, int data3, int data4) { int pktSize; buffer[0] = 0xCDAB; //SimPlot packet header. Indicates start of data packet buffer[1] = 4*sizeof(int); //Size of data in bytes. Does not include the header and size fields buffer[2] = data1; buffer[3] = data2; buffer[4] = data3; buffer[5] = data4; pktSize = 2 + 2 + (4*sizeof(int)); //Header bytes + size field bytes + data //IMPORTANT: Change to serial port that is connected to PC Serial.write((uint8_t * )buffer, pktSize); } //Function that takes 3 integer values and generates a packet to be sent to SimPlot. 16 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


void plot(int data1, int data2, int data3) { int pktSize; buffer[0] = 0xCDAB; buffer[1] = 3*sizeof(int); buffer[2] = data1; buffer[3] = data2; buffer[4] = data3;

//SimPlot packet header. Indicates start of data packet //Size of data in bytes. Does not include the header and size fields

pktSize = 2 + 2 + (3*sizeof(int)); //Header bytes + size field bytes + data //IMPORTANT: Change to serial port that is connected to PC Serial.write((uint8_t * )buffer, pktSize); } //Function that takes 2 integer values and generates a packet to be sent to SimPlot. void plot(int data1, int data2) { int pktSize; buffer[0] = 0xCDAB; buffer[1] = 2*sizeof(int); buffer[2] = data1; buffer[3] = data2;

//SimPlot packet header. Indicates start of data packet //Size of data in bytes. Does not include the header and size fields

pktSize = 2 + 2 + (2*sizeof(int)); //Header bytes + size field bytes + data //IMPORTANT: Change to serial port that is connected to PC Serial.write((uint8_t * )buffer, pktSize); } //Function that takes 1 integer value and generates a packet to be sent to SimPlot. void plot(int data1) { int pktSize; buffer[0] = 0xCDAB; buffer[1] = 1*sizeof(int); buffer[2] = data1;

//SimPlot packet header. Indicates start of data packet //Size of data in bytes. Does not include the header and size fields

pktSize = 2 + 2 + (1*sizeof(int)); //Header bytes + size field bytes + data //IMPORTANT: Change to serial port that is connected to PC Serial.write((uint8_t * )buffer, pktSize); }

3. Em seguida abra o aplicativo SimPlot e selecione a porta COM que está sendo utilizada e fixe para a taxa de aquisição 57600, valor este fixado no código fonte do Arduino

17 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Ao abrir o aplicativo surge a taxa de aquisição de 9600, esta taxa deve ser alterada, assim como a porta COM que está sendo utilizada

Em seguida altere as condições de observação, por exemplo, os limites de leitura da porta analógica ( de 0 a 1023) e desabilite os canais que não estão sendo utilizados

Viu como é fácil!!  18 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Anexos: Grandezas Físicas do Circuito: Corrente elétrica, resistência do LDR, ddp no resistor, etc.  Leia o Anexo abaixo e insira uma linha da programação que permita obter o valor de A0 em Volts e sua correspondente impressão no monitor serial  Sabendo que o circuito LDR+resistor é um circuito serie, insira uma linha para calcular o valor de tensão no resistor.  Sabendo que corrente elétrica = VR/R, insira uma linha que permita obter o valor de corrente elétrica no circuito  Sabendo que resistência no LDR é dada por VLDR/I, insira uma linha de programação que permita obter o valor de resistência no LDR  Imprima tudo em uma tabela com as seguintes colunas; Valor lido no LDR em decimal, valor de A0 em Volts, valor de tensão no resistor, valor de corrente elétrica no circuito, valor de resistência no LDR;

19 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Dicas para a impressão em colunas Para imprimir em tabela você pode abrir a chave para as diferentes variáveis com seus respectivos “Serial.print ”; fechar quando terminar todas as grandezas de impressão, não esquecendo o “ponto e virgula”. Em seguida e escrever Serial.println(); para impressão de todas as grandezas entre as chaves em linha e fechar e void loop(). Veja abaixo: {

Abre chave {

Serial.print (“valor A0 decimal”); Serial.print (LDR); Serial. print (“ “); etc etc

Seqüência de impressão que se deseja Fecha chave }

} Serial.println();

Serial.println(); }

Fecha chave do void loop() }

Como aumentar o número de casas decimais na impressão? Em experimentos, muitas vezes é importante obter grandezas com 3 ou até 4 casas decimais. No exemplo anterior, conseguimos imprimir o valor de tensão tanto no LDR quanto no resistor e corrente elétrica no circuito. Em primeiro lugar na declaração destas variáveis é importante que se associe o tipo “float” já que estes valores não serão inteiros. 20 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Se você associou estas variáveis como “int” faça a devida alteração. Em seguida para que você obtenha impressão com mais casas decimais basta que especifique o numero de casas decimais da seguinte maneira com uma virgula seguida da variável como abaixo: Serial.print(val,numero de casas decimais desejado); Exemplo com 3 casas decimais para corrente; Serial.print(corrente,3); Na declaração da variável “corrente” você não deve esquecer de especificar que ela será do tipo “float”; ou seja; float corrente;

Estimativa da Intensidade de Luz incidente no LDR Agora clique no link http://www.ladyada.net/learn/sensors/cds.html. Considere que o LDR utilizado tenha a curva de resistência versus intensidade da luz em LUX em vermelho. Considere apenas a luz ambiente. Determine em LUX o valor desta intensidade.

21 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Experimento 4: Construindo um Alarme ótico, acendendo um LED LDR e disparo através de uma porta digital Esse experimento propõe que a partir da leitura de um LDR ligado em uma porta analógica, perceber que um feixe de luz foi bloqueado. Por exemplo acender um LED vermelho em uma porta digital. Nesse experimento serão utilizados os seguintes componentes: 1 LDR um resistor de 10K a 39K e 1 led, 1 resistor de 330 , alguns fios.

1º passo Leitura na porta Analógica LDR na porta Analógica São dispositivos elétricos que têm a sua resistência elétrica alterada com a incidência de luz. Com o circuito usando um LDR e um resistor em série podemos efetuar leitura de tensão no LDR através da porta analógica do Arduino. +V

//Código int LDR;

R

Porta analogical (0) LDR

GND

void setup(){ pinMode(A0, INPUT); Serial.begin(9600); } void loop(){ LDR = analogRead(A0); { Serial.print("Valor lido no LDR"); Serial.print(LDR);} Serial.println(); delay(250); }

Copie o código e faca upload para o Arduino e abra o monitor serial. Neste código introduza a linha para leitura da “tensão” no LDR.

22 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Calibração do sensor para bloqueio da luz Incida um feixe de luz (lanterna da ponteira) no LDR. Veja qual será o valor de VLDR e LDR (em decimal- frase binária correspondente) quando o feixe de luz e bloqueado Em seguida estabeleça a condição para o disparo do alarme. Se a leitura na analógica for maior que o valor obtido na calibração escreva da porta digital 13 HIGHT, senão escreva LOW Orientação para o Código int LDR; //declara variável inteiro float VLDR; // declara variável de ddp no LDR tipo //float int ledPin=13; // declara variável ledPin e fixa o pino 13 void setup() { Serial.begin(9600); pinMode(A0, INPUT);// entrada A0 pinMode(13,OUTPUT); // define o pino 13 como saída } void loop(){ LDR = analogRead(A0); VLDR=LDR*5.0000000/1024; Serial.print(LDR); Serial.print(" "); Serial.print(VLDR); Serial.println ( "\t"); delay(2); if (LDR > valor que você vai calibrar) { escreva da porta digital 13 tal coisa} else { escreva oposto da condição anterior;} } 23 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Experimento 5: Alarme Sonoro A função tone( pino, freqüência e duração da nota). http://arduino.cc/en/Reference/Tone (ver anexo) Fornece um sinal sonoro de freqüência conhecida Acrescente no seu alarme um som para isso use o pino 9, por exemplo, para tocar um alarme e faça a conexão com um plug Jack–fêmea-áudio na saída com um resistor de 330 ou 1K em serie, por proteção. Para retirar o sinal sonoro, basta que você envie um sinal com freqüência igual a 0 ou ainda “noTone(pino)” (http://arduino.cc/en/Reference/NoTone)

24 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Orientação para o Código int LDR; //declara variável float VLDR; int ledPin=13; void setup(){ Serial.begin(9600); pinMode(A0, INPUT);// entrada A0 pinMode(13,OUTPUT); // define o pino 13 como saida pinMode(9,OUTPUT); } void loop(){ LDR = analogRead(A0); VLDR=LDR*5.0000000/1024; Serial.print(LDR); Serial.print(" "); Serial.print(VLDR); Serial.println ( "\t"); delay(2); if (LDR > valor que vc vai calibrar) { escreva da porta digital 13 tal coisa} toque a freqüência de 440 Hz (função tone no pino 9, com duração) else { escreva oposto da condição anterior; e não toque nada 9 noTone no pino 9; } }

Para um sensor de distancia variando com a distancia clique no link http://labduino.blogspot.com/2011/06/som-com-oarduino-e-um-ldr-e-caixa-de.html 25 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Anexos DigitalWrite http://arduino.cc/en/Reference/DigitalWrite S yn t a x digitalWrite(pin, value) P a r a m e t er s pin: the pin number value: HIGH or LOW E xa m p l e

int ledPin = 13;

// LED connected to digital pin 13

void setup() { pinMode(ledPin, OUTPUT);

// sets the digital pin as output

} void loop() { digitalWrite(ledPin, HIGH);

// sets the LED on

delay(1000);

// waits for a second

digitalWrite(ledPin, LOW);

// sets the LED off

delay(1000);

// waits for a second

}

tone() http://arduino.cc/en/Reference/Tone S yn t a x tone(pin, frequency) tone(pin, frequency, duration) P a r a m e t er s pin: the pin on which to generate the tone frequency: the frequency of the tone in hertz - unsigned int duration: the duration of the tone in milliseconds (optional) - unsigned long

Agora é com você!! Divirta-se, Invente, projete, Inove isso é o Arduino!  26 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.