吸烟者的黑匣子

许多人抽太多烟,尤其是当他们沉迷于某种东西而没有注意到他们如何接另一支烟时。 吸烟者的黑匣子(CJK)不允许您在特定时间段内再吸下一支香烟。 在本文中,我将关注一些可能对其他开发有用的细节,尤其是不太出名的Teensy LC控制器(Arduino系列)。



机械师

将ChYAK的详细信息打印在3D打印机上,然后将下部,中部和上部组装在一起。



锁定机构是机电的,而基本的锁定功能是纯粹通过机械方式实现的,这使得通过操纵间隙和取出电池而难以裂开NJC。

锁定系统由一个带齿的齿条和一个双稳态棘轮组成,该棘轮允许托盘仅沿关闭方向移动。 在达到预定时间段时,伺服器来回移动一次并推动棘轮,棘轮被设置为第二稳定状态“打开”。 CFC保持打开状态,直到用户机械地拉出托盘为止。 伸出后,托盘将棘轮推入并再次使其处于翘起状态。



装填器以带有四个用于香烟的凹槽的鼓的形式制成。 为了避免试图通过装填器抽烟,棘轮机构不允许在相反的方向上移动,从该方向制造保险杠。



插槽是在顶盖上制成的,它们使您可以消除盒子内香烟的可能变形,并抖落烟丝。

介面

为了控制时间,CHYAK中的香烟数量和取出的香烟数量,对OLED显示器进行了监控。 它几乎一直关闭,以便不给电池放电,并且仅通过来自中央电容传感器的信号打开,该信号在将手抬到CHYAK时或在装烟时来自按钮的信号触发。 另一个按钮捕获托盘关闭的瞬间并开始下一个延迟周期。 后壁上还有两个附加的电容式传感器,用于调节香烟计数器(例如,在更换电池时是必需的)。

电子产品

该微控制器是Teensy LC。 之所以选择这种与大多数Arduino库兼容的类似于arduin的设备,是因为它支持电容传感器(触摸感应接口(TSI))。 传感器非常灵敏,以至于他们很容易在厘米的距离上感觉到举手。 Teensy LC具有所谓的LLWU模式,在该模式下,除1-kHz振荡器外,所有模块均处于睡眠模式。 您可以通过4种方式退出此睡眠模式:a)从电容传感器获取中断,b)从引脚获取中断,c)获取1-kHz计数器(低功耗定时器LPTMR)的溢出,d)从警报获取中断。

这给作者带来了麻烦:在最初的计划中,举手时要用TSI唤醒,而LPTMR则需要定期中断以调整TSI级别(取决于环境条件)和时间控制。 但是事实证明,LPTMR用于TSI的功能,因此不能用作时间计数器。 (LPTMR溢出中断是TSI的硬件触发,当然必须快速监视传感器。通常将此计数器预设为负1,以便以最高的1 kHz频率轮询TSI)。

另一种可能性是使用RTC警报中断,但事实是Tenency LC没有实时时钟(RTC)。 相反,RTC位于处理器本身中,但是板上没有RTC石英的接线。 但是,处理器开发人员留出了一些漏洞来询问思想。 1kHz振荡器(在睡眠模式下运行)可用作控制器RTC寄存器的源。 事实证明,RTC不能计数第二个间隔(如使用32 kHz石英时),而可以计数32秒(如果使用1 kHz振荡器)。 当然,这种准确性是不够的。 但是有一个出路。

运作方式如下:

有一个RTC时间预分频器寄存器(RTC_TPR)。 该16位寄存器对振荡器的脉冲进行计数。 溢出时,RTC时间秒寄存器(RTC_TSR)将增加1。 在经典模式下,这些秒数与RTC时间警报寄存器(RTC_TAR)进行比较,并且在它们重合时会生成警报中断。 当使用常规的32kHz石英时,不会预先安装RTC_TSR,但是每次都会从零开始计数(从32768到溢出(秒))。 但是,如果我们每次都预先安装RTC_TSR,并考虑到我们有一个慢速的1kHz振荡器,则我们可以获得一个高达毫秒精度的警报中断(不考虑振荡器本身的不准确性)。 当然,还应相应地重新计算RTC_TAR。



例如,如果要将周期设置为87秒,则必须在RTC_TSR中写入2(2 * 32768 = 65536ms = 65.536s),在RTC_TAR中写入2,在RTC_TSR中写入32768-(87 * 1000-65536)= 11304。 然后在第一次RTC_TPR溢出之前将经过32.768-11.304 = 21.464秒,并且将两个完整周期2 * 32.768 = 65.536添加到它们中,这将仅为21.464 + 65.536 = 87秒
一般来说,像这样:

void setAlarm(uint32_t seconds ) { RTC_SR = 0; //disable RTC RTC_TPR=32768-(seconds*1000%32768); RTC_TSR=0; //RTC counter RTC_SR = RTC_SR_TCE; //enable RTC RTC_TAR = seconds*1000/32768; } 

甚至我们都可以监视总时间(误差高达1kHz的振荡器),例如,如果在程序开始时所有RTC寄存器均为零:

 timeEllapsed=(RTC_TSR*32768+RTC_TPR)/1000 

1kHz振荡器的精度很小,但就我们的目的而言已经足够了。 应当注意的是,在启动新警报时,我们会修改RTC寄存器,因此,如果您需要监视时间,则必须在警报开始之前记住它们,并且在退出警报中断后,将考虑到休眠所花费的时间来重新计算它们。 我已经在这里进行了详细描述: 关于Teency LC的RTC

在CJC中,每隔10分钟就会有一次中断,测量并存储没有手的情况下来自电容传感器的信号电平。 这样做是为了能够可靠地跟踪信号接近时的变化。 在背景为〜500个单位的情况下,我们使用了〜20个单位的多余水平,这使得可以在5-10mm的距离内感觉到手。 背景水平取决于温度和湿度,因此出于可靠性考虑,应定期进行调整。 我认为这是处理器开发人员的缺陷。 他们为什么不给机会同时从TSI和其他一些低功耗计数器中唤醒(只需再增加一个寄存器),因为即使您不需要定时器用于其他目的,TSI电平的定期调整也是强制性的!

现在大约要消耗能量。 在LLWU睡眠模式下,如果没有车身套件,Teensy LC消耗约15 uA。 我们必须连接另一个OLED显示器和一个伺服器。 这两个器件即使在无源状态下也具有大的泄漏电流。

OLED一切都很简单,这是Adafruit 0.96英寸单色128x64 OLED显示器,由3.3V供电,开启时消耗大约20 mA的电流(取决于所涉及的像素数量),并由SPI控制。 也就是说,只需将其电源输入连接到Teensy LC(Teency具有不同类型的输出)的20毫安输出,就可以完成。 当每个人都在睡觉时,该输出将简单地转换为第三状态,并且电流不会流经显示器,唤醒后,输出将转换为输出高态,并变为用于显示器的Vcc。

伺服稍微复杂一些。 待机模式下的伺服消耗的电流约为2 mA,这当然是不可接受的。 因此,您必须在睡眠时完全将其关闭。 与经典Arduin不同,Teensy LC的电源选择非常少:直接连接1.7-3.3 V或2.6-5.5 V(内部稳压器打开)。 通常可访问的伺服器至少在1S Lipo电压下工作,这是3.3-4.2V。因此,我们需要打开三个串联的标准电池,以使其具有3.3(放电)至4.6 V(新)的电压。 对于大多数伺服器,3.3 V处于工作极限,因此不能直接使用Teensy输出(对于OLED)。 是的,旋转过程中的电流约为50 mA,这对于Teensy LC来说有点大。 因此,伺服器通过MOSFET开启:



接通电源后,这似乎是不安全的,因为当MOSFET关断时,PWM ctrl输入端的电压超过3.3 V,而Tennsy LC输入端不能承受5V的电压(不同于经典的Arduin)。 但是,您不必担心这一点,要记住电流PWM ctrl非常小,并且不必担心处理器输入处的限流二极管(不允许超过Vcc + 0.5的原因在该二极管中),而且其电流与闭合二极管的电流相当他甚至不会处于打开状态。

在CHYAK中,我使用HK282且具有3.3V的阈值(仅因为我拥有它)。 根据用于OLED的方案,某些低电压和低功率伺服器可以直接从Teensy输出供电。

结果,睡眠模式下的电流竟然约为50 uA,可能有可能进一步降低电流,但我认为这已经足够了(如果仅处于睡眠状态,电池应使用超过4年:2000mAh / 0.05mA)。

技术性

在Monoprice Ultimate 3D打印机上打印,PLA塑料,0.4毫米喷嘴,0.2毫米层。 有关锁定机构的详细信息,精度为0.1毫米。 弹簧也打印在3D打印机上。 打字很久了。 例如,最中间的部分(具有许多内部零件以及用于电子设备和电线的双壁)印刷了20个小时。 用氰基丙烯酸酯胶粘在一起。 如果里面有东西破破烂烂,就不可能辨认出来(保护免受疯子吸烟者的侵害),您将不得不像存钱罐一样打破它,然后再次打印(赞成3D打印机的说法)。 图纸和动画是在AtmelStudio开发环境SolidWorks中制作的(是的,通过VisualMicro,像Arduino这样的开箱即用的支持AVR(teency))。

Source: https://habr.com/ru/post/zh-CN402867/


All Articles