Hola,
He estado jugando un poco con el bus de comunicación RS485. Un bus muy utilizado en automatizaciones y entornos industriales.
El transceiver utilizado es un MAX485:
El motaje:
Son dos Arduinos + una placa de arduino sin el micro conectado para poder utilizar el chip FTDI y monitorizar las tramas en el bus con el ordenador.
Para monitorizar las tramas, así como para la depuración he usado el terminal RealTerm: http://realterm.sourceforge.net/. Es gratuito y permite enviar cadenas en Hexadecimal.
Sólo como receptor, ya que para poder emitir tendría que actuar sobre el pin de control del transceiver MAX485. En el caso del chip FTDI, dispone de un pin para esta función (TXDEN).
Es muy sencillo realizar un conversor USB <- -> RS485 con dicho chip.
La comunicación es Half Duplex, es decir, se puede enviar/recibir mensajes pero no de forma simultanea.
El método de transmisión se trata que el arduino maestro manda una petición y el esclavo manda la respuesta con el dato que se le ha pedido. Estas tramas son similares a las que se pueden encontrar en productos profesionales.
Las tramas son de 15 bytes:
Byte 1: Byte de start ( 0 hexadecimal ).
Byte 2-3: ASCII de la dirección del arduino.
Byte 4: Byte ENQ, ACK ó NAK (0x05h, 0x06h y 0x15h) .
Byte 5: ASCII del comando petición.
Byte 6 y 7: ASCII del número de función.
Byte 8: Byte signo (Positivo 0x20h y Negativo 2D)
Byte 9-12: ASCII con el dato (0x00h-0xFFFFh)
Byte 13: Byte fin de texto (0x03h)
Byte 14-15: Checksum (suma de byte 2 al byte13)
En el ejemplo, el arduino maestro envía la orden de encendido/apagado del led al arduino esclavo. El interruptor está en el maestro y la actuación (encendido/apagado) en el esclavo.
Según el estado del interruptor (en el montaje un triste cable? je,je,je). El maestro envía la trama de petición de encendio/apagado, al esclavo de dirección 01. La función la hemos llamado D y el número 00.
Ej: 0x00 0x30 0x31 0x05 0x44 0x30 0x30 0x20 0x30 0x30 0x30 0x31 0x03 0x01 0xEE
El esclavo, contesta con un ACK al maestro confirmando el dato recibido.
Ej: 0x00 0x30 0x31 0x06 0x44 0x30 0x30 0x20 0x30 0x30 0x30 0x31 0x03 0x01 0xEF
Se puede observar, que el maestro confirma la orden recibida en el byte 4. (6h= ACK).
Ver códigos ASCII:
Con esta trama se dispone de un byte que indica función + 2 bytes con el número de la función, por lo cual se pueden hacer multitud de combinaciones? Algunos ejemplos pueden ser: A01 realiza una petición de datos de la entrada analógica 1, P01 realiza una configuración de PWM 1 con el dato enviado en los 4 bytes de datos,?
Aqui puedes ver un video demostrativo:
Con el bus RS485 resulta relativamente sencillo y económico crear redes. Sencillamente puedes montar una red domótica en casa...je,je,je
Cabe descatar que al igual que el bus CAN, el bus RS485 tiene que terminarse ambos extremos con una resistencia terminadora de 120 ohmios. Cuando se introducen dispositivos entre medio del bus, deben ir conectados lo más cerca posible del transceptor si se está trabajando a altas velocidades.
Puedes ver en la foto del transceptor como se ha realizado un "empalme" (recomendado menos de 15 cm).
Espero que haya quedao más o menos claro....
Salu2
Igor R.