Viele Menschen rauchen zu viel, besonders wenn sie süchtig nach etwas sind und nicht bemerken, wie sie eine Zigarette nach der anderen rauchen. In der Black Box des Rauchers (CJK) können Sie die nächste Zigarette erst nach Ablauf einer bestimmten Zeit nehmen. In diesem Artikel werde ich auf einige Details eingehen, die für andere Entwicklungen nützlich sein können, insbesondere den nicht so bekannten Teensy LC-Controller (Arduino-Familie).
Die MechanikChYAK-Details werden auf einem 3D-Drucker gedruckt und nach dem Zusammenbau des unteren, mittleren und oberen Teils zusammengeklebt.
Der Verriegelungsmechanismus ist elektromechanisch, während die grundlegenden Verriegelungsfunktionen rein mechanisch realisiert werden. Dies macht es schwierig, den NJC durch Manipulieren der Lücken und Entfernen der Batterien zu knacken.
Das Verriegelungssystem besteht aus einem Gestell mit Zähnen und einer bistabilen Ratsche, die es dem Tablett ermöglicht, sich nur in Schließrichtung zu bewegen. Bei Erreichen einer vorbestimmten Zeitspanne macht das Servo eine einzelne Bewegung hin und her und drückt die Ratsche, die in den zweiten stabilen Zustand "offen" versetzt ist. Der FCKW bleibt geöffnet, bis der Benutzer das Fach mechanisch herauszieht. Im ausgefahrenen Zustand drückt das Tablett auf die Ratsche und versetzt sie wieder in den gespannten Zustand.
Der Lader besteht aus einer Trommel mit 4 Aussparungen für Zigaretten. Um zu vermeiden, dass versucht wird, eine Zigarette durch den Lader zu bekommen, erlaubt der Ratschenmechanismus keine Bewegung in die entgegengesetzte Richtung, von deren Seite die Stoßstangen hergestellt sind.
Auf dem oberen Deckel wurden Schlitze angebracht, mit denen Sie mögliche Verzerrungen von Zigaretten in der Schachtel beseitigen und Tabakchips ausschütteln können.
SchnittstelleUm die Zeit, die Anzahl der Zigaretten in CHYAK und die Anzahl der herausgenommenen Zigaretten zu steuern, wird das OLED-Display überwacht. Es wird fast immer ausgeschaltet, um die Batterie nicht zu entladen, und nur durch ein Signal des zentralen kapazitiven Sensors eingeschaltet, das ausgelöst wird, wenn eine Hand zum CHYAK gebracht wird, oder durch ein Signal vom Knopf beim Laden von Zigaretten. Eine weitere Taste erfasst den Moment, in dem das Fach geschlossen wird, und startet den nächsten Verzögerungszyklus. Zwei zusätzliche kapazitive Sensoren befinden sich an der Rückwand und dienen zur Einstellung der Zigarettenzähler (z. B. beim Batteriewechsel erforderlich).
ElektronikDer Mikrocontroller ist ein Teensy LC. Dieses Arduino-ähnliche Gerät, das mit den meisten Arduino-Bibliotheken kompatibel ist, wurde ausgewählt, weil es kapazitive Sensoren (Touch Sense Interface (TSI)) unterstützt. Die Sensoren sind so empfindlich, dass sie die erhobene Hand in einem Abstand von einem Zentimeter leicht fühlen. Teensy LC verfügt über den sogenannten LLWU-Modus. In diesem Modus befinden sich alle Module mit Ausnahme des 1-kHz-Oszillators im Ruhemodus. Sie können diesen Ruhemodus auf vier Arten verlassen: a) einen Interrupt vom kapazitiven Sensor erhalten, b) einen Interrupt vom Pin erhalten, c) einen Überlauf des 1-kHz-Zählers (Low-Power-Timer, LPTMR) erhalten, d) einen Interrupt vom Alarm erhalten.
Hier war der Autor in Schwierigkeiten: In den ursprünglichen Plänen war es vorgesehen, TSI zum Aufwachen zu verwenden, wenn eine Hand präsentiert wurde, und LPTMR für periodische Unterbrechungen, um die TSI-Werte (abhängig von den Umgebungsbedingungen) und die Zeitsteuerung anzupassen. Es stellte sich jedoch heraus, dass LPTMR für die Funktion von TSI verwendet wird und dementsprechend nicht als Zeitzähler verwendet werden kann. (Der LPTMR-Überlauf-Interrupt löst die Hardware für TSI aus und muss natürlich schnell sein, um den Sensor zu überwachen. Normalerweise ist dieser Zähler auf minus eins voreingestellt, damit TSI mit der höchstmöglichen Frequenz von 1 kHz abgefragt wird.)
Eine andere Möglichkeit wäre die Verwendung des RTC-Alarminterrupts. Fakt ist jedoch, dass Tenncy LC keine Echtzeituhr (RTC) hat. Vielmehr befindet sich RTC im Prozessor selbst, aber es gibt keine Verkabelung für RTC-Quarz auf der Platine. Der Prozessorentwickler hat jedoch eine Lücke für die Erkundigung von Köpfen hinterlassen. Der 1-kHz-Oszillator (der im Ruhemodus arbeitet) kann als Quelle für die RTC-Register der Steuerung verwendet werden. Dann stellt sich heraus, dass RTC nicht Sekundenintervalle zählen kann (wie bei Verwendung von Quarz bei 32 kHz), sondern 32 Sekunden bei Verwendung eines 1-kHz-Oszillators. Diese Genauigkeit reicht natürlich nicht aus. Aber es gibt einen Ausweg.
So funktioniert es:
Es gibt ein RTC Time Prescaler Register (RTC_TPR). Dieses 16-Bit-Register zählt die Impulse des Oszillators. Wenn es überläuft, erhöht sich das RTC-Zeitsekundenregister (RTC_TSR) um eins. Im klassischen Modus sind dies die Sekunden, die mit dem RTC-Zeitalarmregister (RTC_TAR) verglichen werden. Wenn sie zusammenfallen, wird ein Alarminterrupt generiert. Bei Verwendung von normalem 32-kHz-Quarz ist RTC_TSR nicht vorinstalliert, sondern wird jedes Mal von Null gezählt (32768 bis Überlauf (Sekunden)). Wenn wir jedoch jedes Mal RTC_TSR voreingestellt haben und berücksichtigen, dass wir einen langsamen 1-kHz-Oszillator haben, können wir einen Alarminterrupt mit einer Genauigkeit von bis zu Millisekunden erhalten (ohne Berücksichtigung der Ungenauigkeit des Oszillators selbst). Natürlich sollte auch RTC_TAR entsprechend neu berechnet werden.

Wenn wir beispielsweise den Zeitraum auf 87 Sekunden einstellen möchten, müssen wir 2 in RTC_TSR (2 * 32768 = 65536 ms = 65,536 s), 2 in RTC_TAR und 32768- (87 * 1000-65536) = 11304 in RTC_TSR schreiben. Dann vergehen 32,768-11,304 = 21,464 Sekunden vor dem ersten RTC_TPR-Überlauf, und es werden zwei vollständige Zyklen 2 * 32,768 = 65,536 hinzugefügt, was nur 21,464 + 65,536 = 87 Sekunden entspricht
Im Allgemeinen so:
void setAlarm(uint32_t seconds ) { RTC_SR = 0;
Und selbst wir können die Gesamtzeit (bis zu einem Fehler von 1 kHz des Oszillators) überwachen, wenn beispielsweise zu Beginn des Programms alle RTC-Register Null waren:
timeEllapsed=(RTC_TSR*32768+RTC_TPR)/1000
Die Genauigkeit des 1-kHz-Oszillators ist gering, aber für unsere Zwecke wird es ausreichen. Es ist zu beachten, dass beim Starten eines neuen Alarms die RTC-Register geändert werden. Wenn Sie also die Zeit überwachen müssen, müssen diese vor dem Start des Alarms gespeichert werden. Nach dem Beenden des Alarminterrupts werden sie unter Berücksichtigung der im Ruhezustand verbrachten Zeit erneut neu berechnet. Ich habe es hier ausführlich beschrieben:
über RTC für Teency LCBei CJC misst und speichert ein Interrupt alle 10 Minuten den Signalpegel von kapazitiven Sensoren, wenn keine Hand vorhanden ist. Dies geschieht, um Änderungen in den Signalen bei ihrer Annäherung zuverlässig verfolgen zu können. Bei einem Hintergrund von ~ 500 Einheiten verwenden wir einen Überschuss von ~ 20 Einheiten. Dies ermöglicht es, die Hand in einem Abstand von 5-10 mm zu fühlen. Der Hintergrundpegel hängt von Temperatur und Luftfeuchtigkeit ab. Aus Gründen der Zuverlässigkeit sollte er regelmäßig angepasst werden. Ich glaube, dies ist ein Fehler bei den Prozessorentwicklern. Warum haben sie es nicht möglich gemacht, gleichzeitig von TSI und einem anderen Zähler mit geringem Stromverbrauch geweckt zu werden (es muss nur ein weiteres Register hinzugefügt werden), da eine regelmäßige Anpassung der TSI-Werte fast obligatorisch ist, selbst wenn Sie keinen Timer für andere Zwecke benötigen!
Nun zum Energieverbrauch. Im LLWU-Schlafmodus verbraucht der Teensy LC etwa 15 uA, wenn kein Bodykit vorhanden ist. Wir mussten ein anderes OLED-Display und ein Servo anschließen. Beide Geräte haben auch im passiven Zustand große Leckströme.
Mit OLED ist alles einfach. Dies ist das Adafruit 0,96-Zoll-Monochrom-128x64-OLED-Display. Es wird mit 3,3 V betrieben, verbraucht im eingeschalteten Zustand Strom von etwa 20 mA (abhängig von der Anzahl der beteiligten Pixel) und wird von SPI gesteuert. Das heißt, schließen Sie einfach den Stromeingang an den 20-Milliampere-Ausgang des Teensy LC an (Teency hat verschiedene Arten von Ausgängen) und fertig. Wenn alle schlafen, wird dieser Ausgang einfach in den 3. Zustand versetzt und der Strom fließt nicht durch die Anzeige. Beim Aufwecken wird der Ausgang in den hohen Ausgangszustand versetzt und wird für die Anzeige zu Vcc.
Servo ist etwas komplizierter. Servo im Standby-Modus verbraucht einen Strom von ca. 2 mA, was natürlich nicht akzeptabel ist. Daher müssen Sie es im Schlaf vollständig ausschalten. Im Gegensatz zum klassischen Arduin verfügt Teensy LC über eine relativ kleine Auswahl an Netzteilen: entweder 1,7-3,3 V direkt angeschlossen oder 2,6-5,5 V (bei eingeschaltetem internen Spannungsregler). Normalerweise arbeiten zugängliche Servos mit mindestens 1S Lipo, und dies sind 3,3-4,2 V. Daher müssen drei Standardbatterien in Reihe geschaltet werden, um 3,3 (Entladung) bis 4,6 V (neu) zu haben. Bei den meisten Servos liegt 3,3 V an der Betriebsgrenze, sodass Teensy-Ausgänge nicht direkt verwendet werden können (wie bei OLED). Ja, und der Strom während der Drehung beträgt ungefähr 50 mA, was für den Teensy LC etwas viel ist. Daher wird das Servo über einen MOSFET eingeschaltet:

Mit dieser Einbeziehung scheint es nicht sicher zu sein, da beim Ausschalten des MOSFET die Spannung am PWM-Strg-Eingang 3,3 V überschreitet und die Tennsy LC-Eingänge nicht 5 V tolerant sind (im Gegensatz zum klassischen Arduin). Sie sollten sich jedoch nicht davor fürchten, sich daran zu erinnern, dass die aktuelle PWM-Steuerung sehr klein ist und Sie sich nicht vor der Begrenzungsdiode am Prozessoreingang fürchten müssen (der Grund für die Unzulässigkeit, Vcc + 0,5 zu überschreiten, liegt in Strömen, die mit den Strömen der geschlossenen Diode vergleichbar sind) Er wird nicht einmal im offenen Zustand sein.
In CHYAK verwende ich HK282 mit einem Schwellenwert von 3,3 V (nur weil ich es hatte). Eine Art Servo mit niedrigerer Spannung und geringer Leistung kann gemäß dem für OLED verwendeten Schema direkt von den Teensy-Ausgängen gespeist werden.
Infolgedessen stellte sich heraus, dass der Strom im Schlafmodus etwa 50 uA betrug, wahrscheinlich war es möglich, ihn noch weiter zu reduzieren, aber ich entschied, dass dies ausreichte (wenn die Batterien nur schlafen, sollten sie länger als 4 Jahre halten: 2000 mAh / 0,05 mA).
TechnischGedruckt auf einem Monoprice Ultimate 3D-Drucker, PLA-Kunststoff, 0,4 mm Düse, 0,2 mm Schicht. Für Details des Verriegelungsmechanismus eine 0,1 mm Schicht für Genauigkeit. Die Federn werden auch auf einem 3D-Drucker gedruckt. Lange tippen. Zum Beispiel wurde der mittlere Teil (er hat viele Innenteile und Doppelwände für Elektronik und Drähte) 20 Stunden lang gedruckt. Es wurde mit Cyan-Acrylat-Kleber zusammengeklebt. Wenn etwas im Inneren kaputt geht, ist es unmöglich zu erkennen (Schutz vor Maniacs-Rauchern), müssen Sie es wie ein Sparschwein zerbrechen und erneut drucken (ein Argument für 3D-Drucker). Zeichnungen und Animationen werden in SolidWorks, der AtmelStudio-Entwicklungsumgebung, erstellt (ja, AVR (teency) wird wie Arduino sofort über VisualMicro unterstützt).