Outils pour utilisateurs

Outils du site


communication_protocole_i2c

Ceci est une ancienne révision du document !


Communication avec le protocole I2C

Ressources

Seulement 2 fils, les appareils sont définis par des adresses.

  • I2C sur fr.wikipedia.org Les libs font le boulot, pas besoin d“apprendre la page par coeur. Par contre, le § sur les résistances de pull-up est important.
  • I2C par Nick Gammon This post describes how the I2C (Inter-Integrated Circuit, or “Two-Wire”) interface works, with particular reference to the Arduino Uno which is based on the ATmega328P microprocessor chip. A lot of the details however will be of more general interest.

Exemple à revérifier

Exemple entre Raspberry Pi et Arduino Leonardo

Contexte: Le codeur 4000 points est complétement marabouté! La Leonardo ne peut pas être Slave en SPI, il faut faire la comm entre Pi et Arduino en I2C.

Code python pour la Pi en master

from time import time, sleep
from smbus2 import SMBus
 
 
addr = 42
bus = SMBus(1)
sleep(1)
E = 0
 
def request():
    global E
    try:
        b2 = bus.read_i2c_block_data(addr, 0, 4)
        b = bytearray(b2)
        pos = (b[0] << 8) + b[1]
    except IOError:
        pos = None
        E += 1
    return pos
 
t = time()
n = -1
e = 0
nbr = 1000
print("Speed Test ...")
while n < nbr:
    n += 1
    pos1 = request()
    sleep(0.01)
    pos2 = request()
    sleep(0.025)
    if pos1 and pos2 and nbr % 2 == 0:
        print(pos2 - pos1)
 
 
d = ((((time() - t)/nbr) - 0.035)*1000)
print("Temps de transmission", round(d, 1), "ms")
print("Nombre d'erreur:", E)
bus.close()

Code pour Arduino Leonardo

#include <Wire.h>
#include <AS5048A.h>
 
// 10 = SS
// false = no debug
AS5048A angleSensor(10, false);
 
const byte MY_ADDRESS = 42;
int val = 0;
 
void setup()
  {
  // Capteurs Panauto
  angleSensor.begin();
 
  Wire.begin (MY_ADDRESS);
  Wire.onRequest(requestEvent);
  }
 
void loop() {}
 
void requestEvent ()
  {
  int ang = angleSensor.getRotationInDegrees()*10;
 
  val = ang;
  byte buf [2];
  buf [0] = val >> 8;
  buf [1] = val & 0xFF;
  Wire.write (buf, 2);
  }

Pull-up Resistors

communication_protocole_i2c.1662540353.txt.gz · Dernière modification : 2022/09/07 08:45 de serge