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)
}
}