Link da apresentação:
https://docs.google.com/presentation/d/1afoA24bGlVFrk3Sv5y5zqAcEFzskXpjLKAJBU-OUOPI/edit?usp=sharing
Modelagem da curva dos motores servo:
Imagens do labview:
Código do Arduino:
/*
UCL - Faculdade do Centro Leste
Projeto Interdiscipinar de Engenharia III
Semestre 2022/01
Curso: Engenharia Civil
Aluno: Lucas Tiago Rodrigues de Freitas
Referências: https://www.instructables.com/Arduino-Solar-Tracker/
*/
#include <Servo.h> // inclui a Servo library
Servo servolesteoeste; // Motor Servo leste-oeste
// stand leste-oeste servo
Servo servonortesul; // Motor Servo norte-sul
// stand norte-sul servo
// Conexões LDR nos pinos do Arduino
// nome = pino analógico;
int nordeste = A0; // sensor LDR Nordeste
int sudeste = A1; // sensor LDR Sudeste
int noroeste = A2; // sensor LDR Noroeste
int sudoeste = A3; // sensor LDR Sudoeste
int var = 0; // variável para contagem do while
//angulos iniciais
int angulolesteoeste = 83; // leste é 0 graus no motor // variável para contagem do angulo leste-oeste - de 3 a 165
int angulonortesul = 72; // norte é 0 graus no motor // variável para contagem do angulo na norte-sul - de 15 a 145
/*//erro dos motores para 90 graus
int erromotorlesteoeste = 25;
int erromotornortesul = 12;*/
//Início de curso
int inicioleste = 15;
int inicionorte = 15;
//Fim de curso
int fimoeste = 160;
int fimsul = 160;
// variável para comunicação Serial
int entradaserial; // a variable to read incoming serial data into
int atraso = 50;
void aprumar(){
//na direção leste-oeste
for (angulolesteoeste; angulolesteoeste<fimoeste; angulolesteoeste+=1){ //angulos limites para movimento leste-oeste: 8 e 165
servolesteoeste.write(angulolesteoeste);
//Serial.print("Angulo do motor na direção leste-oeste: ");
//Serial.println(angulolesteoeste);
// enviando o valor das posições dos motores
Serial.print(angulolesteoeste);
Serial.print(";");
Serial.println(angulonortesul);
delay(atraso);
}
for (angulolesteoeste; angulolesteoeste>65; angulolesteoeste-=1){ //angulos limites para movimento leste-oeste: 8 e 165
servolesteoeste.write(angulolesteoeste);
//Serial.print("Angulo do motor na direção leste-oeste: ");
//Serial.println(angulolesteoeste);
// enviando o valor das posições dos motores
Serial.print(angulolesteoeste);
Serial.print(";");
Serial.println(angulonortesul);
delay(atraso);
}
//na direção norte-sul
for (angulonortesul; angulonortesul<fimsul; angulonortesul+=1){ //angulos limites para movimento norte-sul: 8 e 165
servonortesul.write(angulonortesul);
//Serial.print("Angulo do motor na direção norte-sul: ");
//Serial.println(angulonortesul);
// enviando o valor das posições dos motores
Serial.print(angulolesteoeste);
Serial.print(";");
Serial.println(angulonortesul);
//delay
delay(atraso);
}
for (angulonortesul; angulonortesul>78; angulonortesul-=1){ //angulos limites para movimento norte-sul: 8 e 165
servonortesul.write(angulonortesul);
//Serial.print("Angulo do motor na direção norte-sul: ");
//Serial.println(angulonortesul);
// enviando o valor das posições dos motores
Serial.print(angulolesteoeste);
Serial.print(";");
Serial.println(angulonortesul);
delay(atraso);
}
}
/*void leitura(){
Serial.print("LDR Nordeste: ");
Serial.print(analogRead(nordeste));
Serial.print(", ");
Serial.print("LDR Sudeste: ");
Serial.print(analogRead(sudeste));
Serial.print(", ");
Serial.print("LDR Noroeste: ");
Serial.print(analogRead(noroeste));
Serial.print(", ");
Serial.print("LDR Sudoeste: ");
Serial.println(analogRead(sudoeste));
}*/
/*void leituraangulos(){
Serial.print(angulolesteoeste);
Serial.print(";");
Serial.println(angulonortesul);
delay (10);
}*/
//funções de início e fim de curso
//Leste
void inicioleste20(){ //caso 1
inicioleste = 15; //posição do motor para 20 graus;
delay (10);
}
void inicioleste40(){ //caso 2
inicioleste = 30; //posição do motor para 40 graus;
delay (10);
}
void inicioleste60(){ //caso 3
inicioleste = 45; //posição do motor para 60 graus;
delay (10);
}
//Norte
void inicionorte20(){ //caso 4
inicionorte = 3; //posição do motor para 20 graus;
delay (10);
}
void inicionorte40(){ //caso 5
inicionorte = 20; //posição do motor para 40 graus;
delay (10);
}
void inicionorte60(){ //caso 6
inicionorte = 38; //posição do motor para 60 graus;
delay (10);
}
//Oeste
void fimoeste120(){ //caso 7
fimoeste = 110; //posição do motor para 120 graus;
delay (10);
}
void fimoeste140(){ //caso 8
fimoeste = 130; //posição do motor para 140 graus;
delay (10);
}
void fimoeste160(){ //caso 9
fimoeste = 150; //posição do motor para 160 graus;
delay (10);
}
//Sul
void fimsul120(){ //caso X
fimsul = 99; //posição do motor para 120 graus;
delay (10);
}
void fimsul140(){ //caso Y
fimsul = 115; //posição do motor para 140 graus;
delay (10);
}
void fimsul160(){ //caso Z
fimsul = 132; //posição do motor para 160 graus;
delay (10);
}
void rastrear(){
int ne = analogRead(nordeste); // Nordeste
int se = analogRead(sudeste); // Sudeste
int no = analogRead(noroeste); // Noroeste
int so = analogRead(sudoeste); // Sudoeste
int dtime = 50; // tempo de atraso
int tol = 20; // tolerância de variação das médias dos LDRs combinados
int medialeste = (ne + se) / 2; // média na direção leste
int mediaoeste = (no + so) / 2; // média na direção oeste
int medianorte = (ne + no) / 2; // média na direção norte
int mediasul = (se + so) / 2; // média na direção sul
int diflesteoeste = medialeste - mediaoeste; // Checa a diferença do leste para o oeste
int difnortesul = medianorte - mediasul;// Checa a diferença do norte para o sul
//posicionando o motor leste-oeste
if (-1*tol > diflesteoeste || diflesteoeste > tol) // checa se a diferença leste-oeste está na tolerância, senão muda o angulo leste-oeste
{
if (medialeste > mediaoeste) //angulos limites para movimento vertical: 15 a 145
{
angulolesteoeste = --angulolesteoeste;
if (angulolesteoeste < inicioleste) // 180 - restrição de movimento para proteger o motor
{
angulolesteoeste = inicioleste; //180
}
}
else if (medialeste < mediaoeste)
{
angulolesteoeste= ++angulolesteoeste;
if (angulolesteoeste > fimoeste) //0
{
angulolesteoeste = fimoeste; //0
}
}
servolesteoeste.write(angulolesteoeste);
}
if (-1*tol > difnortesul || difnortesul > tol) // checa se a diferença norte-sul está na tolerância, senão muda o angulo norte-sul
{
if (medianorte > mediasul) //angulos limites para movimento horizontal: 8 e 165
{
angulonortesul = --angulonortesul;
if (angulonortesul < inicionorte) //0 - restrição de movimento para proteger o motor
{
angulonortesul = inicionorte; //era pra ser 0, mas o motor treme
}
}
else if (medianorte < mediasul)
{
angulonortesul = ++angulonortesul;
if (angulonortesul > fimsul) //180 - restrição de movimento para proteger o motor
{
angulonortesul = fimsul; // era pra ser 180, mas o motor treme
}
}
servonortesul.write(angulonortesul);
}
// enviando o valor das posições dos motores
Serial.print(angulolesteoeste);
Serial.print(";");
Serial.println(angulonortesul);
//delay
delay(dtime);
// verificar se vai permanecer ou sair do while
}
void setup() {
// initialize serial communication:
Serial.begin(9600);
// Conexões dos motores servos
// nome.attach(pin);
servolesteoeste.attach(5);
servonortesul.attach(6);
//aprumando o rastreador solar
angulolesteoeste = servolesteoeste.read();
// Entrada de dados dos LDRs das portas A0, A1, A2, A3
pinMode(A0,INPUT); // LDR Nordeste
pinMode(A1,INPUT); // LDR Sudeste
pinMode(A2,INPUT); // LDR Noroeste
pinMode(A3,INPUT); // LDR Sudoeste
}
void loop() {
// see if there's incoming serial data:
//if (Serial.available() > 0) {
// read the oldest byte in the serial buffer:
entradaserial = Serial.read();
switch (entradaserial){
// if it's an L (ASCII 76) turn off the LED:
// if it's an L (ASCII 76) turn off the LED:
//if (entradaserial == 'A') {
case 'A':
aprumar();
break;
/*case 'G':
//leitura();
break;*/
case 'R':
rastrear();
break;
//case 'L':
//leituraangulos();
//break;
case '1':
inicioleste20();
break;
case '2':
inicioleste40();
break;
case '3':
inicioleste60();
break;
case '4':
inicionorte20();
break;
case '5':
inicionorte40();
break;
case '6':
inicionorte60();
break;
case '7':
fimoeste120();
break;
case '8':
fimoeste140();
break;
case '9':
fimoeste160();
break;
case 'X':
fimsul120();
break;
case 'Y':
fimsul140();
break;
case 'Z':
fimsul160();
break;
default:
// enviando o valor das posições dos motores
Serial.print(angulolesteoeste);
Serial.print(";");
Serial.println(angulonortesul);
//delay
delay(atraso);
break;
}
/*/if (entradaserial == 'G') {
Serial.print("LDR Nordeste: ");
Serial.print(analogRead(nordeste));
Serial.print(", ");
Serial.print("LDR Sudeste: ");
Serial.print(analogRead(sudeste));
Serial.print(", ");
Serial.print("LDR Noroeste: ");
Serial.print(analogRead(noroeste));
Serial.print(", ");
Serial.print("LDR Sudoeste: ");
Serial.println(analogRead(sudoeste));
}
// Para acionar o rastreador solar
if (entradaserial == 'R') {
rastrear();
}*/
}