本帖最后由 aramy 于 2025-5-15 12:04 编辑
一、项目起源
小朋友参加活动,会有很多陌生小朋友一起玩的场景。这时老师会给每个孩子贴一个名字贴,方便小朋友们互相认识。这次申请到了Beetle树莓派 RP2350的开发板,基于其穿戴特质,加一个墨水屏,为小朋友制作一个名字贴,让孩子成为最闪亮的崽!二、硬件介绍
主控:Beetle RP2350 是一款基于RP2350芯片设计的高性能迷你体积的开发板,该开发板仅硬币大小(25*20.5mm),专为对空间有要求的嵌入式应用设计。高性能树莓派RP2350芯片是树莓派新推出的高性能安全微控制器,该微控制器拥有独特的双核双架构设计,允许选择Arm Cortex-M33或Hazard3 RISC-V内核。P2350拥有150MHz主频,520KB RAM和2MB Flash,可处理大量高速数据。 高度集成,超小尺寸Beetle RP2350在仅硬币大小的体积上引出了11个IO、BAT、3.3V等众多接口,为项目制作提供了充足的IO和方便的电源连接。Beetle RP2350休眠功耗仅uA,使用电池可长时间工作。同时,Beetle RP2350还集成了锂电池充电功能和电池电压监控功能,可对锂电池进行充电和监测电量,以便在电量不足时采取措施,确保设备持续运行。 墨水屏:使用的是微雪 3寸墨水屏模块红黄黑白400×168分辨率 e-paper e-ink电子纸。墨水屏使用SPI与主控通讯。 墨水屏与主控使用杜邦线连接。 Beetle RP2350 | 墨水屏 | GND | GND | VCC(3.3V) | VCC | A1(27) | DC | A0(26) | CS | MOSI(19) | DIN | SCK(18) | SCLK | 9 | BUSY | 8 | RST | | |
|
三、开发介绍 开发工具依然使用自己最喜欢的Vscode+platformIO。但是Beetle RP2350太新了,platformIO暂时还没有支持,这里借用相同主控芯片的seeed-xiao-rp2350开发板的驱动来开发Beetle RP2350板子。开发过程中还使用了python+opencv来对图片进行处理。 上一篇帖子写了,如何在vscode下搭建platformIO的编译环境。除此之外还需要修改板子的引脚对应关系。这里使用到spi通讯接口,所以需要修改spi对应的管脚信息。 墨水屏显示的内容使用绘图板事先绘制好。需要留意,这个墨水屏是4色墨水屏,支持 黑、白、黄、红四色。电脑绘制好的图片是以RGB方式存放的,每个像素点使用3个字节保存。而墨水屏每个像素点使用2位数据保存(仅仅支持4色),这样图片从电脑到墨水屏就要进行转换。 数据转换分为两步,第一步将电脑的图片颜色映射到4色上;第二步,将图片每4个像素压缩到一个字节里去。
- def getcolor(imgpoint):
- b,g,r=int(imgpoint[0]),int(imgpoint[1]),int(imgpoint[2])
- bwyr=[r*r+g*g+b*b,
- (r-255)*(r-255)+(g-255)*(g-255)+(b-255)*(b-255),
- (r - 255) * (r - 255) + (g - 255) * (g - 255) +b*b,
- (r - 255) * (r - 255) + g*g+b*b]
- return bwyr.index(min(bwyr))
-
-
- # 原始图片为 168X400X3的位图,目标图片为42X400的位图,每个字节包含4个点的数据,每个l点由两位构成 00:黑 01:白 10:黄 11:红
- def img_deal(imgdata):
- desimg=[]
- for i in range(0,imgdata.shape[0]):
- for j in range(0, imgdata.shape[1]):
- sourcedata=imgdata[i,j]
- # print(getcolor(sourcedata))
- desimg.append(getcolor(sourcedata))
- return desimg
-
- # 绘制四色墨水屏能显示的图片
- def epd_img(desimg):
- imgpoint=0
- for i in range(0,int(len(desimg)/4)):
- imgpoint=desimg[i*4]<<6 | desimg[i*4+1]<<4 | desimg[i*4+2]<<2 | desimg[i*4+3]
- if i%16==0 and i>0:
- print()
- print('0x%02X' % imgpoint, end=', ')
-
- import cv2
- img=cv2.imread("name.bmp",cv2.IMREAD_COLOR)
- img_transposed = cv2.transpose(img)
- img_transposed=cv2.flip(img_transposed, 0)
- cv2.namedWindow("Image")
- desimg=img_deal(img_transposed)
- # print(len(desimg))
- epd_img(desimg)
-
- #显示图片
- cv2.imshow("Image", img_transposed)
-
- #暂停运行,防止图片一闪而过
- cv2.waitKey (0)
- #销毁窗口
- cv2.destroyAllWindows()
复制代码
使用python将生成的图片内容,转换为一个数组。
下位机的代码就比较简单了,将python生成的数据写到屏幕上,就可以完成一个墨水屏名牌的展示了。- #include <SPI.h>
- #include "epd3in0g.h"
- #include "imagedata.h"
- Epd epd;
- void setup() {
- // put your setup code here, to run once:
- Serial.begin(115200);
- Serial.print("e-Paper init ");
- if (epd.Init() != 0) {
- Serial.print("e-Paper init failed");
- return;
- }
-
- Serial.print("White \r\n");
- epd.Clear(white);
- delay(200);
-
- epd.Init();
- Serial.print("Image \r\n");
- epd.Display(IMAGE_DATA);
- delay(2000);
-
- Serial.print("Goto Sleep...\r\n");
- epd.Sleep();
- }
- void loop() {
- Serial.println("hello woeld!");
- delay(2000);
- }
复制代码
四、效果展示
墨水屏显示内容还是非常惊艳的。不过红色不够艳丽。开发板掉电后也能正常显示内容。
五、源码和视频
beetle.zip
|