Go Down

Topic: RS485 (Read 23840 times) previous topic - next topic

Igor R

Adaptador RS232- RS485 con control de pin envio/recepción automático.
http://pwillard.com/?p=60


;)

Igor R

Ya tengo finalizado la placa para el Mega!!

RS485 + LCD + 3 botones + VNC1








Igor R.

FrankRadio

Interesante proyecto con RS485, yo estoy trabajando en algo parecido pero necesito un detalle mas.

No quiero utilizar dos pares de cables, solamente un par.
La idea es poder enegizar mi CPU y sus sensores por el mismo par que tiene alimentacion + RS-485. :o

No se si el 485 tiene considerada esta situacion, seguramente habra que resolver un tipo de hibrido como para incluir la señalizacion en el mismo par que esta la continua, no se si ese transceiver esta completamente aislado o si se debe aislar como se realiza con los transceivers de ethernet.  ;D

Muchas Gracias
Francisco

Cristal

Hola Igor,

Necesito utilizar una RS485 quizas de una forma un poco diferente, o sea, del master sale un par de hilos para cada slave,

master _____slave
          |_____slave
          |_____slave

No tengo como llevar de un slave para otro

master_____slave____slave_____slave

Como devo hacer la terminacion en este caso?

Saludos,


Igor R

#34
Aug 21, 2009, 07:49 am Last Edit: Aug 21, 2009, 07:51 am by igorreal Reason: 1
Hola,

Da igual que sólo haya un master. Realiza el conexionado como el diagrama que puse en un post anterior.

Es decir, el par de hilos van pasando del Master ==> Primer Slave ==>Segundo Slave ==> y así sucesivamente....

Yo lo que hago siempre (en redes CAN que es similar), usar conectores de 4 o 5 pines. Me hago un convenio, por ejemplo:
- Pin 1= 5 volts
- Pin 2= RS 485 A
- Pin 3= GND
- Pin 4= RS 485 B

En cada dispositivo, me hago una Y con un conector macho y otro hembra. Es decir, de tu dispositivo, sacas 4 cables (5v,gnd,A,B) y a menos de 10 cm, haces uniones soldadas para tener todas las señales duplicadas.  De esta forma, puedes ir intercalando dispositivos siempre que quieras....

Lo que me refiero con esto, es que es estructura de bus, no tienes que sacar del master dos cables a cada uno de los slaves.... Es el mismo par, recorriendo cada uno de los dispositivos (para entendernos)

Luego,te puedes hacer un par de conectores contrarios a los que te queden en los extremos con una simple resistencia 120 ohm soldada entre pin 2 y pin 4 para cerrar el bus.


Los dos cables de comunicaciones (A y B) deben ir trenzados. Si es mucha distancia y vas a usar cables normales, puedes usar un taladro para trenzarlos (unos extremos atrapados con un tornillo de banco y los otros en el taladro(como si metieses una broca y lo cierras, al darle caña al taladro te irá trenzando el par perfectamente).

Espero haberme explicado medio bien..... ;)




Igor R.

Igor R

Puedes ver el link, está bastante bien con gráficos:
http://www.rs-485.com/download/485%20network%20topology.pdf

El problema es que se suelen encontrar gráficos de un bus paralelo en el cual los dispositivos se van conectando, y no es la manera correcta. Esta bien para explicación, pero no es la forma física correcta de cablear.
Me refiero a esto:



Al verlo, es confuso....

Para mi, la forma correcta es:
      ______   __________   ___________
     |           \/                  \/
MASTER     Node 1            Node 2     .....


;)



David Cuartielles

Igor: has echo un monton de trabajo con esto, no te interesaria pasar a publicarlo en el Playground? Si necesitas ayuda con el ingles, podrias hacer el articulo en español y luego buscamos la forma de traducirlo.

/d

Igor R

Hola David,

Podría hacerlo también en ingles... De hecho, tenía pensado hacerlo pero me da pereza....je,je,je     ;)

¿Qué hay que hacer para publicar?



Cristal

Hola Igor, que tal?

Vuelvo otra vez con mas problemas:

Tengo un master y dos slaves, el master envia una solicitacion a mi primero slave para que haga algo, despues que el slave hace la tarea (que no se cuanto tiempo llevará pues depende de sensores) tengo que pedir que el segundo slave haga su tarea.

Pregunto, el primero slave despues de terminar su tarea pude enviar un comando RS485 para que el segundo slave inicie su tarea, o solo el master puede enviar comandos a los slaves?

Si solo el master puede enviar los comandos, como el slave indica al master que el terminó su tarea?

Otro problema:

El slave esta ejecutando una tarea en loop, como puedo salir deste loop con un comando del master?

saludos,
Cristal

Igor R

Hola Cristal,

Tienes que pensar que el protocolo lo haces tú. El RS485 sólo te indica la primera capa (física), por lo que todo lo demás es decisión del diseñador.

Puedes hacer que cualquiera mande mensajes, no tiene que ser el master. Lo que pasa que se habla de master y esclavos para que no haya un caos. Es decir, que no se pongan varios dispositivos a intentar enviar a la vez datos.  Si quieres buscar un poco de teoría para leer acerca de esto, puedes buscar "token ring".

Puedes hacer que el "master" vaya cambiando, y así tenerlo todo controlado. Puedes ir pasando el "relevo" a tus dispositivos y que cambien a ser "master".

De todas formas, por lo que cuentas, puedes hacer que el master manda una orden al slave 1, y te quedas a la espera que te conteste que ha terminado (puede contestarte con un ACK para saber que ha recibido la orden, pero esperas a que te consteste un mensaje de fin de la tarea). Cuando te ha constestado, el master manda al slave 2 que realice la tarea que le corresponda. Si no he entendido mal es algo secuencial, primero tiene que acabar el slave1, para que comience el slave2, por lo que facilita todo....

También tienes que pensar, que tu master puede mandar un mensaje que sea para todos los slaves (imaginemos que manda la hora para sincronizar el reloj de todos los slaves, ó una orden de todos a "off", ...). Como dije antes, es 100% configurable, ya que lo haces tú... (eso siempre puede llevar peligros... ;)).
Por ejemplo, puedes hacer que el mensaje con dirección 0xFF sea global....

Tener un sólo "master" siempre que sea posible, facilita la programación, ya que tendrás 100% controlado el flujo de tu programa y no te complica el protocolo....

Acerca de lo del loop, puedes poner condiciones dentro que si se cumplen se hagan... Por ejemplo:

loop()
{
    hay mensaje? --> si lo hay lo leo
    si hay_mensaje y dirección==mi_direccion y funcion==A01, ....
    {
           tareas que quiero realizar
    }
    si hay_mensaje y dirección==mi_direccion y funcion==A02, ....
    {
           tareas que quiero realizar
    }

    ....

}



O puedes usar estructura switch case para hacer lo mismo.


Una forma de programar, que a mi me gusta mucho cuando los procesos son secuenciales, es la programación de estados. No sé cual es el nombre técnico.... En autómatas lo he visto como Grafcet.
Hay veces que pensando en programación lineal te haces un lio y te dejas casos, y usando ésto en un momento tienes todo funcionando y controlado.... Además pensarlo con papel y boli antes de ponerte a tirar lineas, siempre ayuda...



Saludos   ;)




Igor R.



Cristal

Muchissimas gracias outra vez Igor, todas las dudas aclaradas.  ;D

Saludos,
Cristal

Igor R

Algún día tienes que contarnos que te traes entre manos.... ;)


Cristal

Claro que si Igor, asi que todo marche pongo mi proyeto por aqui.

Seguro que con tu experiencia consigues algo con menos trabajo, hehehe


Igor R

He empezado a hacer un blog, reuniendo toda la información que he publicado por aquí. Intentaré traducir a inglés algunos artículos e iré poniendo más cosillas...
http://real2electronics.blogspot.com/

Saludos!!


;)


Igor R.

Cristal

Excelente iniciativa Igor,

saludos

Go Up