Control techo motorizado (observatorio)

Hola que tal buenas tardes noches, estoy realizando un proyecto de robotización con Arduino de un techo para un observatorio astronómico. Básicamente es un sistema con un Arduino UNO, una placa de relés, dos sensores para confirmar estado abierto o cerrado y un motor CC 12V. Estoy intentando utilizar una compilación realizada por Cfar ( Rolling Roof Computer Interface (RRCI) - Hackster.io) el código inicial no funciona y fue modificado por brucegarner para que funcionara correctamente con software Ascom. El sistema funciona correctamente para sistemas de puertas automáticas donde solo necesitan una señal de un relé para abrir y para cerrar y el resto lo hace el sistema de apertura de puerta de garaje. Yo quiero modificarlo para utilizar dos relés para abrir y dos para cerrar con las confirmaciones de abierto y cerrado, he intentado innumerables maneras con mi poca lógica de programación y ayudado muchas veces por Chatgpt pero no logro que funcionen correctamente los relés o que se pare al llegar a los sensores y he llegado a un punto después de tres días y demasiadas horas en la pantalla para intentar hacerlo funcional. Incluso si añado una pantalla I2C me da fallo en el driver no reconociéndolo. si me pudieran echar una mano, que no sea al cuello, os lo agradecería, o si ya conocéis algún sistema con Arduino compatible con Ascom como el que quiero implementar yo agradecido. Os dejo el código y gracias por adelantado:

String serialin; //incoming serial data
String str; //store the state of opened/closed/safe pins

//relays
#define stop 4
#define sensor 5
#define close 6
#define open 7

//input sensors
#define opened 11  // roof open sensor
#define closed 12  // roof closed sensor
#define safe 13   // scope safety sensor

int led = 10; // the pin the scope safe LED is connected to

unsigned long end_time;
bool lost = false; //roof not reporting state

void setup() {
end_time=millis()+60000; //roof lost reset timer ~60 seconds  change to suit your rquirments to determine if roof is lost

  //Begin Serial Comunication(configured for 9600baud)
  Serial.begin(9600);
  //pin relay as OUTPUT
  pinMode(open, OUTPUT); 
  pinMode(close, OUTPUT);
  pinMode(stop, OUTPUT);
  pinMode(sensor, OUTPUT);
  
  //pins as INPUT
  pinMode(closed, INPUT_PULLUP);
  pinMode(opened, INPUT_PULLUP); 
  pinMode(safe, INPUT_PULLUP);
   
  //Relay state
  digitalWrite(open,LOW);
  digitalWrite(close,LOW);
  digitalWrite(stop,LOW);
  digitalWrite(sensor,LOW);
 
  Serial.write("RRCI#"); //init string
   
}

void loop() {
  Timer();

  if (digitalRead(safe) == LOW){
    
     digitalWrite(led, HIGH); // Turn the LED on
  }
  else if (digitalRead(safe) == HIGH){
    
    digitalWrite(led, LOW); // Turn the LED on
  }
  
  //Verify connection by serial
  while (Serial.available()>0) {
    //Read Serial data and alocate on serialin
 
    serialin = Serial.readStringUntil('#');

     
     if (serialin == "on"){ // turn scope sensor on
      digitalWrite(sensor,HIGH);
     
      }

     if (serialin == "off"){ // turn scope sensor off
      digitalWrite(sensor,LOW);
     
      } 
  
    if (serialin == "x"){ 
      digitalWrite(open,LOW);
     
      }
    
    else if (serialin == "open"){ 
        if (digitalRead(sensor) == LOW){//turn on IR scope sensor
           digitalWrite(sensor,HIGH);
        }
        delay(1000);
        if (digitalRead(safe) == LOW){//open only if scope safe
           digitalWrite(open,HIGH);
           //delay(1000);
          digitalWrite(sensor,LOW);
        }
      }
      if (serialin == "y"){ 
      digitalWrite(close,LOW);
      
      }
   
    else if (serialin == "close"){ 
        if (digitalRead(sensor) == LOW){//turn on IR scope sensor
           digitalWrite(sensor,HIGH);
        }
        delay(1000);
        
        
        if (digitalRead(safe) == LOW){//close only if scope safe
           digitalWrite(close,HIGH);
           //delay(1000);
           digitalWrite(sensor,LOW);
        }
       
      }
  }  

 if (digitalRead(closed) == LOW) { //stop relays when 'closed' reached
      if (digitalRead(close) == HIGH){//relays low if it was high
      digitalWrite(close,LOW);
      }
     
  }
if (digitalRead(opened) == LOW) {  //stop relays when 'opened' reached
       
      if (digitalRead(open) == HIGH){//relays low if it was high
      digitalWrite(open,LOW);
      }
  }
if (serialin == "Parkstatus"){ // exteranl query command to fetch RRCI data
  
  Serial.println("0#");
   serialin = ""; 
  }
 
if (serialin == "get"){ // exteranl query command to fetch RRCI data - Two Pipelines(||) to make a boolean OR Comparission
  
  if (digitalRead(opened) == LOW){
     str += "opened,"; 
        
  }
  else if (digitalRead(closed) == LOW){
     str += "closed,";
  }
  
  if ((digitalRead(closed) == HIGH) && (digitalRead(opened) == HIGH)){
       str += "unknown,";
  }
  
  if (digitalRead(safe) == LOW){
     str += "safe,";
     
  }
  else if (digitalRead(safe) == HIGH){
    str += "unsafe,";
    
  }
  
   if ((digitalRead(closed) == HIGH) && (digitalRead(opened) == LOW) && (lost == false)){
     str += "not_moving_o#";
     end_time=millis()+60000; //reset the timer
   }
   
  if ((digitalRead(closed) == LOW) && (digitalRead(opened) == HIGH) && (lost == false)){
     str += "not_moving_c#";
     end_time=millis()+60000; //reset the timer
   }
  if ((digitalRead(closed) == HIGH) && (digitalRead(opened) == HIGH) && (lost == false)){
       str += "moving#";
       
  }     
  else if ((digitalRead(closed) == HIGH) && (digitalRead(opened) == HIGH) && (lost == true)){   
      str += "unknown#";
  }
  if (str.endsWith(","))  {
    str += "unknown#";
  }
 
 Serial.println(str);  //send serial data
 serialin = "";  
 str = "";
//delay(100);

}
 if (serialin == "Status"){
  Serial.println("RoofOpen#");
  
 }
serialin = "";  
//str = "";
  } 
   
void Timer(){ // detect roof lost
  if(millis()>=end_time){
     //60 s have passed!!
      if ((digitalRead(closed) == HIGH) && (digitalRead(opened)) == HIGH){
       lost = true; //where the heck is the roof position?
     }
     
             
  } 
    if ((digitalRead(closed) == LOW) or (digitalRead(opened)) == LOW){
             lost = false; //roof state is known
             end_time=millis()+60000; //reset the timer  
  }
 
}

Y cual es el problema? Quieres poner dos reles. Olvida todo lo que ChatGPT te sugirió, porque no acierta 1. Y cuando digo que no lo hace es porque todos lo hemos probado.
Asi que baraja y da de nuevo.
Quieres agregar dos reles? supongo ya estan, en el esquema de Rooling Roof veo 4 reles y en el tuyo 4 de modo que o no los agregaste o no se?
Cuales son los sensores extra, tampoco los agregaste?
Por favor, intenta ir por un problema a la vez, no todos juntos, porque primero hay que entenderte.

Hola que tal siento haber sido tan vago en mis explicaciones y tampoco entender el contexto de tu hermosa literatura resumiré un poco:
Tu pregunta: Cuales son los sensores extra, tampoco los agregaste?
Mi respuesta:no hay en ninguna parte del texto que exponga que quiera sensores extra.
Tu pregunta: Quieres agregar dos relés? supongo ya están, en el esquema de Rooling Roof veo 4 relés y en el tuyo 4 de modo que o no los agregaste o no se?
Mi respuesta Yo quiero modificarlo para utilizar dos relés para abrir y dos para cerrar actualmente el código expuesto solo activa un relé
Tu escritura: Por favor, intenta ir por un problema a la vez, no todos juntos, porque primero hay que entenderte.
Mi respuesta: Solo hay un problema, en vez de utilizar un solo relé para abrir y cerrar quiero utilizar un dos relés (ejemplo 7 y 8 para abrir) y dos relés para cerrar (ejemplo 6 y 2) el problema que tengo es que un que modifique el código no funciona, los sensores finales de carrera son para exponer que si esta abierto la función abierta no pueda activarse ya que rompería el sistema de transmisión y lo mismo para cerrado el código mostrado es el original, lo expongo porque quizás haya algo en la lógica del programa que impida esas nuevas funciones y como yo no se programación pido ayuda, si es muy complicado me lo comentáis, tampoco quiero ser una molestia o generar una perdida de tiempo para ambas partes.
Un saludo

Las confirmaciones de abierto y cerrado son sensores, pueden ser switches o contactos del propio rele pero no dejan de ser sensores o como los llamas tu?

Pero para que dos reles, son como una accción redundante? cual es el objetivo de poner dos reles?

Supongamos que te comprendo. Luego veré como modifico el código para agregar 2 para abrir y dos para cerrar. No entiendo para que sirven.
Es solo agregar el rele EXTRA en cada caso. Si uno abre pones el segundo que abre y si uno cierra pones el segundo que cierrra y listo.
Luego miro el código.

El código original tampoco me gustó mucho, pero mas allá de eso ahora tengo una mejor idea de qué quieres/buscas.

Dos relés para el cambio de polaridad (cambio de dirección: Abrir/open ; cerrar/Close ya que es un motor CC. Como los relés solo tienen dos salidas: una NC y otra NO, se utilizaran 4 , dos para abrir el techo y los otros dos para cerrarla, el NC de los dos primeros relés irán a el común de los de abrir así se evita cortocircuito en caso de mal funcionamiento del Arduino, adjunto en ejemplo. Gracias por tu ayuda.

Si quieres me puedes hacerme saber que tengo que tener en cuenta para modificar el código y así intentarlo yo

El motor de CC de que tension/corriente/potencia es?

Esto es lo que tienes que hacer. Dos Reles permiten que la corriente vaya de + a - en una dirección. Y los otros dos en la dirección opuesta.
Este link te dice como

Pero de acuerdo a la tensión y corriente, tal vez puedas usar un Puente H que hace todo mucho mas fácil aunque como dije depende de esos factores.
No creo que sea un motor chico.

Esto tmb deberia funcionar y ahorras 2 reles

Si pones RELE1 ON supongamos que le das +12V y con RELE2 en OFF tienes GND y el motor gira en un sentido.
Invertidos el motor gira al reves.

Si ese sistema es básico pero no se puede utilizar en ningún sistema, motivos: una de las direcciones estará siempre con tensión eso es igual a rotura de componentes, es necesario implantar uno a mas relés para cortar alimentación del circuito del motor. Utilizar los finales de carrera para corte de alimentación de sistema principales no es posible por seguridad. El mejor sistema es el que he expuesto, eso o dos contactores que activarían dos relés. Contactores tengo un buen surtido si quieres realizar la función con dos relés yo tremendamente contento, un rele para abrir y otro para cerrar le implanto un contacto auxiliar NC a cada contactor asi evito cortocircuito. adjunto imagen

También puedes conmutar ambos relés al mismo potencial, no circula corriente y ahorras un par de relés
Perdón, repito lo que te dijo @Surbyte

Con este nuevo esquema se puede utilizar, sistemas de corriente CC, CA monofásica y CA trifásica, todos para ambos sentidos, por si a alguien le interesa. AL igual que también comento que si puedo ayudar a alguien en esquemas eléctricos aquí estoy.

No me gusta que los sistemas de motores tengan tensión ya sea CC o CA si no están activos, llámame esquizofrénico pero en mi trabajo corremos riesgos eléctricos y la seguridad es la diferencia entre quedarte en el trabajo y volver a casa.

Yo entendía que trabajabas con 12V y por eso compartía la sugerencia de @Surbyte .

Supongo que entendimos mal... :thinking:

Dijiste que era un motor de CC no se que tensión.
Aun cuando el motor de CC sea de potencia, puedes usar las ideas que te puse o un puente H que maneje la potencia adecudada. Cual es el problema?

Os desviáis del tema, la tensión es indiferente y no tiene valor en el código, los puentes H no tienen seguridad y por ultimo me gusto la idea de utilizar dos relés. Problema ninguno, entiendo que el código expuesto es difícil, tampoco quiero meteros en un apuro, si ChatGPT ni yo pudimos .... XP

O sea, yendo al grano, quieres que alguien haga el código para tu proyecto porque el que tienes no te sirve.
¿Estoy en lo correcto?

No, un código nuevo no se si seria viable ya que va comunicado con un driver y tendrá que ser compatible con el mismo, yo solo quiero utilizar el mismo código pero activando una relé para apertura y otro para cerrar, como dije lo intente de muchas maneras pero no funcionaba, por eso buscaba ayuda de profesionales a ver si veían algo en el código que a mi se me escapa y por eso tengo esos problemas. Siempre hablando de mi poca experiencia en programación con Arduino.
Un saludo

Todo solucionado, muchas gracias.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.