Banyak orang merokok terlalu banyak, terutama ketika mereka kecanduan sesuatu dan tidak memperhatikan bagaimana mereka merokok satu demi satu. Kotak hitam perokok (CJK) tidak memungkinkan Anda untuk mengambil rokok berikutnya sampai periode waktu tertentu berlalu. Pada artikel ini, saya akan memperhatikan beberapa detail yang mungkin berguna untuk perkembangan lainnya, terutama pengendali Teensy LC yang tidak begitu terkenal (keluarga Arduino).
MekaniknyaRincian ChYAK dicetak pada printer 3D dan setelah perakitan bagian bawah, tengah dan atas direkatkan bersama.
Mekanisme penguncian dibuat elektromekanis, sementara fungsi penguncian dasar diwujudkan sepenuhnya secara mekanis, ini membuatnya sulit untuk memecahkan NJC dengan memanipulasi celah dan mengeluarkan baterai.
Sistem penguncian terdiri dari rak dengan gigi dan ratchet bistable, yang memungkinkan baki bergerak hanya dalam arah penutupan. Setelah mencapai periode waktu yang telah ditentukan, servo membuat satu gerakan bolak-balik dan mendorong ratchet, yang diatur dalam keadaan stabil kedua "terbuka". CFC tetap terbuka sampai pengguna menarik keluar baki secara mekanis. Saat diperpanjang, baki mendorong ratchet dan memasukkannya ke dalam cocked state lagi.
Loader dibuat dalam bentuk drum dengan 4 ceruk untuk rokok. Untuk menghindari upaya mendapatkan rokok melalui loader, mekanisme ratchet tidak memungkinkan gerakan ke arah yang berlawanan, dari sisi di mana bumper dibuat.
Slot dibuat pada tutup atas, memungkinkan Anda untuk menghilangkan kemungkinan distorsi rokok di dalam kotak dan menghilangkan keripik tembakau.
AntarmukaUntuk mengontrol waktu, jumlah rokok di CHYAK, dan jumlah rokok yang dihilangkan, tampilan OLED dipantau. Ini dimatikan hampir setiap waktu agar tidak mengisi baterai dan dihidupkan hanya oleh sinyal dari sensor kapasitif pusat, yang dipicu ketika tangan dibawa ke CHYAK atau sinyal dari tombol saat memuat rokok. Tombol lain menangkap saat baki ditutup dan memulai siklus penundaan berikutnya. Dua sensor kapasitif tambahan terletak di dinding belakang dan digunakan untuk mengatur penghitung rokok (perlu, misalnya, saat mengganti baterai).
ElektronikMikrokontroler adalah Teensy LC. Perangkat seperti arduin ini, kompatibel dengan sebagian besar perpustakaan Arduino, dipilih karena memiliki dukungan untuk sensor kapasitif (touch sense interface (TSI)). Sensornya sangat sensitif sehingga mereka dengan mudah merasakan tangan terangkat pada jarak satu sentimeter. Teensy LC memiliki apa yang disebut mode LLWU, dalam mode ini semua modul dalam mode tidur, dengan pengecualian osilator 1-kHz. Anda dapat keluar dari mode tidur ini dalam 4 cara: a) mendapatkan interupsi dari sensor kapasitif, b) mendapatkan interupsi dari pin, c) mendapatkan limpahan penghitung 1-kHz (timer daya rendah, LPTMR), d) mendapatkan interupsi dari alarm.
Di sini penulis dalam kesulitan: dalam rencana awal itu adalah menggunakan TSI untuk bangun ketika tangan disajikan, dan LPTMR untuk gangguan berkala untuk menyesuaikan tingkat TSI (tergantung pada kondisi lingkungan) dan kontrol waktu. Tetapi ternyata LPTMR digunakan untuk fungsi TSI, dan karenanya, tidak dapat digunakan sebagai penghitung waktu. (LPTMR overflow interrupt adalah pemicu perangkat keras untuk TSI, dan, tentu saja, harus cepat untuk memonitor sensor. Biasanya penghitung ini diatur ke minus satu sehingga TSI disurvei dengan frekuensi 1 kHz yang dimungkinkan).
Kemungkinan lain adalah dengan menggunakan interupsi alarm RTC, tetapi kenyataannya adalah bahwa Tenncy LC tidak memiliki jam waktu nyata (RTC). Sebaliknya, RTC ada di prosesor itu sendiri, tetapi tidak ada kabel untuk RTC kuarsa di papan tulis. Namun, pengembang prosesor telah meninggalkan beberapa celah untuk bertanya. Osilator 1kHz (yang beroperasi dalam mode tidur) dapat digunakan sebagai sumber untuk register RTC pada pengontrol. Kemudian ternyata RTC dapat menghitung bukan interval kedua (seperti ketika menggunakan kuarsa pada 32 kHz), tetapi 32 detik jika menggunakan osilator 1 kHz. Akurasi ini, tentu saja, tidak cukup. Tapi ada jalan keluar.
Begini cara kerjanya:
Ada Daftar Penentu Waktu RTC (RTC_TPR). Register 16-bit ini menghitung pulsa osilator. Ketika meluap, Daftar Detik Waktu RTC (RTC_TSR) bertambah satu. Dalam mode klasik, ini adalah detik, yang dibandingkan dengan Register Alarm Waktu RTC (RTC_TAR), dan ketika cocok, interupsi alarm dihasilkan. Saat menggunakan kuarsa 32kHz biasa, RTC_TSR tidak dipasang sebelumnya, tetapi dihitung dari nol setiap kali (32768 meluap (detik)). Tetapi jika kita melakukan pra-instal RTC_TSR setiap kali, dengan mempertimbangkan bahwa kita memiliki osilator 1kHz yang lambat, kita bisa mendapatkan alarm interupsi hingga akurasi milidetik (tidak memperhitungkan ketidakakuratan osilator itu sendiri). Tentu saja, RTC_TAR juga harus dihitung ulang sesuai dengan itu.

Misalnya, jika kita ingin mengatur periode menjadi 87 detik, kita harus menulis 2 di RTC_TSR (2 * 32768 = 65536ms = 65.536d), 2 dalam RTC_TAR dan 32768- (87 * 1000-65536) = 11304 di RTC_TSR. Kemudian 32.768-11.304 = 21.464 detik akan berlalu sebelum RTC_TPR pertama meluap, dan dua siklus penuh 2 * 32.768 = 65.536 akan ditambahkan ke mereka, yang akan menjadi hanya 21.464 + 65.536 = 87 detik
Secara umum, seperti ini:
void setAlarm(uint32_t seconds ) { RTC_SR = 0;
Dan bahkan kita dapat memonitor total waktu (hingga kesalahan 1kHz dari osilator), misalnya, jika pada awal program semua register RTC nol:
timeEllapsed=(RTC_TSR*32768+RTC_TPR)/1000
Keakuratan osilator 1kHz kecil, tetapi untuk keperluan kami itu sudah cukup. Perlu dicatat bahwa ketika memulai alarm baru, kami memodifikasi register RTC, jadi jika Anda perlu memonitor waktu, mereka harus diingat sebelum alarm dimulai, dan setelah keluar dari alarm, mereka dihitung ulang dengan memperhitungkan waktu yang dihabiskan untuk hibernasi. Saya telah menjelaskannya secara rinci di sini:
tentang RTC untuk Teency LCDalam CJC, interupsi setiap 10 menit mengukur dan menyimpan level sinyal dari sensor kapasitif jika tidak ada tangan. Hal ini dilakukan untuk dapat melacak perubahan pada sinyal saat mereka mendekati. Dengan latar belakang pada ~ 500 unit, kami menggunakan tingkat kelebihan ~ 20 unit, ini memungkinkan untuk merasakan tangan pada jarak 5-10mm. Tingkat latar belakang tergantung pada suhu dan kelembaban, jadi untuk keandalannya harus disesuaikan secara berkala. Saya percaya ini adalah kelemahan pengembang prosesor. Mengapa mereka tidak diberi kesempatan untuk bangun dari TSI dan penghitung daya rendah lainnya secara bersamaan (cukup tambahkan satu register lagi), karena penyesuaian berkala level TSI hampir wajib, bahkan jika Anda tidak memerlukan timer untuk keperluan lain!
Sekarang tentang energi yang dikonsumsi. Dalam mode tidur LLWU, Teensy LC mengkonsumsi sekitar 15 uA ketika tidak ada body kit. Kami harus menghubungkan layar OLED lain dan servo. Kedua perangkat ini memiliki arus bocor besar bahkan dalam keadaan pasif.
Semuanya sederhana dengan OLED, ini Adafruit 0.96 ”Monochrome 128x64 OLED display, didukung oleh 3.3V, mengkonsumsi arus sekitar 20 mA saat dihidupkan (tergantung pada jumlah piksel yang terlibat) dan dikendalikan oleh SPI. Artinya, cukup sambungkan input daya ke output 20 miliampere dari Teensy LC (Teency memiliki berbagai jenis output) dan Anda selesai. Ketika semua orang tidur, output ini hanya ditransfer ke keadaan ke-3 dan saat ini tidak melalui tampilan, dengan bangun output ditransfer ke output keadaan tinggi dan menjadi Vcc untuk tampilan.
Servo sedikit lebih rumit. Servo dalam mode siaga mengkonsumsi arus sekitar 2 mA, yang tentu saja tidak dapat diterima. Karena itu, Anda harus mematikannya sepenuhnya saat tidur. Berbeda dengan Arduin klasik, Teensy LC memiliki pilihan pasokan daya yang cukup kecil: baik 1,7-3,3 V terhubung langsung, atau 2,6-5,5 V (dengan regulator tegangan internal dihidupkan). Biasanya servos yang dapat diakses bekerja dari setidaknya 1S Lipo, dan ini adalah 3,3-4,2 V. Oleh karena itu, kita perlu menyalakan tiga baterai standar secara seri untuk memiliki dari 3,3 (debit) menjadi 4,6 V (baru). Untuk sebagian besar servo, 3,3 V berada pada batas operasi, sehingga secara langsung keluaran Teensy tidak dapat digunakan (seperti untuk OLED). Ya, dan arus selama rotasi adalah sekitar 50 mA, yang sedikit banyak untuk Teensy LC. Oleh karena itu, servo dihidupkan melalui MOSFET:

Dengan pengaktifan ini, sepertinya itu tidak aman, karena ketika MOSFET dimatikan, tegangan pada input ctrl PWM melebihi 3,3 V, dan input Tennsy LC tidak toleran 5V (tidak seperti Arduin klasik). Tetapi Anda tidak perlu takut dengan hal ini, mengingat bahwa ctrl PWM saat ini sangat kecil, dan tidak perlu takut akan dioda pembatas pada input prosesor (alasan ketidakmungkinan melebihi Vcc + 0,5 ada dalam dioda ini), apalagi, pada arus yang sebanding dengan arus dioda tertutup. dia bahkan tidak akan dalam keadaan terbuka.
di CHYAK saya menggunakan HK282 dengan ambang 3.3V (hanya karena saya memilikinya). Beberapa jenis servo tegangan rendah dan daya rendah dapat diaktifkan langsung dari output Teensy, sesuai dengan skema yang digunakan untuk OLED.
Akibatnya, arus dalam mode tidur ternyata sekitar 50 uA, mungkin mungkin untuk mengurangi lebih banyak lagi, tetapi saya memutuskan bahwa ini sudah cukup (jika hanya tidur, baterainya akan bertahan lebih dari 4 tahun: 2000mAh / 0,05mA).
TeknisDicetak pada printer 3D Monoprice Ultimate, plastik PLA, nozzle 0,4 mm, 0,2 mm. Untuk detail mekanisme penguncian, lapisan 0,1 mm untuk akurasi. Pegas juga dicetak pada printer 3D. Mengetik untuk waktu yang lama. Sebagai contoh, bagian paling tengah (memiliki banyak bagian internal dan dinding ganda untuk elektronik dan kabel) dicetak selama 20 jam. Itu terjebak bersama-sama dengan lem cyan-akrilat. Jika ada sesuatu yang pecah di dalam, tidak mungkin untuk melihat (perlindungan dari perokok maniak), Anda harus memecahkannya seperti celengan dan mencetak lagi (argumen yang mendukung printer 3D). Gambar dan animasi dibuat di SolidWorks, lingkungan pengembangan AtmelStudio (ya, AVR (teency) didukung langsung di luar kotak, seperti Arduino, melalui VisualMicro).