aramy 发表于 2025-5-15 12:04:37

Beetle 树莓派RP2350 使用墨水屏制作一个名牌

本帖最后由 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墨水屏
GNDGND
VCC(3.3V)VCC
A1(27)DC
A0(26)CS
MOSI(19)DIN
SCK(18)SCLK
9BUSY
8RST


三、开发介绍开发工具依然使用自己最喜欢的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),int(imgpoint),int(imgpoint)
    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):
      for j in range(0, imgdata.shape):
            sourcedata=imgdata
            # 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<<6 | desimg<<4 | desimg<<2 | desimg
      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);
}
四、效果展示
墨水屏显示内容还是非常惊艳的。不过红色不够艳丽。开发板掉电后也能正常显示内容。



五、源码和视频

https://www.bilibili.com/video/av114509834354923/
页: [1]
查看完整版本: Beetle 树莓派RP2350 使用墨水屏制作一个名牌