一直想玩玩墨水屏,这次咸鱼找了全新的ses价签,而且价格还很便宜,于是买了一个2.66寸三色,和一个4.2寸三色的墨水屏幕,经过几天的折腾终于能正常显示了。
显示效果如下:
折腾来折腾去,发现这个墨水屏还是显示这种黑白的头像表情包效果比较好,显示彩色图片效果太差了。
再来看看显示黑白漫画
显示这些色调简单的漫画效果也可以。要想做一个实时的时钟的话,这个屏幕也不太行,主要是刷新太慢了。刷新一次需要15s左右。而且不能局部刷新,一刷新就是整体刷新。
这次一共是两个价签,其图片及特性如下:
2.66寸价签
4.2寸价签
原本打算无损改造,直接利用自带的板子进行开发,但无奈这两个单片机都没有蓝牙或者wifi。无法实现通过手机推送图片到屏幕上显示。所以干脆进一步改造,只要屏幕。采用ESP32作为主控。ESP32有蓝牙和wifi,未来的拓展性更强。
要用esp32来驱动屏幕,就需要用到屏幕接口板,网上找了一下,只有微雪的板子,且价格较贵。咸鱼上有一个卖的,也要30多一片,比价签本身都贵多了。既然如此,干脆自己做一个屏幕驱动板。
验证方案就是。
ESP32模块+屏幕驱动板+屏幕。
验证通过后,再做一块板子,把esp32和屏幕驱动板集成在一块板子上。
这个板子比较简单,对比了微雪的原理图以及上述官网上找到推荐电路图基本移植。这次直接用立创的在线eda画板子。工程已经开源了,地址如下:
https://oshwhub.com/jackdesign/e-eink-driver
经过几天的等待,板子到了一共5片。
焊接之后如下:
上面的料基本都是从价签本身的板子上面拆下来的。最难焊接的FPC座子,手工焊接很容易焊短路。要特别注意,焊完之后要测下fpc引脚是否短路。
#define PIN_NUM_MOSI 23 //tft sda
#define PIN_NUM_CLK 18 //tft clk
#define PIN_NUM_CS 5 //tft cs
#define PIN_NUM_DC 22 //tft dc
#define PIN_NUM_RST 19 //tft rst
#define PIN_NUM_BUSY 21 //ftf busy
用到的开发环境是ESP32IDF。其配置方法见https://blog.csdn.net/sinat_36568888/article/details/121424739。
这里没有用到arduino环境是因为一直做的是嵌入式开发。arduino这种对于初学者非常友好,几行代码就可以运行了。作为开发者,就不太适合进行自定义开发了。目前微雪以及网上找到的历程基本都是基于arduino的开发。所以整个过程只能自己重头来了。
注意这个屏幕直接用微雪的2.66寸屏幕例程是不能运行,这两块屏幕的寄存器与例程中的定义不一样。
首先搞定两大块。蓝牙和spi屏幕驱动。
蓝牙直接使用例程bt_spp_acceptor进行开发。spi屏幕驱动之前搞过,就直接现成拿来用了。这里就重点说明下屏幕的寄存器操作流程。
第一步:硬件初始化。
void EPD_2IN66B_Init(uint8_t type)
{
EPD_2IN66B_Reset();
EPD_2IN66B_ReadBusy();
soft_reset(); //
EPD_2IN66B_SendCommand(0xe5);//input_temp 25C
EPD_2IN66B_SendData(0x19);
EPD_2IN66B_SendCommand(0xe0);//active temperature
EPD_2IN66B_SendData(0x02);
EPD_2IN66B_SendCommand(0x00);//psr
if(type == 35) //0x23 2.66 b epaper
{
EPD_2IN66B_SendData(0xcf);
}
else if(type == 13) //0x0d 4.2 b epaper
{
EPD_2IN66B_SendData(0xcf);
}
}
void soft_reset(void)
{
EPD_2IN66B_SendCommand(0x00);
EPD_2IN66B_SendData(0x0E);
EPD_2IN66B_ReadBusy();
}
软件reset的寄存器是0x00,写入的数值是0x0e。这是与微雪例程不一样的。
第二步,将突图片数据写入屏幕ram
void EPD_2IN66B_Display(UBYTE *ImageBlack, UBYTE*ImageRed)
{
UWORD Width, Height,psx;
Width = (EPD_2IN66B_WIDTH % 8 == 0)? (EPD_2IN66B_WIDTH / 8 ): (EPD_2IN66B_WIDTH / 8 + 1);
Height = EPD_2IN66B_HEIGHT;
psx = Width*Height;
EPD_2IN66B_SendCommand(0x10);
for (UWORD i = 0; i < psx; i++) {
EPD_2IN66B_SendData(ImageBlack[i]);
}
EPD_2IN66B_SendCommand(0x13);
for (UWORD i = 0; i < psx; i++) {
EPD_2IN66B_SendData(~ImageRed[i]);
}
}
先想0x10寄存器写入黑白图像。然后再向0x13寄存器写入红黑图像。
第三步,屏幕整体刷新
power_on();
display_refresh();
power_off();
void power_on(void)
{
EPD_2IN66B_SendCommand(0x04);//power on
EPD_2IN66B_SendData(0x00);
EPD_2IN66B_ReadBusy();
}
void display_refresh(void)
{
EPD_2IN66B_SendCommand(0x12);//power on
EPD_2IN66B_SendData(0x0E);
EPD_2IN66B_ReadBusy();
}
void power_off(void)
{
EPD_2IN66B_SendCommand(0x02);//power on
EPD_2IN66B_SendData(0x00);
EPD_2IN66B_ReadBusy();
}
注意由于墨水屏的特性,在刷新完成后,最好将墨水屏幕关掉。以延长其寿命。最好是直接外部断掉供电,由于当前设计的驱动板电源不受控,所以没哟硬件断电的代码。
简单来说,要在屏幕上显示需要上述三步操作。
下面来说下busy检测。由于墨水屏刷新很慢,所以每步操作后要等到墨水屏是非busy状态,才能进行下一步操作。
static void EPD_2IN66B_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
// vTaskDelay(50);
while(gpio_get_level(PIN_NUM_BUSY) == 0) { //LOW: idle, HIGH: busy
vTaskDelay(10);
// DEV_Delay_ms(10);
}
// vTaskDelay(50);
// DEV_Delay_ms(50);
Debug("e-Paper busy release\r\n");
}
判断忙的函数一定要注意,大部分的屏幕是高电平是忙。而很不幸上述两块屏幕都是第电平是忙。这里一开始没注意,一直卡在这个判断忙的函数了。排查了好久才发现是这里配置错误了。
安装APP(见文末的代码及app下载路径)。这里直接用到了微雪官方的app,没有进行任何修改。
打开app,选择esp32的蓝牙,第一次连接需要配对,按照操作配对就行了。屏幕的型号后缀b代表的屏幕是黑白红三色。最后点击上传图像,等到上传100%后。屏幕将会刷新。
文中用到的代码以及app如下:
https://download.csdn.net/download/sinat_36568888/87855755?spm=1001.2014.3001.5503