我业余时间用树莓派制作了一个红包发射器,前后断断续续大约花了三个月时间。
* [视频演示](
https://www.bilibili.com/video/BV1fT4y1N7Ng)
* [客户端 Demo](
https://kiwiberry.nz/)
* [客户端源代码](
https://github.com/rocwang/cash-launcher)
* [服务器源代码](
https://github.com/rocwang/cash-launcher-server)
## 客户端
客户端是一个手机 Web App,用于控制发射器硬件。 这个 App 会连接安装在发射器中的树莓
派,使用 WebSocket 将手机朝向数据和手指滑动速度实时地发送至服务器。而服务器会用这
些数据来控制发射器的动作。
App 有两个页面:
* 菜单:提供数种纸币和红包以供选择。
* 发射界面:显示一叠钱。用户上滑即可发射。
App 使用 Vue 3 以及 vue-router 实现。为了在手机上实现流畅的动画效果,发射 UI 的那一叠钱
是使用一个 HTML 2D Canvas 库——[konva](
https://github.com/konvajs/konva) 实现的。另
外我还使用了 rxjs 来帮助实现用户操作和设备朝向事件流向 WebSocket 消息的变换。
## 服务器
服务器跑在树莓派中,使用 Node.js 实现,提供 HTTPS + WebSocket 服务,用于将客户端发来
的控制信息转换为发射器的控制信号,最终旋转发射器和开启其内部的直流电机,将纸币从
不同角度吐出去。
服务器使用[ws](
https://www.npmjs.com/package/ws) 库接受客户端的连接。有两个接口:
`/orientation`和`/velocity`。它将手机朝向和手指滑动速度值转化为脉宽调制信
号和使能信号,用以控制连接在树莓派上的两个伺服电机和一个直流电机。底层的 GPIO 操作交
由[rpio](
https://www.npmjs.com/package/rpio) 处理。服务器同样利用了 rxjs 来实现数据
流的变换。
服务器还提供了一个`/siri`接口。当其被调用时,发射器上的直流电机会工作半秒钟。视
频中一开始使用 Siri 来控制发射器就是使用此接口实现的。
---
(不知为何,V2EX 的 Markdown 发帖接口总报 500 错误,所以只能使用 Default 接口。)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/752307
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.