Comment augmenter le nombre de broches numériques sur Arduino à l'aide d'un extenseur de port. Arduino Shields – cartes d'extension pour Arduino Arduino augmentant les ports d'entrée/sortie

L’un des principaux avantages de la plateforme Arduino est sa popularité. La plate-forme populaire est activement soutenue par les fabricants d'appareils électroniques, publiant des versions spéciales de diverses cartes qui étendent les fonctionnalités de base du contrôleur. De telles cartes, assez logiquement appelées cartes d'extension (autre nom : arduino Shield, Shield), sont utilisées pour effectuer une grande variété de tâches et peuvent considérablement simplifier la vie d'un opérateur Arduino. Dans cet article, nous apprendrons ce qu'est une carte d'extension Arduino et comment elle peut être utilisée pour fonctionner avec une variété d'appareils Arduino : moteurs (blindages de commande de moteur), écrans LCD (blindages LCD), cartes SD (enregistreur de données), capteurs. (bouclier de capteur) et bien d'autres.

Comprenons d'abord les termes. Une carte d'extension Arduino est un appareil complet conçu pour exécuter certaines fonctions et est connectée au contrôleur principal à l'aide de connecteurs standard. Un autre nom populaire pour la carte d'extension est le bouclier Arduino en anglais ou simplement le bouclier. Tous les composants électroniques nécessaires sont installés sur la carte d'extension et l'interaction avec le microcontrôleur et d'autres éléments de la carte principale s'effectue via les broches Arduino standard. Le plus souvent, l'alimentation du bouclier est également fournie par la carte Arduino principale, bien que dans de nombreux cas, il soit possible de l'alimenter à partir d'autres sources. Dans n'importe quel bouclier, il existe plusieurs broches libres que vous pouvez utiliser à votre discrétion en y connectant d'autres composants.

Le mot anglais Shield est traduit par bouclier, écran, écran. Dans notre contexte, il faut le comprendre comme quelque chose qui recouvre la carte contrôleur, créant une couche supplémentaire de l'appareil, un écran derrière lequel sont cachés divers éléments.

Pourquoi avons-nous besoin de boucliers Arduino ?

Tout est très simple : 1) pour que nous gagnions du temps, et 2) quelqu'un puisse gagner de l'argent avec cela. Pourquoi perdre du temps à concevoir, placer, souder et déboguer quelque chose que vous pouvez prendre déjà assemblé et commencer à utiliser immédiatement ? Les cartes d'extension bien conçues, assemblées sur des équipements de haute qualité, sont généralement plus fiables et prennent moins de place dans l'appareil final. Cela ne signifie pas que vous devez abandonner complètement l'auto-assemblage et que vous n'avez pas besoin de comprendre le principe de fonctionnement de certains éléments. Après tout, un véritable ingénieur essaie toujours de comprendre comment fonctionne ce qu’il utilise. Mais nous pourrons fabriquer des dispositifs plus complexes si nous ne réinventons pas la roue à chaque fois, mais si nous concentrons notre attention sur ce que peu de gens ont résolu auparavant.

Naturellement, il faut payer pour les opportunités. Presque toujours, le coût du bouclier final sera supérieur au prix des composants individuels ; vous pouvez toujours rendre une option similaire moins chère. Mais ici, c’est à vous de décider à quel point le temps ou l’argent dépensé sont importants pour vous. Compte tenu de toute l'aide possible de l'industrie chinoise, le coût des cartes est en constante diminution, c'est pourquoi le choix est le plus souvent fait en faveur de l'utilisation d'appareils prêts à l'emploi.

Les exemples de boucliers les plus populaires sont les cartes d'extension pour travailler avec des capteurs, des moteurs, des écrans LCD, des cartes SD, des boucliers réseau et GPS, des boucliers avec relais intégrés pour la connexion à la charge.

Connexion des boucliers Arduino

Pour connecter le blindage, il vous suffit de le « poser » soigneusement sur la carte principale. Généralement, les contacts du blindage de type peigne (mâle) s'insèrent facilement dans les connecteurs de la carte Arduino. Dans certains cas, il est nécessaire d'ajuster soigneusement les broches si la carte elle-même n'est pas correctement soudée. L'essentiel ici est d'agir avec prudence et de ne pas utiliser une force excessive.

En règle générale, un bouclier est destiné à une version très spécifique du contrôleur, même si, par exemple, de nombreux boucliers pour Arduino Uno fonctionnent assez bien avec les cartes Arduino Mega. Le brochage du méga est fait de telle manière que les 14 premières broches numériques et les broches du côté opposé de la carte coïncident avec le brochage de l'UNO, de sorte qu'un blindage Arduino puisse facilement y être inséré.

Programmation du bouclier Arduino

La programmation d'un circuit avec une carte d'extension n'est pas différente de la programmation Arduino classique, car du point de vue du contrôleur, nous avons simplement connecté nos appareils à ses broches habituelles. Dans le croquis, vous devez indiquer les broches connectées dans le blindage aux contacts correspondants sur la carte. En règle générale, le fabricant indique la correspondance des broches sur le blindage lui-même ou dans une instruction de connexion séparée. Si vous téléchargez les croquis recommandés par le fabricant de la carte lui-même, vous n'aurez même pas besoin de le faire.

La lecture ou l'écriture des signaux du bouclier se fait également de la manière habituelle : en utilisant les fonctions et d'autres commandes familières à tout utilisateur d'Arduino. Dans certains cas, des collisions sont possibles lorsque vous êtes habitué à un schéma de connexion particulier et que le fabricant en a choisi un autre (par exemple, vous avez tiré le bouton vers la terre et sur le blindage vers l'alimentation). Ici, il faut juste être prudent.

En règle générale, cette carte d'extension est livrée dans les kits Arduino et c'est donc avec elle que les ingénieurs Arduino la rencontrent le plus souvent. Le bouclier est assez simple - sa tâche principale est de fournir des options de connexion plus pratiques à la carte Arduino. Cela se fait via des connecteurs d'alimentation et de masse supplémentaires situés sur la carte à chacune des broches analogiques et numériques. Sur la carte, vous trouverez également des connecteurs pour connecter une source d'alimentation externe (vous devez installer des cavaliers pour commuter), une LED et un bouton de redémarrage. Les options de bouclier et les exemples d'utilisation peuvent être trouvés dans les illustrations.




Il existe plusieurs versions de la carte d'extension tactile. Ils diffèrent tous par le nombre et le type de connecteurs. Les versions les plus populaires aujourd’hui sont Sensor Shield v4 et v5.

Ce bouclier Arduino est très important dans les projets robotiques, car... vous permet de connecter simultanément des moteurs réguliers et des servomoteurs à la carte Arduino. La tâche principale du bouclier est de permettre le contrôle des appareils qui consomment un courant suffisamment élevé pour une carte Arduino classique. Une caractéristique supplémentaire de la carte est la fonction de contrôle de la puissance du moteur (à l'aide de PWM) et de changement du sens de rotation. Il existe de nombreux types de panneaux de protection moteur. Tous ont en commun la présence dans le circuit d'un transistor puissant à travers lequel une charge externe est connectée, des éléments dissipateurs de chaleur (généralement un radiateur), un circuit pour connecter l'alimentation externe, des connecteurs pour connecter les moteurs et une broche pour se connecter à l'Arduino.



L'organisation du travail en réseau est l'une des tâches les plus importantes des projets modernes. Une carte d'extension correspondante est disponible pour la connexion à un réseau local via Ethernet.




Cartes d'extension pour le prototypage

Ces cartes sont assez simples : elles disposent de plages de contact pour les éléments de montage, d'un bouton de réinitialisation et de la possibilité de connecter une alimentation externe. Le but de ces boucliers est d'augmenter la compacité de l'appareil, lorsque tous les composants nécessaires sont situés immédiatement au-dessus de la carte principale.





Bouclier LCD Arduino et bouclier TFT

Ce type de bouclier est utilisé pour travailler avec les écrans LCD dans Arduino. Comme vous le savez, connecter même le plus simple écran de texte à 2 lignes est loin d'être une tâche anodine : il faut connecter correctement 6 contacts d'écran à la fois, sans compter l'alimentation électrique. Il est beaucoup plus simple d'insérer le module fini dans la carte Arduino et de simplement télécharger le croquis correspondant. Dans le populaire LCD Keypad Shield, de 4 à 8 boutons sont immédiatement installés sur la carte, ce qui vous permet d'organiser immédiatement une interface externe pour l'utilisateur de l'appareil. TFT Shield aide également



Bouclier d'enregistreur de données Arduino

Une autre tâche assez difficile à mettre en œuvre de manière autonome dans vos produits est la sauvegarde des données reçues des capteurs avec une référence temporelle. Le bouclier fini vous permet non seulement de sauvegarder des données et d'obtenir l'heure de l'horloge intégrée, mais également de connecter des capteurs sous une forme pratique par soudure ou sur un circuit imprimé.




Bref résumé

Dans cet article, nous n'avons examiné qu'une petite partie de la vaste gamme de divers appareils qui étendent les fonctionnalités d'Arduino. Les cartes d'extension vous permettent de vous concentrer sur la chose la plus importante : la logique de votre programme. Les créateurs des boucliers ont prévu une installation correcte et fiable et l'alimentation électrique nécessaire. Il ne vous reste plus qu'à trouver la carte souhaitée à l'aide du précieux mot anglais, à la connecter à l'Arduino et à télécharger le croquis. En règle générale, toute programmation de bouclier consiste à effectuer des actions simples pour renommer les variables internes d'un programme prêt à l'emploi. En conséquence, nous obtenons une facilité d'utilisation et de connexion, ainsi qu'une rapidité d'assemblage des appareils finis ou des prototypes.

L'inconvénient de l'utilisation de cartes d'extension est leur coût et leur éventuelle perte d'efficacité due à l'universalité des boucliers, qui réside dans leur nature. Pour votre tâche spécifique ou votre appareil final, toutes les fonctions du bouclier peuvent ne pas être nécessaires. Dans ce cas, vous ne devez utiliser le bouclier qu'au stade du prototypage et des tests, et lors de la création de la version finale de votre appareil, pensez à le remplacer par une conception avec votre propre circuit et type de configuration. C'est à vous de décider, vous avez toutes les possibilités pour faire le bon choix.

Tout le monde est satisfait des cartes Arduino bon marché, mais très souvent, un projet ne manque qu'un ou deux ports libres ! Et parfois, il y a suffisamment de ports, mais vous ne voulez pas tirer un tas de fils vers une autre partie de la structure. Disons que vous devez placer plusieurs boutons et LED sur le panneau avant de l'appareil. Il est plus fiable et plus facile de les connecter à la carte principale avec seulement deux fils de bus de données, plutôt qu'un câble ou un faisceau, n'est-ce pas ?

Divers extenseurs de ports Arduino sont conçus pour de telles situations.

Généralement, les broches du microcontrôleur implémentent plusieurs fonctions différentes, il existe donc différents extensions :

  1. Extension de port GPIO standard
  2. Extenseur de sortie PWM
  3. Extenseurs d'entrée analogiques – multiplexeurs et CAN externes

Séparément, il convient de mentionner les convertisseurs numérique-analogique (DAC) et les extenseurs de l'espace d'adressage du bus I2C. Ces appareils ne dupliquent pas directement les fonctions des ports, mais étendent les capacités des microcontrôleurs.

Dans le premier article de la série, nous parlerons des extensions les plus simples et les plus utiles qui fonctionnent comme des ports d'E/S numériques. Ce sont des microcircuits et . Ils sont conçus et fonctionnent de manière absolument identique et ne diffèrent que par le nombre de ports.

Sélection d'un module d'extension pour Arduino

Le module le plus populaire et le moins cher est fabriqué sur la puce PCF8574 (Fig. 1)

Riz. 1. Module d'extension de port PCF8574 populaire

Avantages :
  • Prix ​​bas.
  • Les modules peuvent être connectés en chaîne en insérant simplement les fiches d'un module dans les prises du précédent. N'oubliez pas de régler les cavaliers sur différentes adresses de module !
Défauts:
  • Il ne peut pas être inséré directement dans une maquette (je recommande de souder le connecteur du port à l'envers).
  • Un total de huit ports dans un module.

Si vous êtes d'humeur pour des projets plus sérieux, commandez un module PCF8575 16 bits sur Aliexpress. Je recommande fortement le module illustré à la Fig. 2.

Riz. 2. Module d'extension de port PCF8575

Avantages :
  • Deux fois plus de ports.
  • Alimentation intégrée de 3,3 volts, peut alimenter d'autres modules.
  • Correspondance de niveau logique intégrée pour le bus I2C à différentes tensions d'alimentation.
  • Format pratique pour le prototypage de cartes.
Défauts:
  • Prix ​​plus élevé.

Principe de fonctionnement de l'extenseur de port GPIO PCF8574/PCF8575

L'échange de données s'effectue via le bus I2C. La connexion à la carte Arduino ne nécessite que quatre fils, alimentation comprise. L'adresse de l'extenseur est définie par trois cavaliers sur les entrées A0...A2, vous pouvez donc connecter simultanément huit puces identiques au bus et obtenir un maximum de 8*8=64 ports supplémentaires avec PCF8574 ou 8*16=128 avec la puce PCF8575. .

Pour sortir des données vers le port, écrivez un octet de données à l'adresse du module sur le bus I2C. Pour lire des données depuis un port, lisez un octet à la même adresse. Un octet est toujours écrit et lu dans son ensemble ; les bits individuels sont gérés par programme.

Les sorties du microcircuit sont également des entrées et il n'existe aucun registre de service qui détermine le but de la sortie. Il n'y a qu'un registre à verrouillage dans lequel l'octet de sortie est écrit. Comment est-ce possible ?

Les ports fonctionnent de manière similaire à collecteur ouvert et disposent de résistances de rappel internes. Si un zéro logique est écrit sur la sortie, le transistor de sortie s'ouvre, ce qui force la sortie à la masse. La lecture à partir d'un tel port renverra toujours zéro.

Soyez prudent lorsque vous appliquez une tension d'alimentation continue à une broche faible ou lorsque le courant est dépassé. 50 mA vous allez ruiner la puce !

Pour utiliser un port comme entrée, écrivez-en un. Dans ce cas, le transistor interne sera désactivé et le résultat de la lecture sera déterminé par le niveau logique externe appliqué à la broche. La broche libre est connectée à l'alimentation par une résistance intégrée.

Afin d'utiliser simultanément certains ports comme entrées et d'autres comme sorties, avant chaque écriture d'un octet de données dans l'expanseur, il est nécessaire d'appliquer un masque de uns aux bits qui correspondent aux entrées en utilisant le « logique » OU ». C'est tout)))

Génération d'interruption

Les extensions de port PCF857* génèrent une impulsion d'interruption niveau basà la sortie INT pour tout changement du signal d'entrée à n'importe quelle entrée du microcircuit. Ceci est pratique si l'extenseur sert de clavier. Mais vous devez déterminer vous-même dans le gestionnaire d'interruption quel bouton a été enfoncé ou relâché. Le générateur d'interruptions est équipé d'un filtre de suppression de rebond de contact.

Exemple 1 : Utilisation du module PCF8574

Assemblons un circuit simple de quatre LED, un module PCF8574 et une carte Arduino (Fig. 3 et 4). Avec ce schéma de connexion, nous n’avons même pas besoin de résistances d’extinction pour les LED. Le courant circule à travers la LED et une résistance intégrée connectée au rail d'alimentation.

Riz. 3. Schéma de connexion du module PCF8574

Riz. 4. Disposition du circuit avec module PCF8574

Copiez et écrivez le croquis 1 sur la carte Arduino :

// Adresse du module sur le bus (A0, A1, A2 = 0) int adresse = 0x38 ; // Données lues depuis le module uint8_t dataReceive; // Données à écrire dans le module uint8_t dataSend; void setup() ( Wire.begin(); Serial.begin(9600); // Niveau élevé sur tous les ports PCF8574 dataSend = B11111111; pcf8574_write(dataSend); ) void loop() ( // Lire un octet du module dataReceive = pcf8574_read (); // Sortie vers le moniteur au format binaire Serial.println(dataReceive, BIN); // Décale les bits vers la gauche d'un quartet dataSend = dataReceive);<< 4; // Накладываем битовую маску dataSend |= B00001111; // Записываем байт в модуль pcf8574_write(dataSend); delay(500); } // Процедура записи байта в модуль void pcf8574_write(uint8_t dt) { Wire.beginTransmission(address); Wire.write(dt); Wire.endTransmission(); } // Процедура чтения байта из модуля int8_t pcf8574_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 1); return (Wire.read()); }

Un niveau élevé est initialement écrit sur tous les ports de la puce, de sorte que les ports P0...P3 peuvent servir d'entrées.

Les niveaux au niveau des broches du port sont lus toutes les 500 ms et le résultat de la lecture est affiché sur le moniteur. Si vous connectez l'une des entrées P0...P3 à un fil commun, un zéro apparaît dans son bit. Ensuite, la valeur lue est décalée de quatre bits vers la gauche, le résultat est transmis au port et l'une des LED s'éteint. Par exemple, si un zéro est lu sur la broche P0, la LED connectée à la broche P4 s'éteindra.

Veuillez noter qu'avant chaque écriture dans l'expandeur, nous devons appliquer un masque de bits de un à tous les bits qui doivent être entrés : dataSend |= B00001111;

Les routines pour travailler avec le bus I2C sont extrêmement simplifiées ; aucune erreur n'est traitée.

Conseil: Pour trouver et vérifier l'adresse du module sur le bus I2C, vous pouvez utiliser . Il affiche dans le terminal les adresses de tous les appareils qui répondent à une demande de bus.

Exemple 2 : Utilisation du module PCF8575

La particularité du module PCF8575 est qu'il dispose de 16 ports, il écrivez toujours deux octets et lisez deux octets. Cette règle doit être suivie même si le deuxième octet n'est pas nécessaire.

Changeons un peu le schéma. Nous connecterons les LED aux ports P10…P13, et nous connecterons les ports P00…P03 avec un cavalier au fil commun (Fig. 5 et 6).

Riz. 5. Schéma de connexion du module PCF8575

Riz. 6. Disposition du circuit avec module PCF8575

Dans le croquis 2, les 1 sont d'abord écrits sur tous les ports, puis leur état est lu toutes les 500 ms. La routine de lecture renvoie un mot de 16 bits divisé en octets. Le contenu de l'octet de poids faible (broches P00...P07) est copié dans l'octet de poids fort et téléchargé vers le module. Si vous connectez l'une des broches P00...P03 au fil commun, l'une des LED connectées à P10...P13 s'éteindra.

// Bibliothèque pour travailler avec I2C #include // Adresse du module sur le bus par défaut int address = 0x20; // Données lues depuis le module uint8_t hi, lo; uint16_t dataReceive ; uint8_t dataHighByte ; // Octet de poids fort (P10...P17) uint8_t dataLowByte ; // Octet faible (P00...P07) void setup() ( Wire.begin(); Serial.begin(9600); // Niveau haut sur tous les ports PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; pcf8575_write(dataLowByte, dataHighByte ); ) void loop() ( // Lire un octet du module dataReceive = pcf8575_read(); // Sortie vers le moniteur au format binaire Serial.println(dataReceive, BIN); // Sélection de l'octet de poids faible à partir d'un mot long dataLowByte = lowByte(dataReceive) ); // Copie l'octet de poids faible dans l'octet de poids fort dataHighByte; // Applique un masque à l'octet de poids faible dataLowByte |= B11111111; // Écrit de nouvelles données dans le module, deux octets pcf8575_write(dataLowByte, dataHighByte ); / La procédure d'écriture d'un octet dans le module void pcf8575_write(uint8_t dtl, int8_t dth) ( Wire.beginTransmission(address); Wire.write(dtl); // Ecriture de l'octet de poids faible (P00...P07) Wire .write(dth); / / Écrire l'octet de poids fort (P10...P17) Wire.endTransmission(); // Procédure de lecture d'un octet du module int16_t pcf8575_read() ( Wire.beginTransmission(address);

Wire.endTransmission();

Wire.requestFrom(adresse, 2);

lo = Wire.read(); // Lecture de l'octet de poids faible (P00...P07) hi = Wire.read(); // Lecture de l'octet de poids fort (P10...P17) return (word(hi, lo)); // Renvoie le mot long )

Bibliothèque Arduino pour PCF8574/PCF8575

La bibliothèque peut être téléchargée depuis GitHub. Mais, comme vous pouvez le constater, travailler avec des extenseurs de ports est très simple et vous pouvez facilement vous passer d'une bibliothèque spéciale.

Nouveaux articles

● 5.4. Extension de port numérique pour NodeMCU ESP8266 utilisant la puce MCP23017

Nous présenterons l'indication LED et l'alarme sonore lors de l'utilisation du module Nodemcu comme contrôleur de maison intelligente. Le nombre de broches sur le module Nodemcu est beaucoup plus petit que sur l'Arduino Mega, nous aurons donc besoin d'une puce d'extension d'entrée MCP23017. La puce MCP23017 ajoute 16 ports, qui peuvent être configurés à la fois en entrée et en sortie (Fig. 5.7). La puce utilise le populaire bus I2C à deux fils.

La puce dispose de 2 banques de ports A (GPA0-GPA7) et B (GPB0-GPAB), chacun pouvant être configuré pour une entrée ou une sortie.
Dans le listing 5.3. montre un exemple de configuration des banques de broches A et B.

Inscription 5.3

// connexion de la bibliothèque Wire.h #inclure entrée d'octet = 0 ; configuration vide()( Serial.begin(9600 ); Wire.begin(0 ,2 ); // démarre I2C Wire.beginTransmission(0x20 ); // i2c - adresse (A0-0,A1-0,A2-0) Wire.write(0x00); // Registre IODIRA Wire.write(0x00 ); // définit le PORT A comme sortie Wire.endTransmission(); ) boucle vide(){ // lit les données du PORT B Wire.beginTransmission(0x20); Wire.write(0x13); Wire.endTransmission();

Wire.requestFrom(0x20 , 1 );

input=Wire.read();

// écrit les données reçues sur le PORT A

Wire.beginTransmission(0x20);

Wire.write(0x12); // adresse PORT A Wire.write(input); // PORT A Wire.endTransmission();

(à partir de la fiche technique)

Description des épingles

Contact Nom Description et connexion
10 ~M. Réinitialisation générale- réinitialisation, niveau actif bas. Idéalement, ce serait une bonne idée de créer un circuit de réinitialisation qui fait d'abord baisser cette entrée, puis la fait passer à un état unique. Mais vous n’avez pas besoin de vous embêter et de le connecter au +5V. Dans ce cas, la sortie avant le premier enregistrement contiendra des valeurs aléatoires
13 ~OE Activation de la sortie- résolution de sortie, niveau actif faible. Lorsque 0 est appliqué, le contenu du registre est fourni aux sorties ; lorsque 1 est appliqué, les sorties sont désactivées et transférées à l'état Z, ce qui permet à différents appareils d'utiliser alternativement un bus. Connectez-vous à la terre si vous n'avez pas besoin de contrôler l'état des sorties
14 D.S. Données série entrantes- entrée série. Cette entrée doit être réglée sur la valeur du signal d'entrée avant que l'horloge de décalage SHCP ne soit appliquée.
11 SHCP Horloge d'entrée du registre à décalage- entrée horloge du registre à décalage. Pour passer un peu dans un registre, une transition de 0 à 1 doit être appliquée. Le moment du retour à 0 est à votre discrétion. Vous pouvez - immédiatement, vous pouvez - juste avant d'emménager. Dans le premier cas, nous pouvons supposer que la commutation se produit le long du bord du signal direct, dans le second - le long du déclin du signal inverse. Voir également les notes de performances ci-dessous. De plus, à l'arrivée de ce signal, la valeur de la sortie série Q7/S change
12 STCP Entrée d'horloge du registre de stockage- entrée d'horloge du registre à verrouillage. Au front de cette impulsion, la valeur est transférée du registre à décalage vers les sorties parallèles Q0-Q7
9 Q7S Sortie de données série- sortie série. La valeur du bit le plus significatif du registre à décalage y est affichée. Cette sortie peut être utilisée pour mettre à l'échelle le registre à décalage en 16 bits, 24 bits, etc. schémas
15, 1-7 T0, T1-7 Sorties du registre à verrouillage. Le signal qui leur est adressé est transféré du registre à décalage interne à l'arrivée du signal STCP
8 GND Nutrition- fil commun
16 VCC Nutrition - +

Nutrition

La version HC du microcircuit nécessite une alimentation de 2V à 6V, la version HCT (compatible TTL) - de 4,5V à 5,5V. HCT - TTL - est-il toujours utilisé ? Arduino semble être CMOS lui-même, donc HCT n'est pas nécessaire, mais si vous devez coordonner les niveaux avec des consommateurs TTL externes, vous pouvez alors alimenter le HC à partir de 3,3 V, alors les niveaux de signal seront compatibles avec TTL. En général, HC et HCT devraient fonctionner avec un Arduino 5 volts. C'est ce qu'ils écrivent sur Internet.

Ce qui est plus important, ce sont les condensateurs de blocage. Sans eux, le circuit risque de ne pas fonctionner comme prévu et, de plus, il peut être imprévisible. Théoriquement, un condensateur de 0,1 µF devrait être installé dans le circuit d'alimentation de chaque boîtier. J'ai calculé cette valeur de capacité comme moyenne à partir d'Internet. Mon plan a très bien fonctionné sans lui. Pour clarifier, je suis allé dans la bible des concepteurs de circuits pour clarifier - Hill et Horowitz, "L'art de la conception de circuits" est presque comme "L'art de la programmation" de Donald Knutt, mais uniquement pour les spécialistes du matériel (d'ailleurs, Hill et Horowitz sont beaucoup plus proches des gens, via Knutt - il est trop intelligent) - mais là, ils semblent appeler les condensateurs de blocage les condensateurs de découplage aux entrées. C’est dommage, c’est un bon livre, mais il est déjà très en retard. J'ai la deuxième ou la troisième édition russe de la fin des années 90 ou du début des années 0, l'original a probablement encore 10 ans de plus. Sur le troisième volume rose, j'ai trouvé un autocollant - «14 roubles» - à quel point tout était bon marché à l'époque, selon les normes modernes. Mais seulement 15 ans ou un peu plus se sont écoulés. La nostalgie était accablante.

Performance

Dans le titre de la fiche technique 74HC595, ils écrivent qu'il fonctionne à 100 MHz. Un rapide coup d'œil aux graphiques et aux tableaux de la fiche technique indique que les durées les plus longues dans la plage de température de -40 °C à +85 °C avec une alimentation de 4,5 V sont de 10 à 20 ns (100 à 50 MHz). Avec les fréquences auxquelles Arduino fonctionne, vous n’avez besoin de rien savoir d’autre. Il est seulement possible que les bibliothèques standard digitalRead/digitalWrite soient d'énormes freins en raison de diverses vérifications, et qu'elles puissent (et devraient) être réécrites dans une version plus rapide. J’ai l’intention d’approfondir cela et d’écrire plus en détail, mais pour l’instant je n’en ai pas de besoin particulier.

Les performances de l'Arduino Nano et de la bibliothèque Arduino en termes de vitesse de commutation des sorties et de traitement des entrées, selon mes observations, se situent quelque part entre quelques kilohertz et des dizaines de kilohertz. Ainsi, à mon avis, lors de l'écriture de code pour contrôler le registre à décalage 74HC595, il n'y a pas lieu de s'inquiéter des retards dans le réglage des signaux de commande.

Une autre chose est que pour un extenseur série 8 bits, vous devez diviser la fréquence de commutation de sortie maximale disponible sur Arduino - définir DS, définir SHCP sur 1, réinitialiser SHCP (à 0) - 8 fois et définir/réinitialiser STCP. Au total, en un coup d'œil, 3 * 8 + 2 = 26 opérations digitalWrite. Au total, il s'avère être environ 25 fois plus lent que ce que l'Arduino lui-même peut faire.

Lors d'une mise à l'échelle vers 16, 24 ou 32 sorties, le ralentissement sera d'environ 3*16 + 2 = 50, 3*24 + 2 = 74 et 3*32 + 2 = 98 fois, respectivement.

Évidemment, un tel extenseur de registre à décalage 74HC595 n'est pas adapté pour contrôler quelque chose de très rapide, mais dans certaines applications, il est tout à fait approprié pour définir des signaux statiques rarement changeants. Ainsi, par exemple, j'ai utilisé un tel extenseur pour définir un mode micropas 3 bits afin de définir le mode micropas pour le pilote de moteur pas à pas DRV8825 dans un testeur de moteurs pas à pas. À propos, cela ne m'a pas encore été particulièrement utile - les steppers des imprimantes matricielles fonctionnent terriblement en mode micropas, au moins sous le contrôle du pilote DRV8825 - par exemple, en mode micropas, 1/2 moitié du pas est D'une certaine manière lente et incertaine, seule la seconde moitié est optimiste et puissante. Par conséquent, lors de l'utilisation d'un micropas, au moindre effort sur l'axe du moteur pas à pas, il commençait à sauter les premiers demi-pas. Après cela, je n'ai pas exploré les modes micropas restants sur les SD de l'imprimante existante.

Mise à l'échelle

L'extenseur de sortie Arduino basé sur le 74HC595 peut être tout simplement converti de la version 8 bits en un circuit de n'importe quelle capacité. Pour ce faire, la sortie série du registre bas Q7S doit être connectée à l'entrée DS du registre supérieur, et les lignes SHCP et STCP doivent être connectées en parallèle. Eh bien, en fonction du circuit adopté et de la solution logicielle, vous devez choisir comment connecter les lignes ~MR et ~OE.

Extension d'entrée

L'extension des lignes d'entrée pour Arduino est en principe similaire à l'extension de la sortie, en tenant compte du fait que vous n'avez pas besoin de définir la valeur DS en sortie, mais de la lire en entrée et d'utiliser une puce de type 74HC597. Cependant, je n'ai pas encore testé cela en pratique.

Multiplexage

Vous pouvez augmenter le nombre de lignes de sortie contrôlées par Arduino de deux manières : 1) augmenter la capacité en bits d'une sortie série, ce qui, en augmentant la capacité en bits de deux, trois ou quatre fois, réduit en conséquence la vitesse de l'extenseur de deux. , trois ou quatre fois ; 2) connexion parallèle de plusieurs extensions, tout en utilisant une sortie supplémentaire pour chaque extension, ce qui permet de maintenir les performances à un niveau acceptable, mais nécessite l'utilisation d'au moins une sortie Arduino pour chaque extension.

Si vous ne contrôlez pas directement les signaux de registre 74HC595 - ~MR, ~OE avec Arduino, alors seulement trois sorties Arduino suffisent pour contrôler les signaux de registre à décalage DS, SHCP et STCP afin de les transformer en 8 ou 16 signaux de sortie ou plus. en utilisant la puce 74HC595.

Pour multiplexer plusieurs extensions basées sur le 74HC595, vous pouvez procéder de deux manières : 1) pour chaque extension de signal, sélectionnez un signal de verrouillage séparé - c'est-à-dire tous les registres sur le bus décalent les données entrantes en parallèle et, par conséquent, décalent les valeurs aux sorties du registre à décalage interne, mais un seul transmet la valeur du registre à décalage interne aux sorties du microcircuit ; 2) les signaux de décalage ne sont transmis qu'à l'un des extenseurs et le transfert des valeurs des signaux vers la sortie s'effectue simultanément pour tous les modules d'extension.

Je suis plus enclin à utiliser l'option lorsque les registres à décalage internes peuvent contenir tout ce que vous voulez (option 1), et que certaines des valeurs précédentes sont fixées en sortie, et voici pourquoi : lors du transfert de valeurs du décalage interne registre à la sortie, des transitions incontrôlées peuvent se produire de 0 à 1 et inversement, une sorte de rebond de signal, même si la valeur initiale dans le registre interne et à la sortie est la même. Et, à mon avis, l'opération de transfert de l'état du registre à décalage interne vers les sorties du 74HC595 doit être utilisée le moins possible.

Assistance logicielle

La prise en charge logicielle de cette extension et d'autres extensions similaires consiste à accéder non pas aux périphériques directement via des broches spécifiques en utilisant le digitalRead/digitalWrite du contrôleur Arduino utilisé, mais via les broches d'un périphérique d'E/S abstrait, qui, à son tour, peut être initialisé comme lié à un type Arduino spécifique et à un autre appareil abstrait similaire.

Treize lignes numériques et six entrées analogiques sont tout ce qu'Arduino a à offrir comme installations d'entrée/sortie. Mais dans certains cas (notamment dans les projets comportant un grand nombre de périphériques), un tel ensemble de lignes de ports ne suffit pas.



À cet égard, la question se pose de la faisabilité d’augmenter le nombre de lignes d’entrée/sortie. Ce matériel montrera un exemple d'une telle extension utilisant la puce MCP23017.


Vous savez peut-être que les 6 broches analogiques peuvent également être utilisées comme broches d'E/S numériques de cette façon :


Entrée analogique 0 = ligne 14
Entrée analogique 1 = ligne 15
Entrée analogique 2 = ligne 16
Entrée analogique 3 = ligne 17
Entrée analogique 4 = ligne 18
Entrée analogique 5 = ligne 19

Nous pouvons donc en fait faire référence à l'entrée analogique 5 comme à une ligne numérique comme celle-ci : digitalWrite(19,HIGH). Une telle commande en écrira une logique sur le port 19, c'est-à-dire la ligne analogique 5.


Techniquement, nous pouvons utiliser des lignes de port série TX/RX. Mais dans certains cas, cela s'avère extrêmement difficile à réaliser, notamment lorsque le code utilise des fonctions comme Serial.begin(), qui sont nécessaires au fonctionnement du port série. Ainsi, le nombre total de contacts disponibles pour l'utilisateur sera toujours de 17. Mais est-il possible avec dix-sept broches de contrôler un grand nombre de LED ou de servomoteurs ? Dans ce cas, il est préférable d'utiliser des microcircuits externes spéciaux. Souvent, un registre à décalage comme le 74HC595 est utilisé à ces fins. Mais cela nécessite trois lignes supplémentaires pour le contrôle et ne permet pas de « développer » toutes les lignes en même temps. Les pilotes d'affichage tels que le MAX7219 « augmentent » également le nombre de broches. Mais le MAX7219 est une puce coûteuse. Par conséquent, il est moins cher et plus rationnel d’utiliser la puce d’extension de port MCP23017. Cette puce est conçue pour 16 lignes, possède une large plage de tension de fonctionnement de 1,8 à 5,5 V et est contrôlée via l'interface I2C.


Le MCP23017 utilisera 2 broches Arduino et donnera 16 lignes d'E/S. Donc, techniquement, vous pouvez utiliser 8 morceaux de MCP23017 pour étendre un Arduino 16 broches à 16 x 8 = 128 broches. Arduino dispose d'une bibliothèque pour le bus I2C appelée Wire.h, donc l'interface avec le MCP23017 sera très simple. Vous trouverez ci-dessous le schéma de connexion entre Arduino et MCP23017.




#include "Wire.h" void setup() ( Wire.begin(); // active le bus I2C // définit les lignes sur la sortie Wire.beginTransmission(0x20); Wire.write(0x00); // registre IODIRA Wire.write (0x00); // définit toutes les lignes du port A pour produire Wire.endTransmission( ) void loop() ( Wire.beginTransmission(0x20); Wire.write(0x12); // banque d'adresses A Wire. write((byte )0xAA); // valeur envoyée - toutes les lignes du journal. 1 Wire.endTransmission(); // banque d'adresses A Wire.write(( byte)0x55); valeur - toutes les lignes du journal 1 Wire.endTransmission();

Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :