Nous ne cherchons pas de moyens simples.

Précédemment, c'est ma première
publication qui a provoqué une résonance chez les utilisateurs de Habr. Décidé de ne pas s'arrêter. Nous continuons de faire sortir l'impossible d'ATtiny13. Je vous préviens tout de suite que les solutions décrites sont à nouveau non standard, et que quelqu'un peut provoquer l'indignation et la dissonance cognitive ("Et quel est l'intérêt de l'article alors? Montrer quels éléments peuvent être connectés?"). De plus, une telle solution est également très peu pratique, que j'écrirai plus en détail ci-dessous. Mais il se trouve que les solutions standard sont connues depuis longtemps, et les lire n'est pas toujours intéressant, mais écrire est ingrat.
J'aime vraiment ce gamin ATtiny13. Il a suffisamment de cervelle pour résoudre de nombreux problèmes quotidiens (allumer les lumières, la ventilation,
s'enfuir au magasin pour la bière ). Et le prix est tout simplement ridicule. Voici quelques pattes et aucune poignée. Par conséquent, vous devez vous lancer dans toutes sortes d'astuces pour résoudre le problème du manque de jambes.
En train d'étudier la programmation des microcontrôleurs (dans l'environnement Arduino, ne le dites à personne), comme beaucoup, je suis passé par l'étape de connexion d'un capteur de distance à ultrasons, quelque chose comme ceci:

Étant donné que la méthode de transmission des informations du capteur au contrôleur est simple à discréditer, ATtiny13 y fait facilement face. Il a ensuite fallu afficher des informations sur un indicateur à sept segments à l'aide de registres à décalage. Autrement dit, le schéma de la partie d'affichage était plusieurs fois plus grand que le contrôleur lui-même. À ce moment-là, j'ai joué et continué.
Récemment, j'ai pensé, quoi d'autre serait une tâche écrasante à confier à Tinka? Ce qu'elle ne pouvait toujours pas gérer dans les exemples décrits. La première chose dont je me suis souvenu de l'indication. Il y a quelque temps, je cherchais déjà des informations sur un sujet similaire. Ensuite, j'ai trouvé une
option intéressante .21 segments de 5 pieds du contrôleur. Ouah! Je n'ai même pas besoin de tant de choses, deux signes suffisent, plus un point, un total de 15 segments. Et si à quatre pattes? Obtenez ensuite un maximum de 13 segments, pas assez. A la vue du circuit, un désir a surgi immédiatement d'assembler et d'essayer, bien qu'il ne soit pas facile d'élaborer un algorithme de fonctionnement. Mais en y regardant de plus près, vous comprenez que cela ne fonctionnera pas à collecter, de tels animaux à sept segments n'existent pas dans la nature (très probablement). Vous pouvez faire, bien sûr, mais c'est un niveau différent. Puis l'idée a été reportée à des temps meilleurs.
Hors sujet: Pourquoi n'y a-t-il pas d'indicateurs à sept segments avec logique intégrée? Où cherchent les développeurs? À quel point l'installation et le contrôle sont-ils pratiques? Deux pieds d'alimentation et 3 (1, 2) pieds de données. Et après tout, ils étaient même en URSS: 490IP1, 490IP2. À l'intérieur de l'indicateur le plus ordinaire pour 2 ... 4 chiffres, il y a beaucoup d'espace pour placer le microcircuit de la puce, et le prix du registre à décalage est de 0,064 cu avec le boîtier. Oh bien.
Et donc j'ai pensé à nouveau, comment réduire le nombre de jambes pour travailler avec l'indicateur à sept segments? Les sorties du contrôleur peuvent prendre trois états (en fait 4, mais maintenant cela n'a plus d'importance). Existe-t-il un moyen de l'utiliser? Si deux états par rapport à la LED ne peuvent être interprétés que comme brillant, pas brillant, alors avec trois c'est un peu plus intéressant. Je n'ai pas encore compris comment l'utiliser, mais le schéma suivant m'est venu à l'esprit:

Si la sortie du contrôleur est à l'état zéro, les LED ne s'allument pas (ce qui est évident).
Si la sortie est à l'état unitaire, les LED sont allumées, ce qui est également compréhensible.
Mais si la sortie n'est pas du tout la sortie, mais est connectée à l'entrée, un courant circule dans le circuit de deux résistances et de la LED HL1, créant une chute de tension au point de connexion des résistances d'environ (5-1,7) / (2,2 + 1,5) * 1,5 + 1,7 = 3,0 V. Cela ne suffit pas pour que le courant passe par le circuit VD1_R3_HL2 (environ 3,4 V sont nécessaires). Le VD1 est une LED supplémentaire utilisée comme diode zener (le stabilisateur est plus correct), donc nous ne le considérerons pas comme une LED, afin de ne pas être confondu. Peu importe si la résistance de rappel est activée à l'intérieur du microcontrôleur, sa résistance (20 kOhm) n'affecte pratiquement pas la situation. Je ne suis pas venu à de telles notes tout de suite, avant d’essayer avec une diode ordinaire comme VD1, cela fonctionne aussi assez bien avec les mêmes résistances R1 et R2. Mais il vaut mieux que R2 soit environ une fois et demie plus grand que R1. Et j'ai presque oublié la chose la plus importante: tout ce qui est décrit n'est possible qu'avec l'utilisation de LED
rouges à la fois dans l'indicateur et les autres. Dans les cas extrêmes,
l' indicateur
ou des LED supplémentaires peuvent être appliqués en vert. Et avec une tension d'alimentation de 4,5 V à 5 V.
Qu'avons-nous finalement? Trois états: aucune LED (0) ne brille, HL1 (1) brille ou HL1 et HL2 (2) brille. Très similaire au système ternaire. Mais nous ne pouvons pas allumer HL2 sans HL1, cela doit être rappelé. Mais maintenant, avec l'aide des quatre pieds du microcontrôleur, nous pouvons contrôler huit LED (je voulais le penser).
Ensuite, j'ai essayé de diviser les segments indicateurs en paires (comme dans un jardin d'enfants: un garçon-fille). La condition principale est que dans chaque paire l'un des segments ne puisse pas briller seul, une telle discrimination. Voici ce que j'ai obtenu:

Quatre paires de segments, dans chaque lettre majuscule est indiqué le segment dominant, qui peut fonctionner seul, le second ne peut qu'avec lui. Vous remarquerez peut-être que le segment «a» s'anime avec deux à la fois, et personne n'est arrivé au mauvais point. Comment ça ressemble à la vie!
Mais avec ces paires, vous pouvez afficher (presque) tous les nombres:
Chaque paire est peinte dans sa propre couleur. Un spectateur attentif a remarqué que quelque chose n'allait pas avec le diable. Nous ne nous concentrerons pas là-dessus pour l'instant. J'ai essayé quelques autres options pour regrouper les segments, mieux vaut ne pas venir. Peut-être que quelqu'un suggérera. Peut-être que le réseau neuronal pourrait le gérer.
À la deuxième étape des expériences, j'ai dû utiliser un indicateur avec une anode commune. Par conséquent, le schéma final est le suivant:
Quelqu'un peut demander: où sont passées les résistances de 100 ohms? Il est connu depuis longtemps (et activement utilisé) qu'avec des indications dynamiques correctement faites, les résistances de limitation de courant peuvent être supprimées. Même si la tension est constamment appliquée de la sortie du contrôleur aux deux LED connectées en série par erreur, le microcontrôleur et les LED résistent normalement à cela, le courant est limité par la résistance de transition à l'intérieur du MC. Et plus sur les résistances. Le courant maximum à travers HL1 selon le schéma précédent est d'environ 2 mA, et à travers HL2 il atteint 25 ... 40 mA (probablement, plus tard, je vous dirai d'où viennent ces chiffres). Cela signifie que le flux lumineux des différents segments sera différent. Mais puisque l'indication dynamique sera utilisée, cela peut facilement être résolu en raison du temps d'affichage différent des segments.
Toutes les expériences que j'ai menées sur l'Arduino Nano dans l'IDE Arduino. Une excellente carte de prototypage, elle devient bonne dans la planche à pain, elle est flashée via USB sans problème. Quelque chose a-t-il échoué? J'ai corrigé le croquis et en une minute j'ai téléchargé un nouveau firmware. Et lorsque vous avez débogué le code, vous pouvez accéder au firmware dans ATtiny13, cela prend encore un peu plus de gestes.
Soit dit en passant, je clignote également en utilisant Arduino dans l'environnement Arduino, cela élimine pratiquement la possibilité de verrouiller MK avec les mauvais fusibles, et beaucoup plus facile.
Voici un exemple d'affichage du chiffre 4 dans le code:
pinMode(f_a, INPUT);
En principe, tout devrait être clair, même pour ceux qui ne connaissent pas Arduino, mais qui comprennent un peu les contrôleurs. Les chiffres de 150 microsecondes et 2 millisecondes sont sélectionnés expérimentalement par la luminosité des segments. Dans le code final, vous devez les placer dans des variables distinctes afin de pouvoir les modifier pendant le débogage. À partir de ces chiffres, il est possible de déterminer approximativement l'ordre de différence des courants sur deux segments dans une paire. Puisque le segment G brille environ 13 fois moins que les autres et fournit la même luminosité, on peut supposer que le courant à travers ce segment est 13 fois plus qu'à travers les autres. En fait, la dépendance de la luminosité sur le courant n'est pas linéaire, donc le courant peut être 25 fois plus grand, soit 50 mA. Avec un tel rapport cyclique, c'est assez sûr pour la sortie de MK. Soit dit en passant, cette différence de courants a joué entre les mains lors de la résolution du problème de la figure 2. Comme je l'ai écrit ci-dessus, le segment G ne peut être allumé qu'avec le segment C. Mais si vous passez 0 à la jambe MK, qui est responsable de C et G, de 150 μs, et après 2 ms pour garder 1 dessus, puis le segment G "fonctionnera" à pleine luminosité, et le segment C pour les mêmes 150 microsecondes n'aura que le temps de surligner un peu. Nous obtenons un presque deux pleins. J'ai donc réussi à briser la règle que j'ai moi-même établie. Ce qui ne peut pas être fait du désespoir.
Donc, nous avons allumé la figure avec les quatre jambes du MK. En fait, j'ai raté cette étape par moi-même, affichant immédiatement deux personnages. Pour ce faire, déconnectez la sortie de l'anode commune de l'un des bits indicateurs de la puissance plus, et connectez-la à une autre sortie MK, et l'anode de l'autre décharge à la sortie suivante (6 jambes déjà). Maintenant, tour à tour, réglez 1 sur l'anode du chiffre le moins significatif, affichez le chiffre du chiffre le moins significatif, puis 1 sur l'anode du chiffre le moins significatif, et affichez le chiffre du chiffre le plus élevé, et ainsi de suite dans un cercle. J'ai mené cette expérience avec Arduino Nano, elle a assez de jambes. Tout le code a été débogué dessus, pas la première fois. Et cela a fonctionné comme il se doit.
Étant donné que les anodes sont connectées à tour de rôle, à l'aide d'un simple raffinement, une sortie de plus du MK peut être libérée. Voici le schéma récapitulatif:
Utilisez au total 5 pattes MK pour afficher un nombre à deux chiffres. À ce stade, vous pouvez déjà essayer avec le bébé ATtiny. Ce que j'ai fait. Mais pas tout de suite. Un croquis compilé dans un environnement Arduino pour ATtiny13 occupait environ 1,7 ko de mémoire avec 1 ko disponible. Pour réduire la taille, j'ai dû me tourner directement vers les ports, ce que j'allais faire plus tard. Soit dit en passant, sur Arduino, j'ai utilisé les mêmes ports que j'allais utiliser sur ATtiny, c'est très pratique. Ils sont déjà indiqués dans le dernier diagramme. Après traitement, le code a perdu un kilo-octet.
Voici le code résultant pour ATtiny13:
Le code ci-dessus permettra à votre ATtiny13 de lire de 0 à 99. Il serait plus correct de prévoir la possibilité de réaffecter les jambes MK. Les gourous de la programmation pourraient réduire le code plusieurs fois (
où est la limite minimale de Hello World sur AVR? ).
Vous pouvez ajouter la fonction nécessaire au code afin que MK affiche quelque chose de conscient. Certes, Tinki a déjà toutes ses jambes occupées. Il existe également un segment de réinitialisation qui peut être utilisé comme port d'entrée / sortie. Mais l'utiliser était plus difficile que je ne le pensais. Par conséquent, pour moi, je pars "pour plus tard". Mais il y a une fonctionnalité intéressante que tout le monde ne connaît pas. L'entrée analogique ADC0 est sortie sur la même branche, et ça marche! Certes, lorsque la tension est inférieure à 1/4 de la tension d'alimentation, le MK passe en mode de réinitialisation. Mais de 1/4 à la tension d'alimentation, il est tout à fait possible de mesurer la tension d'entrée. J'en ai profité:
L'expérience montre que l'indicateur peut être réduit à 21, seulement alors le MK passe en mode de réinitialisation et commence à fonctionner lorsqu'il revient à environ 25 et plus. Il est donc possible de faire un très mauvais «indicateur» pour indiquer une tension de 25 à 99 volts, bien sûr, avec un diviseur sur l'entrée de mesure.
Maintenant sur l'application pratique. L'idée originale d'afficher les données d'un capteur de distance a été reportée à des temps meilleurs en raison du manque d'une entrée numérique. Sinon, pourquoi pouvez-vous appliquer le schéma jusqu'à ce que les idées viennent. Autre mise en garde: il ne peut être question de rentabilité. Même si vous payez tous les segments, un courant de 2,5 mA traversera la résistance R2 (selon le premier schéma), au total 10 mA vers l'indicateur, plus le contrôle du transistor ajoute environ 5 de plus. Je n'ai pas mentionné, le transistor de presque n'importe quel pnp est moderne.
À propos de l'opportunité. L'option la moins chère pour produire sur le segment sept est ATtiny13 plus 74HC595. Deux boîtiers CMS me coûteront environ 0,50 cu Le plus simple est ATmega8 (et c'est tout, pas de résistances, rien de plus), c'est 0,68 cu Et l'option décrite ci-dessus est le coût d'ATtiny, 9 résistances, 4 LED, un transistor (tous les SMD) - c'est environ 0,46 cu, bien que ce soit pièce par pièce, tout est parfois plus cher. De plus, tout assembler est plus compliqué que dans les versions précédentes.
En fait, la seule option que je peux voir est si vous avez un ATtiny13 complet, mais vous devez toujours aller au magasin pour ATmega. Eh bien, si un indicateur à sept segments est la décoration principale de votre appareil, je ne recommanderais pas ce schéma, l'affichage n'est pas parfait, dans certaines combinaisons, les segments inutiles sont légèrement mis en évidence. Il arrive que l'indication soit parfois nécessaire lors de la mise en place, puis du lieu lui-même.
En général, j'ai passé quelques jours en vain.
En plus des critiques, j'attends des suggestions pour améliorer le code et simplifier le schéma. Ou une fonctionnalité améliorée sans complication. Ce qui m'intéresse le plus, c'est comment éclairer un point, cela élargirait la portée. Mais si nous pouvions également publier une conclusion des 5 participants, il serait alors possible de se déplacer.
Je serais heureux si ma solution non standard profiterait à quelqu'un, pas maintenant, un jour.
UPD: Je connais le Charliplexing! Le schéma de tiers que j'ai cité au début de cet article est Charliplexing. Et là, j'ai écrit pourquoi le Charliplexing ne convient pas.
Veuillez ne pas écrire de commentaires si vous lisez l'article en diagonale.