Je veux faire un échiquier en bois sur lequel vous pouvez jouer avec des pièces régulières (c'est-à-dire des pièces non modifiées qui utilisent des codes RFID, des aimants,…), mais qui est connectée à un logiciel qui prend note de mes mouvements et agit comme le deuxième joueur.
J'ai réfléchi à la façon de détecter les pièces sur le tableau, et j'ai pris les décisions que je n'ai pas besoin de reconnaître quelle pièce est où: La "vérité" est dans le logiciel, donc si je déplace une pièce de A à B , le logiciel peut savoir quelle pièce a été déplacée.
J'ai donc eu l'idée de percer deux trous dans chaque champ de l'échiquier, un au centre et un dans le coin supérieur droit:
- Celui du centre sera utilisé pour un capteur de luminosité pour détecter si une pièce se trouve sur le terrain ou non.
- Celui dans le coin sera utilisé pour une LED pour montrer quelle pièce l'utilisateur doit déplacer pour l'ordinateur, afin que la situation réelle corresponde à nouveau à la situation du logiciel.
Je veux utiliser un Raspberry Pi comme base matérielle pour le logiciel à exécuter, qui sera écrit dans Node.js (mais cela ne devrait pas être important pour cette question).
Donc, je me retrouve avec 64 capteurs de luminosité et 64 LED, que je dois traiter individuellement. En d'autres termes: j'ai besoin de 64 sorties et 64 entrées. Et bien sûr, c'est quelque chose qu'un Raspberry Pi ne gère pas dès le départ - et je pense qu'il doit y avoir un meilleur moyen que d'avoir 128 ports d'E / S.
Comme je pense que la détection de l'état de la carte est la tâche la plus importante, j'ai commencé à chercher sur le Web comment gérer une matrice de commutateurs 8x8. J'ai trouvé la suggestion d'utiliser un micro contrôleur qui scanne les colonnes de la carte séquentiellement, et dans chaque colonne détecte si une ligne (= un champ) est utilisée ou non.
Cela réduirait la complexité à 8 sorties et 8 entrées (pour pouvoir lire l'état de la carte).
À ce sujet, j'ai quelques questions:
- Est-ce que mes pensées sont bonnes, c'est-à-dire est-ce la bonne approche, ou y a-t-il une meilleure alternative à laquelle je devrais faire attention?
- Comme je n'ai aucune expérience avec les micro-contrôleurs, à quoi dois-je faire attention? Ai-je juste besoin d'un micro contrôleur à 16 broches, programmable dans une langue que je suis capable d'écrire, ou…?
- Quelqu'un a-t-il construit un tel tableau et a-t-il des conseils ou connaît un tutoriel qui vous guide à travers le processus?
Réponses:
Puisqu'une image vaut mille mots, voici un exemple de LDM-24488NI : une matrice à 64 leds
Pour votre application, vous aurez besoin d'une telle matrice pour les LED et une autre pour les capteurs, nécessitant un total de 32 broches IO. Étant donné que votre RPi n'en a pas autant, vous devrez utiliser un démux de 1 à 8 pour sélectionner des lignes et des colonnes individuelles:
Pour les LED, vous pouvez utiliser des démultiplexeurs pour les lignes et les colonnes, car vous n'avez besoin que d'une seule LED à la fois. Pour les capteurs, je recommande d'utiliser un demux pour les lignes et des lignes individuelles pour les colonnes, afin de pouvoir détecter plusieurs capteurs actifs sur une ligne. Cela portera le nombre de broches requis à 17 broches, qu'un RPi peut gérer.
la source
Oui, le multiplexage comme vous le décrivez est un moyen courant d'aborder des tableaux de choses.
La partie la plus délicate portera sur la nature analogique des capteurs de lumière. Les LDR CdS (résistances dépendantes de la lumière) sont probablement les meilleurs dans ce cas car ils sont sensibles, bon marché et produisent une grande réponse facilement mesurable sur la plage de luminosité humaine. Électriquement, ce sont des résistances, la résistance diminuant en lumière plus vive.
Cela simplifierait le multiplexage si vous utilisez un micro doté de 8 entrées analogiques. Cela signifie que la moitié de votre multiplexeur est intégrée dans le micro. Vous activez une ligne de LDR et lisez les 8 signaux de colonne directement avec le micro, par exemple.
Le balayage séquentiel de 64 entrées analogiques peut facilement être effectué instantanément en termes humains avec des micros ordinaires. Disons que vous pouvez effectuer une nouvelle lecture toutes les 100 µs. C'est "long", même pour les micros petits et bon marché. Cela signifie que la carte entière serait analysée toutes les 6,4 ms, ce qui est beaucoup plus rapide que vous ne pouvez percevoir de retard.
Le multiplexage des LED est encore plus facile car tout se fait avec des sorties numériques. Beaucoup de micros ont bien plus de 16 sorties numériques, donc ce n'est pas un problème. Il y aura d'autres choses qui devront se produire, et vous utiliserez des broches plus rapidement que vous ne le pensez maintenant, mais un micro 64 broches devrait vraiment être assez bon, sinon 44 broches.
Je consacrerais probablement un micro uniquement à la gestion des E / S de la carte. Ceci est optimisé pour avoir suffisamment de broches d'E / S, d'entrées A / N, etc. Il s'interface ensuite avec le moteur de calcul principal via UART. Le protocole ressemblerait à "éclairer le carré 3,2" ou "morceau retiré du carré 5,4". Cela permet également une interface matérielle totalement différente à l'avenir tant que vous gardez le protocole identique.
la source
Pour les LED , la manière évidente de le faire est d'avoir une sortie pour chaque ligne et chaque colonne de l'échiquier: un total de 8 + 8 = 16 broches. Les anodes seraient connectées aux fils de ligne et les cathodes au fil de colonne. Pour la LED que vous souhaitez allumer, vous devez rendre son fil d'anode positif (logique 1) et son fil de cathode négatif (logique 0), tout en maintenant les autres à l'état inverse (de sorte que les LED restantes ont une polarisation neutre ou inverse.)
Je fais l'hypothèse ici que le microcontrôleur fournit des tensions suffisamment élevées / basses pour que vous puissiez ponter une LED de l'une à l'autre. Si ce n'est pas le cas, vous aurez besoin d'un transistor ou d'un tampon pour chaque ligne. Avec une alimentation de 5 V, c'est serré, compte tenu du fait que la LED chute d'environ 2 V et que vous voulez une chute de tension raisonnable sur votre résistance de limitation de courant (notez que vous devez seulement les installer dans les lignes de ligne ou les lignes de colonne, pas les deux).
Si vos sorties sont à trois états (c'est-à-dire, en plus de la logique 0 et de la logique 1, elles peuvent être réglées sur un état de haute impédance, peut-être en les configurant temporairement comme entrées), alors vous pouvez devenir intelligent et utiliser une grille 4x8, avec des LED connectés en paires antiparallèles. Il est important de régler les sorties inutilisées à haute impédance dans cette configuration, sinon les LED indésirables s'allumeront.
Dans les deux cas, vous devrez penser au tirage actuel et s'il est acceptable de risquer la possibilité d'une erreur logicielle allumant toutes les LED à la fois (ce qui, s'il n'est pas pris en compte, pourrait surintégrer cette ligne de ligne du microcontrôleur). .)
Le cas des capteurs est plus compliqué. Je vais supposer que vous utilisez des capteurs résistifs, bien que les phototransistors ne soient pas nécessairement garantis pour conduire dans une seule direction.
Vous pouvez utiliser les mêmes sorties à 8 lignes que vous utilisez pour allumer vos LED, mais vous aurez besoin de 8 entrées à colonnes dédiées à la détection. Vous aurez sans doute vu des circuits pour claviers comme celui-ci. Gardez à l'esprit que ceux-ci ne sont conçus que pour appuyer sur une touche à la fois . Si l'utilisateur appuie simultanément sur 1, 3, 7 et 9, le clavier n'est pas en mesure de détecter si l'utilisateur relâche l'une de ces quatre touches car il existe toujours un chemin actuel à travers les trois autres commutateurs.
Une solution utilisée sur les claviers musicaux (qui sont conçus pour avoir plus d'un élément de la matrice conductrice à la fois) est d'avoir une diode en série avec chaque interrupteur.
Une autre solution serait d'acheter quatre circuits intégrés de décodeur 4 à 16 avec des sorties à collecteur ouvert (ou un drain ouvert si vous utilisez des circuits intégrés MOSFET) tels que celui-ci: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Le collecteur ouvert signifie que les sorties du CI ne feront que absorber le courant, pas le source. Ainsi, vous pouvez connecter 16 capteurs à 16 sorties de la puce et mettre en commun les autres extrémités avec une résistance de rappel (vous connecteriez également votre ADC ici). Vous apportez une sortie basse (conductrice) et les 15 autres restent hautes (non conductrices). Cela contraste avec la sortie logique standard, où les 15 autres sorties versent du courant dans le point commun.
L'entrée de ces circuits intégrés est binaire 4 bits pour sélectionner l'une des 16 sorties, mais elles ont également une entrée supplémentaire pour activer / désactiver la puce. Ainsi, vous pourriez potentiellement avoir un ensemble de 64 éviers à collecteur ouvert, connectés à 64 capteurs, les autres extrémités des capteurs étant toutes communes à une seule résistance de rappel et un convertisseur analogique-numérique. Pour cela, vous aurez besoin d'un total de 8 sorties sur votre microcontrôleur: quatre pour prendre les signaux de sélection 4 à 16 (communs aux quatre puces) et quatre pour prendre les signaux d'activation (un pour chaque puce).
EDIT: 3 à 8 décodeurs (également appelés 1 de 8 = 1 ligne sur 8) semblent être plus disponibles que 4 à 16, mais 8 CI sont beaucoup plus compliqués que 4. Un autre type de CI qui pourrait être utile est le compteur octal (et son cousin le plus courant, le compteur de décades , qui peut être configuré comme un compteur octal en connectant sa neuvième sortie à la ligne de réinitialisation.) Ceux-ci nécessitent une impulsion série pour avancer d'une sortie à la suivante, donc il en faudrait moins Broches d'E / S sur le microcontrôleur que les circuits intégrés du décodeur. Ils ont généralement des entrées supplémentaires pour la réinitialisation et l'activation. Il existe également des IC appelés registres à décalage , qui sont disponibles en deux types: l'un pour convertir des séries en parallèle, l'autre pour convertir des séries en parallèle. Enfin, il existetampons , que vous pouvez mettre entre votre Rasberry Pi et votre échiquier afin que le Pi ne soit pas détruit en cas de surintensité. Tous ces éléments peuvent être utiles dans les circuits de multiplexage.
la source
Le multiplexage est en effet une pratique courante.
Il existe plusieurs façons de tirer le meilleur parti de vos broches Raspberry Pi
La première consiste à utiliser une puce pour faire le gros du travail pour vous. Par exemple, si vous avez 8 entrées et 8 sorties pour lire l'état de la carte, vous pouvez utiliser un compteur pour augmenter les 8 entrées une à la fois. Pour cela, vous aurez besoin de 2 broches sur l'Arduino - une pour réinitialiser la première broche et une pour "passer à la ligne suivante". Vous venez d'enregistrer 6 broches!
Enregistrer 6 broches peut ne pas être suffisant - voyons où nous pouvons aller à partir d'ici: Si vous réorganisez votre grille 8x8 en une grille 16x4, vous pouvez utiliser quelque chose comme http://www.instructables.com/id/16-Stage -Decade-Counter-Chain-Using-two-4017-Chi /? ALLSTEPS (ignorez la moitié supérieure, les deux lignes descendant du haut vers le bas sont votre "réinitialisation", venant du haut à gauche, et le " aller à la ligne suivante ", qui s'appelle CLK, pour horloge, ici). Vous pouvez maintenant compter le 8 sur la moitié gauche du plateau, suivi du 8 sur la moitié droite du plateau; connectez les colonnes A et E, B et F, C et G, et D et H ensemble.
Félicitations, vous avez maintenant deux broches de sortie (réinitialisation et horloge) et 4 broches d'entrée, pour un total de 6 - ce qui économise 10 broches! Notez que le raspberry pi n'a pas de convertisseurs analogique-numérique, vous aurez donc besoin de travail supplémentaire pour cela.
Passons maintenant aux LED. Vous avez déjà une alimentation contrôlée (les deux compteurs de décades) - permet de les réutiliser. Mettez vos 64 LED de vos 16 broches d'alimentation, via une résistance (chaque LED DOIT avoir sa propre résistance!), Sur 4 autres rails (même disposition que ci-dessus: AE, BF, CG et DH). Connectez ces 4 rails à via 4 transistors à 4 broches, et mettez toutes les broches à «haut» - puisque les deux côtés de la LED sont maintenant à 5 volts, les LED seront éteintes. Ensuite, lorsque vous souhaitez allumer une LED, assurez-vous que vos deux décennies sont dans la bonne position (comme si vous lisiez le capteur sur cette place), réglez l'un des 4 rails sur bas. Le courant devrait maintenant passer du «haut» du compteur de la décennie au «bas» dans ce rail spécifique. Hé hop, la lumière s'allume! Accordez un peu de retard, puis désactivez-le avant de modifier à nouveau le compteur de décades.
Si vous voulez plus de contrôle, vous pouvez utiliser quelque chose comme une puce TLC5940 - http://playground.arduino.cc/Learning/TLC5940 - chaque puce peut définir 16 LED (vous en aurez donc besoin de 4) à un niveau de luminosité de 0 (éteint) à 1024 (plein allumé), vous pouvez donc estomper et éteindre des LED individuelles avec un excellent contrôle. De la mémoire, ceux-ci ont besoin d'environ 4 broches, et ils peuvent être connectés en guirlande, donc 4 broches numériques (dont l'une doit être PWM - celles-ci ont le symbole "~" à côté de la broche) contrôleront n'importe quel nombre de LED.
Bonne chance!
la source
Je ne pense pas que vous aurez besoin d'une LED dans le coin supérieur droit. Un capteur au milieu comme vous le mentionnez serait suffisant. La partie Tricky sera le code de l'échiquier. Imaginez que vous ayez un échiquier. La ligne sera indiquée comme «alphabet» et la colonne comme «numéro».
Vous devez donc d'abord un programme pour programmer le type de pièce à la position initiale. Plus tard, lorsque vous déplacez vos pièces, le code générera l'emplacement initial de la pièce à l'emplacement final. Cela réduira de moitié votre apport.
la source