Le SCD30 sur Pi renvoie une erreur Remote I/O, dois-je écrire l'I2C en Python en bit-bang ?
Traduit de Türkçe par IA ·
Nous mesurons le CO2 dans les salles de réunion, avec un Pi 3B+ et un Sensirion SCD30. Le Pi lit toutes les 30 secondes et envoie co2, temp, rh à Hermetry. Certaines lectures échouent avec cette erreur :
OSError: [Errno 121] Remote I/O error
File "scd30.py", line 58, in read_measurement
data = bus.read_i2c_block_data(0x61, 0x03, 18)
Environ 20 à 30 fois par heure. Il y a des trous dans le graphique. D’après ce que j’ai lu, le SCD30 utilise le clock stretching et l’I2C matériel du Pi ne le gère pas correctement. Je pense écrire le maître I2C en Python en bit-bang avec RPi.GPIO. Est-ce logique, quelqu’un l’a-t-il déjà fait ? Je ne suis pas sûr que la temporisation tienne en Python.
Toplantı odaları için CO2 ölçüyoruz, Pi 3B+ ve Sensirion SCD30. Pi her 30 saniyede okuyup Hermetry’ye co2, temp, rh gönderiyor. Okumaların bir kısmı şu hatayla patlıyor:
OSError: [Errno 121] Remote I/O error
File "scd30.py", line 58, in read_measurement
data = bus.read_i2c_block_data(0x61, 0x03, 18)
Saatte 20-30 kez. Grafikte boşluklar oluyor. Okuduğum kadarıyla SCD30 clock stretching yapıyor ve Pi’nin donanım I2C’si bunu düzgün desteklemiyor. Düşündüğüm şey RPi.GPIO ile I2C master’ı Python’da bit-bang olarak yazmak. Mantıklı mı, daha önce yapan var mı? Zamanlama Python’da tutar mı emin değilim.
Traduit de Türkçe par IA ·
Avez-vous essayé de réduire la vitesse ? Avec i2c_arm_baudrate dans config.txt.
Hızı düşürmeyi denediniz mi? config.txt’de i2c_arm_baudrate ile.
Traduit de Türkçe par IA ·
Je l’ai baissé à 10000, l’erreur est tombée à 5-6 par heure mais ne s’est pas arrêtée.
10000’e indirdim, hata saatte 5-6’ya düştü ama bitmedi.
Traduit de Türkçe par IA ·
Ne l’écris pas toi-même en Python, le noyau dispose déjà d’un I2C logiciel prêt à l’emploi qui fait le bit-banging et surveille correctement le clock stretching. C’est justement pour cette raison que j’ai migré le SCD30 vers lui. /boot/config.txt (sur Bookworm /boot/firmware/config.txt) :
dtoverlay=i2c-gpio,bus=3,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2
Redémarre, puis vérifie avec i2cdetect -y 3 que 0x61 apparaît. Dans le code, utilise SMBus(3) au lieu de SMBus(1). Déplace le capteur sur GPIO 23/24 et place une résistance de tirage (pull-up) de 4,7k vers 3,3V (les pull-ups internes des broches I2C matérielles ne sont pas présentes ici). Si tu as d’autres capteurs, ils peuvent rester sur le bus 1.
Fais aussi la lecture selon la commande « data ready » du capteur (0x0202) : si tu lis alors que la mesure n’est pas prête, tu obtiens également n’importe quoi. Si une erreur survient encore de temps en temps, réessaie une fois et saute cette lecture ; pour une lecture sautée, n’envoie rien, la dernière valeur reste dans Hermetry.
Python’da kendin yazma, çekirdekte zaten hazır bir yazılım I2C var, bit-bang’i o yapıyor ve clock stretching’i doğru izliyor. SCD30’u ben de tam bu yüzden ona taşıdım. /boot/config.txt (Bookworm’da /boot/firmware/config.txt):
dtoverlay=i2c-gpio,bus=3,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2
Yeniden başlat, i2cdetect -y 3 ile 0x61’i gör. Kodda SMBus(1) yerine SMBus(3). Sensörü GPIO 23/24’e taşı, 3.3V’a 4.7k pull-up koy (donanım I2C pinlerindeki dahili pull-up’lar burada yok). Diğer sensörlerin varsa onlar bus 1’de kalabilir.
Bir de okumayı sensörün « data ready » komutuna (0x0202) göre yap, ölçüm hazır değilken okursan da saçmalıyor. Arada bir hata yine olursa bir kez tekrar dene, o okumayı atla; boş geçen okuma için bir şey gönderme, Hermetry’de son değer kalır.
Traduit de Türkçe par IA ·
Je l’ai passé sur le bus 3 avec un overlay, et depuis 2 jours, pas un seul Errno 121. J’avais oublié les pull-ups : au premier démarrage, i2cdetect était vide, et une fois les 4.7k ajoutées, il est apparu. Heureusement que je ne me suis pas lancé dans l’écriture en bit-bang.
Overlay ile bus 3’e aldım, 2 gündür tek Errno 121 yok. Pull-up’ları unutmuştum, ilk açılışta i2cdetect boş geldi, 4.7k’ları takınca göründü. Bit-bang yazmaya girişmediğim iyi olmuş.
Traduit de Türkçe par IA ·
Pourquoi réduire la vitesse n’a-t-il pas tout résolu, alors ? Je me pose la question.
Hız düşürmek neden tamamen çözmedi peki? Merak ettim.
- Vous devez être connecté pour répondre à ce sujet.
Rejoignez la discussion
Connectez-vous pour poser et répondre à des questions, aimer les messages utiles et marquer la réponse qui a résolu votre problème. Chaque contribution rapporte des points et des niveaux.

