Vamos dar continuidade ao projeto. Agradeço a todos que de uma forma estão contribuindo com conhecimento para evolução do projeto.
Hoje vamos falar sobre o algorítimo introduzido na programação para distinguir de onde temos mais incidência de raios solares, e de que forma tratamos esses dados para controlar os dois servo motores.
O código para o Arduino está todo comentado, mas basicamente o quele faz é o seguinte, define em quais pinos estão conectados os LDRs e servo motores, estes tem valor inicial de posição 90° e 135°. No loop, fazemos a leitura dos sensores e armazenamos em variáveis, que são tratadas logo em seguida. Avaliamos em conjunto os sensores Acima/Abaixo e Direita/Esquerda, verificamos em qual sensor temos mais incidência com um limiar 2 para evitar movimentos inesperados.
- #include <Servo.h>// Inclui biblioteca de servos
- Servo servoRotacao;// Cria variaveis para controlar servos
- Servo servoPasso;// Cria variaveis para controlar servos
- int ldrEsquerda = A2;// Ldr da esquerda pino 2
- int ldrDireita = A3;// Ldr da direita pino 3
- int ldrCima = A0;// Ldr de cima pino 4
- int ldrBaixo = A1;// Ldr de baixo pino 5
- int valRotacao = 90;// Posicao inicial dos servos
- int valPasso = 135;// Posicao inicial dos servos
- int valEsquerda;// Variaveis para pegar valor analogico dos pinos
- int valDireita;
- int valCima;
- int valBaixo;
- int delayMovimento= 100;// Tempo de delay dos servos
- void setup()
- {
- servoRotacao.attach(10);// Atribui ao pino 6 o servo rotacao
- servoPasso.attach(9);// Atribui ao pino 9 o servo passo
- }
- void loop()
- {
- valEsquerda = analogRead(ldrEsquerda);// Faz leitura analogica do ldr esquerdo de acordo com a incidencia de luz
- valDireita = analogRead(ldrDireita);
- valCima = analogRead(ldrCima);
- valBaixo = analogRead(ldrBaixo);
- if (valEsquerda - valDireita > 2 || valEsquerda - valDireita < -2)
- // Comparando os LDR's da esquerda e direita com threshold de "2" para evitar tremer os servos (jitter)
- {
- if (valEsquerda > valDireita && valRotacao > 0)
- // Luz vindo da direita, prepara para virar servo para direita (valor de travamento menor que 0)
- {
- valRotacao--;
- // Decrementa variavel
- }
- if (valDireita > valEsquerda && valRotacao < 180)
- // Luz vindo da esquerda, prepara para virar servo para esquerda (valor de travamento maior que 180)
- {
- valRotacao++;
- // Incrementa variavel
- }
- }
- if (valCima - valBaixo > 2 || valCima - valBaixo < -2)
- // Comparando LDR's de Cima e Baixo com threshold de "2" para evitar tremer os servos (jitter)
- {
- if (valCima > valBaixo && valPasso > 90)
- // Luz vindo de Cima, prepara servo para virar para cima (valor de travamento menor que 90)
- {
- valPasso--;
- // Decrementa variavel
- }
- if (valBaixo > valCima && valPasso < 180)
- // Luz vindo de Baixo, prepara servo para ir para baixo (valor de travamento maior que 180)
- {
- valPasso++;
- // Incrementa variavel
- }
- }
- /*
- dica: o servo de passo so precisa de um alcance de 90 graus em caso de luz vindo
- horizontalmente para o chao(nascer do sol)
- ou verticalmente (sol do meio dia)
- */
- servoRotacao.write(valRotacao);// Coloca a posicao do servo de acordo com valor calculado
- servoPasso.write(valPasso);// Coloca a posicao do servo de acordo com valor calculado
- delay(delayMovimento);// Espera o servo se mover até a posicao
- }
Conjunto acoplado a placa do Arduino:
Verificando funcionamento do algorítimo usando luz artificial:
É isso ai, em breve novas atualizações no projeto!
Nenhum comentário:
Postar um comentário