
手把手教您驱动电子墨水屏/电子纸系列-01
各位看客老爷们大家好!!!最近我们Shining Man小组(公司内部小组) 一直在鼓捣墨水屏的教学项目。我们设想以一个小白的视角去呈现给大伙从零到一驱动墨水屏的整个过程!
首先,您需要弄明白一些硬件的知识
1、了解墨水屏的工作原理
墨水屏,学名电子纸,它背后的技术是一种“微胶囊电泳显示”技术。其基本原理是悬浮在液体中的带电纳米粒子受到电场作用而产生迁移。
电子墨水被涂布在一层塑料薄膜上,再贴覆上薄膜晶体管(TFT)电路,经由驱动IC控制,形成像素图形。
1)双色电子墨水原理
电子墨水由数百万个微胶囊所构成,微胶囊的大小约等同于人类头发的直径。每个微胶囊里含有电泳粒子──带负电荷的白色以及带正电荷的黑色粒子,悬浮于透明液体中。
利用正负相吸的原理,当电场接通时,该区块对应的黑或白粒子会移动至微胶囊的顶端,使用者在该区块上,就能看见白色或黑色。
2)三色电子墨水原理
三色电子墨水系统,特别适用于电子货架标签(简称ESL)应用。
三色电子墨水系统运作原理与双色系统类似,施加不同的电压,使不同颜色的粒子移动至上层,看见不同的颜色。三色系统在微杯技术架构下开发而成。
3)电子纸基本结构
1)电子纸膜片
这是电子纸显示模组的核心材料,负责显示人眼实际看到的图案。
2)底板
作为电子纸显示屏的像素电极(下电极),用于控制电子纸每个像素的黑白变化。底板有多种类型可选,包括PCB、FPC、TFT玻璃、PET等,
实际应用时可根据具体需求选择不同的底板。电子纸膜片可通过层压的方式贴合在底板上。
3)驱动芯片
可根据控制指令和信号产生相应的逻辑电平和时序,用于控制底板每个像素(或段码)的工作时序和状态,并使电子纸能够显示所需图案。
4)透明保护膜
一种高分子塑料薄膜,具有很强的防水汽透过性。用层压机将其紧密贴合在电子纸膜片与底板上面,可有效防止水汽侵入电子纸膜片,避免电子纸因受潮而损坏。
5)封边胶
一种特殊的化学胶水,将其均匀涂在透明保护膜的四周边缘处,起到隔离水汽的作用。可避免水汽从透明保护膜四周渗入进去而对电子纸膜片造成损坏。
2、下一步准备您的开发板,单片机MCU(强烈推荐初学者使用Good Display系列的开发套件)
STM32、ESP8266、ESP32、ArduinoUNO(四款开发板原理图都开源,具体内容直接点击链接进行访问 https://www.good-display.cn/product/71/)
以stm32为例,拿到板子首先我们要考虑接线
我就是这么连的,VCC电源和GND接地是固定的,其他的可以根据使用的情况随意定义,只要程序是按照您定义的来就没问题。
3、重点是要搞明白为什么是连这个几个引脚?它们各自代表什么?
a、首先电源和接地不必多少,MCU工作就必须有电源供给
b、我们需要明确的是,电子墨水屏和任何主控都是采用SPI通信协议(这里不讨论并口的屏幕)
DIN代表了MOSI(主设备(单片机)输出,从设备(墨水屏)输入,这个很好理解,单片机要给墨水屏发送内容显示)
CLK代表的就是时钟(数据传输双方都要约定在同一个频段上进行)
c、CS代表的是片选,低电平有效
d、DC是数据引脚,代表 数据/命令 读写选择,高电平为数据,低电平为命令
e、RST是墨水屏复位引脚,您可以这么理解,墨水屏重新更新画面时需要掉电喘口气才能继续。
f、BUSY顾名思义就是忙,用来检测墨水屏工作状态是busy还是idle,如果处于busy状态,MCU是没办法对墨水屏进行任何操作的。
接下来介绍硬件接口程序
1、首先您需要把我们已经定义好的硬件接口在程序中体现出来
void EPD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);
//CS-->PD8 SCK-->PD9 SDO--->PD10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //Port con
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
// D/C--->PE15 RES-->PE14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; //Port configuration
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// BUSY--->PE13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
2、接下是各个硬件接口的程序
a、首先就是通信方式SPI
SPI时序图
void SPI_Write(unsigned char value)
{
unsigned char i;
for(i=0; i<8; i++)
{
EPD_W21_CLK_0;
if(value & 0x80)
EPD_W21_MOSI_1;
else
EPD_W21_MOSI_0;
value = (value << 1);
EPD_W21_CLK_1;
}
}
这段代码实现的是通过SPI通信协议写数据,每次写一个字节也就是8位所以利用了for循环,
根据上边的时序图,循环8次,这里的 value & 0x80就是在判断最高位是1还是0,
是1 代表MOSI=1,是0 代表MOSI=0。因为SPI写数据是从最高位开始但是数据保存在最低位,
所以要往左移一位即value = (value << 1)这样循环8次就得到了一个字节。
b:CS和DC了
CS和DC就是要用到写数据和写命令里(时序图中CS低电平的时候开始写数据或者命令;DC=0的时候写命令,DC=1的时候写数据。结束后CS重新回到高电平。)
void EPD_W21_WriteCMD(unsigned char command)//写命令
{
EPD_W21_CS_0;
EPD_W21_DC_0; // command write
SPI_Write(command);
EPD_W21_CS_1;
}
void EPD_W21_WriteDATA(unsigned char data)//写数据
{
EPD_W21_CS_0;
EPD_W21_DC_1; // data write
SPI_Write(data);
EPD_W21_CS_1;
}
c:RST通常只用在初始化部分,0,1代表电平
EPD_W21_RST_0; // Module reset
delay_xms(10);//At least 10ms delay
EPD_W21_RST_1;
delay_xms(10); //At least 10ms delay
d:读取BUSY的电平,busy=1代表忙状态,就会一直在while(1)的死循环里;busy=0才会跳出循环执行接下来的程序
void Epaper_READBUSY(void)
{
while(1)
{ //=1 BUSY
if(isEPD_W21_BUSY==0) break;;
}
}
欢迎各位看客老爷们给我们小组留言(您可以直接邮件或者通过官网的SaleSmartly或者留言板给我们私信)
下一期更新 快刷,局刷,全刷的初始化代码!!!!
额外扩展阅读:
GITHUB Library-Good Display墨水屏例程库(支持STM32/Arduino/ESP32/ESP8266)
电子纸/墨水屏的百科全书(查找您需要的FAQ,如果没有您需要的请您告知我们,第一时间发布弥补空白!!!)
您可以点击这里或者导航栏的企业定制服务快捷提交您对我们的需求!!我们会及时回复跟进的。
使用ImageToArray为您手上的GoodDisplay系列墨水屏制作取模图吧!
扫二维码用手机看

©2021 大连点墨电子科技有限公司版权所有