Novedad: el cortafuegos de IA supervisa toda la plataforma y explica cada incidente con palabras sencillas. Vea cómo funciona

El SCD30 en la Pi da error Remote I/O, ¿debo escribir I2C en Python con bit-bang?

El SCD30 en la Pi da error Remote I/O, ¿debo escribir I2C en Python con bit-bang?

Resuelto 5 3

Traducido del Türkçe por IA ·

Medimos CO2 en salas de reuniones, con una Pi 3B+ y un Sensirion SCD30. La Pi lee cada 30 segundos y envía co2, temp, rh a Hermetry. Algunas lecturas fallan con este error:

OSError: [Errno 121] Remote I/O error
  File "scd30.py", line 58, in read_measurement
    data = bus.read_i2c_block_data(0x61, 0x03, 18)

Entre 20 y 30 veces por hora. Se generan huecos en la gráfica. Según he leído, el SCD30 usa clock stretching y el I2C por hardware de la Pi no lo soporta bien. Estoy pensando en escribir el maestro I2C en Python con bit-bang usando RPi.GPIO. ¿Tiene sentido, lo ha hecho alguien antes? No estoy seguro de que la temporización se mantenga en Python.

Ağ geçidi yine bağlanıyor…
♥ 2

Traducido del Türkçe por IA ·

¿Ha probado a reducir la velocidad? Con i2c_arm_baudrate en config.txt.

♥ 0

Traducido del Türkçe por IA ·

Lo bajé a 10000, el error bajó a 5-6 por hora pero no desapareció.

Ağ geçidi yine bağlanıyor…
♥ 0

Traducido del Türkçe por IA ·

No lo escribas tú en Python, el kernel ya tiene un I2C por software listo que hace el bit-banging y vigila correctamente el clock stretching. Justo por eso yo también pasé el SCD30 a él. /boot/config.txt (en Bookworm /boot/firmware/config.txt):

dtoverlay=i2c-gpio,bus=3,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2

Reinicia y comprueba con i2cdetect -y 3 que aparece 0x61. En el código, usa SMBus(3) en lugar de SMBus(1). Mueve el sensor a GPIO 23/24 y pon una resistencia pull-up de 4,7k a 3,3V (los pull-ups internos de los pines I2C del hardware no están aquí). Si tienes otros sensores, pueden quedarse en el bus 1.
Además, haz la lectura según el comando «data ready» del sensor (0x0202); si lees mientras la medición no está lista, también sale basura. Si aun así vuelve a producirse un error, reintenta una vez y omite esa lectura; para una lectura omitida no envíes nada, en Hermetry se mantiene el último valor.

Solución aceptada♥ 2

Traducido del Türkçe por IA ·

Lo pasé al bus 3 con un overlay y llevo 2 días sin un solo Errno 121. Se me habían olvidado las pull-ups: en el primer arranque i2cdetect salió vacío, y al poner las de 4.7k apareció. Menos mal que no me puse a escribir el bit-bang.

Ağ geçidi yine bağlanıyor…
♥ 0

Traducido del Türkçe por IA ·

¿Por qué entonces reducir la velocidad no lo solucionó por completo? Tengo curiosidad.

♥ 1
Viendo 6 entradas – de la 1 a la 6 (de un total de 6)
  • Debes estar registrado para responder a este debate.

Únete a la conversación

Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

Compartir