Solucionado Seguidor Solar de motores dcc a nema-17

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.

E jugado otro rato con las { llaves aquí les dejo una muestra de lo que imprime el monitor Serial los primeros 5 renglones con toda la intensidad luminosa y los siguientes 10 cero iluminación y ahora si detienen los dos nema, con la intensidad luminosa no se detienen.

V1-1023 V2-1023 V3-1023 V4-1023   ..fc1: 1   ..fc2:  1   ..fc3:  1   ..fc4:  1
 V1-1010 V2-1023 V3-1023 V4-1023   ..fc1: 1   ..fc2:  1   ..fc3:  1   ..fc4:  1
 V1-1023 V2-1023 V3-1023 V4-1023   ..fc1: 1   ..fc2:  1   ..fc3:  1   ..fc4:  1
 V1-1023 V2-1023 V3-1023 V4-1023   ..fc1: 1   ..fc2:  1   ..fc3:  1   ..fc4:  1
 V1-1023 V2-1023 V3-1023 V4-1023   ..fc1: 1   ..fc2:  1   ..fc3:  1   ..fc4:  1
 V1-24 V2-554 V3-632 V4-42   ..fc1: 0   ..fc2:  1   ..fc3:  1   ..fc4:  0
 V1-32 V2-550 V3-627 V4-24   ..fc1: 0   ..fc2:  1   ..fc3:  1   ..fc4:  0
 V1-43 V2-446 V3-629 V4-18   ..fc1: 0   ..fc2:  0   ..fc3:  1   ..fc4:  0
 V1-64 V2-561 V3-637 V4-17   ..fc1: 0   ..fc2:  1   ..fc3:  1   ..fc4:  0
 V1-85 V2-562 V3-636 V4-18   ..fc1: 0   ..fc2:  1   ..fc3:  1   ..fc4:  0
 V1-120 V2-413 V3-644 V4-14   ..fc1: 0   ..fc2:  0   ..fc3:  1   ..fc4:  0
 V1-118 V2-425 V3-632 V4-20   ..fc1: 0   ..fc2:  0   ..fc3:  1   ..fc4:  0
 V1-70 V2-424 V3-644 V4-11   ..fc1: 0   ..fc2:  0   ..fc3:  1   ..fc4:  0
 V1-0 V2-420 V3-656 V4-9   ..fc1: 0   ..fc2:  0   ..fc3:  1   ..fc4:  0
 V1-76 V2-425 V3-654 V4-22   ..fc1: 0   ..fc2:  0   ..fc3:  1   ..fc4:  0

Saludos

No le encuentro mucho sentido a esto

  int V1 = analogRead(Vplaca1) ;
  int V2 = analogRead(Vplaca2) ;
  int V3 = analogRead(Vplaca3) ;
  int V4 = analogRead(Vplaca4) ;

y luego

  int Lekfc1 = digitalRead(fc1) ;
  int Lekfc2 = digitalRead(fc2) ;
  int Lekfc3 = digitalRead(fc3) ;
  int Lekfc4 = digitalRead(fc4) ;

porque Vplaca1 = fc1, Vplaca2 = fc2, etc..

O sea, estás leyendo los pines analógicos también como digitales casi simultáneamente.
Revísalo porque en el código original usa pines diferentes.

Saludos

Hola Gatul, no hay nada conectado a los pines digitales, 1 2 3 4 solo 4 foto celdas a los pines A0 A1 A2 A3, y en el monitor Serie fc1 fc2 fc3 fc4 da 1 o 0, si no se iluminan las celdas 0, si se iluminan 1, es una de tantas dudas que tengo con este código, si las comento simplemente desaparecen del monitor Serial.
Saludos.

Si hice cambios en los pines de motores, y también cambie algunos de los que recolectan información. Si tiene mas de un sentido que aparentan no tener sentido.

:interrobang:

Yo no dije nada de los pines 1, 2, 3 y 4, estoy hablando de A0, A1, A2 y A3, justamente.

Me encanta tu entusiasmo pero sigues a los saltos en lugar de ir paso a paso.

¿Estás leyendo una señal analógica o digital?

Si la fotocelda te entrega una salida 0 ó 1 según reciba o no luz, ¿para qué la lees de forma analógica si sabes que vas a obtener solo 2 valores, 0 ó 1023?

En cambio si devuelve una señal analógica según la cantidad de luz recibida ¿para qué la lees de forma digital?

Un nivel bajo (verifícalo en la hoja de datos del micro) debe ser menor a 0.3xVcc y un alto superior a 0.6xVcc, entonces para 5V de alimentación para leer un LOW (0) la señal debe ser inferior a 1.5V, por el contrario un HIGH (1) debe ser superior a 3.0V.
¿Y que valor obtienes si la señal está entre 1.5V y 3.0V?
Por ser un estado indefinido obtendrás lo que al micro "se le ocurra".

Entonces, si es el primer caso, las sentencias analogRead() no tienen sentido.
Y si es el segundo caso, ¿no es más lógico hacer algo así?

int V1 = analogRead(Vplaca1) ;
int Lekfc1 = V1 > 310;    // yo la definiría bool

por ejemplo, para que si el nivel es mayor a 1.5V lo considere 0 y si es superior, 1.

Si claro eso si tiene sentido ( int Lekfc1 = V1 > 310;) eso de leer los pines digitales, ya estaba en el código, yo no lo escribí y si lo que yo necesito, es la lectura entre 0 y 1023 en norte sur, este oeste, para que haga el rastreo, con ceros y unos no creo que funcione el rastreo, esto digitalRead(fc1) ; terminara desapareciendo del código, lo que ahora esta echo un desastre son las llaves { en el vod loop. Ahora empiezo a hacer pruebas con int Lekfc1 = V1 > 310; haber que resulta.

Si pero sobre otros pines (6, 7, 8 y 9), no sobre los analógicos.

Si en otros pines que use para los motores nema

Ya probe tu sujerencia.

int V1 = analogRead(Vplaca1) ;
int Lekfc1 = V1 > 310;  

Esto ya quedo comentado int Lekfc1 = digitalRead(fc1) ; gramatical mente, ya mejoro los motores actúan igual era de esperarse, toda vía no hemos llegado a esa parte

Hice esto y cambio el comportamiento de los motores

int Lekfc2 = V1 < 510; 

Se activaron ambos motores, con muy poca luminosidad en el A2, esta sugerencia no solo mejoro la sintaxis, tiene efecto en el comportamiento de los motores.

Lógico porque así estás negando la entrada.
Lekfc2 es true cuando la tensión en la entrada es menor a 2.5V

lekfc2 y si es mayor 2.5v es false?, hay un renglón que se repite 6 veces solo cambia las variables de comparacíon no acabo de entender como lo hace.

// 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 {

En este grupo //left move quite las llaves de for y su respectivo cierre.

En este bloque tiene las llevas del bucle for.
si le quito a los seis bloques las llaves se congelan los motores, si le pongo llaves a los seis bloques, se congelan los motores, si le pongo aleatoria mente llaves, a algunos bloques los motores cambian, su comportamiento, y no doy con el correcto no e intentado ; ni ;{

   //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 {



V1-173 V2-86 V3-35 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-173 V2-88 V3-35 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-177 V2-87 V3-36 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-178 V2-87 V3-39 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-180 V2-89 V3-37 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-176 V2-86 V3-38 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-173 V2-85 V3-37 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-175 V2-84 V3-39 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-175 V2-85 V3-40 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-176 V2-87 V3-40 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-176 V2-86 V3-40 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-176 V2-86 V3-40 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-175 V2-84 V3-41 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-172 V2-83 V3-37 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1
V1-176 V2-83 V3-40 V4-1023 ..fc1: 0 ..fc2: 0 ..fc3: 0 ..fc4: 1

Sigue imprimiendo la  celda solar que esta iluminada.

No se trata de poner o quitar llaves, se trata de entender qué es lo que estás haciendo.

Cuando te dije que prestases atención a las llaves y demás era porque tenías errores, no para que "juegues" con ellas.
El lenguaje tiene una sintaxis que hay que respetar.

Y si, si es mayor a 2.5V lekfc2 es false, obviamente.

Saludos

Hola Gatul, disculpa el termino jugar, ( no lo vuelvo a usar) es mi forma de llamar a al viejo termino, prueba error, hasta donde tengo entendido, cada bloque debe tener su llave de inicio y de final, como void loop tiene una al inicio y otra al final, pero dentro de cada bloque hay llaves, en ocasiones acompañadas de ;, y aquí hay cuatro bloques, con con dos sub bloques cada uno, y no e podido englobar cada uno de los dos sub bloques, que lleva cada bloque, sabrás de algún enlace que hable de llaves y ;, si sabes de alguno seria excelente.
Saludos.


Moderador:
Personalmente me pregunto porque no unes todos los hilos en uno solo hasta darle fin
Le pones a algo solucionado y a las 3 hs abres otro hilo relacionado. Los hilos se cierran automáticamente en 4 meses pero mientras, quedas en una situación de doble posteo.
Sería bueno que concentres aquí, todas tus dudas hasta agotar stock, se entiende la analogía.

Hola @Surbyte, Este es otro tema, el anterior era un termómetro, para un calentador solar de agua, este es un seguidor del sol, para unos paneles foto voltaicos se parecen pero para nada son lo mismo, este lleva 2 motores para que las foto celdas estén perpendicularmente hacia el sol, y mejorar su eficiencia, el otro es una persiana que abre y cierra, para evitar que el agua llega a hervir,

Ok. ya veremos.

Hola @Surbyte, digame que debo hace,r no quiero que echen del foro, si usted considera que que este hilo no tiene razon de existir, digame como lo integro al hilo anterior, o a donde usted decida, en el otro hilo que esta solucionado solo queria subir un esquema para complementar el los códigos, y agregar la URL a los 2 códigos que funcionan, yo pregunte si era correcto antes de hacer lo, pero si lo correcto es que no toque, no lo toco, con toda confianza dígamelo, y si ve el código de este hilo como parte del otro usted decida que hago.
Saludos

Tranquila @silvia, cuando algo esta mal yo lo expreso en letras verdes.
Tienes razón son dos temas diferentes. Contínúa.