Jouet pour enfants sur les éléments logiques

Dans cet article, pour ainsi dire, je veux parler de mon premier projet en génie électrique. Je dois dire que, par ma profession, je suis loin des circuits et de l'électronique radio, mais l'intérêt pour ce sujet ne m'a pas donné de repos dès mon plus jeune âge. Pour les personnes expérimentées, les informations ci-dessous peuvent sembler trop évidentes, et j'ai fait beaucoup «inventer un vélo». Mais peut-être que certains noob, comme moi, pourront découvrir quelque chose de nouveau et d'intéressant. Peu importe, s'il vous plaît, sous le chat.


Tout a commencé avec l'idée de créer une carte de développement pour ma petite fille. Tout d'abord, je voulais étirer mes bras et faire quelque chose moi-même. Deuxièmement, je voulais étirer mon cerveau et trouver quelque chose qui ne se trouve pas sur des planches ordinaires de ce type.


Après avoir observé ce que l'enfant aime le plus faire dans la vie de tous les jours, il a été décidé qu'en plus des poignées de chaîne standard, vous devez ajouter des boutons pour appuyer et un certain appareil qui affiche la réaction à la pression. Étant donné que quelque chose de simple, mais lumineux, aurait dû être affiché, le choix s'est porté sur la matrice LED 8x8 rouge.


Jusqu'au moment où j'ai créé le jouet, je ramassais de la poussière sur l'étagère Arduino Uno depuis un certain temps - il attendait que je trouve quelque chose d'utile autre que le système de couleurs à arrosage automatique, qui, en plus de créer l'ennui lui-même, était un peu moins que je n'en avais pas besoin du tout. Je pensais que son heure (Arduino) était venue, car vous devez commencer quelque part. Après avoir lu les manuels de la matrice, j'ai appris qu'en plus de ne pas le connecter à l'Arduino (juste pour cela, vous avez besoin de 16 broches qui ne sont pas dans mon Arduino), il est impossible de contrôler toutes les LED en même temps. Vous pouvez briller simultanément avec certaines diodes soit sur une ligne soit dans une colonne (contrôle de la cathode commune ou de l'anode commune). Et si vous le faites régulièrement et assez rapidement, une personne cesse de percevoir le clignotement et voit une image stable. J'ai également appris que pour Arduino, il existe des pilotes et des bibliothèques standard qui prennent la peine de gérer ce processus. Et le fait de l'absence d'un tel pilote à l'époque prédéterminait l'issue de l'ensemble du projet.


Tandis que je procrastinais tout et repoussais le choix du meilleur endroit pour acheter un pilote, je suis tombé sur un article sur le fonctionnement des systèmes de déclenchement. Pour mon cerveau, les sciences humaines, c'est devenu une véritable découverte, permettant de comprendre comment la mémoire est organisée à un niveau primitif. Ensuite, je me suis demandé si je pouvais me passer d'Arduino et faire mon projet basé sur des déclencheurs et des circuits logiques.


Donc, vous devez d'abord décider quoi montrer et comment le faire. Il était clair qu'il était nécessaire d'appliquer tour à tour un signal à huit rangées de la matrice et à chaque itération d'appliquer un signal parallèle à certaines colonnes. Eh bien, cela m'a permis de comprendre les trois principaux composants - un générateur d'impulsions, un convertisseur d'horloge en huit signaux consécutifs et un convertisseur qui, pour chacun des huit signaux, produira une certaine combinaison de signaux parallèles. Ce n'est pas si compliqué.


Après réflexion, un circuit s'est formé dans la tête dans lequel le signal d'horloge est converti en code binaire à l'aide de trois déclencheurs JK connectés en série, puis, à l'aide de circuits logiques, en octal. Les détails sur ce type de déclencheurs peuvent être lus au moins sur Wikipedia . En bref, il possède deux entrées (J et K) et deux sorties (Q et Q̄), ainsi qu'une entrée de synchronisation (CLK). Lorsqu'une unité logique est envoyée à l'une des entrées lors de la prochaine impulsion de synchronisation, l'unité sera affichée sur la sortie correspondante et stockée dessus, que l'impulsion de synchronisation soit à nouveau appliquée et que la valeur de l'entrée sélectionnée change, à condition que la deuxième entrée reste nulle. Si vous soumettez une unité à la deuxième entrée et au premier zéro, puis à la prochaine impulsion de synchronisation, la valeur de la première sortie passera à zéro et la seconde à une. Mais si une unité est appliquée aux deux entrées de déclenchement, alors à chaque impulsion de synchronisation, l'unité apparaît alternativement sur l'une des sorties. Et si vous prenez deux déclencheurs, appliquez une impulsion d'horloge à l'entrée de synchronisation du premier, et le signal de la sortie Q̄ du premier à l'entrée de synchronisation du second, par conséquent, la sortie Q1 produira un tous les deux cycles et Q2 tous les quatre. Ainsi, un compteur binaire à deux chiffres est obtenu. Et si vous ajoutez le troisième déclencheur de la même manière, en raison du troisième chiffre, vous pouvez compter jusqu'à huit avec un code binaire - c'est ce dont vous avez besoin.


image


Ensuite, il était nécessaire de créer une table de vérité et de sélectionner un ensemble de clés logiques afin que le code binaire se transforme en huit signaux consécutifs. Si pour certains, la table de vérité et les opérations booléennes sont quelque chose de nouveau et d'inconnu, vous pouvez les lire à nouveau sur Wikipedia ici et ici .


Il semblerait que la moitié du travail soit là, mais en fait, ce n'était pas si simple. Lorsque j'ai rassemblé la première partie du circuit pour le test sur une planche à pain et présenté comment mettre en œuvre la deuxième partie de la même manière, mon fantasme a dessiné pendant de nombreux mois (et peut-être des années - le temps de se livrer à un passe-temps est un peu plus d'une heure après le travail) de dessin de diagrammes et de compilation de tables de vérité. En effet, pour huit lignes de chaque image, vous devez générer une combinaison unique de colonnes. Et plus il y a d'images, plus le circuit sera monstrueux. J'ai réalisé que cela ne fonctionnerait pas pour faire ce qui était prévu uniquement sur les clés logiques. Il fallait chercher quelque chose qui pourrait simplifier ce processus.


La solution était une puce mémoire. Pour ma tâche, la mémoire EEPROM (Electrically Erasable Programmable Read-Only Memory) était bien adaptée - une mémoire programmable avec la possibilité d'effacement électrique avec entrée / sortie parallèle. La mémoire a combien d'entrées d'adresse, qui sont en fait des bits de l'adresse binaire des cellules de mémoire. Autrement dit, si la mémoire a n entrées d'adresse, 2 ^ n cellules peuvent être programmées. Le nombre de broches de mémoire est ce que l'on appelle la "longueur de mot" ou la longueur réelle d'une chaîne binaire qui peut être écrite dans chaque cellule. Le produit du nombre de cellules par longueur de mot détermine la quantité de mémoire en bits.


Le signal d'entrée sous forme de code binaire était à ma disposition à la sortie des déclencheurs JK. Il reste à le compléter avec des bits des boutons, qui devraient être responsables de la sortie des différentes images, et le point est dans le chapeau.


Et encore une fois, le manque d'expérience ne m'a pas permis d'évaluer correctement la complexité du processus. Après tout, la mémoire doit être programmée, et pour cela, vous avez besoin d'un programmeur - l'appareil est considérablement coûteux pour l'acheter pour un jouet unique. La recherche sur Google a montré qu'il était théoriquement possible de le faire avec l'Arduino. Mais pour la programmation, il est nécessaire de fournir simultanément des signaux aux entrées d'adresse de la puce mémoire et aux sorties, qui devraient ensuite reproduire le signal. Et nous avons également besoin de signaux de contrôle de puce. Autrement dit, encore plus que les broches disponibles. Une recherche supplémentaire a ouvert pour moi un registre à décalage - une puce qui se souvient d'une séquence donnée de zéros et de uns et les affiche sur des sorties parallèles. Souvent, ces puces fonctionnent également comme un tampon et ont une sortie qui peut reproduire séquentiellement les signaux d'entrée. Autrement dit, si vous y connectez le même registre suivant, vous pouvez afficher simultanément une séquence deux fois plus grande que pour une seule. Lorsque vous entrez dans la ligne, la première partie passera par le premier registre comme par le biais d'un tampon dans le second, et le reste restera dans le premier registre. En ajoutant un troisième registre, vous pouvez tripler la longueur de la chaîne, etc. Pour implémenter cela, vous avez dû écrire une esquisse dans un langage de programmation inconnu. Mais ayant une certaine expérience en Python et de nombreux exemples sur Internet, après une série d'essais et d'erreurs, cette tâche s'est avérée tout à fait réalisable. Le croquis peut être pris sur github .


Et maintenant le croquis est écrit, le microcircuit est connecté, le lancement et ... rien - la mémoire n'est pas programmée. Quelques échantillons, modification des paramètres d'enregistrement et aucun résultat. J'avais un microcircuit W27C512-45Z. Une lecture attentive des manuels a montré un moment désagréable. Pour écrire sur un contact spécifique du microcircuit, il est nécessaire de fournir un courant de 0,03A avec une tension de 12V. Je pensais que je venais d'acheter une puce pas si appropriée. Mais après avoir parcouru les étagères des magasins locaux de composants électriques, je me suis assuré que tout le monde avait besoin de 12V. Je n'avais pas d'alimentation électrique de laboratoire. Il y a beaucoup de blocs 12V dans la maison, mais ils sont tous pulsés, de plus, le courant est d'environ 1A. Pardonnez-moi, ingénieurs expérimentés pour un tel sacrilège, mais en désespoir de cause, j'ai décidé d'essayer de voir si un miracle se produirait avec ces blocs qui étaient à portée de main. Cela ne s'est pas produit. Les deux premières passes de l'enregistrement n'ont rien donné, et après le troisième microcircuit, il a cessé de montrer des signes de vie.


Sur Internet, j'ai trouvé des références à un certain microcircuit ST662AB - un convertisseur 5V-12V - qui, avec le bon ensemble de condensateurs, devrait produire le courant et la tension nécessaires. En fait, il n'a pas été facile de trouver la puce. En conséquence, je l'ai commandé en Chine, également SMD. Et qu'en est-il de quatre à six semaines de livraison? Bon, apprends. En parcourant les articles sur la programmation mémoire, je suis tombé sur une mention d'une puce qui peut être programmée à 5V. Il s'agissait de l'AT28C256. Et en effet, dans les fiches techniques pour elle, il n'y avait aucune mention de 12V. Besoin de prendre! Certes, la puce pour mes besoins était un peu redondante, car elle m'a permis d'économiser 256 Ko: une sortie 8 bits pour 32 Ko d'adresses, ce qui, compte tenu des trois broches d'adresse occupées pour les signaux de synchronisation de ligne, a permis de coder jusqu'à 4096 images (10 me suffiraient). De plus, la livraison devait déjà être effectuée depuis le Royaume-Uni. Mais je n'ai pas trouvé d'autres options, et au final, la mémoire peut être reprogrammée, et lorsque le jouet n'est plus d'actualité, la puce peut être utilisée ailleurs. Donc, après quatre jours, j'ai eu un souvenir. Sketch test run, et bonheur - tout fonctionne.


La dernière chose qui reste est de décider du nombre de boutons, de dessiner des images 8x8 et de mettre en œuvre l'ajout de signaux des boutons au circuit. Ayant estimé la place sur le plateau, je me suis installé sur cinq boutons. Étant donné la demande sans valeur par rapport à la ressource mémoire, le moyen le plus simple était d'envoyer un signal de chaque bouton directement vers une entrée séparée sans utiliser de codage. Certes, je devais encore résoudre le problème de basculement entre les images. Il était possible d'utiliser des boutons avec fixation de pression. Mais une telle implémentation ne convenait pas à un enfant d'un an, car alors, avant d'appuyer sur le bouton suivant, il fallait appuyer sur le bouton de travail, et c'était assez primitif en soi. Je voulais proposer un schéma pour les boutons sans fixation, dans lequel la pression de chaque bouton serait enregistrée, et même annuler la pression de la précédente. J'ai lu les caractéristiques de l'utilisation de différents types de déclencheurs, en espérant que certains d'entre eux peuvent résoudre ce problème par eux-mêmes, mais hélas. Après m'être assis un peu avec une feuille et un crayon, j'ai trouvé le schéma suivant (un exemple pour trois boutons).


Tout d'abord, vous devez connecter tous les boutons à un certain collecteur, qui à la sortie donnera une unité lorsque vous cliquez sur l'un des boutons. Pour cela, la touche OU convient. Étant donné que le plus souvent les microcircuits de touches n'ont que deux entrées, il est nécessaire de connecter les deux premiers boutons à une touche, puis de connecter sa sortie à la première entrée de la deuxième touche et le troisième bouton à sa deuxième entrée. De cette façon, vous pouvez continuer à connecter plus de boutons, en ajoutant une nouvelle clé pour chacun des suivants. De plus, chaque bouton doit être connecté à une touche XOR distincte et à l'entrée J d'un déclencheur JK distinct. Connectez la sortie du tampon OR à la deuxième entrée des touches XOR et la sortie de chaque touche XOR à l'entrée K du déclencheur JK correspondant. Ainsi, en appuyant, par exemple, sur le bouton 1, une unité sera envoyée à J1 et XOR1 ne sera pas déclenchée, car une unité lui est fournie à la fois par le bouton et par le tampon OU. À la sortie Q1, une unité apparaîtra également et sera enregistrée. Dans le même temps, XOR2 et XOR3 fonctionneront, alimentant une unité en K2 et K3. Et si sur Q2 ou Q3 avant cela il y avait une unité, elle passera à zéro.


image


La création d'images 8x8 était également un test distinct. Trop peu de points pour reproduire une image reconnaissable. Mais allumer le fantasme, a quand même réussi à en dessiner quelques-uns, par exemple un tel androïde.


image


Pour les photos, j'ai créé des tables de vérité. Mais comme il faut en soumettre un pour les lignes pour la matrice et zéro pour les colonnes, le tableau a dû être inversé. J'ai écrit le code binaire résultant en encodage hexadécimal pour une utilisation plus pratique dans le croquis Arduino.


Pour construire tout le circuit, je voulais commander une planche finie. Mais à partir de la liste des entreprises disponibles offrant des services de fabrication de cartes simulées, on m'a proposé l'option la moins chère pour une carte bilatérale pour près de 25 $. Je ne sais pas, c'est peut-être un coût normal, mais ça me semblait un peu trop. De plus, je n'ai absolument aucune expérience dans la conception de mises en page. Et je trouve le processus de soudage très agréable et apaisant. Par conséquent, j'ai acheté une planche universelle, un rouleau de fil multicolore, les composants nécessaires et je me suis assis à l'assemblage pendant plusieurs soirées. Puisque tous les composants fonctionnent sous une tension de 5V à 12V. Pour plus de commodité, j'ai fabriqué une batterie 9V.


Comment tout fonctionne en conséquence peut être vu ici , le schéma complet est disponible sur le github .
En tant que «cœur» de l'ensemble du circuit, j'ai utilisé un générateur d'impulsions. Je n'étais pas sûr de la fréquence exacte de l'impulsion d'horloge, j'ai donc utilisé le circuit prêt à l'emploi avec réglage. Malheureusement, je n'ai pas d'oscilloscope, mais en comparant les réglages et la fiche technique du circuit, quelque part autour de 1KHz est utilisé. Ici, la vidéo montre comment la fréquence passe de faible à élevée, vous pouvez voir comment les lignes de la matrice sont dessinées.


Merci de votre attention.

Source: https://habr.com/ru/post/fr421967/


All Articles