基于micro:bit与ESP32徽章板打造体感翻页笔:手势识别与蓝牙HID实战
1. 项目概述:当徽章板遇上micro:bit,一个体感翻页笔的诞生
最近在创客圈子里,用开源硬件做点实用又有趣的小玩意儿,热度一直不减。我自己也喜欢捣鼓这些,特别是那种能把不同平台“攒”在一起,实现1+1>2效果的项目。今天要聊的这个“徽章板+micro:bit体感翻页笔”,就是一个典型的例子。它听起来有点复杂,但拆解开来,核心思路其实非常清晰:利用micro:bit内置的加速度计来捕捉我们手腕的倾斜或晃动动作,然后通过徽章板上的无线模块,把动作指令转换成控制电脑翻页的信号。
这玩意儿能干嘛?最直接的,就是让你在讲PPT或者做演示的时候,彻底解放双手。不用再满桌子找那个小小的翻页器,也不用非得站在电脑旁边。你只需要把这块“徽章”戴在身上,或者拿在手里,轻轻一晃手腕,PPT就“唰”地翻到下一页。对于老师、培训师,或者任何需要频繁进行演示的人来说,这绝对是个提升效率和范儿的神器。而且,它不只是个翻页笔,通过编程,你可以定义各种体感动作——比如向上抬手腕回到上一页,快速晃动两下黑屏,甚至画个圈圈来启动某个特定程序——把演示过程玩出花来。
这个项目特别适合两类朋友:一类是已经接触过micro:bit或徽章板,想找个综合项目练手,把学到的无线通信、传感器应用串起来的创客爱好者;另一类则是虽然没太多硬件基础,但喜欢动手,想做一个真正能用、能秀出来的DIY作品的实用派。整个制作过程涉及硬件连接、图形化编程(或Python)、以及一点点电脑端的小设置,但每一步我都会掰开揉碎了讲,保证你跟着做,一定能成功点亮它,让它听你指挥。
2. 核心硬件选型与功能解析
2.1 为什么是徽章板+micro:bit这个组合?
选择徽章板和micro:bit搭档,而不是用其中任何一个单独完成,背后有非常实际的考量。这就像组队打游戏,各自发挥特长,互补短板。
首先看micro:bit,它的核心优势在于内置传感器丰富且易用。板载的加速度计和磁力计(电子罗盘)是实现体感控制的物理基础。特别是加速度计,它能以很高的频率感知板子在X、Y、Z三个轴向上的加速度变化,我们手腕的每一个细微动作,都会被它精准捕获。更重要的是,BBC为micro:bit开发的MakeCode或Python编程环境,对传感器数据的读取做了极大简化,往往拖一个积木块或者写一行代码就能拿到实时数据,极大降低了开发门槛。但是,micro:bit原生支持的无线通信是低功耗蓝牙(BLE)和2.4GHz私有协议(通过radio模块),虽然功能强大,但想要让它直接、稳定地模拟成一个USB键盘或鼠标设备来控制电脑,过程会比较曲折,需要额外的桥接设备或复杂的驱动配置。
这时,徽章板的价值就凸显出来了。我用的这款徽章板,通常指的是集成了ESP32主控、彩色屏幕、按键和锂电池管理的一体化开发板。它的王牌是强大的无线连接能力和USB HID功能。ESP32芯片同时支持Wi-Fi和蓝牙,而且通过Arduino等开发环境,可以非常方便地将其编程为一个“蓝牙键盘”或“蓝牙鼠标”设备。这意味着,徽章板可以轻松地与电脑、手机配对,并直接发送键盘按键(如Page Down, Page Up)或鼠标移动指令。此外,徽章板自带的屏幕和按键,为我们提供了绝佳的人机交互界面:你可以实时显示当前状态(比如“已连接”、“翻页模式”),或者通过按键切换不同的体感控制模式。
所以,分工就明确了:micro:bit负责“感知”——采集我们的体感动作;徽章板负责“执行”——将动作指令通过蓝牙发送给电脑。两者之间通过最经典、最稳定的串口(UART)进行通信。这个组合规避了各自的弱点,放大了优点,让整个系统稳定又高效。
注意:市面上徽章板型号较多,确保你手中的版本主控是ESP32系列,并且支持Arduino开发环境下的蓝牙HID库。这是项目成功的关键前提。
2.2 硬件清单与连接要点
动手之前,请清点以下材料。大部分都能在常用的电子元件商城找到,总成本可以控制得很低。
- micro:bit V2 主板一块:推荐V2版本,其麦克风和扬声器在后续功能扩展时可能用得上,当然V1.5版本也完全足够。
- 徽章板一块:如前所述,核心是ESP32。常见的有DFRobot的HuskyLens AI摄像头套装里的那块板子,或者一些社区设计的专为徽章形态优化的ESP32板。
- USB数据线两条:一条用于给micro:bit下载程序,一条用于给徽章板下载程序和供电。
- 杜邦线若干:用于连接两块板子。至少需要3根(公对公或公对母,根据板子接口决定),推荐准备4-5根以备不时之需。
- 锂电池一块(可选但推荐):如果徽章板支持,搭配一块3.7V的锂电池(如502030规格),可以让你的体感翻页笔真正摆脱线缆,实现无线移动使用。注意查看徽章板的电池接口和充电管理电路。
硬件连接详解:连接的核心是建立micro:bit和徽章板之间的串口通信。我们使用micro:bit的P0、P1引脚作为串口的发送(TX)和接收(RX)。
- 接线方案:
- micro:bitP0(TX)引脚 → 连接至 → 徽章板的某个RX引脚(例如GPIO16)。
- micro:bitP1(RX)引脚 → 连接至 → 徽章板的某个TX引脚(例如GPIO17)。
- micro:bitGND引脚 → 连接至 → 徽章板的GND引脚。
实操心得:务必确保TX接RX,RX接TX,这是串口通信的黄金法则,接反了数据无法传输。另外,共地(GND连接)至关重要,它为两个系统提供了共同的电压参考点,没有它,通信会不稳定甚至无法进行。连接时最好在板子未通电状态下操作。
3. 软件环境搭建与编程逻辑拆解
3.1 双平台编程环境准备
这个项目需要在两个不同的开发环境中为两块板子分别编写程序。
对于micro:bit(感知端):我们使用Microsoft MakeCode for micro:bit在线编辑器。这是最推荐新手使用的方式,图形化积木编程,直观易懂。
- 打开浏览器,访问 makecode.microbit.org。
- 创建一个新项目。编程语言选择“块”(Blocks)模式即可。
- 编程的核心逻辑是:持续读取加速度计数值,根据预设的阈值判断手势,然后通过串口发送对应的指令字符给徽章板。
对于徽章板(执行端):我们使用Arduino IDE。ESP32在Arduino社区有非常完善的支持。
- 下载并安装最新版Arduino IDE。
- 在“文件”->“首选项”的“附加开发板管理器网址”中,添加ESP32的开发板管理网址:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json - 打开“工具”->“开发板”->“开发板管理器”,搜索“esp32”,安装“Espressif Systems”提供的开发板包。
- 安装完成后,在“工具”->“开发板”中选择你的徽章板对应的ESP32型号(例如“ESP32 Dev Module”)。
- 还需要安装一个关键库:蓝牙键盘库。在“项目”->“加载库”->“管理库”中,搜索“Keyboard”,找到并安装“Keyboard”库(作者可能是“Arduino”)。这个库允许徽章板模拟蓝牙键盘。
3.2 micro:bit端程序:手势识别与串口发送
micro:bit端的程序是整个项目的“感知大脑”。它的任务很简单:感知动作,发出指令。
逻辑流程图(文字描述):上电初始化 -> 设置串口通信波特率(例如9600) -> 无限循环:读取加速度计Y轴(或X轴)数值 -> 判断数值是否超过“翻页”阈值 -> 如果超过,则通过串口发送字符‘N’(Next)给徽章板 -> 为避免一次动作触发多次翻页,加入一个简单的延时或状态判断。
MakeCode关键积木块解析:
初始化串口:在“高级”->“串行”分类中,找到“串行重定向到 USB/串行 写入引脚 …”积木。将其放入“当开机时”积木中。这个积木的作用是指定使用micro:bit的哪个引脚进行串口通信,并设置波特率。我们将TX(发送)引脚设置为P0,RX(接收)引脚设置为P1,波特率设为9600(需与徽章板程序一致)。
读取加速度计:在“输入”分类中,找到“加速度(mg) x/y/z”积木。我们主要关心Y轴。当你水平握住micro:bit(屏幕朝上),前后倾斜它时,Y轴加速度值会发生显著变化。向前倾斜(屏幕一端抬高)为正值,向后倾斜为负值。
判断与发送:使用“如果…那么…”逻辑积木进行判断。例如:
如果 加速度(mg) y > 200 那么。这个200就是一个阈值,需要你根据实际握持姿势和力度去调整。在“那么”分支里,放入“串行 写入字符串 “N””积木,表示发送“下一页”指令。防误触与延时:发送指令后,立即加入一个“暂停(ms) 500”积木。这是因为人的一个倾斜动作会持续几百毫秒,如果不加延时,在这几百毫秒内,程序会循环执行几十上百次,发送几十个‘N’字符,导致电脑瞬间翻了几十页。500毫秒的延时可以有效防止这种情况,确保一次动作只触发一次翻页。
一个基础的micro:bit程序示例(思路):
当开机时 串行 重定向到 USB/串行 写入引脚 TX->P0 RX->P1 波特率 9600 无限循环 如果 加速度(mg) y > 200 那么 串行 写入字符串 “N” 暂停(ms) 500 如果 加速度(mg) y < -200 那么 串行 写入字符串 “P” // 假设‘P’代表上一页(Previous) 暂停(ms) 500这个程序实现了向前倾斜翻下一页,向后倾斜翻上一页的基本功能。你可以在此基础上增加更多手势,比如判断X轴实现左右倾斜控制音量,或者通过组合按键(micro:bit的A/B键)来切换不同的控制模式。
3.3 徽章板端程序:串口接收与蓝牙HID转发
徽章板端的程序是“神经中枢”,负责沟通内外。它需要做三件事:监听串口、解析指令、模拟按键。
程序结构解析:
初始化设置:
#include <BluetoothSerial.h> #include <BleKeyboard.h> BleKeyboard bleKeyboard("MyGesturePresenter", "Manufacturer", 100); // 创建一个蓝牙键盘设备,名称可自定义 HardwareSerial SerialPort(2); // 使用ESP32的第二个硬件串口(UART2),引脚可自定义 void setup() { Serial.begin(115200); // 用于调试输出 SerialPort.begin(9600, SERIAL_8N1, 16, 17); // 初始化UART2,波特率9600,RX=GPIO16, TX=GPIO17 bleKeyboard.begin(); // 启动蓝牙键盘 // 可以在徽章板屏幕上显示连接状态 }这里的关键是
BleKeyboard库的使用,它让我们用几行代码就创建了一个蓝牙键盘。SerialPort对象用于和micro:bit通信,我们将其映射到GPIO16和GPIO17,这与之前的硬件连接对应。主循环逻辑:
void loop() { // 检查蓝牙是否已连接 if (bleKeyboard.isConnected()) { // 检查串口是否有数据到来 if (SerialPort.available() > 0) { char receivedChar = SerialPort.read(); // 读取一个字符 Serial.print("Received: "); // 调试用,在串口监视器显示 Serial.println(receivedChar); // 解析字符并执行相应按键操作 switch (receivedChar) { case 'N': // 下一页 bleKeyboard.write(KEY_PAGE_DOWN); // 或者在屏幕上显示一个向下的箭头动画 break; case 'P': // 上一页 bleKeyboard.write(KEY_PAGE_UP); break; case 'S': // 停止播放(模拟空格键) bleKeyboard.write(KEY_SPACE); break; // 可以添加更多case来处理其他指令 default: break; } } } else { // 蓝牙未连接,可以在屏幕上显示“等待连接...”的提示 delay(1000); } delay(10); // 短暂延时,释放CPU资源 }主循环不断检查两个状态:蓝牙是否连接、串口是否有数据。一旦蓝牙已连接且收到micro:bit发来的特定字符(如‘N’),就调用
bleKeyboard.write()函数发送对应的键盘键值。KEY_PAGE_DOWN和KEY_PAGE_UP是Arduino库中定义好的特殊键值,分别对应键盘上的PageDown和PageUp键,这正是PPT翻页的快捷键。
注意事项:首次使用时,需要在电脑的蓝牙设置中,搜索名为“MyGesturePresenter”(或你自定义的名称)的设备并进行配对。配对通常只需要一次,以后徽章板上电后会自动尝试连接。
4. 系统集成、调试与功能优化
4.1 烧录程序与硬件组装
按照前面两节分别编写好micro:bit和徽章板的程序后,就可以开始烧录和组装了。
烧录micro:bit:在MakeCode编辑器中点击“下载”,会得到一个.hex文件。用USB线连接micro:bit到电脑,它会被识别为一个名为“MICROBIT”的U盘。将.hex文件拖入这个U盘,等待文件复制完成,micro:bit背后的黄色指示灯会闪烁,程序即烧录成功。
烧录徽章板:在Arduino IDE中,选择正确的端口(工具->端口),点击上传按钮。首次上传可能需要长按徽章板上的“BOOT”或“FLASH”按钮进入下载模式,具体请参考你的徽章板说明书。上传成功后,打开Arduino IDE的串口监视器(波特率设为115200),可以看到调试信息。
硬件连接与供电:将micro:bit和徽章板通过杜邦线按照2.2节的接线图连接好。可以先通过USB线为两块板子供电进行测试。如果一切正常,徽章板的蓝牙名称应该出现在电脑的蓝牙设备列表中。
初步功能测试:电脑与徽章板蓝牙配对并连接。打开一个PPT文档。倾斜或晃动你手中的micro:bit,观察PPT是否翻页。如果没反应,首先检查串口监视器里的调试信息,看徽章板是否收到了来自micro:bit的字符。
4.2 手势调参与防抖优化
最初的程序可能不太“听话”,动作识别不灵敏或者过于灵敏(误触发)。这就需要我们进行“调参”。
阈值(Threshold)调整:在micro:bit的程序中,那个“200”和“-200”就是阈值。你可以通过MakeCode的“模拟器”功能,在浏览器里实时查看Y轴的加速度值,做各种倾斜动作,观察数值范围。然后根据这个范围设定一个合理的阈值。例如,你发现轻轻前倾,数值在150-300之间,那么阈值设为180可能比较合适。阈值设得太低容易误触发,太高则需要很大动作幅度。
加入死区(Dead Zone):在阈值判断中,可以设置一个“死区”。比如
如果 加速度 y > 150 且 加速度 y < 50 那么不执行任何操作。这个区间(-50 到 50)被认为是静止或微动状态,可以有效过滤掉手部无意识的轻微抖动。软件消抖(Debouncing):除了简单的延时,更高级的方法是使用状态机或计时器。例如,只有检测到加速度超过阈值并持续保持超过100毫秒,才判定为一次有效手势。这可以避免因瞬间抖动导致的误触发。在MakeCode中,可以利用“变量”来记录状态和时间来实现。
多轴复合判断:单一轴(如Y轴)的判断在某些姿势下可能不准确。可以结合X轴和Z轴进行综合判断。例如,定义一个“向前翻页”手势为:Y轴正值较大,同时Z轴(垂直方向)变化不大。这能提高手势识别的鲁棒性。
4.3 功能扩展与个性化
基础翻页功能实现后,这个项目的可玩性才真正开始。
丰富控制指令:
- 激光笔模式:让徽章板模拟蓝牙鼠标。在Arduino端使用
BleMouse库,根据micro:bit发送的指令,控制鼠标光标在屏幕上划圈或指示。这需要micro:bit发送更精细的加速度或角度数据。 - 媒体控制:定义新的手势,让徽章板发送媒体键值,如
KEY_MEDIA_PLAY_PAUSE,KEY_MEDIA_VOLUME_UP等,用来控制音乐或视频播放。 - 自定义快捷键:发送组合键,比如
Ctrl+S保存,Win+L锁屏等。在Arduino中可以使用bleKeyboard.press(KEY_LEFT_CTRL); bleKeyboard.press('s'); delay(100); bleKeyboard.releaseAll();这样的序列。
- 激光笔模式:让徽章板模拟蓝牙鼠标。在Arduino端使用
利用徽章板屏幕和按键:
- 状态显示:在徽章板屏幕上实时显示当前模式(如“PPT模式”、“媒体模式”)、电池电量、蓝牙连接状态。
- 模式切换:通过徽章板上的物理按键,在不同功能模式间循环切换。每按一次键,屏幕上的模式标识就改变,同时micro:bit端也可以通过串口通知改变其手势映射逻辑。
结构设计与佩戴方式:
- 你可以3D打印一个外壳,将micro:bit和徽章板(如果尺寸允许)集成在一起,做成一个真正的“徽章”或“手表”形态。
- 更常见的做法是,将micro:bit用腕带或魔术贴固定在手腕或手背上,徽章板则可以放在口袋、夹在衣领上,或者用别针做成胸牌。两者之间用细长的杜邦线或更柔软的排线连接,并将线材用热缩管或缠绕管整理好。
5. 常见问题排查与实战心得
在实际制作过程中,你几乎一定会遇到下面这些问题。别慌,我们一个个解决。
5.1 通信类问题
问题1:徽章板串口监视器没收到任何数据。
- 检查接线:这是最高发的问题!再次确认micro:bit的TX是否接到了徽章板的RX,RX接TX,GND接GND。
- 检查波特率:确保micro:bit程序(MakeCode中)和徽章板程序(Arduino的
SerialPort.begin(9600,…))中设置的波特率完全一致,通常用9600。 - 检查引脚定义:确认Arduino代码中
SerialPort.begin(9600, SERIAL_8N1, 16, 17)的后面两个数字(16,17)是否与你实际连接徽章板的RX、TX引脚号一致。 - 供电问题:确保两块板子都已正确供电。可以尝试先单独用USB给micro:bit供电,看看其程序是否正常运行(比如点阵屏是否有显示)。
问题2:蓝牙配对失败或连接不稳定。
- 名称冲突:确保你的蓝牙键盘名称是唯一的。如果之前配对过同名的其他设备,可能会冲突。在代码中修改
BleKeyboard构造函数的第一个参数。 - 电脑端问题:在电脑的蓝牙设置中,删除旧的、可能出错的配对记录,然后重新搜索配对。
- 距离与干扰:确保设备在有效范围内(通常10米内无遮挡),并远离大型金属物体或Wi-Fi路由器等强信号源。
5.2 功能类问题
问题3:翻页动作不灵敏或没反应。
- 阈值过高:按照4.2节的方法,在MakeCode模拟器中观察你实际动作产生的加速度值,调低阈值。
- 手势方向不对:记住,micro:bit的加速度计坐标系是固定的。你可能需要调整判断的轴向(把判断Y轴改成判断X轴),或者改变micro:bit在你手上的固定朝向。
- 程序逻辑错误:检查micro:bit的“如果”判断条件是否正确,以及发送的字符串是否和徽章板程序中
switch-case里的字符完全匹配(注意大小写)。
问题4:一次动作导致连续翻好多页。
- 缺少延时或消抖:这是最可能的原因。务必在micro:bit发送指令后加入足够的延时(如500ms),或者实现更高级的消抖逻辑(见4.2节)。
- 徽章板程序循环过快:检查徽章板
loop()函数末尾是否有delay(10)之类的短暂延时,避免CPU全速运行导致一次接收被处理多次。
5.3 供电与便携化
问题5:如何实现无线便携使用?
- 徽章板供电:如果徽章板支持,焊接或插接一块3.7V锂电池是最佳方案。大部分ESP32徽章板都有充放电管理芯片,可以通过USB口给电池充电。
- micro:bit供电:micro:bit V2可以通过其边缘的“3V”和“GND”引脚由外部电源供电。一个巧妙的方法是:使用一枚CR2032纽扣电池座。将电池座的正极(+)接到micro:bit的“3V”引脚,负极(-)接到“GND”引脚。这样,一块小小的纽扣电池就能让micro:bit工作很久,因为它的功耗非常低。
- 整合供电:更优雅的方案是,用一块稍大的锂电池(如1000mAh)同时为两块板子供电。你需要一个升压模块(将3.7V升到5V)给徽章板,同时从电池接出3.3V线给micro:bit。这需要一定的电路知识,但能获得最长的续航。
个人实战心得:我最开始做这个项目时,在防误触上栽了跟头。最初只用了简单延时,但在快速走动或手势激动时还是容易误触发。后来改用了“持续检测法”:只有加速度值超过阈值并保持超过200毫秒,才认定为有效手势,松开后状态才重置。这个改动让识别准确率提升了90%以上。另外,在佩戴方式上,我发现把micro:bit用弹性腕带固定在手背,比固定在手腕内侧识别更准,因为手背的倾斜动作更自然、幅度更大。最后,别忘了给你的作品起个酷炫的名字,并在徽章板开机画面上显示出来,这小小的仪式感能让整个制作过程的成就感直接拉满。
