agauchhhe
Posts: 20
Joined: Fri Sep 20, 2019 9:28 pm

Communication capteur I2C

Sat Jan 04, 2020 10:13 pm

Bonjour,
Je reviens sur le forum pour mon projet de monitoring de consommation de ma chaudière.

J'ai un débimètre gaz qui fonctionne en I2C que je souhaite suivre avec mon raspberry.

J'ai fait ma connexion en prenant le 5V sur la borne 4 du GPIO. J'ai conneceur le SDA et le SCL au capteur avec un level shifter 3.3/5V bi directionnel et enfin une masse.

Mon i2c semble fonctionner car je peux lancer la commande i2cdetect -y 1
mais je ne vois rien....
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

J'ai un doute sur ma configuration car dmesg | grep i2c
[ 3.480459] i2c /dev entries driver

Mon fichier /boot/config.txt
# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=1
hdmi_mode=16

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
#dtparam=i2s=on
dtparam=spi=on
#dtoverlay=mpc2515-can0,oscillator=8000000,interrupt=25,spimaxfrequency=1000000
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25
dtoverlay=spi-bcm2835-overlay
#dtoverlay=pi3-miniuart-bt
dtoverlay=pi3-disable-bt
#core_freq=250

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

[pi4]
# Enable DRM VC4 V3D driver on top of the dispmanx display stack
dtoverlay=vc4-fkms-v3d
max_framebuffers=2

[all]
#dtoverlay=vc4-fkms-v3d

# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
enable_uart=1
[dimanche 15 septembre 2019, 07:01:32 (UTC+0200)] Executing cat

J'ai un dongle usb uart car je ne parvenais pas à faire fonctionner le port uart du gpio (post précédent), et également un shield CAN.
Le CAN et le UART fonctionnent bien mais pas l'I2C...

Est ce que quelqu'un peut m'aider?

Merci

ChPr
Posts: 13
Joined: Sat Dec 14, 2019 5:27 pm

Re: Communication capteur I2C

Sun Jan 05, 2020 8:59 am

Avez-vous autorisé le fonctionnement du bus I2C ?

sudo raspi-config
menu interface options --> autoriser ou pas le bus I2C

Cordialement.

Pierre

agauchhhe
Posts: 20
Joined: Fri Sep 20, 2019 9:28 pm

Re: Communication capteur I2C

Sun Jan 05, 2020 1:51 pm

Oui j'ai bien activé l'I2C avec rasp-config

agauchhhe
Posts: 20
Joined: Fri Sep 20, 2019 9:28 pm

Re: Communication capteur I2C

Sat Feb 01, 2020 7:31 am

Bonjour,
Je reviens sur mon problème de communication en I2C.

Donc la commande i2cdetect -y 1 donne
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Je pensais que ça ne fonctionnait pas mais si je lance i2cdetect -a 1

WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x00-0x7f.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 00 01 -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

D'après ma doc de capteur l'adresse est 1. Il faut donc que j'utilise l'option a pour voir toutes les adresses à partir de 0.
Si je relance i2cdetect -a 1 en débranchant le cable je ne vois plus rien. Je pense donc que la connexion avec le capteur est bonne.

Il ne reste qu'à l'interroger...

agauchhhe
Posts: 20
Joined: Fri Sep 20, 2019 9:28 pm

Re: Communication capteur I2C

Sat Feb 01, 2020 7:38 am

J'ai un exemple de code pour interroger ce capteur avec un arduino.

Il me suffit donc de le convertir en python pour le faire fonctionner avec mon pi.
image.jpg
image.jpg (24.95 KiB) Viewed 928 times
où I2C_ADDR = 1, READ_DEBIT = 0x83

Je comprends qu'on envoie la commande READ_DEBIT pour la lecture et qu'on reçoit 4 octets en retour.

agauchhhe
Posts: 20
Joined: Fri Sep 20, 2019 9:28 pm

Re: Communication capteur I2C

Sat Feb 01, 2020 7:53 am

Mon premier code en python était le suivant
import smbus

bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)

DEVICE_ADDRESS = 1 #7 bit address (will be left shifted to add the read write bit)
DEVICE_REG_MODE1 = 0x00
DEVICE_REG_LEDOUT0 = 0x1d

#Write a single register
bus.write_byte(DEVICE_ADDRESS, 0x83)

bus.read_byte(DEVICE_ADDRESS)

J'ai un 0 en retour. Mais ça me semble normal car je ne lis qu'un seul octet au lieu de 4 par rapport à mon exemple sur l'ardiuno

agauchhhe
Posts: 20
Joined: Fri Sep 20, 2019 9:28 pm

Re: Communication capteur I2C

Sat Feb 01, 2020 7:56 am

En cherchant un peu j'ai trouvé un exemple ici qui avait l'air de ressembler à ce dont j'ai besoin
https://raspberrypi.stackexchange.com/q ... nt-via-i2c

J'ai donc écris
import smbus
import time
import struct
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)

# This is the address we setup in the Arduino Program
address = 0x01

def readLong():
#number = bus.read_byte(address)
bus.write_byte(address, 0x83)
number=""
for i in range(4):
number += bus.read_byte(address)
return struct.unpack('l', number)

while True:
time.sleep(1)
number = readLong()
print("[Capteur]", number, "mm")

Mais ça ne fonctionne pas
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-83aa195885ff> in <module>()
18 while True:
19 time.sleep(1)
---> 20 number = readLong()
21 print("[Arduino]", number, "mm")

<ipython-input-1-83aa195885ff> in readLong()
13 number=""
14 for i in range(4):
---> 15 number += bus.read_byte(address)
16 return struct.unpack('l', number)
17

TypeError: can only concatenate str (not "int") to str

Je comprends que la fonction de concaténation des bytes ne fonctionne pas...

agauchhhe
Posts: 20
Joined: Fri Sep 20, 2019 9:28 pm

Re: Communication capteur I2C

Sat Feb 01, 2020 7:58 am

Est ce que quel'un pourrait m'aider sur ce point?

J'ai aussi un petit doute sur l'adresse entre 0x1 ou simplement 1.
J'ai essayé les 2 avec mon premier code et ça semble fonctionner car si je mets une autre adresse 2 ou 0x2 par exemple j'obtiens

---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-8-6dfc7183f862> in <module>()
8
9 #Write a single register
---> 10 bus.write_byte(DEVICE_ADDRESS, 0x83)
11
12 bus.read_byte(DEVICE_ADDRESS)

OSError: [Errno 121] Remote I/O error

totoharibo
Posts: 4437
Joined: Thu Jan 24, 2013 8:43 am

Re: Communication capteur I2C

Sat Feb 01, 2020 9:18 am

je ne voudrais pas perturber le fil mais la lecture du "technical manual" c'est très intéressant.
Tout pour savoir comment vit la "bête".
Encore faut-il savoir de quel composant il s'agit :lol:

Ce que tu fais j'appelle ça "aller à la pêche"

agauchhhe
Posts: 20
Joined: Fri Sep 20, 2019 9:28 pm

Re: Communication capteur I2C

Sun Feb 02, 2020 12:48 pm

Message reçu! Mon post manque un peu de contexte...

J'ai un débitmètre branché sur la ligne gaz de ma chaudière. Mon but étant de remonter la puissance gaz consommé en instantané.
Ma chaudière à un module solaire (pour l'eau chaude sanitaire et aussi le chauffage) sur lequel j'ai déjà remonté les informations par un port série.

Je récupère tout ça dans jeedom. Mon objectif étant de quelle part de ma consommation j'arrive à couvrir avec la partie solaire.

Les informations que j'ai sur le capteur dans la doc sont les mêmes que celle dans l'exemple du programme arduino : on envoie la commande 0x83 sur l'adresse 1 et on récupère la mesure sur 4 octets.

J'ai l'impression que ça fonctionne quasiment, je n'arrive simplement pas à faire fonctionner la concaténation des bytes en python...

totoharibo
Posts: 4437
Joined: Thu Jan 24, 2013 8:43 am

Re: Communication capteur I2C

Sun Feb 02, 2020 2:44 pm

si tu n'as pas la référence du composant, un peu de chirurgie est possible pour lire la référence du composant dans le capteur ?

Sinon utiliser la référence du débit-mètre, un coup de Google avec éventuellement visite sur le site du fournisseur.

d'avoir le manuel technique te permettra en plus d'avoir (sans doute) accès à d'autres fonctions.

Belle bidouille en vue mais ne fais pas sauter la maison :evil:

Return to “Français”