Programação Arduino
Introdução
Pela programação você deve ter notado que o Arduino lê a tensão no potenciômetro, esta é a principal função de nossa programação.
Para que possamos girar o potenciômetro e fazermos consecutivas leituras necessitamos calibrar o programa de forma que ele interprete o valor correspondente da posição de acordo com a tensão relativa de cada posição. Se a resistência do potenciômetro fosse linear, poderíamos pular esta parte e faríamos uma conversão direta da leitura da porta analógica para a distância percorrida.
Para encontrarmos a equação do potenciômetro, precisamos posicionar nosso LDR em uma das extremidades de nosso suporte. Utilizando o próprio Arduino iremos fazer a leitura da tensão a cada centímetro percorrido pelo LDR até chegarmos à outra extremidade.
Com os valores encontrados, utilizaremos o Excel para encontrarmos a função que melhor se adéqua aos dados coletados.
A função encontrada para o seu potenciômetro deverá ser inserida na programação do Arduino.
Exemplo Calibração potenciômetro.
Montagem do suporte para movimentar o LDR
Utilizamos uma madeira de aproximadamente (50 x 10 cm) como suporte, uma roldana (1) de 3,5 cm de diâmetro, uma roldana (2) de 9,5 cm de diâmetro, fio para correia (onde será fixado o LDR por meio de fita adesiva), um potenciômetro e um anteparo com a folha de papel branca.
Montagem da Placa Arduino e Protoboard
Na placa Protoboard você deverá fazer o seguinte circuito, conforme figura.
Placa Arduino, circuito eletrônico Protoboard.
A programação que você deverá inserir no Arduino é a seguinte:
int i,VLDR,VPOT;
float MVPOT,MVLDR,dX,componda,D,d,x,xo;
char leitura;
void setup ()
float MVPOT,MVLDR,dX,componda,D,d,x,xo;
char leitura;
void setup ()
{ Serial.begin(9600);
pinMode(A0, INPUT);//leitura do LDR
pinMode(A1, INPUT); //Leitura do potenciômetropinMode(12, OUTPUT);//led vermelho
pinMode(11, OUTPUT);//led verde
pinMode(10, OUTPUT);//led azul
Serial.println("Digite I para iniciar o ponto a posição inicial de x");
Serial.println("Digite L para obter as leituras de posição e
comprimento de onda");
}
void loop()
{
leitura = Serial.read();//lê o que foi digitado
VLDR=analogRead(A0);// leitura da tenção sobre o LDR entre 0 a
1023, que equivale de 0 a 5V
VPOT=analogRead(A1); // leitura da tenção sobre o potenciômetro
x=-0.0000001582*VPOT*VPOT*VPOT+0.0000633*VPOT*VPOT-0.03906VPOT+24.02;//equação
que transforma a medida da tensão em posição no eixo x
dX=x-xo; // dá a diferença entre a posição inicial e posição atual
dX=sqrt(dX*dX); // dá o módulo da diferença da posição
componda=(d*dX)/(sqrt(dX*dX+D*D)); // calcula o comprimento da
onda
if(componda<450)// determina que os leds fiquem apagados para
comprimentos de ondas menores que 450nm
{
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(12,LOW);
}
if (componda>725) //desliga os leds para frequencias acima de 750nm
{
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(12,LOW);
}
if (leitura == 'I')// Dá as condições iniciais quando teclar a tecla I
{
VLDR=analogRead(A0);
VPOT=analogRead(A1);
D=12.00000; //distância entre o anteparo e a rede de difração
d=1687.3;//rede de difração em nm
xo=-0.0000001582*VPOT*VPOT*VPOT+0.0000633*VPOT*VPOT-0.03906VPOT+24.02;
}
if (leitura == 'L')//leitura dos dados
{
VLDR = analogRead(A0);
VPOT = analogRead(A1);
MVPOT=VPOT;
MVLDR=VLDR;
for (i=0;i<=100;i++)// realiza 100 medias consecutivas
dos dados de entrada
{
VPOT=analogRead(A1);
VLDR = analogRead(A0);
MVPOT=(MVPOT+VPOT)/2;//devolve a média dos 100 valores
do potenciometro
MVLDR=(MVLDR+VLDR)/2;//devolve a média dos 100 valores do LDR
delay (20);
}
x=-0.0000001582*VPOT*VPOT*VPOT+0.0000633*VPOT*VPOT-0.03906VPOT+24.02;
dX=x-xo;
dX=sqrt(dX*dX);
componda=(d*dX)/(sqrt(dX*dX+D*D));
Serial.print(VLDR); //envia o valor da tenção do LDR para o tela
Serial.print(" ");
Serial.print(dX,2); // Envia o valor da distancia entre o ponto
central e a primeira franja de difração para a tela
Serial.print(" ");
Serial.print(componda,2);// envia o valor do comprimento da onda
para a tela
Serial.println ( "\t");
if (componda>=601,componda<=725)// acende o led vermelho para indicar
a faixa do vermelho da franja de difração
{
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(12,HIGH);
}
if (componda>=501,componda<=600)//acende o led verde para indicar a
faixa do verde da franja de difração
{
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
}
if (componda>=450,componda<=500)//acende o led azul para indicar a
faixa do azul da franja de difração
{
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
}
}
}
pinMode(11, OUTPUT);//led verde
pinMode(10, OUTPUT);//led azul
Serial.println("Digite I para iniciar o ponto a posição inicial de x");
Serial.println("Digite L para obter as leituras de posição e
comprimento de onda");
}
void loop()
{
leitura = Serial.read();//lê o que foi digitado
VLDR=analogRead(A0);// leitura da tenção sobre o LDR entre 0 a
1023, que equivale de 0 a 5V
VPOT=analogRead(A1); // leitura da tenção sobre o potenciômetro
x=-0.0000001582*VPOT*VPOT*VPOT+0.0000633*VPOT*VPOT-0.03906VPOT+24.02;//equação
que transforma a medida da tensão em posição no eixo x
dX=x-xo; // dá a diferença entre a posição inicial e posição atual
dX=sqrt(dX*dX); // dá o módulo da diferença da posição
componda=(d*dX)/(sqrt(dX*dX+D*D)); // calcula o comprimento da
onda
if(componda<450)// determina que os leds fiquem apagados para
comprimentos de ondas menores que 450nm
{
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(12,LOW);
}
if (componda>725) //desliga os leds para frequencias acima de 750nm
{
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(12,LOW);
}
if (leitura == 'I')// Dá as condições iniciais quando teclar a tecla I
{
VLDR=analogRead(A0);
VPOT=analogRead(A1);
D=12.00000; //distância entre o anteparo e a rede de difração
d=1687.3;//rede de difração em nm
xo=-0.0000001582*VPOT*VPOT*VPOT+0.0000633*VPOT*VPOT-0.03906VPOT+24.02;
}
if (leitura == 'L')//leitura dos dados
{
VLDR = analogRead(A0);
VPOT = analogRead(A1);
MVPOT=VPOT;
MVLDR=VLDR;
for (i=0;i<=100;i++)// realiza 100 medias consecutivas
dos dados de entrada
{
VPOT=analogRead(A1);
VLDR = analogRead(A0);
MVPOT=(MVPOT+VPOT)/2;//devolve a média dos 100 valores
do potenciometro
MVLDR=(MVLDR+VLDR)/2;//devolve a média dos 100 valores do LDR
delay (20);
}
x=-0.0000001582*VPOT*VPOT*VPOT+0.0000633*VPOT*VPOT-0.03906VPOT+24.02;
dX=x-xo;
dX=sqrt(dX*dX);
componda=(d*dX)/(sqrt(dX*dX+D*D));
Serial.print(VLDR); //envia o valor da tenção do LDR para o tela
Serial.print(" ");
Serial.print(dX,2); // Envia o valor da distancia entre o ponto
central e a primeira franja de difração para a tela
Serial.print(" ");
Serial.print(componda,2);// envia o valor do comprimento da onda
para a tela
Serial.println ( "\t");
if (componda>=601,componda<=725)// acende o led vermelho para indicar
a faixa do vermelho da franja de difração
{
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(12,HIGH);
}
if (componda>=501,componda<=600)//acende o led verde para indicar a
faixa do verde da franja de difração
{
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
}
if (componda>=450,componda<=500)//acende o led azul para indicar a
faixa do azul da franja de difração
{
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
}
}
}
O 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.
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.