远程训狗器
次访问
背景
自从家里阿姨之后,家里来了个新人,狗十六对她十分热情,还总是在阿姨不理它的时候去咬东西,之前咬坏了阿姨的鞋,后来给狗十六买了个睡垫,结果刚买回来第一天就被它咬得稀烂。看下这个视频就懂了。
后来实在忍不了,网上买了训狗器,发现效果超级好,有电击、震动和发声的功能。
首先,由于我们之前只要让它戴项圈,就带它出去,我们家狗子并不抗拒带狗项圈。
另外,我发现通过这个震动或者电击它比人为制止甚至揍它有个巨大的好处:由于通过远程开关控制,狗狗对于突然从脖子上过来的刺激感到很奇怪,特别是如果它刚好在干某件错误的事情的时候,像是有上帝突然对它产生了惩罚,它就非常容易形成这个事情是不能做的的印象,就像它去爬带电的线,突然被电到了,它就会知道那个东西不能碰,及时上面有很香的味道。我把这个总结成上帝的惩罚(对未知的恐惧是各种动物包括人的共同特征)。
有了这个之后,确实很好的解决了它在你面前瞎搞的毛病,但也仅仅适应于我老婆或者丈母娘这种不会揍它的人身上,还得盯着才行。随着看监控发现每天阿姨到我家来,它都在那个时间点咬毯子,我更加断定它咬东西是要吸引阿姨的注意力,想让阿姨陪她玩,但阿姨总是不理它。于是,我就在想,如果能给这个遥控器增加一个远程收集控制功能,然后在阿姨来的时候,盯着狗子,一旦狗十六开始咬,就给它来一发,有个两三次,狗十六应该就不会咬了。
这就是这个远程训狗器的来源。于是我就开始着手研究怎么弄。
方案
首先,现在各种智能家居都支持远程控制,其实有比较成熟的方案。从同事那边了解到,有一款叫 ESP8266 的芯片,自带了 wifi 功能,有一个同事还用它做了一个远程开关,于是了解了一下,感觉可行,于是有了这个远程训狗器的原型。
v0.1
最初的版本,是直接网上买了一个 ESP8266-01s + 继电器的模块,这个是网上的成熟模型,将 ESP8266-01s 和继电器集成在一块了。最开始买了这个版本,直接就是个远程开关,通过 5v 电源供电,然后可以直接刷 ESPHome,然后通过 home-assistant 来控制,整体来说,只需要加两个线,接到训狗器的开关的两端,继电器闭合,开关就可以闭合,从而实现远程控制的功能。
接线的图忘了拍照。
拆开遥控器之后,发现其实上面有震动和电击两个开关的焊点,只要把相应的焊点跟地相连,就能触发相应的动作(震动或电击)。所以这个就比较简单了,直接把相应的焊点焊了两个线,接出来接到继电器上面,然后配置好 ESP8266 就好了。
我也是在搞这块板子的过程中学习了 ESP8266 刷 ESPHOME 的固件,配置 ESPHOME 的 yaml 配置文件以及使用 HomeAssistant。
但这个方案有几个明显的问题:
- 只有一个接口,震动和电击只能选择一个
- 整个板子太大,要接的线比较多,这个必须持续供电,所以还需要额外接个 5v 的电源
- 有点声音。继电器一般都有声音,不过这个问题算是个小问题
v0.2
为了解决问题 #1,于是我又搞了个双继电器的版本,并且采用 ESP8266-12F 来作为控制板,所示 v0.2 吧。相比于 v0.1 的方案,最大的好处是电击和震动可以同时使用了。
因为我使用过程中发现,只是用震动,狗子经常没反应,我试了一下,发现震动本来只能作为一种提醒,确实对它没啥痛感。
于是,v0.2 版本用了一些天,也抓住了狗十六刚好狂咬的时候,效果显著,搞了两次,它就没咬它的睡垫了。
不过改咬起阳台上的椅子了 ;) 上班的过程中没发持续盯着它,被它咬破了,好在影响比较小,而且后面慢慢又没咬了。
v0.3
v0.2 版本解决了只有一个开关的问题,但板子太大,线多,需额外接电源这些问题都没有解决。
中间,我一直想搞个小型化方案,把所有的电路全部集成中遥控器里面,这样就完美了,出去遛狗的时候也可以带着它,也不需要单独给接一堆的线,看起来跟原始版本没啥区别。
于是,经过各种想办法,我又搞出来了 v0.3。
我发现,除了继电器之外,还有一个光电耦合器,也可以做开关,但貌似不是电阻为 0 的那种开关,不过电阻比较小,可以作为近似开关。而且它是芯片状,可以做得非常小。
中间玄拙还给我推销三极管的方案,他不知道怎么弄,但感觉可以。于是我还研究了一阵子三极管,不过主要学到了是三极管的放大电路,最后还是投向了光耦。
当然,我淘宝上买了一个元器件套装,里面包含了一堆各种常见的元器件,然后在单独买了三种光电耦合器,发现这些元器件都非常便宜,还包邮。于是搞了一堆回来试验,分别是:CPC1020N、PC817 和 4N35。
最先买的是 CPC1020N,当时淘宝上搜的是固态继电器,搜到了这个,抱着试试的心态买的。买回来不知道怎么用,当时刚好在试验 v0.2 的方案,又不知道怎么接,所以一直没搞成,后来心想试一把,于是直接给它接了个 3.3v 的电源,然后在另一端测电阻,发现果然是通的;后来又用 5v 电源给接上去,结果没反应了,我估摸着是烧了。。刚好只买了一个,于是这个就放弃了。
后来网上搜光耦,找到了一堆其他的型号,主要就是 PC817 和 4N35,于是后面就没走 CPC1020N 了。
在 PC817 到货之后,我就开始琢磨这怎么用这玩意当开关了,在摸索三极管和 CPC1020N 的过程中,知道这种器件本质上就是一个发光二极管 + 一个光电二极管,一般是有一个最大电流的,直接给它 3.3/5v 的电源都不太靠谱,需要前面解个电阻给它分压。于是搜了一下这玩意的参数:
输入侧的典型电流是 20mA,典型电压是 1.2v,所以电阻大概是 60Ω,而接 3.3v 的 ESP8266,剩下需要 105Ω 的电阻,我为了简单,直接给它接了个 100Ω 的电阻。试了下,接上之后,输出端用万用表的声音档侧果然可以。于是又把训狗器的两个线解出来,接到这个光耦的输出端,发现真的可以触发开关的开闭。
于是兴奋了一番,感觉这条路可以走得通。
于是,经过一番折腾在外面面包板上把原型搞通了。
为了放到训狗器里面,发现还有个问题,那就是 ESP8266 自身的供电问题。
最理想的情况下是,训狗器电路板上直接给 ESP8266 供电,我测了一下,发现确实有几个点和地之间是 3.3v 的电压,于是计划直接从电路板上取 3.3v 的电源,可实际操作过程中发现,这个 ESP8266 的功率可能有点太大,这个电路板上的 3.3v 的焊点一接上去,没能把 ESP8266 起起来,更严重的是,训狗器自己也不能用了。
找来找去没有找到合适的 3.3v 电源,于是又求助淘宝买 3.3v 电源芯片。万能的淘宝再一次没有让我失望,找到了又便宜又小的 3.3v 电源芯片。输入端直接接到 3.7v 电池上,输出端可以输出稳定的 3.3v 电源。
于是,经过几天的折腾,把整个方案全部串起来,并接到了训狗器上,形成了我的 v0.3 版本的训狗器,如下:
为了确保固定稳定,我在上面又涂了一层热熔胶,最终的效果如下。不过发现有点太厚,把训狗器后背板上面的一些突起全给用刀削掉之后,用力压勉勉强强能合上盖子。最终这个版本总算实现了便携。
v0.3:最终版本把底下那张热缩管的垫子放在了 ESP826 和 训狗器自身的电路板之间,避免短路什么的
v1.0
v0.3 版本基本上实现了我的主要目标,但仍然有两个地方让我并不满意:
- 没有加开关,而 3.3v 电源芯片直接接在电池上,这样一旦没有充电,这个 3.3v 电源芯片 + ESP8266 用不了两天就把电池的电消耗殆尽了。我测了一下,每次电池消耗完毕,电池电压基本上在 0.9v 的样子,这样理论上非常伤锂电池,所以平常还是只能插在电源充电。所以后来我就想应该给它在电源芯片前面加一个开关,这样就可以避免这个问题了。
- 还是太大太占地方了,搞的遥控器不太能关得上。
v1.0 版本主要是为了解决问题 #1,不过既然我们想做一个完备的版本,就干脆把问题 #2 也一并解决了。问题 #2 中的一个主要问题是,用了 ESP8266-12F 的扩展板,然后把光耦和电阻粘在它的背后,导致整体太厚,于是我就想一方面放弃扩展板,只用一块 ESP8266-12F,然后把光耦和电阻放它旁边,这样就薄了一倍。
但这里又遇到一个坑:ESP8266 没有扩展板,直接接到 usb-ttl 的线上,死活连不上,一点反应也没有。刚开始还以为板子又被我烧了,好在这次一把买了 3 块板子,结果试了新的板子,发现仍然不行。
于是又去搜了半天资料,发现单纯的 ESP8266-12F 如果要启动或者下载,除了 VCC/GND/TX/RX/GPIO0 要接上之外,还需要把 EN/RST 和 GPIO15 也接上。否则根本启动不起来,而之前的 ESP8266-01s 以及带扩展板的 ESP8266-12F 都不需要接其他 IO 口,甚至一旦刷好了 ESPHOME,只需要借 VCC/GND 就够了。
后来,再拿回去看 ESP8266-12F 的扩展板,才发现原来扩展板上面带了三个电阻,两个 10K 的电阻和一个 0K 的电阻,才发现原来扩展板帮忙接了 EN/RST 和 GPIO15。
于是,在面包板上试验,按照下图接上,并将 GPIO0 接地,发现果然可以连上了:
但这里又遇到一个难题,如果要额外增加两个电阻,放到训狗器的盒子里面又会非常挤,我又没有特别小的电阻。不过好在,我测试发现,即使没接这两个 10K 的电阻,它照样可以工作,我就省事直接把 EN/RST 和 VCC 短路了。最终电路图如下:
最后,再在旁边槽了个小孔,把开关接上去,总算有了 v1.0 的成品:
v1.0 最终成品
为了让它更加美观稳定,我给 3.3v 电源版套了一层热缩管,并且把 ESP8266-12F、电阻和光耦用线接上,然后一起在热缩管膜上面粘了一层双面胶,把它们全部粘在上面了,然后在热宿管膜背面也贴了一层双面胶,直接将它粘在训狗器的电路板上。最终就可以轻松的合上了,并且将侧面的开关关闭之后,就不会有额外的电量消耗了。
总结
其实,回过头来看,在搞这个事情的过程中,还是学到了不少基础的模拟电路知识,同时对于实践这类事情也有了更多的经验,总结下来至少在三个方面有明显的提高:
- 焊接:之前一直不知道松香的作用,感觉松香没啥用,这次在焊接过程中总是焊不好,才发现松香原来用处这么大,当然我现在也不是用松香,而是用助焊剂,感觉焊接水平提升了一个数量级;
- 模电:特别是三极管和一些基本元器件的使用和阅读说明书,之前一直不知道三极管具体怎么用,电容用来干啥等鞥
- ESP8266: 这玩意相当于给我打开了一扇窗,知道以后这类东西都可以用这个实现远程控制,那些所以 IOT 其实开源方案都有,实现起来其实也挺简单。
当然,最后还有最重要的一点:狗十六更老实了。
后续
这个训狗器的实践过程,其实一直在践行快速迭代,如果一开始就要搞最终的方案,估计也搞不成,狗十六估计也咬了不少东西。目前这个之所以直接从 v0.3 跳到了 v1.0 是因为我觉得这个基本上算是一个我比较满意的版本了,没有什么明显的硬伤,再优化就需要花费很大的精力,投入产出比已经不成正比了。我估计这个训狗器我应该不会在折腾升级了。
不过如果要改进还是有改进空间的:(搞 v2.0 的话)
譬如整个 ESP8266-12F 可以和电阻、光耦、电源芯片搞到一块集成电路板上,做成一个整体板子,应该体积能更小,也不需要焊这么多线,然后训狗器上的焊点和电源可以接触 4 个线搞成 4pin 的插头,直接插到整个板子上,看起来就会很清爽了。
