Comunicación I2C entre Raspberry Pi y Arduino (2) – serialización/deserialización de bytes y sincronización de tiempo

clock_code_complete-3

En el artículo anterior vimos cómo transmitir bytes entre Raspberry Pi y Arduino, una tarea común va a ser la de dividir un valor a transmitir en varios bytes y el ensamblaje de los mismos para recuperar el valor en la parte del receptor.

Un caso típico será el de la transmisión de valores obtenidos de un sensor conectado a un puerto analógico de entrada en Arduino, puesto que el conversor A/D de éste es de 10 bits, querremos transmitir, desde el Arduino, el valor en dos bytes. Para ello podemos usar operaciones de desplazamiento a nivel de bit. El truco consiste en filtrar bits (bitmasking) y desplazarlos (bitshifting).

Como ejemplo, en Arduino C, para obtener y reconstruir los dos bytes que forman un word (16 bits):

En Python la técnica y los operadores son los mismos, aunque podemos hacer uso de la librería struct para simplificar el proceso. Igualmente, para Arduino C, las funciones lowByte() y highByte() nos asistirán para obtener los dos bytes de un word.

Sincronización de tiempo

Ahora toca hablar de una técnica de sincronización de tiempo, que, haciendo uso de una librería, permite a Arduinos mantener un registro temporal relativamente preciso sin necesidad de tener un RTC acoplado. La idea consiste en obtener un valor del exterior que represente el momento temporal actual y hacer que el Arduino lo incremente para mantenerlo siempre actualizado.

Para nuestro ejemplo práctico obtendremos el valor para el Arduino vía I2C de un PI. La actualización y el manejo del tiempo en Arduino correrá a cargo de la librería Time.

Ejemplo práctico

Para el siguiente ejemplo un PI maestro enviará el valor de tiempo actual en formato UNIX timestamp a un Arduino para que éste se sincronice, dicho valor será almacenado en 4 bytes (32 bits, unsigned long). PI serializará dicho valor, lo enviará al Arduino y esté, tras haberlo ensamblado, lo usará para sincronizarse con el PI.

También apuntar que empleamos el valor de registro de entrada en bus.write_i2c_block_data(address, cmd, bytes) (parámetro cmd) en el script de Python como un comando de control que usamos para indicar al Arduino que queremos sincronizar el reloj. Esto será manejado por Arduino a través de un condicional.

A continuación el código, que puede encontrarse en el siguiente repositorio de GitHub.

Arduino

PI

Acerca de

Ver todas las entradas de

2 Responses

  1. Manuel dice

    Hola,
    tengo un caso de comunicaciones entre Arduino y/o Arduinio Raspberry Pi via ethernet o 3G.
    tienes alguna experiencia en esto? Es posible?
    Gracias

    Manuel

    • Víctor Barceló dice

      Hola, no tengo experiencia conectando directamente ese tipo de sistemas vía Ethernet (supongo que te refieres a conexión directa punto a punto sin dispositivos de enrutado de por medio), tampoco tengo de momento un shield 3G para experimentar. Lo que si que te aseguro es que es posible. Si quieres ofrecer más detalles del sistema de comunicación que tienes en mente puedo buscarte información que te sirva de ayuda.

      Un saludo.