Différences entre versions de « MicroPython-I2C »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 165 : Ligne 165 :
  
 
==== i2c.recv(...) ====
 
==== i2c.recv(...) ====
{{fname|i2c.recv(recv, addr=0x00, timeout=5000)}}
+
i2c.recv(recv, addr=0x00, timeout=5000)
  
 
Recevoir des données sur le bus:
 
Recevoir des données sur le bus:
Ligne 172 : Ligne 172 :
 
* '''timeout''' le temps d'attente max pour recevoir les données. ''TimeOut'' s'exprimant en millisecondes.
 
* '''timeout''' le temps d'attente max pour recevoir les données. ''TimeOut'' s'exprimant en millisecondes.
  
Return value: if recv is an integer then a new buffer of the bytes received, otherwise the same buffer that was passed in to recv.
+
Valeur retournée: si {{fname|recv}} est un entier alors la fonction retourne un nouveau ''buffer'' (mémoire tampon) avec les octets/bytes reçu --sinon-- ce sera la même buffer que celui passé dans le paramètre {{fname|recv}}.
i2c.scan()
 
  
 
==== i2c.scan() ====
 
==== i2c.scan() ====

Version du 26 septembre 2015 à 11:21


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Introduction

Voila, je me suis mis en tête de supporter quelques breakout I2C d'Adafruit sur la PyBoard. C'est un projet intéressant et captivant.

Cet article reprends différentes notes utilises à ce sujet.

Bus I2C en quelques mots

I2C est la contraction de "Inter Integrated Circuit".

Ce dernier permet d'établir des connexions asynchrones entre plusieurs composants intelligents pour partager des informations via un "bus commun".

Si ce bus est utilisé pour permettre à un microcontroleur (PyBoard,Arduino,Raspberry-Pi) de communiquer avec des senseurs (un réseau de senseur), il permet aussi à des microcontrôleurs de communiquer directement ensembles.

  • PyBoard dispose d'une class pour I2C, ce qui rend la mise en oeuvre très facile.
  • Principalement développé pour la Domotique et l'électronique domestique, ce bus est très populaire et donc utilisé par de nombreux composants. Les PC, lecteurs DVD, télévisions, etc disposent généralement d'un tel bus.
  • Le protocole I2C ne requière que 3 fils pour fonctionner et peut être implémenté sur n'importe quel microcontrôleur.
  • La longueur du bus est de l'ordre de 1 mètre... mais il est possible de l'étendre jusqu'à 30 mètres à l'aide d'un simple composant nommé "I2C extender".
  • Il dispose d'un mécanisme d'adressage à la fois simple et efficace permettant à plusieurs senseurs de fonctionner sur un seul bus.
  • Supporte plusieurs maître (Attention: dans ce cas il y a donc risque de collisions).

Quelques documents sur le net:

Les concepts associés au bus I2C

Il y a quelques concepts de base à maîtriser autour de l'I2C:

  • Le concept de "maître et esclave"
  • Le principe d'adressage (adresse unique pour chaque esclave).
  • Le concept de régulation de communication comme "Master Reader" et "Master Writer"

Nous avons rédigé une page d'explication autour du Bus I2C d'Arduino... mais un bus I2C reste avant tout un bus I2C, qu'il soit sur Arduino, PyBoard, Raspberry-Pi, ...

Nous ne saurions que trop vous recommander de parcourir cette page pour vous familiariser avec ces concepts.

Principes I2C

Tlogo-I2C.jpg

Comprendre les principes fondamentaux du bus I2C.

 

Les Bus I2C de la PyBoard

Pour Rappel, les signaux sont:

  • SDA - Signal DATA (donnée) du bus I2C.
  • SCL - Signal CLOCK (horloge) du bus I2C.

Pybv10-I2C-pinout.jpg

Tolérance 5V

Petit rappel, toutes les broches du PyBoard sont tolérantes à 5V sauf PA4 & PA5 (dixit PYBv10b.pdf)

Par conséquent, le bus SPI du skin X n'est pas tolérant à 5 Volts.

La classe I2C

I2C is a two-wire protocol for communicating between devices. At the physical level it consists of 2 wires: SCL and SDA, the clock and data lines respectively.

I2C objects are created attached to a specific bus. They can be initialised when created, or initialised later on:

from pyb import I2C i2c = I2C(1) # create on bus 1 i2c = I2C(1, I2C.MASTER) # create and init as a master i2c.init(I2C.MASTER, baudrate=20000) # init as a master i2c.init(I2C.SLAVE, addr=0x42) # init as a slave with given address i2c.deinit() # turn off the peripheral

Printing the i2c object gives you information about its configuration.

Basic methods for slave are send and recv:

i2c.send('abc')      # send 3 bytes
i2c.send(0x42)       # send a single byte, given by the number
data = i2c.recv(3)   # receive 3 bytes

To receive inplace, first create a bytearray:

data = bytearray(3)  # create a buffer
i2c.recv(data)       # receive 3 bytes, writing them into data

You can specify a timeout (in ms):

i2c.send(b'123', timeout=2000)   # timout after 2 seconds

A master must specify the recipient's address:

i2c.init(I2C.MASTER)
i2c.send('123', 0x42)        # send 3 bytes to slave with address 0x42
i2c.send(b'456', addr=0x42)  # keyword for address

Master also has other methods:

i2c.is_ready(0x42)           # check if slave 0x42 is ready
i2c.scan()                   # scan for slaves on the bus, returning
                             #   a list of valid addresses
i2c.mem_read(3, 0x42, 2)     # read 3 bytes from memory of slave 0x42,
                             #   starting at address 2 in the slave
i2c.mem_write('abc', 0x42, 2, timeout=1000)

Constructeur

I2C(bus, ...)

Construit un objet I2C sur le bus mentionné. Le bus peut recevoir la valeur 1 ou 2.

Sans paramètre additionnel, l'objet I2C est créé mais pas initialisé (il dispose des paramètres de la dernière initialisation du bus, s'il cela est applicable).

Si des paramètres complémentaires sont fourni alors le bus est initialisé. Voyez la méthode init pour les paramètres d'initialisation.

Les broches physique du bus I2C sont:

  • I2C(1) sur la partie X de la carte: (SCL, SDA) = (X9, X10) = (PB6, PB7)
  • I2C(2) sur la partie Y de la carte: (SCL, SDA) = (Y9, Y10) = (PB10, PB11)

Méthodes

i2c.deinit()

Désactive le bus I2C.

i2c.init(...)

i2c.init(mode, *, addr=0x12, baudrate=400000, gencall=False)

Initialise le bus I2C avec les paramètres suivants:

  • mode mode du bus I2C. Soit I2C.MASTER pour le mode maitre ou I2C.SLAVE pour le mode esclave.
  • addr l'adresse I2C (codée sur 7-bits, uniquement valable en mode esclave)
  • baudrate pour le débit du signal d'horloge du bus I2C (SCL, uniquement valable en mode maitre)
  • gencall destiné au support des appels (is whether to support general call mode)

i2c.is_ready(...)

i2c.is_ready(addr)

Vérifie si un périphérique I2C répond sur l'adresse donnée. Uniquement valide pour le mode master.

i2c.mem_read(....)

i2c.mem_read(data, addr, memaddr, timeout=5000, addr_size=8)

Effectue une lecture depuis la mémoire d'un périphérique:

  • data un entier ou un buffer pour stocker le résultat de la lecture
  • addr est l'adresse du périphérique I2C
  • memaddr est la position mémoire dans le périphérique I2C
  • timeout est le temps max d'attente (en millisecondes) pour l'opération de lecture
  • addr_size détermine la taille de memaddr: 8 ou 16 bits

Retourn la donnée lue.

Uniquement valable en mode master.

i2c.mem_write(...)

i2c.mem_write(data, addr, memaddr, timeout=5000, addr_size=8)

Ecrit dans la mémoire d'un périphérique I2C.

  • data est entier ou un buffer contenant les données à envoyer au périphérique I2C.
  • addr est l'adresse du périphérique I2C.
  • memaddr est la position mémoire (adresse mémoire) dans le périphérique I2C.
  • timeout est le temps d'attente max (millisecondes) pour démarrer l'opération d'écriture.
  • addr_size permet de sélectionner la taille de memaddr: 8 ou 16 bits

Retourne None.

Uniquement valable en mode master.

i2c.recv(...)

i2c.recv(recv, addr=0x00, timeout=5000)

Recevoir des données sur le bus:

  • recv peut être un entier représentant le nombre d'octets/bytes à recevoir --OU-- un buffer mutable (modifiable) qui sera remplis avec les octets reçus.
  • addr l'adresse depuis laquelle les données seront reçues (uniquement valable en mode master)
  • timeout le temps d'attente max pour recevoir les données. TimeOut s'exprimant en millisecondes.

Valeur retournée: si recv est un entier alors la fonction retourne un nouveau buffer (mémoire tampon) avec les octets/bytes reçu --sinon-- ce sera la même buffer que celui passé dans le paramètre recv.

i2c.scan()

Scanne toutes les adresses du Bus I2C de 0x01 à 0x7f et retourne la liste des adresses offrant une réponse.

Cette instruction est uniquement utilisable en mode master.

i2c.send(...)

{{{1}}}

Envoi des données sur le bus:

  • send est la donnée à envoyer (un entier/integer ou un objet buffer)
  • addr est l'adresse du destinataire (uniquement nécessaire en mode master)
  • timeout est le temps d'attente max (timeout) pour l'envoi des données. Temps en millisecondes

Return value: None.

Constantes

  • I2C.MASTER - pour l'initialisation du bus en mode master (maître).
  • I2C.SLAVE - pour l'initialisation du bus en mode slave (esclave).



Source: class I2C écrit par/written by Damien P.George et autres sources.

Traduit/composé par Meurisse D. pour MCHobby.be - Translated/assembled by Meurisse D. for MCHobby.be

Traduit avec l'autorisation de micropython.org - Translated with the authorisation of micropython.org

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.