IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Comment lire le niveau de la batterie via I2C ?


Sujet :

Raspberry Pi

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Comment lire le niveau de la batterie via I2C ?
    Bonjour,
    J'ai une problématique périeuse.
    Je viens de recevoir un zero2go qui est un peu comme un UPS. Il permet d'avoir trois source d'alimentation. Ainsi je pourrai prolonger l'autonomie de mon Raspberry qaund il sera sur le terrain.

    Je viens de voir que ce n'est pas du Python https://github.com/uugear/Zero2Go-Om...2go/zero2go.sh et j'espérais utiliser la librairie de ce dernier, mais j'ai du rèver

    C'est très ennuyant, car j'ai besoin de connaitre l'état de ma batterie (ou de mes batteries) qui seront envoyées avec mes mesures

    Je ne sais pas si ma demande est périeuse, mais je me demandais si c'est une tâche réalisable, avec un coup de main.

    Ici, je vois une fonction https://github.com/uugear/Zero2Go-Om...lities.sh#L124 qui semble faire un requete vis le bus I2C, et qui fait appelle à cette fonction (i2C_read)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    https://github.com/uugear/Zero2Go-Omini/blob/master/Software/zero2go/utilities.sh#L83
    En python, on devrait aussi pouvoir le faire. Est-ce cécrocher la lune, de "convertir cette fonction en Python?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    read_channel_A()
    {
    	local i=$(i2c_read 0x01 $I2C_SLAVE_ADDRESS $I2C_CHANNEL_AI)
    	local d=$(i2c_read 0x01 $I2C_SLAVE_ADDRESS $I2C_CHANNEL_AD)
    	calc $(($i))+$(($d))/100
    }
    On connait
    I2C_SLAVE_ADDRESS=0x29
    https://github.com/uugear/Zero2Go-Om...tilities.sh#L9

    On connait
    I2C_CHANNEL_AI=1
    I2C_CHANNEL_AD=2

    Serait-il un bon départ

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def read_channel_a:
    	i=i2c_read( 0x01 0x29 1)
    	d=i2c_read(0x01 0x29 2)
    	calc $(($i))+$(($d))/100}

    ou
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import time
    import smbus
     
    # Initialize I2C (SMBus)
    i2c_ch = 1
    bus = smbus.SMBus(i2c_ch)
     
    val1 = bus.read_i2c_block_data(0x29, 0x01, 1)
    val2 = bus.read_i2c_block_data(0x29, 0x01, 2)
    #val = (val1+val2)/100
    print(str(val1))
    print(str(val2))
    print(str(val))
    ??

    Serait-il possible de mettre sur la piste, ou je cherche à décrocher la lune
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 857
    Points
    56 857
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Il n'y a pas de raison qui empêche de communiquer en I2C que ce soit en C, Python, Java ou autres...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    read_channel_A()
    {
    	local i=$(i2c_read 0x01 $I2C_SLAVE_ADDRESS $I2C_CHANNEL_AI)
    	local d=$(i2c_read 0x01 $I2C_SLAVE_ADDRESS $I2C_CHANNEL_AD)
    	calc $(($i))+$(($d))/100
    }

    On connait
    I2C_SLAVE_ADDRESS=0x29

    On connait
    I2C_CHANNEL_AI=1
    I2C_CHANNEL_AD=2
    Et on sait ce que fait la fonction i2c_read :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    i2c_read()
    {
      local retry=0
      if [ $# -gt 3 ] ; then
        retry=$4
      fi
      local result=$(i2cget -y $1 $2 $3)
    ...

    Elle passe par l'outil en ligne de commande i2cget pour une opération de lecture sur le bus.
    $1 : numéro du bus = 0x01
    $2 : adresse de l'esclave = 0x29
    $3 : registre à atteindre = 0x01 puis 0x02

    Tu devrais essayer en ligne de commande pour voir si tu vois bien le capteur et si tu récupères bien les données :
    Code linux : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i2cdetect -y 1
    i2cget -y 1 0x29 0x01
    i2cget -y 1 0x29 0x02

    En Python, voir un exemple ici

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour,
    Oui mais j’ai oublié de préciser un truc.
    J’ai un script python qui interroge un capteur d air et envoi ceci avec la librairie tinylora (LoRaWAN). C est depuis ce script python, que j aimerais interroge le niveau de mes trois batteries pour les envoyer avec les mesures du capteur de la qualité de l’air.
    Donc depuis un script photon , je ne peux faire faire du code bash? Je dois trouver l’équivalent en python?
    (Je me suis pas à la maison et j’ai pas mon PC, mais je relirai ton message plus attentivement après. Je le lis depuis mon smartphone )

    Merci
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Hello,

    Ok, j'ai connecté ma batterie sur l'input 2 et rien sur l'input 1 et 3 (inpit => Channel).
    J'ai lamcé l'application zero2go et voci les valeurs qu'il retoure

    Channel-A: 0.07V Channel-B: 5.00V Channel-C: 0.32V

    J'ai regardé le lien que tu m'as donné mais j'ai du mal à le reproduire.

    Pour commencer, J'ai fait ceci

    Les deux premiere serait pour l'input 1 (0.07V), et les deux dernier pour l'input (5V)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pierrot@sds011:/opt/Raspi-sds011 $ sudo i2cget -y 1 0x29 0x01
    0x00
    pierrot@sds011:/opt/Raspi-sds011 $ sudo i2cget -y 1 0x29 0x02
    0x0e
    pierrot@sds011:/opt/Raspi-sds011 $ sudo i2cget -y 1 0x29 0x03
    0x04
    pierrot@sds011:/opt/Raspi-sds011 $ sudo i2cget -y 1 0x29 0x04
    0x5d
    pierrot@sds011:/opt/Raspi-sds011 $
    J'ai chercher à avoir le même résultat avec python, alors j'ai commencé à faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    val1 = bus.read_i2c_block_data(0x29, 0x01, 1)
    val2 = bus.read_i2c_block_data(0x29, 0x01, 2)
    val3 = bus.read_i2c_block_data(0x29, 0x01, 3)
    val4 = bus.read_i2c_block_data(0x29, 0x01, 4)
    print(val1)
    print(val2)
    print(val3)
    print(val4)
    ce qui m'affiche ceci
    [0]
    [0, 255]
    [0, 255, 255]
    [0, 255, 255, 255]

    Selon le lien que tu m'a donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    val = bus.read_i2c_block_data(0x29, 0)
    
    print(val[0])
    print(val[1])
    print(val[2])
    print(val[3])
    113
    255
    255
    255
    Donc je nage un petit peu

    Ausi je me demandais comment "traduire" ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    calc $(($i))+$(($d))/100
    est-ce que ca serait la même chose que

    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Par contre si je lance ces commandes
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    val1 = bus.read_i2c_block_data(0x29, 1)
    val2 = bus.read_i2c_block_data(0x29, 2)
    val3 = bus.read_i2c_block_data(0x29, 3)
    val4 = bus.read_i2c_block_data(0x29, 4)
    print(val1)
    print(val2)
    print(val3)
    print(val4)
    Il m'affiche ceci:
    [0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
    [14, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
    [4, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
    [97, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
    Je ne sais pas si c'est une coincidence, mais zero2go affiche ces niveau suivants
    Channel-A: 0.10V Channel-B: 4.93V
    Dans la premiere ligne, je vois un 0
    Dans la deuxième, un 14
    Channel-A affiche 0.10

    Dans la troisième ligne, il y 4
    Dans la dernière, ily 97
    Channel-B affiche 4.93

    Est-ce qu'il y aurait un lien, car les valeur sont proches

    EDIT: Ou alors

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    i2c_ch = 1
    bus = smbus.SMBus(i2c_ch)
     
    val1 = bus.read_i2c_block_data(0x29, 1)
    val2 = bus.read_i2c_block_data(0x29, 2)
    val3 = bus.read_i2c_block_data(0x29, 3)
    val4 = bus.read_i2c_block_data(0x29, 4)
    print(val1)
    print(val1[0])
    print(val2)
    print(val2[0])
    print('=====')
    print(val1[0] + val2[0]/100)
    print(' ')
    print(val3)
    print(val3[0])
    print(val4)
    print(val4[0])
    print('=====')
    print(val3[0] + val4[0]/100)

    [0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
    0
    [14, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
    14
    =====
    0.14

    [4, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
    4
    [92, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
    0
    =====
    4.92
    Est-ce que je suis à côté de la plaque, ou complétememt à côté de la plaque ?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 857
    Points
    56 857
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Ici, il n'y a qu'un seul octet à récupérer à la fois.

    Essaie plutôt avec bus.read_byte_data(adresse, registre).

Discussions similaires

  1. Récupérer les données d'une batterie via i2C²
    Par DECIDELife dans le forum Raspberry Pi
    Réponses: 0
    Dernier message: 20/07/2018, 15h21
  2. [XL-2013] Comment lire un fichier avi dans une fenêtre excel via vba
    Par coy76 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/07/2015, 11h08
  3. Réponses: 1
    Dernier message: 08/11/2009, 23h27
  4. Réponses: 2
    Dernier message: 30/03/2009, 21h36
  5. Réponses: 5
    Dernier message: 20/08/2002, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo