Hola, navegando por el foro Arduino en español, me encontré un código, seguidor solar, con micro motores dcc, no usa LDR (foto resistencia), usa paneles solares para enviar los datos, de la intensidad de luz a los pines analógicos,
(Seguidor Solar Automatizado. [TERMINADO] - #8 by _jose ) es un código muy completo, y también complejo, envía mucha información al monitor Serial, ya conseguí integrar los motores nema 17, pero su comportamiento toda vía esta lejos de funcionar como debe.
El motor nema17-A cambia de dirección, pero nunca se detiene, ni en 0 ni 1023. el nema17-B si llega a detenerse, pero en muy rara ocasión cambia de giro, he procurado borrar lo menos posible del código original, solo lo e comentado, el numero de pasos y la velocidad de los nema, solo son con fines demostrativos, agregue un delay(2000); para poder ver el monitor serial, con claridad y que los motores no tengan un brusco cambio de giro.
Hace 4 años inicie con esta proyecto, y nunca e encontrado un rastreador solar con motores nema, casi todos los códigos están creados para servos, y motores a pasos 28BYJ-48, o motores dcc, como es el caso del código en el que estoy basando mi proyecto, hay otros proyectos basados en librerías, AccelStepper CustomStepper etcetera, y tienen sus pros y sus contras.
Tengo fe en el foro seguro y nos saldrá un buen código, yo trabajare Hardware para complementarlo con esquemas e imágenes.
Saludos.
//nema 17-A
const int stepPin = 8;
const int dirPin = 9;
const int enPin = 10;
//nema17-B
const int stepPin2 = 5;
const int dirPin2 = 6;
const int enPin2 = 7;
// 4 fotoceldas
int Vplaca1 = A0;
int Vplaca2 = A1;
int Vplaca3 = A2;
int Vplaca4 = A3;
//lectura pines monitor serial
//int km1 = 9;
//int km2 = 10;
//int km3 = 11;
//lectura pines monitor serial
//int km4 = 5;
//int km5 = 6;
//int km6 = 7;
int fc1 = A0;
int fc2 = A1;
int fc3 = A2;
int fc4 = A3;
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(enPin, OUTPUT);
digitalWrite(enPin, HIGH);
pinMode(stepPin2, OUTPUT);
pinMode(dirPin2, OUTPUT);
pinMode(enPin2, OUTPUT);
digitalWrite(enPin2, HIGH);
// initialize km as outputs:
// pinMode(km1, OUTPUT) ;
// pinMode(km2, OUTPUT) ;
// pinMode(km3, OUTPUT) ;
// pinMode(km4, OUTPUT) ;
// pinMode(km5, OUTPUT) ;
// pinMode(km6, OUTPUT) ;
pinMode(fc1, INPUT) ;
pinMode(fc2, INPUT) ;
pinMode(fc3, INPUT) ;
pinMode(fc4, INPUT) ;
Serial.begin(9600) ;
}
void loop() {
delay(2000);
// read the values of the solar panels:
int V1 = analogRead(Vplaca1) ;
int V2 = analogRead(Vplaca2) ;
int V3 = analogRead(Vplaca3) ;
int V4 = analogRead(Vplaca4) ;
// int Km1 = digitalRead(km1) ;
// int Km2 = digitalRead(km2) ;
// int Km3 = digitalRead(km3) ;
// int Km4 = digitalRead(km4) ;
// int Km5 = digitalRead(km5) ;
// int Km6 = digitalRead(km6) ;
int Lekfc1 = digitalRead(fc1) ;
int Lekfc2 = digitalRead(fc2) ;
int Lekfc3 = digitalRead(fc3) ;
int Lekfc4 = digitalRead(fc4) ;
int Tolerancia = 60;
// left move:
int Dif12 = V1 - V2 ;
int Dif34 = V3 - V4 ;
// right move
int Dif21 = V2 - V1 ;
int Dif43 = V4 - V3 ;
//up move
int Dif13 = V1 - V3 ;
int Dif24 = V2 - V4 ;
//Down move
int Dif31 = V3 - V1 ;
int Dif42 = V4 - V2 ;
// Print voltage.
Serial.print(" V1-"); Serial.print( V1);
Serial.print(" V2-"); Serial.print(V2);
Serial.print(" V3-"); Serial.print(V3);
Serial.print(" V4-"); Serial.print(V4);
// estado de las salidas:
// Serial.print(" km1."); Serial.print(Km1);
// Serial.print(" km2."); Serial.print(Km2);
// Serial.print(" km3."); Serial.print(Km3);
// Serial.print(" km4."); Serial.print(Km4);
// Serial.print(" km5."); Serial.print(Km5);
// Serial.print(" km6."); Serial.print(Km6);
// estado de las restas de tensión:
Serial.print(" ..fc1: "); Serial.print(digitalRead(fc1)); Serial.print(" ..fc2: "); Serial.print(digitalRead(fc2));
Serial.print(" ..fc3: "); Serial.print(digitalRead(fc3)); Serial.print(" ..fc4: "); Serial.print(digitalRead(fc4));
Serial.println();
delay(1);
// left move:
if ((Lekfc1 == 0) && (((V1 > V2) && (Dif12 > Tolerancia)) || ((V3 > V4) && (Dif34 > Tolerancia) )))
{
//digitalWrite(km1, HIGH) ;
digitalWrite(dirPin, HIGH);
for (int x = 0; x < 400; x++)
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
else {
//digitalWrite(km1, LOW) ;
digitalWrite(dirPin, LOW);
for (int x = 0; x < 200; x++)
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
// right move
if ( (Lekfc2 == 0) && (( (V2 > V1) && (Dif21 > Tolerancia)) || ( (V4 > V3) && (Dif43 > Tolerancia)) ))
{
//digitalWrite(km2, HIGH) ;
digitalWrite(dirPin, HIGH);
for (int x = 0; x < 200; x++)
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
else {
//digitalWrite(km2, LOW) ;
digitalWrite(dirPin, LOW);
for (int x = 0; x < 200; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
//up move
if ( (Lekfc4 == 0) && (( (V1 > V3) && (Dif13 > Tolerancia) ) || ((V2 > V4) && (Dif24 > Tolerancia))))
{
//digitalWrite(km3, HIGH) ;
digitalWrite(dirPin2, HIGH);
for (int x = 0; x < 200; x++) {
digitalWrite(stepPin2, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin2, LOW);
delayMicroseconds(2000);
}
}
else {
//digitalWrite(km3, LOW) ;
digitalWrite(dirPin2, LOW);
for (int x = 0; x < 200; x++) {
digitalWrite(stepPin2, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin2, LOW);
delayMicroseconds(2000);
//Down move
if ((Lekfc3 == 0) && (((V3 > V1) && (Dif31 > Tolerancia)) || ((V4 > V2) && (Dif42 > Tolerancia))))
{
//digitalWrite(km4, HIGH) ;
digitalWrite(dirPin2, HIGH);
for (int x = 0; x < 200; x++)
digitalWrite(stepPin2, HIGH);{
delayMicroseconds(2000);
digitalWrite(stepPin2, LOW);
delayMicroseconds(2000);
}
}
else {
//digitalWrite(km4, LOW) ;
digitalWrite(dirPin2, LOW);
for (int x = 0; x < 200; x++)
digitalWrite(stepPin2, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin2, LOW);
delayMicroseconds(2000);
}
}
}
}
}
}
Les doy una idea de donde le he estado moviendo, es el las { de void loop termine haciendo un desbarajuste, } cada juego de llaves que muevo cambia el comportamiento.