Comment utiliser l’extension de port MCP23017

Comment utiliser l'extension de port MCP23017

introduction

Le Raspberry Pi est un excellent appareil avec une charge d’E / S; mais parfois ce n’est pas suffisant! Si vous avez besoin de plus d’E / S que le Pi ne peut en fournir, il existe un certain nombre de circuits intégrés que vous pouvez utiliser pour augmenter le nombre d’E / S disponibles. Dans ce tutoriel, je vais vous montrer comment utiliser la puce d’extension de port MCP23017; il utilise deux broches i2c (qui peuvent être partagées avec d’autres appareils si nécessaire) et en échange donne au Pi 16 GPIO supplémentaires! Chaque broche d’E / S peut être configurée comme une entrée, une sortie ou une entrée avec un pullup. Vous pouvez définir l’adresse i2c pour jusqu’à 8 MCP23017 uniques sur le même bus i2c, ce qui signifie que vous pouvez connecter en série ces circuits intégrés pour vous donner jusqu’à 128 E / S!

Les écrans à sept segments sont un bon exemple de périphériques qui nécessitent beaucoup d’E / S, donc dans ce tutoriel, nous allons connecter quelques écrans à sept segments à un circuit intégré MCP23017 et tout contrôler via le bus i2c du Pi! Nous allons créer un petit compteur en utilisant 2 affichages à sept segments et 2 boutons, où les boutons vous permettront d’augmenter et de diminuer la valeur affichée sur les sept segments. Parfait pour marquer des jeux!

Configuration du Raspberry Pi

Il y a quelques choses que nous devons faire avec notre Pi avant de pouvoir utiliser la puce et le python MCP23017.

Activer I2C

Si votre Raspberry Pi a démarré sur le bureau, accédez à l’écran de configuration du Raspberry Pi (sous Préférences), cliquez sur l’onglet «Interfaces», puis activez I2C.

Si vous utilisez un terminal, chargez raspi-config:

sudo raspi-config

Accéder aux options avancées

Puis vers I2C

Alors oui pour activer

Vous devrez redémarrer votre Pi une fois que vous aurez effectué cette modification.

Installer la bibliothèque python de wirepi

Assurez-vous d’abord que notre liste de colis est à jour

mise à jour sudo apt-get

Maintenant, installez quelques prérequis

sudo apt-get install python-dev python-pip

Nous pouvons maintenant installer le câblagepi

sudo pip installer le câblagepi

Câblage du MCP23017

Jetons un coup d’œil à la disposition des broches du MCP23017, nous savons donc comment le câbler

Comment utiliser lextension de port MCP23017

À partir de la broche 1 – la broche 8, nous avons 8 de nos broches GPIO supplémentaires GPB0 – GPB7

La broche 9 Vdd doit être câblée à la broche Pis 3v3, broche 1
La broche 10 Vss doit être câblée à une broche de terre sur notre Pi, la broche 6
La broche 12 SCL doit être câblée à la broche SCL de notre Pi, broche 5
La broche 13 SDA doit être câblée à la broche SDA de notre Pi, broche 3
Les broches 15 – 17 nous permettent de changer l’adresse de la puce, en les raccordant à la masse ou 3v3. Câblez les trois broches à la terre sur notre Pi, broche 6
La broche 18 doit être câblée en 3v3, la broche 1
Les broches 21 à 28 sont 8 autres broches GPIO supplémentaires GPA0 – GPA7

Maintenant, nous savons où chaque broche doit aller, nous pouvons câbler le tout.

1593005407 854 Comment utiliser lextension de port MCP23017

Les résistances utilisées dans le circuit sont:

Marron Noir Marron (la plupart des résistances externes) – 100 Ohms
Rouge rouge brun (la plupart des résistances intérieures) – 220 Ohms

Ces résistances ont deux objectifs. Premièrement, ils sont configurés pour être des diviseurs de tension, et deuxièmement, ils limiteront la quantité de courant consommée.

Une fois que tout est câblé, téléchargez simplement notre exemple de script python depuis github et exécutez-le.

git clone git: //github.com/modmypi/MCP23017_7_segment_display.git

cd MCP23017_7_segment_display

sudo python counter.py

Lorsque vous exécutez le code pour la première fois, vous devriez voir «00» affiché sur les sept segments. Si vous ne le faites pas, vous devrez revenir en arrière et vérifier que tout a été correctement câblé.

Si tout s’affiche comme prévu, appuyez sur le bouton le plus proche de la puce pour augmenter la valeur et sur l’autre pour la diminuer. Vous remarquerez que lorsque vous atteignez -9, vous ne pouvez pas descendre plus bas. De même, si vous montez jusqu’à 99, vous ne pourrez pas aller plus haut.

Le script a quelques commentaires pour expliquer ce que font les différentes lignes. Une partie du code a besoin d’un peu plus d’explications qui peuvent être trouvées ci-dessous.

Commentaires de script

Augmenter la fonction

Ligne 74 – Décomposons cette ligne en différentes fonctions:

len (seven_seg) – Cela renvoie simplement la longueur du dictionnaire « seven_seg » qui est 2

ljust (arg1, arg2) – ljust ajoute une chaîne à une longueur spécifique, en ajoutant un caractère défini à droite de la chaîne. Arg1, dans notre cas, est la longueur du dictionnaire seven_seg, 2. Arg2 est «0»

str () – Convertit simplement en chaîne. Dans notre cas, nous voulons traiter l’entier 1 comme une chaîne.

Alors qu’est-ce que cela signifie quand il est assemblé? Cela signifie – Traitez l’entier, 1, comme une chaîne, puis ajoutez des zéros au début de ce 1 jusqu’à ce que nous ayons le même nombre de caractères que pour les affichages à sept segments. Dans cet exemple, nous avons 2 affichages à sept segments dans notre dictionnaire seven_seg, nous nous retrouvons donc avec max = 10.

Ligne 75 – Convertissez notre chaîne «10» en un entier ou un nombre. Multipliez-le par 10, puis moins 1. Cela nous donne 99.

Quel est donc le but de ces deux lignes de code? Eh bien, comme nous n’avons que 2 affichages à sept segments, nous sommes limités à un nombre maximum, 99. Si le nombre passait à 100, nous ne pourrions pas l’afficher. Ainsi, avec cette variable «max», nous pouvons la comparer à notre variable «compteur» et lorsque le compteur devient supérieur à 99, nous remettons simplement la variable de compteur à max afin qu’elle n’atteigne jamais 100.

Ligne 79 – Une instruction while parcourra continuellement son code tout le temps que son instruction est vraie. Nous utilisons ici «tout sauf» en raison de la résistance de rappel utilisée pour nos commutateurs. Lorsque l’interrupteur n’est pas enfoncé, sa broche a un état haut, ou «vrai». Lorsque l’interrupteur est enfoncé, il se connecte à la terre et a un état bas, ou «faux». Ainsi, «tout en n’étant pas faux» se lit en fait «tout en étant vrai» en raison du double négatif, ce qui revient à dire «lorsque notre bouton est enfoncé». Donc, alors que notre bouton est enfoncé, nous forçons le script dans une petite boucle, mais dès que notre commutateur passe à un état vrai, ou lorsque nous le relâchons, la déclaration se lit alors «tout en n’étant pas vrai» ou «en cas de faux» et non boucles plus longues car l’instruction n’est plus vraie. N’oubliez pas que les instructions ne s’exécutent que lorsqu’elles sont «vraies».

Diminuer la fonction

Ligne 85 – identique à la ligne 74 dans notre fonction d’augmentation

Ligne 86 – Lorsque le symbole plus est utilisé avec des chaînes, il joint simplement les chaînes ensemble. Cette ligne ajoute donc le symbole moins à notre chaîne «min». À ce stade, min = «-10»

Ligne 87 – Encore une fois, nous convertissons notre chaîne en un nombre entier / puis ajoutons 1. Maintenant min = -9

Semblable à la fonction d’augmentation, le but de cette variable min est de s’assurer que notre nombre ne descend pas en dessous d’un certain nombre afin que nous puissions toujours afficher le nombre sur nos affichages à sept segments. N’oubliez pas que nous sommes limités à -9 car nous voulons afficher le caractère «-» en tant que personnage, donc en occupant l’un de nos sept segments d’affichage.

Fonction d’affichage

Ligne 94 – Vous remarquerez que cette fonction a un couple ou des paramètres, un numéro et un affichage. Cela nous permet de passer des variables à la fonction. Dans ce cas, nous pouvons transmettre le nombre que nous voulons afficher et le groupe de sept affichages à segments sur lesquels nous voulons l’afficher.

Ligne 95 – zfill dans cette ligne ajoute simplement des zéros au début d’une chaîne jusqu’à ce que la longueur de la chaîne corresponde à la longueur spécifiée. Donc, notre longueur spécifiée est len ​​(display) display contiendra la quantité de sept segments que notre groupe. Comme nous n’avons qu’un seul groupe de sept segments dans cet exemple de script, nous savons que cette valeur sera 2. Donc, si notre nombre est 1, nous remplissons le début de celui-ci avec des zéros jusqu’à ce que sa longueur soit 2, nous nous retrouvons donc avec «02»

Ligne 96 – Ici, nous avons une boucle for. En énumérant la variable numérique, nous pouvons obtenir la clé (ou la position) de chaque élément dans la variable, puis l’utiliser plus tard dans la boucle. La variable «i» contiendra la clé et la variable «c» contiendra la valeur. Ainsi, par exemple, si le nombre est «04» à la position 0, la valeur est 0 et à la position 1, la valeur est 4.

Ligne 97 – Un autre pour la boucle! Cette fois, nous parcourons une série de nombres. À partir de 0, boucle 7 fois incrémentation de 1 chaque boucle. 0,1,2,3,4,5,6. Nous bouclons 7 fois parce que nous avons 7 segments dans nos affichages à sept segments. Ça a du sens hein J
Ligne 98 – Ici, nous définissons une broche sur notre expanseur de port, haut ou bas. Le premier argument «afficher[i][x] »Dites-nous quelle broche nous voulons définir, tandis que le deuxième argument » num[c][x]»Nous dit si nous allons haut ou bas. Ok alors comment cela nous dit-il cette information? Notre variable d’affichage sera transmise à la fonction lors de son appel, vous verrez plus tard dans le script, mais pour l’instant je peux vous dire que la variable sera seven_seg. Donc, si nous regardons cette variable, nous pouvons voir que c’est notre dictionnaire contenant le nombre de sept segments que nous avons et le numéro de broche pour chacun des segments sur chacun des écrans. afficher[i], cela nous indique les sept segments du groupe que nous ciblons, puis affichez[i][x] le «x» nous indique quel segment sur les sept segments que nous visons. De même, num[c] cela nous indique quel personnage nous voulons cibler, puis num[c][x] nous indique l’état (haut ou bas) dans lequel chaque segment doit être affiché pour nous montrer le bon caractère.