전자 종이를 ESP32 및 Arduino 개발 환경에서 사용 3
htps : // m / 난부 wks / ms / 14257cf5f9 et d192b8 ec
"전자 종이를 ESP32와 Arduino 개발 환경에서 사용하기 2"
htps : // m / 난부 wks / ms / 266bf61726b005d8 221
그럼 각각 GxEPD , GxEPD2 라이브러리를 사용했지만 이번에는 라이브러리를 사용하지 않는 방법을 시도해 보겠습니다.
이번 실행 결과
폰트 정보 등을 사용하지 않는 데모 때문에 대신 체커 패턴을 표시하고 있습니다.
목적
복잡한 e-Paper 제어를 e-Paper에 대한 명령 수준에서 이해하기 위해 e-Paper 외부 라이브러리에 맡기지 않고 SPI를 직접 제어하고 이동해 봅니다.
또, 도형 묘화나 문자 묘화등을 위한 그래픽 버퍼의 조작에 대해서는 생략해, 단순히 흑백을 그리기 위해서 최소한 필요한 <움직이는> 코드를 작성합니다.
환경
지금까지의 실험과 유사
복잡한 e-Paper 제어를 e-Paper에 대한 명령 수준에서 이해하기 위해 e-Paper 외부 라이브러리에 맡기지 않고 SPI를 직접 제어하고 이동해 봅니다.
또, 도형 묘화나 문자 묘화등을 위한 그래픽 버퍼의 조작에 대해서는 생략해, 단순히 흑백을 그리기 위해서 최소한 필요한 <움직이는> 코드를 작성합니다.
환경
지금까지의 실험과 유사
htps //w w. 와우 멋지다. 코 m/우우키/2.
ESP32 모듈은 WEMOS LOLIN32를 사용했습니다.
WEMOS LOLIN32 조사
htps : // 이 m / 난부 wks / ms / 111 예 8cd69f3390d866f
배선
지금까지의 실험과 유사
ESP32 PIN
ESP32 신호명
WAVESHARE e-Paper 신호명
케이블 색상
4
4
BUSY
보라색
16
16
RST
화이트
17
17
DC
녹색
5
SS/5/LED
CS
주황색
18
SCK/18
CLK
노랑
23
MOSI
DIN
블루
GND
GND
GND
블랙
3V3
3.3V
VCC
레드
19
MISO/19
연결하지 않고
연결하지 않고
원본이 된 코드
waveshare e-Paper 저장소가 있습니다.
이 중, 「epd2in9d」를 바탕으로 작성했습니다.
htps : // 기주 b. 코 m / 와 ぇ 샬레 / 에 빠페 r / t 어 /
이 저장소는 MIT 라이센스입니다.
htps : // 기주 b. 코 m / 와 ぇ 멋쟁이 / 에 빠페 r / 이스에 s / 23
덧붙여 이번 사용하는 것은 2.9inch_e-Paper_Module_(B)이므로 본래는 epd2in9bc 를 사용할 것입니다만, 여러가지 경위로부터 이쪽을 사용하고 있습니다.
「epd2in9d」는 이것용일까? (별로 조사하지 않았습니다)
htps //w w. 와우 멋지다. 네 t/우우키/2.
코드
이용하고 있는 것은 SPI.h만 인클루드 하고 있습니다.
그리고는 다음의 1 파일만으로 동작합니다.
#include <SPI.h>
#define RST_PIN 16
#define DC_PIN 17
#define CS_PIN 5
#define BUSY_PIN 4
#define EPD_WIDTH 128
#define EPD_HEIGHT 296
const unsigned char EPD_2IN9D_lut_vcomDC[] = {
0x00,0x08,0x00,0x00,0x00,0x02,0x60,0x28,0x28,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_ww[] = {
0x40,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x40,0x14,0x00,0x00,0x00,0x01,0xA0,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_bw[] = {
0x40,0x17,0x00,0x00,0x00,0x02,0x90,0x0F,0x0F,0x00,0x00,0x03,0x40,0x0A,0x01,0x00,0x00,0x01,0xA0,0x0E,
0x0E,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_wb[] = {
0x80,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x80,0x14,0x00,0x00,0x00,0x01,0x50,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_bb[] = {
0x80,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x80,0x14,0x00,0x00,0x00,0x01,0x50,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
void SendCommand(unsigned char command)
{
digitalWrite(DC_PIN, LOW);
SPI.transfer(command);
}
void SendData(unsigned char data)
{
digitalWrite(DC_PIN, HIGH);
SPI.transfer(data);
}
void WaitUntilIdle(void)
{
char busy;
do {
SendCommand(0x71);
busy = digitalRead(BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
delay(200);
}
void SetFullReg(void)
{
SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
SendData(0xb7); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
unsigned int count;
SendCommand(0x20);
for(count=0; count<44; count++) {
SendData(EPD_2IN9D_lut_vcomDC[count]);
}
SendCommand(0x21);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_ww[count]);
}
SendCommand(0x22);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_bw[count]);
}
SendCommand(0x23);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_wb[count]);
}
SendCommand(0x24);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_bb[count]);
}
}
void TurnOnDisplay(void)
{
SendCommand(0x12); //DISPLAY REFRESH
delay(10); //!!!The delay here is necessary, 200uS at least!!!
WaitUntilIdle();
}
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(CS_PIN, OUTPUT);
pinMode(RST_PIN, OUTPUT);
pinMode(DC_PIN, OUTPUT);
pinMode(BUSY_PIN, INPUT);
SPI.begin();
SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
digitalWrite(RST_PIN, HIGH);
delay(200);
digitalWrite(RST_PIN, LOW); // module reset
delay(10);
digitalWrite(RST_PIN, HIGH);
delay(200);
digitalWrite(CS_PIN, LOW);
//POWER SETTING
SendCommand(0x01);
SendData(0x03);
SendData(0x00);
SendData(0x2b);
SendData(0x2b);
SendData(0x03);
SendCommand(0x06); //boost soft start
SendData(0x17); //A
SendData(0x17); //B
SendData(0x17); //C
SendCommand(0x04);
WaitUntilIdle();
SendCommand(0x00); //panel setting
SendData(0xbf); //LUT from OTP,128x296
SendData(0x0e); //VCOM to 0V fast
SendCommand(0x30); //PLL setting
SendData(0x3a); // 3a 100HZ 29 150Hz 39 200HZ 31 171HZ
SendCommand(0x61); //resolution setting
SendData(EPD_WIDTH);
SendData((EPD_HEIGHT >> 8) & 0xff);
SendData(EPD_HEIGHT & 0xff);
SendCommand(0x82); //vcom_DC setting
SendData(0x28);
Serial.println("e-Paper initialized.");
int w, h;
w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1);
h = EPD_HEIGHT;
SendCommand(0x10);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
SendData(0x00);
}
}
// SendCommand(0x13);
// for (int j = 0; j < h; j++) {
// for (int i = 0; i < w; i++) {
// SendData(0xFF);
// }
// }
SendCommand(0x13);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
if ( 0 == ( j / 8 ) % 2 ){
SendData(0x00);
SendData(0xFF);
} else {
SendData(0xFF);
SendData(0x00);
}
}
j++;
}
Serial.println("e-Paper cleared");
SetFullReg();
TurnOnDisplay();
SendCommand(0X50);
SendData(0xf7);
SendCommand(0X02); //power off
WaitUntilIdle();
SendCommand(0X07); //deep sleep
SendData(0xA5);
digitalWrite(RST_PIN, LOW);
}
void loop()
{
}
하이라이트
몇 점으로 짜서 코드를 읽어 갑니다.
해당 초기화 루틴
waveshare 데이터시트에서. 왼쪽은 2.9inch e-Paper Module (B)의 것. 오른쪽은 2.9inch e-Paper HAT(D)의 것.
오른쪽의 타이틀이 「GDEW029I6F V1.1 Specification」이 되고 있네요.
GDEW029I6F는 GooDisplay의 2.9 inch flexible 4 grayscale e ink display module e paper display
그래서,
h tp // w w. 에 빠 ぺ r ぢ sp ぁ y. 이 m / p 로즈 cts_에서 원하는 l / p 로즈 c d = 411. HTML
에서 IC Driver 링크를 따라 가면
IL0373 그렇습니다.
SPI 설정
Waveshare 인터페이스 보드에는 BS 점퍼가 있습니다.
기본적으로 4-line SPI로 설정되어 있습니다.
4-line SPI란, 데이터시트
h tp // w w. 오 d ぢ sp ぁ y. 이 m/pu bぃc/html/pdfjs/ゔぃ에우ぇr/ゔぃ에우ぇr네. HTML? 흠 = ht ps // v4. 음, cd. 윤 300. c/100001_1909185148/G에서 H029Z13. pdf
읽으면 DC 신호선을 사용하여 Command와 Data의 바이트 경계, 혹은 Command와 데이터 읽기의 경계를 나타내는 방법.
3-line SPI는 SPI에서 DC 신호선 대신
Command Startbit로 0,
Data Startbit ~ 데이터 리드의 Startbit 로서 1 이 되는 DC bit 를 부가하는 방법인 것 같다.
따라서, Command/Data 송출시에 있어서 4-line SPI는 8bit 데이터 단위, 3-line SPI는 9bit 데이터 단위가 된다.
코드는 4-line SPI이므로 예를 들어 명령 송출할 때는 다음과 같이 DC 라인을 LOW로 하여 송출하고 있다
void SendCommand(unsigned char command)
{
digitalWrite(DC_PIN, LOW);
SPI.transfer(command);
}
BUSY 체크
초기화 흐름 중에 BUSY 핀을 확인합니다.
해당 코드는 이것입니다.
void WaitUntilIdle(void)
{
char busy;
do {
SendCommand(0x71);
busy = digitalRead(BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
delay(200);
}
Reference
이 문제에 관하여(전자 종이를 ESP32 및 Arduino 개발 환경에서 사용 3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nanbuwks/items/1a4d58fc7f74ab8c8d85
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
waveshare e-Paper 저장소가 있습니다.
이 중, 「epd2in9d」를 바탕으로 작성했습니다.
htps : // 기주 b. 코 m / 와 ぇ 샬레 / 에 빠페 r / t 어 /
이 저장소는 MIT 라이센스입니다.
htps : // 기주 b. 코 m / 와 ぇ 멋쟁이 / 에 빠페 r / 이스에 s / 23
덧붙여 이번 사용하는 것은 2.9inch_e-Paper_Module_(B)이므로 본래는 epd2in9bc 를 사용할 것입니다만, 여러가지 경위로부터 이쪽을 사용하고 있습니다.
「epd2in9d」는 이것용일까? (별로 조사하지 않았습니다)
htps //w w. 와우 멋지다. 네 t/우우키/2.
코드
이용하고 있는 것은 SPI.h만 인클루드 하고 있습니다.
그리고는 다음의 1 파일만으로 동작합니다.
#include <SPI.h>
#define RST_PIN 16
#define DC_PIN 17
#define CS_PIN 5
#define BUSY_PIN 4
#define EPD_WIDTH 128
#define EPD_HEIGHT 296
const unsigned char EPD_2IN9D_lut_vcomDC[] = {
0x00,0x08,0x00,0x00,0x00,0x02,0x60,0x28,0x28,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_ww[] = {
0x40,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x40,0x14,0x00,0x00,0x00,0x01,0xA0,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_bw[] = {
0x40,0x17,0x00,0x00,0x00,0x02,0x90,0x0F,0x0F,0x00,0x00,0x03,0x40,0x0A,0x01,0x00,0x00,0x01,0xA0,0x0E,
0x0E,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_wb[] = {
0x80,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x80,0x14,0x00,0x00,0x00,0x01,0x50,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_bb[] = {
0x80,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x80,0x14,0x00,0x00,0x00,0x01,0x50,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
void SendCommand(unsigned char command)
{
digitalWrite(DC_PIN, LOW);
SPI.transfer(command);
}
void SendData(unsigned char data)
{
digitalWrite(DC_PIN, HIGH);
SPI.transfer(data);
}
void WaitUntilIdle(void)
{
char busy;
do {
SendCommand(0x71);
busy = digitalRead(BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
delay(200);
}
void SetFullReg(void)
{
SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
SendData(0xb7); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
unsigned int count;
SendCommand(0x20);
for(count=0; count<44; count++) {
SendData(EPD_2IN9D_lut_vcomDC[count]);
}
SendCommand(0x21);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_ww[count]);
}
SendCommand(0x22);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_bw[count]);
}
SendCommand(0x23);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_wb[count]);
}
SendCommand(0x24);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_bb[count]);
}
}
void TurnOnDisplay(void)
{
SendCommand(0x12); //DISPLAY REFRESH
delay(10); //!!!The delay here is necessary, 200uS at least!!!
WaitUntilIdle();
}
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(CS_PIN, OUTPUT);
pinMode(RST_PIN, OUTPUT);
pinMode(DC_PIN, OUTPUT);
pinMode(BUSY_PIN, INPUT);
SPI.begin();
SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
digitalWrite(RST_PIN, HIGH);
delay(200);
digitalWrite(RST_PIN, LOW); // module reset
delay(10);
digitalWrite(RST_PIN, HIGH);
delay(200);
digitalWrite(CS_PIN, LOW);
//POWER SETTING
SendCommand(0x01);
SendData(0x03);
SendData(0x00);
SendData(0x2b);
SendData(0x2b);
SendData(0x03);
SendCommand(0x06); //boost soft start
SendData(0x17); //A
SendData(0x17); //B
SendData(0x17); //C
SendCommand(0x04);
WaitUntilIdle();
SendCommand(0x00); //panel setting
SendData(0xbf); //LUT from OTP,128x296
SendData(0x0e); //VCOM to 0V fast
SendCommand(0x30); //PLL setting
SendData(0x3a); // 3a 100HZ 29 150Hz 39 200HZ 31 171HZ
SendCommand(0x61); //resolution setting
SendData(EPD_WIDTH);
SendData((EPD_HEIGHT >> 8) & 0xff);
SendData(EPD_HEIGHT & 0xff);
SendCommand(0x82); //vcom_DC setting
SendData(0x28);
Serial.println("e-Paper initialized.");
int w, h;
w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1);
h = EPD_HEIGHT;
SendCommand(0x10);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
SendData(0x00);
}
}
// SendCommand(0x13);
// for (int j = 0; j < h; j++) {
// for (int i = 0; i < w; i++) {
// SendData(0xFF);
// }
// }
SendCommand(0x13);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
if ( 0 == ( j / 8 ) % 2 ){
SendData(0x00);
SendData(0xFF);
} else {
SendData(0xFF);
SendData(0x00);
}
}
j++;
}
Serial.println("e-Paper cleared");
SetFullReg();
TurnOnDisplay();
SendCommand(0X50);
SendData(0xf7);
SendCommand(0X02); //power off
WaitUntilIdle();
SendCommand(0X07); //deep sleep
SendData(0xA5);
digitalWrite(RST_PIN, LOW);
}
void loop()
{
}
하이라이트
몇 점으로 짜서 코드를 읽어 갑니다.
해당 초기화 루틴
waveshare 데이터시트에서. 왼쪽은 2.9inch e-Paper Module (B)의 것. 오른쪽은 2.9inch e-Paper HAT(D)의 것.
오른쪽의 타이틀이 「GDEW029I6F V1.1 Specification」이 되고 있네요.
GDEW029I6F는 GooDisplay의 2.9 inch flexible 4 grayscale e ink display module e paper display
그래서,
h tp // w w. 에 빠 ぺ r ぢ sp ぁ y. 이 m / p 로즈 cts_에서 원하는 l / p 로즈 c d = 411. HTML
에서 IC Driver 링크를 따라 가면
IL0373 그렇습니다.
SPI 설정
Waveshare 인터페이스 보드에는 BS 점퍼가 있습니다.
기본적으로 4-line SPI로 설정되어 있습니다.
4-line SPI란, 데이터시트
h tp // w w. 오 d ぢ sp ぁ y. 이 m/pu bぃc/html/pdfjs/ゔぃ에우ぇr/ゔぃ에우ぇr네. HTML? 흠 = ht ps // v4. 음, cd. 윤 300. c/100001_1909185148/G에서 H029Z13. pdf
읽으면 DC 신호선을 사용하여 Command와 Data의 바이트 경계, 혹은 Command와 데이터 읽기의 경계를 나타내는 방법.
3-line SPI는 SPI에서 DC 신호선 대신
Command Startbit로 0,
Data Startbit ~ 데이터 리드의 Startbit 로서 1 이 되는 DC bit 를 부가하는 방법인 것 같다.
따라서, Command/Data 송출시에 있어서 4-line SPI는 8bit 데이터 단위, 3-line SPI는 9bit 데이터 단위가 된다.
코드는 4-line SPI이므로 예를 들어 명령 송출할 때는 다음과 같이 DC 라인을 LOW로 하여 송출하고 있다
void SendCommand(unsigned char command)
{
digitalWrite(DC_PIN, LOW);
SPI.transfer(command);
}
BUSY 체크
초기화 흐름 중에 BUSY 핀을 확인합니다.
해당 코드는 이것입니다.
void WaitUntilIdle(void)
{
char busy;
do {
SendCommand(0x71);
busy = digitalRead(BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
delay(200);
}
Reference
이 문제에 관하여(전자 종이를 ESP32 및 Arduino 개발 환경에서 사용 3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nanbuwks/items/1a4d58fc7f74ab8c8d85
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <SPI.h>
#define RST_PIN 16
#define DC_PIN 17
#define CS_PIN 5
#define BUSY_PIN 4
#define EPD_WIDTH 128
#define EPD_HEIGHT 296
const unsigned char EPD_2IN9D_lut_vcomDC[] = {
0x00,0x08,0x00,0x00,0x00,0x02,0x60,0x28,0x28,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_ww[] = {
0x40,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x40,0x14,0x00,0x00,0x00,0x01,0xA0,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_bw[] = {
0x40,0x17,0x00,0x00,0x00,0x02,0x90,0x0F,0x0F,0x00,0x00,0x03,0x40,0x0A,0x01,0x00,0x00,0x01,0xA0,0x0E,
0x0E,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_wb[] = {
0x80,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x80,0x14,0x00,0x00,0x00,0x01,0x50,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
const unsigned char EPD_2IN9D_lut_bb[] = {
0x80,0x08,0x00,0x00,0x00,0x02,0x90,0x28,0x28,0x00,0x00,0x01,0x80,0x14,0x00,0x00,0x00,0x01,0x50,0x12,
0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
void SendCommand(unsigned char command)
{
digitalWrite(DC_PIN, LOW);
SPI.transfer(command);
}
void SendData(unsigned char data)
{
digitalWrite(DC_PIN, HIGH);
SPI.transfer(data);
}
void WaitUntilIdle(void)
{
char busy;
do {
SendCommand(0x71);
busy = digitalRead(BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
delay(200);
}
void SetFullReg(void)
{
SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
SendData(0xb7); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
unsigned int count;
SendCommand(0x20);
for(count=0; count<44; count++) {
SendData(EPD_2IN9D_lut_vcomDC[count]);
}
SendCommand(0x21);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_ww[count]);
}
SendCommand(0x22);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_bw[count]);
}
SendCommand(0x23);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_wb[count]);
}
SendCommand(0x24);
for(count=0; count<42; count++) {
SendData(EPD_2IN9D_lut_bb[count]);
}
}
void TurnOnDisplay(void)
{
SendCommand(0x12); //DISPLAY REFRESH
delay(10); //!!!The delay here is necessary, 200uS at least!!!
WaitUntilIdle();
}
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(CS_PIN, OUTPUT);
pinMode(RST_PIN, OUTPUT);
pinMode(DC_PIN, OUTPUT);
pinMode(BUSY_PIN, INPUT);
SPI.begin();
SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
digitalWrite(RST_PIN, HIGH);
delay(200);
digitalWrite(RST_PIN, LOW); // module reset
delay(10);
digitalWrite(RST_PIN, HIGH);
delay(200);
digitalWrite(CS_PIN, LOW);
//POWER SETTING
SendCommand(0x01);
SendData(0x03);
SendData(0x00);
SendData(0x2b);
SendData(0x2b);
SendData(0x03);
SendCommand(0x06); //boost soft start
SendData(0x17); //A
SendData(0x17); //B
SendData(0x17); //C
SendCommand(0x04);
WaitUntilIdle();
SendCommand(0x00); //panel setting
SendData(0xbf); //LUT from OTP,128x296
SendData(0x0e); //VCOM to 0V fast
SendCommand(0x30); //PLL setting
SendData(0x3a); // 3a 100HZ 29 150Hz 39 200HZ 31 171HZ
SendCommand(0x61); //resolution setting
SendData(EPD_WIDTH);
SendData((EPD_HEIGHT >> 8) & 0xff);
SendData(EPD_HEIGHT & 0xff);
SendCommand(0x82); //vcom_DC setting
SendData(0x28);
Serial.println("e-Paper initialized.");
int w, h;
w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1);
h = EPD_HEIGHT;
SendCommand(0x10);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
SendData(0x00);
}
}
// SendCommand(0x13);
// for (int j = 0; j < h; j++) {
// for (int i = 0; i < w; i++) {
// SendData(0xFF);
// }
// }
SendCommand(0x13);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
if ( 0 == ( j / 8 ) % 2 ){
SendData(0x00);
SendData(0xFF);
} else {
SendData(0xFF);
SendData(0x00);
}
}
j++;
}
Serial.println("e-Paper cleared");
SetFullReg();
TurnOnDisplay();
SendCommand(0X50);
SendData(0xf7);
SendCommand(0X02); //power off
WaitUntilIdle();
SendCommand(0X07); //deep sleep
SendData(0xA5);
digitalWrite(RST_PIN, LOW);
}
void loop()
{
}
몇 점으로 짜서 코드를 읽어 갑니다.
해당 초기화 루틴
waveshare 데이터시트에서. 왼쪽은 2.9inch e-Paper Module (B)의 것. 오른쪽은 2.9inch e-Paper HAT(D)의 것.
오른쪽의 타이틀이 「GDEW029I6F V1.1 Specification」이 되고 있네요.
GDEW029I6F는 GooDisplay의 2.9 inch flexible 4 grayscale e ink display module e paper display
그래서,
h tp // w w. 에 빠 ぺ r ぢ sp ぁ y. 이 m / p 로즈 cts_에서 원하는 l / p 로즈 c d = 411. HTML
에서 IC Driver 링크를 따라 가면
IL0373 그렇습니다.
SPI 설정
Waveshare 인터페이스 보드에는 BS 점퍼가 있습니다.
기본적으로 4-line SPI로 설정되어 있습니다.
4-line SPI란, 데이터시트
h tp // w w. 오 d ぢ sp ぁ y. 이 m/pu bぃc/html/pdfjs/ゔぃ에우ぇr/ゔぃ에우ぇr네. HTML? 흠 = ht ps // v4. 음, cd. 윤 300. c/100001_1909185148/G에서 H029Z13. pdf
읽으면 DC 신호선을 사용하여 Command와 Data의 바이트 경계, 혹은 Command와 데이터 읽기의 경계를 나타내는 방법.
3-line SPI는 SPI에서 DC 신호선 대신
Command Startbit로 0,
Data Startbit ~ 데이터 리드의 Startbit 로서 1 이 되는 DC bit 를 부가하는 방법인 것 같다.
따라서, Command/Data 송출시에 있어서 4-line SPI는 8bit 데이터 단위, 3-line SPI는 9bit 데이터 단위가 된다.
코드는 4-line SPI이므로 예를 들어 명령 송출할 때는 다음과 같이 DC 라인을 LOW로 하여 송출하고 있다
void SendCommand(unsigned char command)
{
digitalWrite(DC_PIN, LOW);
SPI.transfer(command);
}
BUSY 체크
초기화 흐름 중에 BUSY 핀을 확인합니다.
해당 코드는 이것입니다.
void WaitUntilIdle(void)
{
char busy;
do {
SendCommand(0x71);
busy = digitalRead(BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
delay(200);
}
Reference
이 문제에 관하여(전자 종이를 ESP32 및 Arduino 개발 환경에서 사용 3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nanbuwks/items/1a4d58fc7f74ab8c8d85텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)