segunda-feira, 5 de novembro de 2012

Kit para estudo do comportamento ondulatório da Luz com Arduino

Código de programação:

 #include <Stepper.h>  
   
 #define ECHOPIN 6              // Pin to receive echo pulse  
 #define TRIGPIN 7              // Pin to send trigger pulse   
   
 char leitura;  
 char leitura2;  
   
 const int stepsPerRevolution = 64; // passos por volta (28BYJ48)  
   
 // Pinos utilizados para a comunicacao  
 // (8 e 9 de um lado, 10 e 11 do outro)  
 Stepper myStepper(stepsPerRevolution, 8,9,10,11);   
   
 int i,VLDR,;  
 float ,MVLDR,dX,componda,D,d,x,xo;  
 char leitura;  
    
 void setup ()  
 { Serial.begin(9600);  
 pinMode(A0, INPUT);//leitura do LDR  
 pinMode(12, OUTPUT);//led vermelho  
 pinMode(11, OUTPUT);//led verde  
 pinMode(10, OUTPUT);//led azul  
 pinMode(ECHOPIN, INPUT);  
 pinMode(TRIGPIN, OUTPUT);  
 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");  
    
  // velocidade (60 RPM):  
  myStepper.setSpeed(60);  
  // initialize the serial port:  
  Serial.begin(9600);  
   
 }  
   
   
 void loop()  
    
 {  
 leitura = Serial.read();//lê o que foi digitado  
   
 if (leitura =='A') { // sentido horario  
  // rotacao em sentido horario   
  Serial.println("clockwise");   
  myStepper.step(stepsPerRevolution);  
  delay(1);  
    
  }  
    
  if (leitura =='S') { // Sentido anti-horario  
  //Agora em direcao oposta, os 200 passos  
  Serial.println("counterclockwise");  
  myStepper.step(-stepsPerRevolution);  
  delay(1);   
    
  }  
   
 VLDR=analogRead(A0);// leitura da tenção sobre o LDR entre 0 a 1023, que equivale de 0 a 5V  
 x=- //equação que transforma os passos 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);  
 digitalWrite(TRIGPIN, LOW);          // Set the trigger pin to low for 2uS  
 delayMicroseconds(2);  
 digitalWrite(TRIGPIN, HIGH);         // Send a 10uS high to trigger ranging  
 delayMicroseconds(10);  
 digitalWrite(TRIGPIN, LOW);          // Send pin low again  
 float tempo, distancia   
 tempo= pulseIn(ECHOPIN, HIGH);   
 distance= ((tempo * 340)/10000)/2;         // Distância entre o anteparo e a rede de difração  
   
 Serial.println(distance);             
 delay(50);   
 d=1687.3;//rede de difração em nm  
 xo=   
 }  
 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  
 {  
   
 VLDR = analogRead(A0);  
 MVLDR=(MVLDR+VLDR)/2;//devolve a média dos 100 valores do LDR  
 delay (20);  
 }  
    
 x=  
 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);  
 }  
 }  
 }