VI - Programmation IDE Arduino |
VI - Programmation de PCF8574 à laide de l'IDE Arduino
Cet exemple est tiré de l’excellent site de Jérôme TOMSKI
Exemple: ajouter des entrées à son Arduino, et afficher leur état (PCF 8574 + librairie Wire)
Cet exemple nous allons le simuler avec Proteus
élaboration du schéma structurel ( XX_Uno_PCF8574_V1_c.pdsprj )
Le code source
/* |
Simulation sous Proteus
Aide librairie " Wire.h " --> https://www.arduino.cc/reference/en/language/functions/communication/wire/
Cette bibliothèque vous permet de communiquer avec des appareils I2C/TWI. Sur les cartes Arduino avec la disposition R3 (brochage 1.0), le SDA (ligne de données) et le SCL (ligne d'horloge) se trouvent sur les en-têtes de broches à proximité de la broche AREF. L'Arduino Due a deux interfaces I2C/TWI SDA1 et SCL1 sont proches de la broche AREF et l'autre est sur les broches 20 et 21.
À titre de référence, le tableau ci-dessous indique où se trouvent les broches I2C/TWI sur différentes cartes Arduino.
Carte |
Broches I2C/TWI |
Uno, Ethernet |
A4 (SDA), A5 (SCL) |
Mega2560 |
20 (SDA), 21 (SCL) |
Léonard |
20 (SDA), 21 (SCL), SDA1, SCL1 |
Depuis Arduino 1.0, la bibliothèque hérite des fonctions Stream, ce qui la rend cohérente avec les autres bibliothèques de lecture/écriture. Pour cette raison, send()et receive()ont été remplacés par read()et write().
Les versions récentes de la librairie Wire peuvent utiliser des timeouts pour éviter un blocage face à certains problèmes sur le bus, mais cela n'est pas (encore) activé par défaut dans les versions actuelles. Il est recommandé de toujours activer ces délais d'attente lors de l'utilisation de la bibliothèque Wire. Voir la fonction Wire.setWireTimeout pour plus de détails.
Remarque : Il existe des versions 7 et 8 bits des adresses I2C. 7 bits identifient le périphérique et le huitième bit détermine s'il est en cours d'écriture ou de lecture. La bibliothèque Wire utilise des adresses de 7 bits partout. Si vous avez un exemple de code qui utilise une adresse 8 bits, vous voudrez supprimer le bit bas (c'est-à-dire décaler la valeur d'un bit vers la droite), ce qui donne une adresse entre 0 et 127. Cependant, les adresses de 0 à 7 ne sont pas utilisés car sont réservés, la première adresse pouvant être utilisée est 8. Veuillez noter qu'une résistance de rappel est nécessaire lors de la connexion des broches SDA/SCL. Veuillez vous référer aux exemples pour plus d'informations. La carte MEGA 2560 a des résistances pull-up sur les broches 20 et 21 intégrées.
L'implémentation de la bibliothèque Wire utilise un tampon de 32 octets, donc toute communication doit être dans cette limite. Les octets en excès dans une seule transmission seront simplement supprimés.
Pour utiliser, inclure, cette bibliothèque :
#include <Wire.h>
Les fonctions
Cette fonction initialise la bibliothèque Wire et rejoint le bus I2C en tant que contrôleur ou périphérique. Cette fonction ne doit normalement être appelée qu'une seule fois. Wire.begin() Wire.begin(address) address : l'adresse de l'esclave 7 bits (facultatif) ; s'il n'est pas spécifié, rejoignez le bus en tant que périphérique contrôleur. |
Cette fonction lit un octet qui a été transmis d'un dispositif périphérique à un dispositif contrôleur après un appel requestFrom()ou a été transmis d'un dispositif contrôleur à un dispositif périphérique. read()hérite de la classe utilitaire Stream. Wire.read() Aucun. L'octet suivant reçu. |
||
Désactivez la bibliothèque Wire, en inversant l'effet de Wire.begin(). Pour utiliser à nouveau la bibliothèque Wire après cela, appelez Wire.begin()à nouveau. |
Cette fonction modifie la fréquence d'horloge pour la communication I2C. Les périphériques I2C n'ont pas de fréquence d'horloge de travail minimale, mais 100 KHz est généralement la référence. Wire.setClock(clockFrequency)
|
||
Cette fonction est utilisée par le contrôleur pour demander des octets à un périphérique. Les octets peuvent ensuite être récupérés avec les fonctions available()et read(). À partir d'Arduino 1.0.1, requestFrom()accepte un argument booléen modifiant son comportement pour la compatibilité avec certains appareils I2C. Si vrai, requestFrom()envoie un message d'arrêt après la demande, libérant le bus I2C. Si false, requestFrom()envoie un message de redémarrage après la requête. Le bus ne sera pas libéré, ce qui empêche un autre appareil maître de demander entre les messages. Cela permet à un appareil maître d'envoyer plusieurs requêtes tout en contrôlant. La valeur par défaut est true. Wire.requestFrom(address, quantity) Wire.requestFrom(address, quantity, stop)
|
Cette fonction enregistre une fonction à appeler lorsqu'un périphérique reçoit une transmission d'un contrôleur. Wire.onReceive(handler)
Aucun. |
||
Cette fonction commence une transmission vers le périphérique I2C avec l'adresse donnée. Ensuite, mettez les octets en file d'attente pour la transmission avec la write()fonction et transmettez-les en appelant endTransmission(). Wire.beginTransmission(address)
Aucun. |
Cette fonction enregistre une fonction à appeler lorsqu'un contrôleur demande des données à un périphérique. Wire.onRequest(handler)
Aucun. |
||
Cette fonction termine une transmission vers un périphérique qui a été commencée par beginTransmission()et transmet les octets qui ont été mis en file d'attente par write(). À partir d'Arduino 1.0.1, endTransmission()accepte un argument booléen modifiant son comportement pour la compatibilité avec certains appareils I2C. Si vrai, endTransmission()envoie un message d'arrêt après la transmission, libérant le bus I2C. Si faux, endTransmission()envoie un message de redémarrage après la transmission. Le bus ne sera pas libéré, ce qui empêchera un autre appareil contrôleur de transmettre entre les messages. Cela permet à un dispositif de contrôle d'envoyer plusieurs transmissions tout en contrôlant. La valeur par défaut est true. Wire.endTransmission() Wire.endTransmission(stop)
|
Définit le délai d'attente pour les transmissions filaires en mode maître. Remarque : ces délais d'attente sont presque toujours une indication d'un problème sous-jacent, tel que des appareils qui se comportent mal, du bruit, un blindage insuffisant ou d'autres problèmes électriques. Ces délais d'attente empêcheront votre croquis de se bloquer, mais ne résoudront pas ces problèmes. Dans de telles situations, il y aura souvent (également) une corruption des données qui n'entraîne pas de dépassement de délai ou d'autre erreur et reste non détectée. Ainsi, lorsqu'un délai d'attente se produit, il est probable que certaines données précédemment lues ou écrites soient également corrompues. Des mesures supplémentaires peuvent être nécessaires pour détecter ces problèmes de manière plus fiable (par exemple, sommes de contrôle ou lecture de valeurs écrites) et les résoudre (par exemple, réinitialisation complète du système). Ce délai d'attente et ces mesures supplémentaires doivent être considérés comme une dernière ligne de défense, lorsque cela est possible, la cause sous-jacente doit être corrigée à la place. Wire.setWireTimeout(timeout, reset_on_timeout) Wire.setWireTimeout()
Lorsque cette fonction est appelée sans paramètres, un délai d'attente par défaut est configuré qui devrait être suffisant pour empêcher les blocages dans une configuration typique à maître unique. |
||
Cette fonction écrit des données à partir d'un périphérique en réponse à une demande d'un contrôleur ou met en file d'attente des octets pour transmission d'un contrôleur à un périphérique (entre les appels à beginTransmission()et endTransmission()). Wire.write(value) Wire.write(string) Wire.write(data, length)
Le nombre d'octets écrits (la lecture de ce nombre est facultative). |
Efface l'indicateur de délai d'attente. Les délais d'expiration peuvent ne pas être activés par défaut. Consultez la documentation pour Wire.setWireTimeout()plus d'informations sur la configuration des délais d'attente et leur fonctionnement. Wire.clearTimeout() Aucun.
|
||
Cette fonction renvoie le nombre d'octets disponibles pour la récupération avec read(). Cette fonction doit être appelée sur un périphérique contrôleur après un appel vers requestFrom()ou sur un périphérique à l'intérieur du onReceive()gestionnaire. available()hérite de la classe utilitaire Stream. Wire.available() Aucun. Le nombre d'octets disponibles pour la lecture. |
Vérifie si un délai d'attente s'est produit depuis la dernière fois que l'indicateur a été effacé. Cet indicateur est défini chaque fois qu'un délai d'attente se produit et effacé lorsque Wire.clearWireTimeoutFlag()est appelé ou lorsque le délai d'attente est modifié à l'aide de Wire.setWireTimeout(). Wire.getWireTimeoutFlag() Aucun.
|
Créé avec HelpNDoc Personal Edition: Créez sans effort une documentation professionnelle avec l'interface utilisateur propre de HelpNDoc