2021-07-19 由于这玩意还挺好用的(天天用), 停止迭代很久了. 这两天平板电脑处于坏掉的边缘(换掉鼓包电池后问题修复), 再不发怕是拍 demo 又要等很久了.
Demo 视频
也可查看 YouTube 上的 demo 视频
https://youtu.be/qql_tM655xw
https://youtu.be/CejsZOpXph0
引言
目前用的平板电脑为联想牌surface. 经常用来跑安卓模拟器用 ehviewer 看漫画. 正常的翻页方式为左右滑动, 体验一般. 而平板仅有的物理按键也只有两个小小的音量键, 并不方便. 所以本文实现了一个提高翻页效率的飞梭旋钮.
相关技术研究
成品方案
鼠标
不如外接个鼠标. 鼠标滚轮就是一个方便的输入工具. 于是拿了个旧鼠标, 分解到只剩滚轮功能.
但 ehviewer 在看图界面是没有鼠标滚轮支持的. 写一个 AHK 脚本映射成按键.
WheelUp::
Send {Up}
return
WheelDown::
Send {Down}
return
这样用鼠标滚轮就可以前后翻页了, 效率+1.
然而鼠标滚轮只能实现一下一下的滚, 速度不平滑. 而且即使砍掉一部分的鼠标, 体积还是过大, 需要放个地方. 用起来并不是很爽.
指环鼠标
常规鼠标太大的问题, 可以通过买更小的鼠标解决. 比如下图这种. 淘宝售价大约40元左右
飞梭旋钮
飞梭旋钮这种东西在小时候朋友家的多媒体电脑键盘上见过. 类似下图这种(右上角). 旋转可以实现音量调节或上下滚动等功能.
现代的键盘也有类似设计, 比如 Cherry MX 9.0, DaVinci Resolve
Editor Keyboard等.
当然, 这种旋钮也有独立版. 比如微软 Surface Dial
DIY 方案
飞梭旋钮相比鼠标滚轮要好不少. 可以直接通过旋转速度调整翻页速度. 只要旋转速度均匀, 翻页速度就均匀. 可以连续旋转, 而不需要像鼠标滚轮那样戳一下戳一下.
家里的功放也有一个类似的飞梭旋钮, 调节EQ时等使用, 手感非常好, 大概是整个功放上仅次于主音量按钮可以自动旋转的让我觉得最厉害的地方了. 于是决定自己 DIY 一个.
优化目标:
- 手感不至于太差
- 体积越小越好
- 最终需要是一个通过USB或者蓝牙等能与电脑直接相连的东西
旋转编码器
首先需要一个能输入水平面上旋转的元件. 比如一个放平了的鼠标滚轮. 鼠标光电编码器+光栅体积太大而且结构复杂, 暂不考虑.
可供选择的还是不少的: 最常见的Alps EC11, 车载音响用的Alps EC21A, 鼠标滚轮机械编码器TTC凯华等, 磁编码器 AS5600等. 其中Alps EC11 和 Alps EC21A 太高/太大. 决定尝试鼠标滚轮机械编码器和磁编码器.
控制器
只要是一个能连蓝牙或者USB的东西就可以. 经过一番考察, 最终选择了 Seeeduino XIAO. 选择的原因主要是, 体积小, 自带USB-C 接口. 正好摸一下 Arduino.
机械编码器版
先上图
编码器选择
之前砍的还剩一半的鼠标竟然用的是光电的, 没法拆下来用, 只好再买一个机械编码器. 这里机械结构有限, 精度难以控制, 尺寸小导致力矩小, 阻力大概比正常鼠标小一些更好. 去淘宝搜了一下, 选择了 TTC 红芯, 据商家说手感偏软. 编码器是常规的一圈24格. 也就是转一圈可以翻24页. 更小的机械编码器当然是有的, 不过这次尝试没有极端追求体积.
轴承
单靠机械编码器不足以提供流畅的手感, 这里需要一个额外的轴承来保持稳定的转动. 由于轴承离旋钮帽越近越好, 轴承被设计放在编码器上方, 而编码器安装方向为竖直, 所以轴承不能太小. 最终选择了ET2015. 内径15mm, 外径20mm, 宽度3.5mm.
外壳
3D 模型/3D 打印在线查看/下载
https://grabcad.com/library/pager-mechanical-1
https://www.thingiverse.com/thing:4937962
机械部分
外壳的设计与轴承的选择是同步进行的(毕竟不能买到任意尺寸的轴承).
机械部分, 由于轴承旋转轴需要与编码器旋转轴在同一条直线上, 最小体积有了若干限制
- 轴承和编码器需要竖直放置, 高度最小也只能做到二者之和(再加上旋钮帽).
- 宽度最小也只能做到轴承的宽度(再加上能固定住轴承的外壳)
- 长度最小也只能做到轴承半径+编码器旋转轴到最远点的距离(再加上固定外壳)
几个外壳零件通过滑动组合, 靠摩擦力结合. 同时在背面和平板卡扣上粘贴了防滑垫.
组装过程及细节图
控制器部分
只要能包住 XIAO 即可, 需要露出USB-C接口和排针部分. 接口一边是个简单的卡扣, 另一侧用m1.7的热压螺母固定. 这个外壳实际上做的太宽了, 浪费了一部分空间.
组装过程及细节图
连接机械部分与控制器
机械编码器相当于两个开关, 选择任意数字输入即可. 这里选择了GND连接C脚, 较近的D9 D10 连接编码器AB脚, 设置上拉电阻, 检测到低电平即为通.
Arduino 程序
第一次摸 Arduino, 有点小激动. 第一次决定全部按照官方推荐来. 直接使用 Arduino IDE 编写调试.
源码 https://github.com/exzhawk/pager/tree/mechanical
检测旋转方向
鼠标机械旋转编码器的旋转方向原理很简单, 它有两个输出针脚: A, B. 每旋转1格, A和B的电平(与第三个针脚的通断状态)都会发生一次变化, 根据A/B电平改变的先后顺序就可以判断旋转方向了.
或者换一种思路, 每旋转1格, A/B的电平改变都是相同的, 要么都是从高到低, 要么都是从低到高, 只是先后顺序区别. 那就可以始终指盯着A的变化, 当它电平发生改变的时候, 去看一下B的电平, 如果和A一致, 那么就是B电平变化先于A, 如果和A不一致, 那就是B电平变化晚于A. 即可判断旋转方向了.
模拟成USB键盘
方便起见, 直接使用TinyUSB的相关库. https://github.com/cyborg5/TinyUSB_Mouse_and_Keyboard/blob/master/library.properties
消抖
有机械开关当然就有抖动, 当然需要消抖. 懒得改硬件了, 软件消抖直接抄了一段, 并不是很work, 在一个方向上效果还可以, 另一个方向上还是会抖. 不过翻页主要是一个方向, 就这么苟下去了.
磁性编码器版
先上图
选择磁性编码版当然是因为体积能更小, 手感也可能会有提高, 毕竟不再需要机械结构, 只要芯片和磁铁就行.
编码器选择
再往能的淘宝上搜了下, 选择了比较常见的AS5600. 买了在 PCB 上焊好的, 可以省下自己配供电部分的小电容, 直接作为机械部分的元件.
轴承
如果机械编码器还能提供部分旋转约束, 只有一个芯片的磁编码器当然是什么也没有. 为了顺滑的旋转体验, 还是需要一个轴承. 得益于整个磁编码器和磁铁的小型化, 这里选择了更小的MR128. 内径8mm, 外径12mm, 宽度2.5mm.
外壳
3D 模型/3D 打印在线查看/下载
https://grabcad.com/library/pager-magnetic-1
https://www.thingiverse.com/thing:4938412
机械部分
思路与机械编码器版相同, 只不过更小了, 而且不需要转轴, 只需要固定磁铁即可. 平板卡扣的卡榫同时具有把顶盖和外壳部分固定在一起的功能. 为了简化打印, 旋钮表面的突起也换成凹陷.
组装过程及细节图
控制器部分
同样与机械编码器版类似, 同样是更小了. 不过这次使用的是 I2C 协议. 限制了能使用的针脚, 所以可能看起来有些奇怪.
组装过程及细节图
连接机械部分与控制器
AS5600 PCB 与 XIAO 之间通过 I2C 协议连接(原因见下), 所以要连接四根线, XIAO上 分别是 5V/GND 供电, SDA/SCL 数据. 连接到AS5600 PCB对应的焊点即可.
Arduino 程序
由于 Arduino IDE 过于难用, 决定换一个工具开发. 比如 Jetbrains 家的 CLion, 同时 Arduino 工具链也换为 PlatformIO. 各种东西配置一下, 基本都直接能用. 比起 Arduino IDE, 少了更方便的自动开关的 console 和plotter 工具. 但是写代码的体验着实提高了不少.
源码 https://github.com/exzhawk/pager/tree/magnetic
模拟成键盘的方法与机械编码器版相同, 不再赘述.
检测旋转方向
AS5600是绝对值编码器, 提供了几种直接读取当前角度的方法: 模拟方式, 数字方式(PWM), I2C接口. 模拟方式有一个限制, 回报的数值会有一定的滞后现象. (by design的)
直接用 I2C 接口读取原始值即可. Seeed 官方甚至都提供了代码, 直接拿来用非常方便.
https://github.com/Seeed-Studio/Seeed_Arduino_AS5600
消抖
没错, 即使是数字接口, 还是有抖动存在. 如图, 尖刺就是抖动. 每次抖动范围都相对固定, 而且只会抖动一次, 直接过滤相差太大的值即可.
机械编码器版及磁编码器版对比
时间上来说, 是先做了机械编码器, 之后做了磁编码器. 二者相对独立, 零件无法互换. 外观上最重要的区别仍然是体积变小.
总结
第一次尝试 Arduino 开发, 还是挺有趣的. 各种东西拼一起他竟然 work.
我们中国真的太厉害了! 国内厂家 Seeed Studio 提供的 XIAO 和各种资料超出了我的想象.
未来
- 3D 打印机用的年久失修的 Ultimaker3, 打印精度太低了. 甚至会出现打印误差导致轴承变形, 旋转力度非常不线性的情况. 等买了光固化打印机可以再尝试打印一个新的壳.
- 编码器和控制器之间就靠杜邦线连接也太菜了. 可以考虑编码器卡扣背面直接固定控制器等等思路.
- 编码器板子和控制器板子都是现成的, 想要进一步缩小体积其实应该自己画个板子. 画板子的技能好像点过, 但现在肯定已经归零了.
- 能有个无线就更好了.
- 在 Arduino IDE, Platform IO 之后, 该试试基于 Python 的程序了.
本文提出了一种适用于平板计算机的翻页设备,
想法新颖
结构完整
配图清晰
内容详实
政治正确
我王多鱼accept了