Beaucoup de gens fument trop, surtout quand ils sont dépendants de quelque chose et ne remarquent pas comment ils fument une cigarette après l'autre. La boîte noire du fumeur (CJK) ne vous permet pas de prendre la prochaine cigarette avant un certain laps de temps. Dans cet article, je ferai attention à certains détails qui peuvent être utiles pour d'autres développements, en particulier le contrôleur LC Teensy pas si célèbre (famille Arduino).
La mécaniqueLes détails ChYAK sont imprimés sur une imprimante 3D et après assemblage des parties inférieure, centrale et supérieure sont collées ensemble.
Le mécanisme de verrouillage est rendu électromécanique, tandis que les fonctions de verrouillage de base sont réalisées de manière purement mécanique, ce qui rend difficile le crack du NJC en manipulant les espaces et en retirant les batteries.
Le système de verrouillage se compose d'une crémaillère à dents et d'un cliquet bistable, qui permet au plateau de se déplacer uniquement dans le sens de la fermeture. Lorsqu'il atteint une période de temps prédéterminée, le servo effectue un seul mouvement de va-et-vient et pousse le cliquet, qui est réglé dans le deuxième état stable «ouvert». Le CFC reste ouvert jusqu'à ce que l'utilisateur tire mécaniquement le plateau. Lorsqu'il est déployé, le plateau pousse le cliquet et le remet à l'état armé.
Le chargeur est réalisé sous la forme d'un tambour avec 4 évidements pour cigarettes. Pour éviter d'essayer de faire passer une cigarette dans le chargeur, le mécanisme à cliquet ne permet pas de se déplacer dans la direction opposée, du côté duquel les pare-chocs sont fabriqués.
Des fentes ont été faites sur le couvercle supérieur, elles vous permettent d'éliminer les éventuelles distorsions de cigarettes à l'intérieur de la boîte et de secouer les copeaux de tabac.
InterfacePour contrôler l'heure, le nombre de cigarettes dans CHYAK et le nombre de cigarettes sorties, l'affichage OLED est surveillé. Il est éteint presque tout le temps pour ne pas décharger la batterie et n'est allumé que par un signal du capteur capacitif central, qui se déclenche lorsqu'une main est levée vers le CHYAK ou un signal du bouton lors du chargement des cigarettes. Un autre bouton capture le moment où le plateau est fermé et démarre le cycle de retard suivant. Deux capteurs capacitifs supplémentaires sont situés sur la paroi arrière et sont utilisés pour régler les compteurs de cigarettes (nécessaires, par exemple, lors du changement de piles).
ÉlectroniqueLe microcontrôleur est un Teensy LC. Cet appareil de type arduin, compatible avec la plupart des bibliothèques Arduino, a été choisi car il prend en charge les capteurs capacitifs (interface tactile (TSI)). Les capteurs sont si sensibles qu'ils sentent facilement la main levée à une distance d'un centimètre. Teensy LC a le mode dit LLWU, dans ce mode tous les modules sont en mode veille, à l'exception de l'oscillateur 1 kHz. Vous pouvez quitter ce mode veille de 4 manières: a) obtenir une interruption du capteur capacitif, b) obtenir une interruption de la broche, c) obtenir un débordement du compteur 1 kHz (minuterie à faible puissance, LPTMR), d) obtenir une interruption de l'alarme.
Ici, l'auteur était en difficulté: dans les plans initiaux, il s'agissait d'utiliser TSI pour se réveiller lorsqu'une main était présentée, et LPTMR pour des interruptions périodiques pour ajuster les niveaux de TSI (en fonction des conditions environnementales) et le contrôle du temps. Mais il s'est avéré que LPTMR est utilisé pour le fonctionnement de TSI et, par conséquent, ne peut pas être utilisé comme compteur de temps. (L'interruption de débordement LPTMR est un déclenchement matériel pour TSI, et, bien sûr, doit être rapide pour surveiller le capteur. Habituellement, ce compteur est préréglé sur moins un pour que TSI soit interrogé avec la fréquence la plus élevée possible de 1 kHz).
Une autre possibilité serait d'utiliser l'interruption d'alarme RTC, mais le fait est que Tenncy LC n'a pas d'horloge temps réel (RTC). Au contraire, RTC est dans le processeur lui-même, mais il n'y a pas de câblage pour le quartz RTC sur la carte. Cependant, le développeur du processeur a laissé une faille pour les esprits curieux. L'oscillateur 1 kHz (qui fonctionne en mode veille) peut être utilisé comme source pour les registres RTC du contrôleur. Ensuite, il s'avère que le RTC peut compter non pas des secondes d'intervalle (comme lors de l'utilisation de quartz à 32 kHz), mais 32 secondes si vous utilisez un oscillateur à 1 kHz. Cette précision n'est bien sûr pas suffisante. Mais il y a une issue.
Voici comment cela fonctionne:
Il existe un registre RTC Time Prescaler (RTC_TPR). Ce registre de 16 bits compte les impulsions de l'oscillateur. Lorsqu'il déborde, le registre des secondes de temps RTC (RTC_TSR) augmente d'une unité. En mode classique, ce sont les secondes, qui sont comparées au registre des alarmes temporelles RTC (RTC_TAR), et lorsqu'elles coïncident, une interruption d'alarme est générée. Lors de l'utilisation de quartz 32 kHz standard, RTC_TSR n'est pas préinstallé, mais est compté à partir de zéro à chaque fois (32 768 jusqu'au débordement (secondes)). Mais si nous préréglons RTC_TSR à chaque fois, en tenant compte du fait que nous avons un oscillateur lent à 1 kHz, nous pouvons obtenir une interruption d'alarme jusqu'à une milliseconde de précision (sans tenir compte de l'inexactitude de l'oscillateur lui-même). Bien entendu, RTC_TAR doit également être recalculé en conséquence.

Par exemple, si nous voulons définir la période à 87 secondes, nous devons écrire 2 dans RTC_TSR (2 * 32768 = 65536ms = 65,536s), 2 dans RTC_TAR et 32768- (87 * 1000-65536) = 11304 dans RTC_TSR. Ensuite, 32.768-11.304 = 21.464 secondes se passeront avant le premier débordement RTC_TPR, et deux cycles complets 2 * 32.768 = 65.536 leur seront ajoutés, qui ne seront que 21.464 + 65.536 = 87 secondes
En général, comme ceci:
void setAlarm(uint32_t seconds ) { RTC_SR = 0;
Et même nous pouvons surveiller le temps total (jusqu'à une erreur de 1 kHz de l'oscillateur), par exemple, si au début du programme tous les registres RTC étaient nuls:
timeEllapsed=(RTC_TSR*32768+RTC_TPR)/1000
La précision de l'oscillateur 1 kHz est faible, mais pour nos besoins, elle sera suffisante. Il convient de noter que lors du démarrage d'une nouvelle alarme, nous modifions les registres RTC, donc si vous avez besoin de surveiller l'heure, ils doivent être mémorisés avant le déclenchement de l'alarme, et après avoir quitté l'interruption d'alarme, ils sont recalculés à nouveau en tenant compte du temps passé en veille prolongée. Je l'ai décrit en détail ici: à
propos de RTC pour Teency LCDans CJC, une interruption toutes les 10 minutes mesure et stocke le niveau du signal des capteurs capacitifs en l'absence d'une main. Ceci est fait afin de pouvoir suivre de manière fiable les changements dans les signaux à l'approche. Avec un fond à ~ 500 unités, nous utilisons un niveau excédentaire de ~ 20 unités, ce qui permet de sentir la main à une distance de 5-10 mm. Le niveau de fond dépend de la température et de l'humidité, donc pour la fiabilité il doit être ajusté périodiquement. C'est, je crois, une faille dans les développeurs de processeurs. Pourquoi n'ont-ils pas permis d'avoir un réveil de TSI et d'un autre compteur de faible puissance en même temps (il suffit d'ajouter un autre registre), car un ajustement périodique des niveaux de TSI est presque obligatoire, même si vous n'avez pas besoin d'une minuterie à d'autres fins!
Maintenant sur l'énergie consommée. En mode veille LLWU, le Teensy LC consomme environ 15 uA lorsqu'il n'y a pas de kit carrosserie. Nous avons dû connecter un autre écran OLED et un servo. Ces deux appareils ont des courants de fuite importants même dans un état passif.
Tout est simple avec OLED, c'est un écran OLED monochrome Adafruit 0,96 "128x64, il est alimenté par 3,3 V, consomme environ 20 mA lorsqu'il est allumé (en fonction du nombre de pixels impliqués) et est contrôlé par SPI. Autrement dit, connectez simplement son entrée d'alimentation à la sortie de 20 milliampères du Teensy LC (Teency a différents types de sorties) et vous avez terminé. Lorsque tout le monde dort, cette sortie est simplement transférée au 3ème état et le courant ne passe pas par l'affichage, au réveil la sortie est transférée à l'état haut de sortie et devient Vcc pour l'affichage.
Le servo est un peu plus compliqué. Le servo en mode veille consomme un courant d'environ 2 mA, ce qui, bien sûr, n'est pas acceptable. Par conséquent, vous devez l'éteindre complètement pendant que vous dormez. Contrairement à l'Arduin classique, le Teensy LC propose une assez petite sélection d'alimentations: soit 1,7-3,3 V directement connectées, soit 2,6-5,5 V (avec le régulateur de tension interne activé). Les servos généralement accessibles fonctionnent à partir d'au moins 1S Lipo, et cela fait 3,3-4,2 V. Par conséquent, nous devons allumer trois batteries standard en série pour avoir de 3,3 (décharge) à 4,6 V (nouveau). Pour la plupart des servos, 3,3 V est à la limite de fonctionnement, donc les sorties Teensy ne peuvent pas être utilisées directement (comme pour OLED). Oui, et le courant pendant la rotation est d'environ 50 mA, ce qui est un peu trop pour le Teensy LC. Par conséquent, le servo est activé via MOSFET:

Avec cette mise sous tension, il peut sembler que ce n'est pas sûr, car lorsque le MOSFET est éteint, la tension à l'entrée PWM ctrl dépasse 3,3 V, et les entrées Tennsy LC ne sont pas tolérantes à 5 V (contrairement à l'Arduin classique). Mais cela ne vaut pas la peine d'être craint, en se souvenant que le courant PWM ctrl est très petit, et il n'y a pas lieu de craindre pour la diode de limitation à l'entrée du processeur (la raison de l'inadmissibilité de dépasser Vcc + 0,5 est dans cette diode), d'ailleurs, à des courants comparables aux courants de la diode fermée il ne sera même pas à l'état ouvert.
en CHYAK j'utilise HK282 avec un seuil de 3,3V (juste parce que je l'avais). Une sorte de servo basse tension et basse puissance peut être alimenté directement à partir des sorties Teensy, selon le schéma utilisé pour OLED.
En conséquence, le courant en mode veille s'est avéré être d'environ 50 uA, il était probablement possible de le réduire encore plus, mais j'ai décidé que cela suffisait (ne serait-ce qu'au sommeil, les batteries devraient durer plus de 4 ans: 2000mAh / 0,05mA).
TechniqueImprimé sur une imprimante 3D Monoprice Ultimate, plastique PLA, buse 0,4 mm, couche 0,2 mm. Pour plus de détails sur le mécanisme de verrouillage, une couche de 0,1 mm pour plus de précision. Les ressorts sont également imprimés sur une imprimante 3D. Tapez longtemps. Par exemple, la partie la plus au milieu (elle a de nombreuses pièces internes et de doubles parois pour l'électronique et les fils) a été imprimée pendant 20 heures. Il a été collé avec de la colle cyan-acrylate. Si quelque chose se casse à l'intérieur, impossible à distinguer (protection contre les maniaques-fumeurs), vous devrez le casser comme une tirelire et l'imprimer à nouveau (un argument en faveur des imprimantes 3D). Les dessins et les animations sont réalisés dans SolidWorks, l'environnement de développement AtmelStudio (oui, AVR (teency) est pris en charge dès la sortie de la boîte, comme Arduino, via VisualMicro).