Pages: [1]   Go Down
Author Topic: Consulta NOVATO ( Control Relés mediante RS232)  (Read 421 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: April 20, 2014, 01:55:33 pm by macallan » Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 542
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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;
            }
      }
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas gracias Noter!,
como puedes ver estoy muy pez en Arduino y todo es empezar...
 Mira los codigos serían por ejemplo estos..

Data received: 00000001 Rele 1 Close
Data received: 00000000  Rele 1 Open


Data received: 00000010 Rele 2 Close
Data received: 00000000 Rele 2 Open


De todas formas puedo monitorizar el RS232 con algún software y sacarlos todos.
Pero has visto mi idea no? Con un Arduino uno ( 0 = tx // 1= rx)  + Placa de reles de 8 de Dealxtreme, intentar hacer lo que hace esa placa smiley-wink

Muchas gracias por tu ayuda y aqui estoy para aprender y jugar smiley-wink
« Last Edit: April 20, 2014, 01:58:22 pm by macallan » Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 542
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-cool. 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ú?

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola noter,

Perdona que tenía yo mal la información.
Cuando se cierra el contacto, se pone a 1 el bit correspondiente (el primer bit es el relé 8 y el último es el relé 1).



   (Rele)                               8 7 6 5 4 3 2 1

   Estado                             0 0 0 0 0 0 0               Todos los Reles OPEN
  
   Estado                            0 0 0 0 0 0 1                 Rele 1 Close

   Estado                            0 0 0 0 0 1 0                  Rele 2 Close

  Estado                             1   1  1  1  1  1  1                   Rele 1,2,3,4,5,6,7,8 Close
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 542
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo probaré mañana.
Utilizo un programa realizado en Visual Basic y te cuento a ver que tal.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola noter,
lo he probado y funciona a medias... es decir...
cuando envió 00000001 me pone todos los reles en on
cuando envió 00000010 me pone todos los reles en on

Lo que necesito es que...

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


Cuando envió 00000001 Ponga la salida 5 en ON
Cuando envió  00000000 Ponga la salida 5 en OFF

Cuando envio  00000010 Ponga la salida 6 en ON
Cuando envió  00000000 Ponga la salida 6 en OFF

Cuando envio  00000100 Ponga la salida 7 en ON
Cuando envió  00000000 Ponga la salida 7 en OFF

Cuando envio  00001000 Ponga la salida 8 en ON
Cuando envió  00000000 Ponga la salida 8 en OFF

No se si me explico...
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 542
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: