I2C Bus en el PLC Arduino para automatización industrial

Uso del Bus de Circuito Inter-Integrado (I2C)
11 de febrero de 2020 por
I2C Bus en el PLC Arduino para automatización industrial
Boot & Work Corp. S.L., Support Team

        Index

        1. Introducción
        2. Requisitos
        3. I2C protocol
        4.  Advantages and Disadvantages
        5. Typical I2C connections
        6. Hardware
        7. Software

        Introducción

        En este post hablaremos del bus I2C bus, una de las comunicaciones disponibles en toda la gama de los PLCs industriales de Industrial Shields.

        El bus I2C es interesante porque, del mismo modo que sucede con el bus SPI, un gran número de dispositivos tienen una conexión I2C, como acelerómetros, brújulas, pantallas, etc.

        Requisitos

        En el esquema del que partiremos, hemos usado un M-Duino 21+, pero toda la gama de Arduino PLC industriales de Industrial Shields también se puede usar con la misma finalidad:


        - WiFi & Bluetooth Controller Family

        - 20 E/S Familia de controladores 

        - Familia de controladores Ethernet

        - Familia de controladores GPRS / GSM


        I2C protocolo

        Este protocolo estándar (Inter-Integrated Circuit) fue desarrollado por Philips en 1982 para la comunicación interna de los dispositivos electrónicos de sus artículos. Posteriormente, fue adoptado gradualmente por otros fabricantes hasta convertirse en un estándar del mercado.

        En el bus I2C, cada dispositivo tiene una dirección, que se utiliza para acceder a los dispositivos individualmente. Esta dirección puede establecerse por hardware (en cuyo caso, con frecuencia, los últimos 3 bits pueden modificarse mediante puentes o conmutadores) o completamente por software.

        En general, cada dispositivo conectado al bus debe tener una dirección única. Si tenemos varios dispositivos similares, tendremos que cambiar la dirección o, si no es posible, implementar un bus secundario.

        El bus I2C tiene una arquitectura maestro-esclavo. El dispositivo maestro inicia la comunicación con los esclavos y puede enviar o recibir datos de los esclavos. Los esclavos no pueden iniciar la comunicación (el maestro tiene que preguntarles), ni hablar entre ellos directamente.

        El bus I2C es síncrono. El maestro proporciona una señal de reloj, que mantiene todos los dispositivos en el bus sincronizados. Esto elimina la necesidad de que cada dispositivo tenga su propio reloj para tener que acordar una velocidad de transmisión y mecanismos para mantener la transmisión sincronizada (como en UART).

        Para poder comunicarse con un solo cable de datos, el bus I2C utiliza un marco amplio. La comunicación consiste en:

        - 7 bits a la dirección del dispositivo esclavo con el que queremos comunicarnos.

        - Un bit restante indica si queremos enviar o recibir información.

        - Un bit de validación.

        - Uno o más bytes son los datos enviados o recibidos del esclavo.

        - Un bit de validación.


        Bus I2C - Bus I2C en PLC Arduino para la automatización industrial

        El protocolo I2C proporciona resistencias pull-up de las líneas Vcc.


        El uso de resistencias suaves significa que los bordes ascendentes de la señal serán menos rápidos, por tanto, podemos usar velocidades más bajas y distancias de comunicación más bajas. Si queremos usar velocidades más altas o distancias de transmisión, debemos colocar físicamente resistencias pull-up entre 1k y 4K7.

        Here puedes encontrar resistencias I2C con adaptador de riel DIN.



         Ventajas y desventajas

                     

        Ventajas:

        • Requiere pocos cables.
        • Tiene mecanismos para verificar que la señal ha llegado correctamente.
           

        Desventajas: 

        • Su velocidad es media-baja.
        • No es full duplex.
        • No hay un sistema de verificación que nos diga que el contenido del mensaje es correcto..

        Conexiones I2C típicas

        Conexiones I2C - Bus I2C en PLC Arduino para la automatización industrial

        Como podemos ver en esta imagen, la forma de hacer la conexión es simplemente colocando cada pin SDA y SCL de los dispositivos en las líneas generales del maestro. Aquí puede consultar nuestra Resistencia I2C Pull-Up con adaptador de riel DIN.


        Hardware

        Cada controlador lógico programable de Industrial Shields tiene los pines SCL y SDA. Consulte el Manual del usuario de su versión de controlador PLC industrial para ver dónde se encuentran estos pines. Aquí tienes el ejemplo arduino del controlador M-Duino 21+:


        Ejemplo de Arduino - Bus I2C en PLC Arduino para la automatización industrial


        Software

        Para utilizar el puerto Wire en Arduino, el estándar IDE proporciona la biblioteca "Wire.h" que contiene las funciones necesarias para controlar el hardware I2C integrado.

        Función Begin:

        Wire.begin();            // Starts the I2C bus as master or slave

        Para solicitar bytes de un dispositivo esclavo, utilizado por el maestro.

        Wire.requestFrom();             // If true, sends a stop message after the request, releasing the I2C bus.

                                                              // If true, sends a restart message after the request, the bus won't be released, which prevents another master                                                             device from requesting between messages. This allows one master device to send multiple request while in                                                                             control.  The default value is true.

        Comienza una transmisión al dispositivo esclavo I2C con la dirección dada.

        Wire.beginTransmission();          // The 7-bit address of the device to transmit.



        Termina una transmisión a un dispositivo esclavo que fue iniciada por beginTransmission() transmite los bytes que fueron puestos en cola por write().

        Wire.endTransmission();        // If true, endTransmission() sends a stop message after transmission, releasing the I2C bus.
                                       
                                       // If false, endTransmission() sends a restart message after transmission. The bus won't be released, which
                                          prevents another master device from transmitting between messages. This allows one master device to send
                                          multiple transmissions while in control.

        Escribe datos desde un dispositivo esclavo en respuesta a una solicitud de un maestro, o pone en cola bytes para su transmisión desde un maestro a un dispositivo esclavo (entre las llamadas a beginTransmission() y endTransmission().

        Wire.write();                   // Will return the number of bytes written, though reading that number is optional.

        Devuelve el número de bytes disponibles para recuperar con read(). Debe llamarse en un dispositivo maestro después de una llamada a requestFrom() o en un esclavo dentro del manejador onReceive(). 

        Wire.available();                // Will return the number of bytes available for reading.

        Lee un byte que fue transmitido desde un dispositivo esclavo a un maestro después de una llamada a requestFrom() o fue transmitido desde un maestro a un esclavo. read() hereda de la clase de utilidad Stream.

        Wire.read();                     // Will return the next byte received.

        Esta función modifica la frecuencia del reloj para la comunicación I2C. Los dispositivos esclavos I2C no tienen una frecuencia mínima de reloj de trabajo, sin embargo, 100 KHz suele ser la línea de base.

        Wire.setClock();                 // ClockFrequency: the value of desired communication clock. 
                                            Accepted values are 100000(std mode) and 400000(fast mode).    
                                            Also some processors support 10000(low speed mode),1000000(fast mode plus) and 3400000(high speed mode).

        Registra una función a llamar cuando un dispositivo esclavo recibe una transmisión de un maestro.


        Wire.onReceive(handler);          // handler: the function to be called when the slave receives data; this should take as parameter the number
                                             of bytes read from the master and returns nothing.

        Registra una función que se llamará cuando un maestro solicite datos de este dispositivo esclavo.

        Wire.onRequest(handler);           // handler: the function to be called, takes no parameters and returns nothing
        handler: the function to be called, takes no parameters and returns nothing.

        Guía de cables - Bus I2C en PLC Arduino para la automatización industrial 


        Buscar en nuestro blog

        I2C Bus en el PLC Arduino para automatización industrial
        Boot & Work Corp. S.L., Support Team 11 de febrero de 2020
        Compartir

        ¿Estás buscando tu Controlador Lógico Programable ideal?

        Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

        Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


        Comparación de PLCs industriales >>>