Páginas

segunda-feira, 7 de novembro de 2011

Código da programação para experimento do espectrofotômetro com arduino

Segue, agora, a programação comentada utilizada para a coleta de dados do espectrofotômetro com arduino.


/*
 Stepper Motor Control - Espectrofotometro com motor de passo

 Este programa permite a leitua do número de voltas executado pelo motor de passo para um intervalo de step=1
 Com velocidade de ida e volta variáveis
 A indicaçao de que o sistema está efetuando a leitura é realizada atraves do acendimento de um LED no pino 3
 O led conectado no pino 2 indica que o sistema está retornando para o ponto de inicio de medida
 */
#include //chama a BIBLIOTECA "Stepper.h" (biblioteca do motor de passo)
int valorpino2=LOW; // declara a VARIÁVEL "valorpino2" (LED Vermelho) tipo inteiro e igual a BAIXO (0 Volts), este led indica o retorno do sensor
int valorpino3;     // declara a VARIÁVEL "valorpino3" (LED Verde) igual a inteiro, este led indica que a medida está sendo realizada
const int stepsPerRevolution = 48;  // indica o numero de passos/revolução, para o tipo de motor utilizado (específico p/ cada modelo de motor de passo)
// iniciar a BIBLIOTECA "stepper" pelos pinos pinos 8 a 11
Stepper myStepper(stepsPerRevolution, 8,9,10,11); // Função "passo" myStepper(número de passos, 2 ou 4 pinos que devem ser ligados ao motor;o 5º fio do motor é ligado a +5V da placa, que conecta-se ao pino correspondente do arduino)
int cont=0;            //declara a VARIÁVEL "cont" inteira e igual a 0
int stepCount = 0;     //declara a VARIÁVEL "stepCount" inteira e igual a 0
int intervaloIda=10;   //define a VARIÁVEL "intervaloIda" igual a 10, pode ser alterado pelo usuario, representa o intervalo de passos do motor para cada captura de dados
int velocidadeIda=200; //define a VARIÁVEL "velocidadeIda" igual a 100. Esta variável é a velocidade da varredura do sensor na Ida, pode ser alterada pelo usuario
int valorLDR;          //declara a VARIÁVEL "valorLDR" inteira. Esta variável recebe o valor lido no sensor LDR
int D = 85;           //declara a constante D igual ao comprimento do carro do scanner, em mm
int d = 1398;           //declara a constante d, a distancia entre os sulcos da rede de difração (CD), igual a 1660 linhas/nm (isso para o compdeonda ser em nm).
float senq;            //declara a VARIAVEL senq, o seno do angulo formado entre cursoremX e a hipotenusa, flutuante.
float n;               //declara a VARIÁVEL "N" flutuante. Esta variável será especificada na próxima seção.
float compdeonda;      // declara a VARIÁVEL referente ao comprimento de onda, podendo flutuar (variando as casas decimais, para maior precisão)
float cursoremX;       //declara a VARIÁVEL "cursoremX" flutuante. Esta variável será a responsável pela distância em X percorrida, e será o limite percorrido pelo motor.
float Dmenor;          //declara a VARIÁVEL "Dmenor" flutuante. Esta variável é o diametro da engrenagem menor
float I;// variavel proporcional a intensidade de luz
unsigned long time;    //declara a VARIÁVEL "time" ocupando 1 bit de memória. Esta variável...
void setup()           //declara o início da FUNÇÃO "setup" (configuração das portas e dos pinos)
{
  pinMode(2,INPUT);    //define o pino digital 2 como ENTRADA do motor para o arduino.
  pinMode(3,OUTPUT);   //define o pino digital 3 como SAÍDA do arduino para o motor.
  pinMode(A5,INPUT);   //define o pino analógico A5 como ENTRADA de dados (aquisição dos dados coletados pelo LDR).
  Serial.begin(9600);  //define a taxa de transmissão de dados entre o Arduíno e o computador (comunicação serial -USB- em 9600 bits por segundo).
}
void loop()            //define o inicio da FUNÇÃO loop. Verifica o valor das variáveis continuamente.
{
    //char leitura = Serial.read();
    time=millis(); //variável "time" é igual ao tempo que o Arduíno está operando em milisegundos.
    valorLDR=analogRead(A5); // define variável "valorLDR" igual à leitura do sinal vindo do LDR, na porta analógica A5
    I=1000.0/valorLDR;
    valorpino2=digitalRead(2); // define a variável "valorpino2" igual a leitura da porta digital 2. Isso acende LED vermelho no pino 2
    valorpino3=!valorpino2; // define a variável "valor pino2" igual a "valorpino2". Isso acende led verde no pino 3.
    //O ! indica que o LED conectado no pino 3, apresenta comportamento inverso ao LED do pino 2: ou seja, enq. o do pino 2 acende, o do pino 3 está apagado, e vice-versa.
    digitalWrite(3,valorpino3); //define o valor do pino3 (ALTO ou BAIXO) para o pino digital 3
    if (valorpino2==LOW) //se variável "valorpino2" igual a BAIXO
    /*
    Se valor da variável "valorpino2" estiver em BAIXO (5 OU 3.3 Volts).
    Pino 2 em BAIXO, faz com que o motor gire no sentido positivo de X, com velocidade definida e corre fazendo as leituras do LDR,
    até o limite em X definido.
    */
    //Então, " se a variável 'valorpino2' igual a BAIXO"
    {
      stepCount++; //soma-se 1 à variável stepCount, equivalente a "stepCount=StepCount+1"
      cont = stepCount; // declara a variável "cont" igual ao valor contido na variável "stepCount"
      n = cont*intervaloIda/48.000; //declara a variável "N" igual a "cont x intervalodeIda / 48 , com 3 casas decimais"
      //ou seja, N é o produto do numero de volta do motor, durante o intervalo de ida, em razão das voltas do motor
      Dmenor = 13.5;
      cursoremX = Dmenor * (n/10) * 3.14159; //declara a variável cursoremX, ou o quanto o motor faz o carro se deslocar em X, levando-se em consid. o diâmetro da engrenagem menor ("engrenagem-motora")e o número de voltas
          if (cursoremX > 30); //se a variável cursoremX for maior que 32.7 (limite que o cursor pode percorrer, o pino 2 sobe para HIGH
              {
               valorpino2==HIGH;
              }
      senq=(cursoremX)/sqrt((cursoremX*cursoremX)+(D*D));
      compdeonda = d * senq;
        {
        //Serial.print(cont);     // Imprime em caracteres ASCII a variável "cont" serial
       // Serial.print("   ");    // Imprime em caracteres ASCII "   "
        //Serial.print(n,5);      // Imprime em caracter es ASCII a variável "n" na porta 5
       // Serial.print("   ");    // Imprime em caracteres ASCII "   "
       Serial.print(I,3); // Imprime em caracteres ASCII a variável "proporcional a intensidade de luz"
       Serial.print("   ");    // Imprime em caracteres ASCII "   "
       //Serial.print(cursoremX);     // Imprime em caracteres ASCII a variável "cursoremX"
       //Serial.print("   ");    // Imprime em caracteres ASCII "   "
       Serial.print(compdeonda); //Imprime em caracteres ASCII a variável "compdeonda"
       Serial.print("   ");     // Imprime em caracteres ASCII "   "
        }
        {
        Serial.println();      // Imprime em caracteres ASCII uma nova linha
        }
  myStepper.setSpeed(velocidadeIda); //define a velocidade do motor em RPMs
  myStepper.step(intervaloIda);}     //aciona o motor
    if (valorpino2==HIGH )
        {
         cont=0;  //variável cont igual a 0
         stepCount=0; //variável stepCount=0
         myStepper.setSpeed(200); //define velocidade do motor em 200RPMs
         myStepper.step(-200); //aciona o motor em (-100) passos, na direção -X (a volta fica mais devagar)
       }      
}

Nenhum comentário:

Postar um comentário