Go Down

Topic: Consulta NOVATO ( Control Relés mediante RS232) (Read 487 times) previous topic - next topic

macallan

Apr 19, 2014, 10:42 pm Last Edit: Apr 20, 2014, 08:55 pm by macallan Reason: 1
Hola amigos,
tengo un arduino uno + placa de 8 reles y me gustaría poder hacer lo mismo que hace esta placa que os envio en el enlace.
La comunicación se realizaría mediante el protocolo RS-232 (9600, n, 8, 1).
Y cada vez que recibamos uno nuevo byte por el puerto RS232 , actualice el estado de relés de la placa.

Las entradas de la placa no las necesito, solo las salidas de relés y la recepción de datos del puerto serie.


PS6E8S              (6 entradas logicas 8 salidas reles)
http://www.micropik.com/pag_puertos.htm

Alguien me puede ayudar con este proyecto, de momento he realizado un proyecto que con alguna modificación, podría servir.

¿no creeis?

Espero vuestra ayuda... (SOY NOVATO)

http://forum.arduino.cc/index.php?topic=234412.0

noter

No es en absoluto complicado, aunque hay alguna cosa que no me casa del todo. Si se recibe 00000101  ¿debería activar el relé 5 o bien apagar los reles correspondientes a los ceros y encender los de los unos (Es decir, encender el relé 0 y el 3 y apagar el resto)? Lo digo porque me parece enrevesado que hables de binario para decir que si se recibe 5 activar el relé 5.
Este código (está sin probar) debería hacer algo parecido a lo que te decía como segunda opción.
Code: [Select]

int PIN_LED[8]={5, 6, 7, 8, 9 , 11, 12, 13};

void setup()
{
  Serial.begin(9600);
  for (int i=0; i<8; i++) {
        pinMode(PIN_LED[i],OUTPUT);
        digitalWrite(PIN_LED[i],LOW);
  }
}

void loop()
{
      if (Serial.available()){
            byte recibido=Serial.read();
            for(int i=0; i<8; i++){
                  digitalWrite(PIN_LED[i],recibido & 1);
                  recibido>>=1;
            }
      }
}

noter

Como ves, el código de base es muy sencillo. Tan sólo habría que cambiar la interpretación que queremos hacer del byte recibido. En el código que te he puesto yo, en un solo byte se encienden/apagan los ocho relés. Es decir, si envío 10101010, encenderá los relés 1,3,5 y 7 y apagará los 0,2,4 y 6 (como ves los cuento de 0 a 7 y no de 1 a 8). El método que propones tú me parece un poco lioso, aunque también se puede implementar. ¿Es como trabaja la placa "original", o es como lo has ideado tú?


noter

Entonces el código que te he puesto debería hacer prácticamente lo mismo. ¿Lo has probado?
Otra cuestión: ¿Con qué programa enviarás los bytes de control por el puerto?
Saludos.

noter

No te entiendo muy bien qué quieres decir con "a medias" si dices que siempre están todos los relés en ON. Eso sería más bien que no hace nada.
Tal vez ocurra que los relés (en muchos casos es así) trabajen con lógica invertida. Prueba a cambiar en setup la línea
digitalWrite(PIN_LED,LOW);
por
digitalWrite(PIN_LED,HIGH);

y en loop la línea
byte recibido=Serial.read();
por
byte recibido=~Serial.read();

Ya me contarás.
Saludos.

Go Up