Par exemple, si vous aviez un Arduino avec 4 broches d'E / S numériques, comment pourriez-vous allumer indépendamment> 4 LED ou lire l'état de> 4 boutons?
Par exemple, si vous aviez un Arduino avec 4 broches d'E / S numériques, comment pourriez-vous allumer indépendamment> 4 LED ou lire l'état de> 4 boutons?
Réponses:
Un registre à décalage tel que le 74595 vous permettra d'avoir de nombreuses sorties avec seulement 2 connexions: une broche de données et une broche d'horloge. Vous définissez la broche de données à la prochaine valeur que vous souhaitez déplacer dans le registre, puis impulsions la broche d'horloge.
Bruno a donné une bonne réponse, mais j'aimerais prendre quelques notes.
Le fameux 70 mA
Le 74HC595 est souvent utilisé comme extension d'E / S et aussi souvent utilisé pour contrôler une série de LED. Ce qui est souvent négligé, c'est que vous pouvez le faire fonctionner de cette façon. La fiche technique indique que le courant d'alimentation total ne doit pas dépasser 70 mA, les valeurs nominales maximales absolues (AMR), il vaut donc mieux rester à l'écart de cela par une certaine marge. Par conséquent, 8 LED à 10 mA, c'est trop, et à 20 mA, vous dépasserez l'AMR de pas moins de 130%! La limite est probablement due à la capacité actuelle des fils de liaison, puis un courant trop élevé peut non seulement détériorer les performances de la pièce, mais aussi le mettre définitivement hors service si ce fil se cassait.
Mais hier soir, je me suis réveillé parce que j'avais une idée . La limite de 70 mA vaut pour le courant Icc et le courant de terre, alors pourquoi ne pas diviser notre total ou 80 mA et laisser Icc en avoir la moitié et le courant de terre l'autre moitié? Il vous suffit de référencer 4 des LED à la masse (actif haut) et les 4 autres à Vcc (actif bas). Puis le courant des premiers vient d'Icc, le courant des autres va à la terre. Vous pourrez ainsi utiliser des LED 15 mA. (C'est si simple que je me sens idiot de ne pas y avoir pensé plus tôt.)
Les horloges combinées,
je pensais que Bruno a économisé une broche d'E / S supplémentaire en combinant l'horloge du registre à décalage avec celle du verrou. Il semble que j'ai mal interprété sa réponse. Je veux toujours développer cette option.
Que se passe-t-il alors? Le tableau de la page 5 de la fiche technique indique:
le contenu du registre à décalage a été déplacé; le contenu précédent du registre à décalage est transféré vers le registre de stockage et les étages de sortie parallèles
(soulignant par moi)
Donc ce ne sont pas les nouvelles données mais les précédentes qui sont verrouillées. Pas un vrai problème, assurez-vous simplement de déplacer un bit fictif supplémentaire pour verrouiller les dernières données, sinon tout sera incorrect.
La combinaison des horloges signifie également que les sorties basculeront tout le temps pendant que vous introduisez de nouvelles données. La fonction du verrou était en fait d'éviter cela. Dans de nombreux cas, ce ne sera pas un problème, si vous pouvez le faire rapidement, mais dans le pire des cas, vous pouvez obtenir des effets indésirables. Le pire des cas pourrait être d'utiliser le 74HC595 pour multiplexer un affichage à une fréquence de balayage très élevée + avoir une très longue chaîne de registres à décalage + avoir tous les 1 sauf un 0, une LED éteinte + une pièce sombre. Étant donné que cette LED voit tous les 1 passer de temps en temps dans une pièce sombre, elle peut s'allumer très faiblement.
Ou si vous combinez ce multiplexage haute fréquence avec une sortie de contrôle de relais. Tous les zéros, puis un 1 pour le relais peuvent signifier que la sortie du relais n'est pas assez longue pour être activée.
Certes, ce sont des cas extrêmes, mais je garderais la série et l'horloge de verrouillage séparées chaque fois que possible si vous voulez multiplexer, ou sinon avoir des taux de mise à jour élevés.
Je suis d'accord avec Ignacio concernant l'utilisation d'un 74XX595, registre à décalage série en parallèle pour l'extension de la sortie, mais en fait, vous aurez besoin de 3 connexions, une pour les données , une pour l' horloge et un verrou permettant de transférer les données du registre à décalage interne aux verrous de sortie.
Pour l'extension des entrées, vous pouvez utiliser un 74XX165, registre à décalage de sortie série parallèle, cela permettra d'avoir jusqu'à 8 boutons par 74XX165.
La bonne chose à propos de cette approche est que vous pouvez connecter en guirlande plusieurs registres à décalage permettant un nombre accru d'entrées ou de sorties, et mieux, vous pouvez mélanger 74XX595 et 74XX165 permettant et vous d'avoir un nombre quelconque d'entrées ou de sorties.
En plus de cela, vous pouvez partager les signaux d'horloge et de verrouillage en réduisant le nombre de connexions nécessaires et en simplifiant considérablement le logiciel. De cette façon, vous n'aurez besoin que de 4 connexions pour n'importe quel nombre de ces registres à décalage:
Comme je cherchais un diagramme, j'ai trouvé sur ce site un moyen très intelligent de réduire à 3 le nombre de connexions nécessaires. Il consiste à utiliser la même broche pour l'entrée et la sortie des données.
Le logiciel fera quelque chose comme ceci pour chaque impulsion d'horloge:
Nick mentionne les extenseurs d'E / S, et ils valent vraiment la peine d'être examinés. Digikey en répertorie plus d'un millier, je vais en choisir un avec une interface I2C à titre d'exemple, car cela nécessite le moins de broches d'E / S; minimum deux.
Le NXP PCA9505 possède 40 broches d'E / S configurables, l'équivalent de cinq 74HC595. C'est une solution légèrement plus chère mais vous obtenez beaucoup plus de fonctionnalités pour cela:
Lectures complémentaires
GPIO expanders , NXP brochure
PCA9505 datasheet
Pour une solution sans CI supplémentaire, vous pouvez utiliser des techniques telles que le multiplexage et le Charliplexage :
Multiplexage (aucune résistance de limitation de courant représentée):
Le fonctionnement du multiplexage est assez simple - dans l'exemple ci-dessus, si nous voulons allumer LED1, nous réglons la broche C1 pour une sortie haute et le PIN R1 pour une sortie basse, toutes les autres broches peuvent être hautes ou Hi-Z (définies pour entrer, hautes impédance qui les fait paraître "déconnectés")
Si nous souhaitons allumer LED5, nous réglons la broche C2 pour une sortie haute et R2 pour une sortie basse.
Le nombre de broches nécessaires pour piloter x LED peut être calculé par 2n broches pour n² LED, par exemple pour 16 LED, nous avons besoin (√16) * 2 = 8 broches.
Charlieplexing:
Disposition schématique alternative (plus nette) (suggérée par Supercat):
C'est un peu plus complexe, mais utilise moins de broches pour piloter un plus grand nombre de LED. Par exemple, nous pouvons utiliser seulement 5 broches pour piloter 20 LED comme dans l'exemple ci-dessus (par rapport à au moins 10 broches avec un multiplexage matriciel "normal" (à ne pas confondre avec l'utilisation d'un circuit intégré, auquel cas le nombre de broches nécessaires est log2 (nLED).
Pour une solution externe, vous pouvez utiliser des choses comme des registres à décalage ou des multiplexeurs tels que 74HC595 et 74HC151.
Un registre à décalage prend un flux d'entrée série horodaté de données et des sorties parallèles (Serial In Parallel Out SIPO) ou inversement (PISO) .Il a
généralement 8 sorties (ou entrées) mais vous pouvez enchaîner autant que vous le souhaitez pour les étendre des choses. L'inconvénient est que la vitesse que vous pouvez mettre à jour est divisée par le nombre de sorties par entrée (par exemple, pour un registre de 8 sorties, si vous avez une horloge d'entrée à 8 MHz, vous pouvez mettre à jour à 1 MHz, pour 16 sorties à 500 kHz, etc.)
Ces techniques peuvent également fonctionner en sens inverse pour les entrées.