top of page
Buscar
  • Coordinador

Conectando múltiples sensores i2c (Sensores láser VL53L1X)


Una de las cuestiones que más se nos han atrancado durante este #ProyectoHEIMDALL radica en la División de Obstáculos.

Para equipar a nuestro casco con un sistema que permita a su portador desplazarse por una estancia con visibilidad nula, estamos prototipando lo que nosotros llamamos el "BATMODE".

Este modo de funcionamiento está constituido por tres sensores láser VL53L1X de distancia que se conectan a Raspberry Pi a través de GPIOs i2c.

El sensor VL53L1X, es capaz de detectar objetos u obstáculos a un máximo de 4 metros. Esta es su hoja de especificaciones (DataSheet).

Si lo comparamos con el sensor de ultrasonidos HC-SR04, tiene mayor precisión que éste, más alcance y puede detectar obstáculos aunque haya humo en el ambiente. Quizá su punto débil puede ser el ángulo de detección.

Encontrarás código de ejemplo y alguna que otra cosa más aquí sobre este sensor.

Los sensores láser están dispuestos para detectar obstáculos que se encuentran en la diagonal izquierda, frente y diagonal derecha del casco.

localización lásers

Mediante scripts Python y Node Red las lecturas de cada uno de los sensores son enviadas a un panel de control (dashboard), a una pantalla LCD de 1,8 pulgadas SPI y a un accesorio (NeckBand) a modo de banda ajustable al cuello del usuario, que incorpora tres micromotores de vibración que indicarán mediante diferentes pulsos la cercanía a un obstáculo u objeto.

¿Y cuál es el problema?

Hasta ahora, habíamos conseguido hacer funcionar correctamente un único sensor láser i2c y hacer lecturas más o menos precisas de la distancia a un objeto. La cuestión se complica cuando necesitamos tener tres sensores leyendo simultáneamente a través de i2c en tiempo real.

Pues bien, después de investigar y hacer múltiples pruebas, para solucionarlo hemos determinado dos métodos de conexión, detección y configuración:

MÉTODO 1: Conexión de varios sensores al mismo bus i2c

Antes de nada, de los 6 cables que cada sensor VL53L1X dispone hemos utilizado sólo 4:

  • Amarillo - SCL

  • Azul - SDA

  • Rojo - Vcc (3,3 V)

  • Negro - GND

Si quieres saber cómo se instala y prueba el sensor VL53L1X puedes echar un vistazo a esta documentación: Instalación y prueba sensor láser.

En nuestra Raspberry Pi, hemos de localizar los GPIOs asociados a i2c, concretamente son GPIO02 (SDA) y GPIO03 (SCL). Puedes verlos en la imagen siguiente:

Instala en tu Raspberry Pi las utilidades i2c, mediante el comando:

sudo apt-get install -y i2c-tools

Una vez hecho esto, conectas uno de los sensores a estos dos GPIOs y podrás visualizar si ha sido detectado utilizando la orden:

sudo i2cdetect -y 1

Con esto estarás solicitando saber qué dispositivos i2c han sido detectados en el bus 1 de tu Raspberry Pi. Se utiliza -y para eliminar la interactividad.

Ten en cuenta que los buses 0 y 2 no se utilizan, están reservados.

Lo más probable es que recibas una respuesta como la siguiente:

Lo que significará que tu sensor ha sido detectado en la dirección por defecto 0x29. Puede ser que muestre otra dirección, pero tu sensor habrá sido detectado correctamente. Ya podrás configurar cualquier script que pretenda leer el sensor, utilizando dicha dirección y el bus 1.

Esto es válido para un solo sensor i2c. Si conectamos otro sensor a los mismos GPIOs no podremos diferenciar si estamos accediendo al primero que se conectó o al segundo.

Aquí tienes un pequeño vídeo en el que se realiza el proceso para un sólo dispositivo:

Para poder conectar más de un dispositivo i2c, este método requiere que cambiemos la dirección al primer sensor que hemos conectado. Para ello, hemos de utilizar una ayuda en forma de script, que podrás encontrar aquí: Script para cambiar dirección i2c

Si descargas el script change-address.py podrás establecer la dirección que le quieres asignar a tu dispositivo i2c y una vez lanzado, si vuelves a visualizar los dispositivos i2c detectados, podrás ver que su dirección ahora ha cambiado a la que tu has puesto.

Reinicia ahora tu Raspberry Pi y comprueba que los cambios han quedado correctamente registrados.

Pues bien, esto puedes hacerlo con múltiples dispositivos i2c y quedarán configurados y accesibles en el mismo bus, pero con sus direcciones correspondientes. Estas direcciones serán las que tienes que tener en cuenta a la hora de leer sus valores. Puedes usar los scripts de prueba de este enlace y retocarlos para varios sensores.

Problema detectado:

Si alguno de tus sensores o dispositivos i2c se desconecta por accidente o se mueve su conector, perderá la dirección asignada y tendrás que volver a detectarlo y configurarlo.

MÉTODO 2: Creación de buses adicionales i2c y conexión estándar de sensores

El segundo método, se basa en crear diferentes BUSES (7,6,5,4,3) y conectar en ellos cada uno de los sensores, o conjuntos de ellos.

Si sólo conectamos un sensor, éste recibirá una dirección por defecto (en nuestro caso 0x29) y podremos leerlo sólo con identificar el bus al que se encuentra conectado.

Esta creación de buses implica una desventaja, que perdemos GPIOs. Ya que se utilizarán por parejas para las entradas SCL y SDA de i2c. Por tanto, si creamos 3 buses adicionales i2c estaremos asignado 2 GPIOs por cada bus, por lo que 6 GPIOs de nuestra Raspberry Pi los estaremos empleando en esos 3 buses.

Pero también, podría significar una ventaja. Imagina cuántos dispositivos i2c podríamos direccionar si combinamos los dos métodos que te proponemos.

Vamos a ver un ejemplo empleando este método:

Crearemos dos buses i2c 3 y 4. Para ello nos vamos a la consola de comandos de Raspberry Pi y nos posicionamos en la carpeta /boot.

cd / boot

Buscaremos un archivo llamado config.txt y lo editamos.

sudo nano config.txt

Buscamos una sección que hace referencia a i2c y SPI y agregamos la siguiente línea:

dtoverlay = i2c-gpio, bus = 4, i2c_gpio_delay_us = 1, i2c_gpio_sda = 23, i2c_gpio_scl = 24

Con esta línea estaremos creando un bus adicional (el bus nº 4) que utilizará GPIO 23 como SDA y GPIO 24 como SCL.

Si además, añadimos otra línea para otro bus como la siguiente:

dtoverlay = i2c-gpio, bus = 3, i2c_gpio_delay_us = 1, i2c_gpio_sda = 17, i2c_gpio_scl = 27

Estaremos creando el bus 3 que utilizará GPIO 17 para el SDA y GPIO 27 para el SCL.

Guardamos con Ctrl+O y salimos con Ctrl+X.

Conecta ahora tus dispositivos i2c a los GPIOs indicados para tus buses adicionales.

Reinicia tu Raspberry Pi.

Visualiza ahora el contenido de los buses 3 y 4 creados:

sudo i2cdetect -y 3

sudo i2cdetect -y 4

Si todo ha sido realizado correctamente, tus dispositivos estarán detectados en el bus correspondiente.

Ahora sólo te queda programar tus scripts python utilizando el bus adecuado.

A tener en cuenta:

  • No está permitido utilizar los números de bus 0 y 2.

  • Siempre se ha de empezar la creación de buses en config.txt desde el número más alto de bus al más bajo.

  • El bus más bajo ha de ser el 3.

  • El máximo de buses serían 5 en el siguiente orden: 7,6,5,4,3

CONCLUSIONES:

A través de este post, te hemos mostrado un par de métodos para hacer que tu Raspberry Pi sea capaz de detectar y configurar varios dispositivos i2c. Por un lado, todos en el mismo bus con direcciones diferentes y, por otro, cada uno en un bus diferente con posibilidad de incorporar más en dichos buses, pero con direcciones distintas.

Cada una de estas soluciones aporta ventajas e inconvenientes, serás tú quien elija la mejor opción para tu proyecto.

Esperamos que esta información te haya sido de ayuda.

Nos hemos basado en:

2856 visualizaciones2 comentarios

Entradas Recientes

Ver todo
bottom of page