전자 종이를 ESP32 및 Arduino 개발 환경에서 사용 3

10990 단어 e-PaperESP32
"전자 용지를 ESP32 및 Arduino 개발 환경에서 사용"
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를 직접 제어하고 이동해 봅니다.
또, 도형 묘화나 문자 묘화등을 위한 그래픽 버퍼의 조작에 대해서는 생략해, 단순히 흑백을 그리기 위해서 최소한 필요한 <움직이는> 코드를 작성합니다.

환경



지금까지의 실험과 유사
  • WaveShare 전자 종이 모듈.
    htps //w w. 와우 멋지다. 코 m/우우키/2.
  • Arduino 1.8.10
  • ESP32

  • 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);
    }
    

    좋은 웹페이지 즐겨찾기