Escolar Documentos
Profissional Documentos
Cultura Documentos
Arduino uma plataforma de hardware livre, baseado em microprocessador de cdigo aberto, uma placa fsica em cdigo aberto baseada em um circuito de entradas/sadas simples, e linguagem de programao padro, que essencialmente C/C++, sendo uma plataforma completamente personalizvel j que todo o seu projeto aberto aos usurios. O objetivo da criao do Arduino ter uma plataforma totalmente aberta, tanto hardware como softwares acessveis, pois alm de ter um custo baixo uma plataforma flexvel e de fcil utilizao, tanto para profissionais como para interessados na rea, visando fornecer uma alternativa para aqueles que no tm alcance a outros microcontroladores, que alm do custo elevado e software prioritrio, no podem ser personalizados e so mais difceis de utilizar pois requerem um maior nvel de conhecimento tcnico. Uma das grandes vantagens do Arduino o seu nvel de personalizao, como se trata de uma plataforma aberta, todo o projeto disponibilizado aos seus usurios no site www.arduino.cc, assim caso o usurio queira ele pode montar o seu prprio Arduino e adicionar ou retirar funcionalidades de acordo com o seu projeto, o mesmo tambm pode ser feito com a sua IDE (software utilizado para programar o Arduino), que de cdigo 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. Descrio da placa Arduino
Os componentes mais bsicos da placa Arduino so: Entrada usb Entrada de alimentao Pino ICSP Pinos de entrada analgica Pinos digitais Pinos de alimentao Boto reset
Descrio dos componentes bsicos Entrada USB A entrada USB da placa Arduino utilizada para realizar a comunicao entre o Arduino e o computador, atravs dessa comunicao so enviados os cdigos referentes as aes que o Arduino executar, a entrada tambm utilizada para o envio e recepo de informaes do cdigo em execuo, que sero exibidos em um hiperterminal (monitor serial) e alm dessas funes a entrada USB tambm fornece alimentao para a placa Arduino. O padro do cabo utilizado USB AB. Entrada de alimentao Caso seja necessrio mais alimentao, ou caso haja necessidade da no utilizao da alimentao atravs da entrada USB, a placa Arduino dispe de uma entrada padro para adaptadores AC-DC. Pino ICSP Esse pino suporta comunicao 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 analgica A funo principal dos pinos de entrada analgica para a maioria dos usurios de Arduino, a leitura de sensores analgicos, como por exemplo, ldr, sensores de distncia, sensores de
2 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )
temperatura, os pinos de entrada analgica fazem leituras em valores inteiros em um intervalo de 0-1023 ( converso 10 bits). Pinos digitais Os pinos digitais so pinos de propsito geral de entrada(input) e sada(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 alimentao Como mais uma alternativa de alimentao para a placa Arduino, existe o pino VIN (voltage input), atravs dele e do pino GND a placa pode ser alimentada, ligando uma bateria ou pilhas atravs de um adaptador diretamente a esses dois pinos, porm cada modelo de Arduino requer um faixa de voltagem diferente, portanto antes usar o pino verifique qual a necessria para alimentar a sua placa corretamente.
Boto reset Utilizado para dar um reset fsico no microcontrolador, o boto reset era utilizado em algumas verses anteriores do Arduino como um procedimento antes de enviar um novo cdigo para a placa.
Arduino IDE O Arduino IDE (ambiente de desenvolvimento integrado ou Integrated Development Environment) o software que nos possibilita escrever cdigos e envi-los para a placa Arduino, atravs dele possvel verificar quando e aonde h erros no cdigo. O programa fornece ao usurio a opo de salvar o cdigo, podendo assim administrar seus projetos. Tambm h a interface serial de comunicao, por onde o usurio pode enviar dados do seu projeto e visualiz-los na tela. Dentro do programa so disponibilizados exemplos prontos, desde os de nvel bsico at o nvel avanado, assim o usurio 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 funes principais, a primeira o void setup(). Estabelece as configuraes iniciais. Nela fazemos as configuraes dos componentes e recursos que utilizaremos, por exemplo, para ligar um led, nesse caso o led atuar como um dispositivo de sada, vamos usar a porta digital 13 no exemplo, ento dentro da funo: Assim teremos por exemplo: pinMode(13, OUTPUT); caso o dispositivo seja de sada pinMode(13, INPUT); caso o dispositivo seja de entrada Ainda em void seteup; para iniciar uma comunicao serial, e criar a possibilidade de enviar os dados obtidos e visualiz-los em um hiper terminal, usamos a funo Serial.begin(9600); em que o 9600 representa a velocidade dessa comunicao em bits por segundo, A segunda funo void Loop(), nela estabelecemos o controle propriamente dito e a operao que vairodar o tempo no seu Arduino:
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 varivel 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 atravs das portas digitais da placa Arduino utilizaremos as seguintes funes: 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 sada, j que ela aceita dois valores HIGH e LOW, que podem ser entendidos como ligado e desligado (e na leitura de uma porta digital so 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 analgicas utilizaremos o seguinte comando: analogRead(13); A IDE Arduino pode ser baixada no seguinte endereo: http://arduino.googlecode.com/files/arduino-0022.zip
Obs: O led um componente que possui polaridade, portanto a sua perna maior deve ser ligada a alimentao 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 funes so: dificultar a passagem da corrente eltrica e transformar energia eltrica em energia trmica por efeito joule. Entendemos a dificuldade que o resistor apresenta passagem da corrente eltrica como sendo resistncia eltrica. O material mais comum na fabricao do resistor o carbono. Para o resistor vlida a expresso:
Que relaciona a resistncia oferecida passagem da corrente eltrica com tenso e corrente eltrica. Devemos lembrar que a unidade da resistncia eltrica o ohm () relao entre a tenso e a corrente eltrica em ampre. Obs: Diferente do led o resistor no possui polaridade, portanto a ligao de suas pernas no segue alguma determinada ordem. Neste exemplo utilizaremos um circuito simples , com um LED e um resistor (330 em srie, conforme indica a figura abaixo Este circuito foi desenhado em um software freeware Fritzing disponvel em http://fritzing.org/.
Cdigo: 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 )
Antes de programarmos na IDE do Arduino vamos estimar os valores de resistncias que podem ser utilizadas para circuitos desta natureza Calculando o valor mnimo do resistor que deve ser associado: Suponha que para o led acender suporte uma tenso mxima da ordem de 2,0 Volts Considere ainda que a corrente mxima 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
Altere o intervalo de tempo em que o LED fica aceso e o intervalo de tempo que fica apagado! Viu como fcil!
7 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )
Faa upolad do programa e abra o monitor serial. Digite a letra L ou H e, seguida tecle enter para alterar o estado do led
Cdigo
int ledPin = 13; //define o pino em que o led est ligado char leitura; //define a varivel 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 varivel leitura ser obtida atravs do teclado if (leitura == 'L') { digitalWrite(ledPin, LOW); } else if (leitura == 'H') { digitalWrite(ledPin, HIGH); } }
Adicione a linha de programao que permite imprimir no monitor serial o estado do pino 13
Dica: defina uma nova varivel, por exemplo, estadodoled e para cada condio if faa estadodoled =LOW ou HIGH em seguida use a funo Serial.print( ) (ver em http://arduino.cc/en/Serial/Print)
8 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )
int float
http://arduino.cc/en/Reference/Int http://arduino.cc/en/Reference/Float
double
http://arduino.cc/en/Reference/Double
caractere Verdadeiro ou falso Longas maiores que 32 bits Impede que assuma valores negativos
unsigned long
Variveis longas e sempre positivas (em geral usada para tempo) Numero de 8 bits
http://arduino.cc/en/Reference/Unsigne dLong
http://arduino.cc/en/Reference/Byte
byte
Outras referncias
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
Indicamos o uso de simuladores para mostrar esta dependncia. Um bom simulador est disponvel 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 aquisio para um amplo domnio da tecnologia. 10 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )
Cdigo: 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 varivel tempo: Para a coleta de dados em experimentos, necessitamos da indicao de como a varivel evolui com o tempo, ou ainda a relao entre diferentes variveis. Para que voc possa obter a impresso dos dados em colunas das variveis; tempo e valor para o sensor LDR, segue o programa abaixo
Cdigo Fonte
int LDR; //declara a varivel 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 espao para as colunas Serial.print(LDR); } Serial.println(); // imprime em linhas delay(250); }
3 selecione com o cursor os dados que deseja copiar e transfira para uma planilha de calculo Pronto agora voc j pode visualizar o grfico!!
Anexo: Conversor AD
O que representam os valores lidos na porta analgica?
Para compreender o que representam os valores lidos na porta analgica temos que recorrer a teoria sobre Conversores analgicos digitais. Segue um link para um texto com exerccios 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 tenses, prximas de zero (dcimos de mV) e que corresponde ao bit 0 e aquela em que a tenso assume o seu valor mximo (da ordem de 5 V) que corresponde ao bit 1. Assim um valor de tenso que varia continuamente entre 0 e 5 V dever ser expresso em frases binrias para que possa ser processado pelo micro-controlador. Para 10 bits teremos um conjunto de 210 frases binrias= 1024 O Arduino opera com 5V de tenso (ou bem prximo disso).Assim qualquer valor de tenso de teremos que: Para 5 Volts teremos o decimal correspondente 1024 Valor de tenso 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
O simplot um aplicativo de fcil manuseio e muito eficiente para uma visualizao grfica em tempo real de dados nas entradas analgicas do Arduino. Existem varias outras opes tais como o Processing, Phyton e at mesmo em visual bsica no Excel. No entanto de todas estas opes o SIMPLOT foi o que me pareceu mais simples e rpido.
1. Baixe o aplicativo disponvel 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 cdigo fonte disponvel abaixo e faa upload na IDE do Arduino Se preferir baixe o arquivo disponvel no na link pasta
https://skydrive.live.com/?cid=59bcf284a2d396aa&sc=documents&id=59BCF284A2D396AA%21222
simplot_4canais_arduino
/* 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 aquisio 57600, valor este fixado no cdigo fonte do Arduino
Ao abrir o aplicativo surge a taxa de aquisio de 9600, esta taxa deve ser alterada, assim como a porta COM que est sendo utilizada
Em seguida altere as condies de observao, por exemplo, os limites de leitura da porta analgica ( de 0 a 1023) e desabilite os canais que no esto sendo utilizados
Anexos: Grandezas Fsicas do Circuito: Corrente eltrica, resistncia do LDR, ddp no resistor, etc.
Leia o Anexo abaixo e insira uma linha da programao que permita obter o valor de A0 em Volts e sua correspondente impresso no monitor serial Sabendo que o circuito LDR+resistor um circuito serie, insira uma linha para calcular o valor de tenso no resistor. Sabendo que corrente eltrica = VR/R, insira uma linha que permita obter o valor de corrente eltrica no circuito Sabendo que resistncia no LDR dada por VLDR/I, insira uma linha de programao que permita obter o valor de resistncia no LDR Imprima tudo em uma tabela com as seguintes colunas; Valor lido no LDR em decimal, valor de A0 em Volts, valor de tenso no resistor, valor de corrente eltrica no circuito, valor de resistncia no LDR;
Serial.println(); }
Se voc associou estas variveis como int faa a devida alterao. Em seguida para que voc obtenha impresso com mais casas decimais basta que especifique o numero de casas decimais da seguinte maneira com uma virgula seguida da varivel como abaixo: Serial.print(val,numero de casas decimais desejado); Exemplo com 3 casas decimais para corrente; Serial.print(corrente,3); Na declarao da varivel corrente voc no deve esquecer de especificar que ela ser do tipo float; ou seja; float corrente;
GND
Copie o cdigo e faca upload para o Arduino e abra o monitor serial. Neste cdigo introduza a linha para leitura da tenso no LDR.
Orientao para o Cdigo int LDR; //declara varivel 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 freqncia de 440 Hz (funo tone no pino 9, com durao) else { escreva oposto da condio anterior; e no toque nada 9 noTone no pino 9; } }
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; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
// sets the LED on // waits for a second // sets the LED off // 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