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  
    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-Omini/blob/master/Software/zero2go/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-Omini/blob/master/Software/zero2go/utilities.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

    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  
    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  
    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  
    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