communication_protocole_i2c
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| communication_protocole_i2c [2022/09/05 07:40] – serge | communication_protocole_i2c [2022/09/07 09:33] (Version actuelle) – [Communication avec le protocole I2C] serge | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Communication avec le protocole I2C ====== | ====== Communication avec le protocole I2C ====== | ||
| + | {{ : | ||
| + | |||
| + | =====Ressources===== | ||
| + | Seulement 2 fils, les appareils sont définis par des adresses. | ||
| + | * **[[https:// | ||
| + | * **[[https:// | ||
| + | * https:// | ||
| + | |||
| + | |||
| + | =====Installation sur une Pi===== | ||
| + | |||
| + | From https:// | ||
| + | |||
| + | <code bash> | ||
| + | sudo nano / | ||
| + | |||
| + | # Find the line containing dtparam=i2c_arm=on | ||
| + | # Add i2c_arm_baudrate=< | ||
| + | dtparam=i2c_arm=on, | ||
| + | </ | ||
| + | |||
| + | Reboot Raspberry Pi\\ | ||
| + | Create a simple test script to verify the speed | ||
| + | |||
| + | Switch to home directory | ||
| + | cd ~ | ||
| + | Create shell script | ||
| + | nano i2cspeed.sh | ||
| + | Copy and paste the following lines of code | ||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | var=" | ||
| + | var=${var// | ||
| + | printf " | ||
| + | </ | ||
| + | Change file permissions | ||
| + | chmod +x i2cspeed.sh | ||
| + | |||
| + | Execute test script | ||
| + | ./ | ||
| + | |||
| + | =====Installation sur Arduino===== | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * [[https:// | ||
| + | |||
| + | =====smbus2===== | ||
| + | La lib I2C python | ||
| + | * https:// | ||
| + | |||
| + | |||
| + | =====Exemple à revérifier===== | ||
| + | * https:// | ||
| + | |||
| + | =====Exemple entre Raspberry Pi et Arduino Leonardo===== | ||
| + | **Contexte**: | ||
| + | |||
| + | ===Code python pour la Pi en master=== | ||
| + | <code python> | ||
| + | from time import time, sleep | ||
| + | from smbus2 import SMBus | ||
| + | |||
| + | addr = 44 | ||
| + | bus = SMBus(1) | ||
| + | sleep(0.1) | ||
| + | E = 0 | ||
| + | |||
| + | def request(): | ||
| + | global E | ||
| + | try: | ||
| + | b2 = bus.read_i2c_block_data(addr, | ||
| + | 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 | ||
| + | tempo = 0.03 | ||
| + | pos = 0 | ||
| + | while n < nbr: | ||
| + | n += 1 | ||
| + | pos1 = request() | ||
| + | # #if n % 200 == 0: | ||
| + | # # | ||
| + | if pos1 != pos: | ||
| + | pos = pos1 | ||
| + | print(pos) | ||
| + | sleep(tempo) | ||
| + | d = ((((time() - t)/nbr) - tempo))*1000 | ||
| + | print(" | ||
| + | print(" | ||
| + | bus.close() | ||
| + | """ | ||
| + | freq = 100 000 Hz avec adaptateur | ||
| + | Temps de transmission 0.93 ms | ||
| + | Nombre d' | ||
| + | freq = 100 000 Hz avec adaptateur et pull up | ||
| + | Temps de transmission 1.02 ms | ||
| + | Nombre d' | ||
| + | """ | ||
| + | </ | ||
| + | |||
| + | ===Code pour Arduino Leonardo=== | ||
| + | <code C++> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Interrupt | ||
| + | const int ENC_Z = 7; | ||
| + | // Objet Encoder | ||
| + | Encoder myEnc(0, 1); | ||
| + | // I2C | ||
| + | const byte MY_ADDRESS = 44; | ||
| + | // Variable globale | ||
| + | long val = 0; | ||
| + | int hi = 0; | ||
| + | int lo = 0; | ||
| + | |||
| + | void index_ISR(){ | ||
| + | myEnc.write(0); | ||
| + | } | ||
| + | |||
| + | void setup() { | ||
| + | // | ||
| + | // I2C | ||
| + | Wire.begin (MY_ADDRESS); | ||
| + | Wire.onRequest(requestEvent); | ||
| + | |||
| + | pinMode(ENC_Z, | ||
| + | attachInterrupt(digitalPinToInterrupt(ENC_Z), | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | val = myEnc.read(); | ||
| + | delayMicroseconds(500); | ||
| + | // | ||
| + | // | ||
| + | // | ||
| + | } | ||
| + | |||
| + | void requestEvent () | ||
| + | { | ||
| + | //val = myEnc.read(); | ||
| + | byte buf [2]; | ||
| + | buf [0] = val >> 8; | ||
| + | buf [1] = val & 0xFF; | ||
| + | Wire.write (buf, 2); | ||
| + | } | ||
| + | </ | ||
| + | =====Pull-up Resistors===== | ||
| + | * https:// | ||
| + | * **[[https:// | ||
| + | |||
| + | On tire le signal vers le **+** avec une résistance sur SDA et SDL: | ||
| + | {{ : | ||
| + | |||
| + | |||
| - | **Je suis rentré de vacances** | ||
| {{tag> | {{tag> | ||
communication_protocole_i2c.1662363620.txt.gz · Dernière modification : de serge
