一、项目介绍
由于平时写代码和编写实验报告中频繁用到“复制”、“黏贴”,假如能够一键实现这两个功能将会提高工作效率。键盘只保留三个按键有利于减小体积、降低成本。由于网上一下子没找到基于RP2040的对应产品,因此想借助这次WeDesign活动提供的RP2040芯片,自己动手做一个CV小键盘。
基于上述目的,本项目将围绕RP2040展开CV小键盘的设计。该键盘共有三个按键,分别一键实现“Ctrl-C”、“Ctrl-V”和“Ctrl-X”的功能。每个按键均有LED背光灯,亮度通过电位器调节。键盘背面有4个WS2812灯珠,能够实现彩虹灯效,颜色变换的速度通过另一个电位器调节。当然,键盘上额外提供一个按键以便用户开启或关闭背面的WS2812灯珠。
二、芯片介绍
本项目使用树莓派基金会研发的RP2040双核Cortex-M0处理器,工作频率最高133MHz,拥有 264kB 的 SRAM,通过专用 QSPI 总线支持高达 16MB 的片外闪存。拥有30个I/O端口、4 个12位ADC、2个UART串口、16个PWM通道、USB 1.1 控制器和 PHY等一系列外设。它还拥有8 个可编程 I/O (PIO) 状态机,用于自定义外设。凭借大型片上存储器、对称双核处理器复合体和丰富的外设以及可编程 I/O (PIO) 状态机,它为用户提供了无与伦比的功能和灵活性。
三、软件设计
本项目使用Arduino平台进行嵌入式软件开发。它的优势在于扩展库丰富且例程较为详细,同时系统配置简单,大量底层的配置操作已经被封装,有助于快速上手完成原型的开发工作。为了充分发挥RP2040双核处理器的优势,本项目在Arduino平台下使用FreeRTOS编写多核程序。
CPU0专门负责WS2812彩虹灯效的实现。不同于显示固定的颜色,彩虹灯效要求处理器不断地向WS2812发出脉冲信号从而实现灯光颜色的渐变效果。使用Adafruit_NeoPixel库驱动WS2812并实现所需的效果。
CPU1负责USB通信、按键检测和ADC测量工作。参考内置示例“KeyboardAndMouseControl”中键盘、鼠标设备的实现方法完成本项目所需的快捷键功能。按键检测通过轮询实现,然后使用两路ADC检测两个电位器的电压,将ADC结果线性映射至LED背光灯的亮度和WS2812灯效的速度。此处背光灯亮度使用RP2040_PWM库产生三路硬件PWM信号直接驱动三个LED,信号频率1KHz。当然,如果按下键盘正面的USER按键,完成一组彩虹灯效后将关闭WS2812;如果WS2812没有开启,该按键会打开它。
四、硬件设计
本项目使用KiCad绘制硬件原理图和PCB线路图。该EDA软件对我而言是陌生的,需要从头学起。之前做的几个东西都是嘉立创EDA设计的,验证过Type-C插座封装的可靠性,所以本项目使用了不少嘉立创EDA的封装,以防自己画图时发生失误。具体通过LCKiConverter浏览器插件完成嘉立创EDA封装的转换下载,然后将相关文件复制到KiCad工程的文件夹下即可完成导入。本项目的PCB线路图完全手动布线,因为没找到KiCad的自动布线工具。并且没找到KiCad的圆弧线工具,只能45°走线。但是,KiCad的整体界面典雅精致,比嘉立创EDA看起来舒服多了。最终,使用Fabrication Toolkit插件导出Gerber格式文件,嘉立创20块钱绿色板打样(7月要是还有WeDesign活动是不是能免费KiCad打样了?)
本项目的主控芯片是RP2040,选用12MHz晶振(20pF,SMD3225-4P封装),Flash存储器是W25Q32FVSIG,电源芯片是友台半导体生产的AMS1117 3.3。发光器件使用3颗橙光LED,和4个WS2812B灯珠。使用两个103电位器、三个拆机青轴、三个贴片轻触开关。
五、调试经历
本项目采用的调试流程为:tb购买最便宜最低配的RP2040核心板初步调试代码,然后设计CV键盘的电路,嘉立创打样,自行焊接。备足焊锡膏和锡浆,1个下午能够完成全部焊接,工作量还行吧。
Arduino做RP2040时开发板类型选“VCC-GND YD RP2040”,测试下来用这个不会出问题,尽管CV键盘的Flash大小比源地的板小许多。注意在模拟组合键时,使用Keyboard.press函数模拟“按下”,最后用Keyboard.releaseAll函数“抬起”所有按键。
if (digitalRead(keyL)==0){
delay(10);
Keyboard.press(KEY_LEFT_CTRL);
delay(10);
Keyboard.press('c');
delay(10);
Keyboard.releaseAll();
while(digitalRead(keyL)==0);
}
else if(digitalRead(keyM)==0){
delay(10);
Keyboard.press(KEY_LEFT_CTRL);
delay(10);
Keyboard.press('v');
delay(10);
Keyboard.releaseAll();
while(digitalRead(keyM)==0);
}
else if(digitalRead(keyR)==0){
delay(10);
Keyboard.press(KEY_LEFT_CTRL);
delay(10);
Keyboard.press('x');
delay(10);
Keyboard.releaseAll();
while(digitalRead(keyR)==0);
}
KiCad画图时遇到的放置器件、导出Gerber等问题,百度找答案,以及看下电子森林的资料。
原理图中1uF的应该用2.2uF。如果电脑没有识别到RP2040的串口或虚拟U盘,那么请再焊接一遍RP2040芯片、2个27欧姆电阻还有Type-C插座。有兴趣的读者可以猜猜看为什么我知道这些。另外,本项目推荐使用高质量的1117 3.3电源芯片。友台1117很好用,虽然略贵一点点。本来我想用0.1元的1117,然后焊接的前一天做其他东西时发现那1117芯片啸叫了,估计它不喜欢10uF陶瓷贴片电容吧:)
六、RP2040芯片的优势和局限
RP2040基于双核心低功耗m0内核,省电。它有强大的可编程io(本项目没用上)来实现一些复杂的功能。RP2040能够使用Arduino快速开发,上手难度低,同时usb拖拽烧录程序简单方便,不需要额外的daplink调试器。另外,qfn封装比lqfp容易焊接,有热风枪和锡浆后,成功率高。
但是RP2040无内置flash,必须加钱买外置flash芯片,电路布线时麻烦了不少。而且RP2040不带蓝牙wifi,需要进行无线通信时,不如使用esp32c3所以本项目刻意不加蓝牙和wifi的功能,有理由不用ESP32。对了,这个RP2040芯片应该不是国产芯片。
七、总结
本项目是我第一次使用KiCad开展PCB设计。CV键盘总算是做好了,能用。未来希望加上更多的功能,例如宏按键切换、键盘背光灯升级为呼吸灯。至于外壳么,算了,A4纸包裹下就好了,不会影响高效地开展CV操作。