電子ペーパーWAVESHARE Pico e-Paper 2.13のサンプルコードを解説

  • URLをコピーしました!

※本ページはアフィリエイト広告を利用しています

今回はWAVESHAREから発売されている電子ペーパーPico e-Paper 2.13のサンプル子コードの処理内容について解説します。

サンプルコードをベースに改変することで、簡単に電子ペーパーの表示を変更できますので、ぜひ活用してみてください。

目次

WAVESHARE Pico e-Paper 2.13

入手先

WAVESHARE Pico e-Paper 2.13はAmazonで販売されています。

公式ドキュメント

Pico e-Paper 2.13の仕様やセットアップ方法については、WAVESHAREの公式wikiで解説されています。

Pico e-Paper 2.13サンプルコードの入手方法

サンプルコードのダウンロード

Pico e-Paper 2.13のサンプルコードはWAVESHAREの以下のURLからダウンロードします。

サンプルコード

サンプルコードをダウンロードし、解凍すると以下のディレクトリにPythonのサンプルコードが格納されています。

(解凍したディレクトリ)\Pico_ePaper_Code\python

ライブラリ EPDドライバー

EPD のドライバー コードは、次のディレクトリに保存されます。

C:\user\lab\開発\Waveshare電子ペーパー\Pico_ePaper_Code\Pico_ePaper_Code\c\lib\e-Paper

.h ヘッダー ファイルを開くと、定義されているすべての関数を確認できます。

Raspberry Pi Picoでサンプルコードを実行する手順

サンプルコードをRaspberry Pi Picoで実行する手順は以下の通りです。

  • まず、Pico ボードの BOOTSEL ボタンを押したままにし、Micro USB ケーブルを使用して Pico を Raspberry Pi に接続し、ボタンを放します。この時点で、デバイスはリムーバブル ディスク (RPI-RP2) を認識します。
  • Python ディレクトリ内の rp2-pico-20210418-v1.15.uf2 ファイルを、先ほど特定したリムーバブル ディスク (RPI-RP2) にコピーします。
  • Thonny IDE を開き (Raspberry ロゴ -> 「プログラミング」 -> 「Thonny Python IDE」をクリック)、インタープリターを選択します。
    • [ツール] -> [オプション] -> [インタープリター] を選択します。
    • MicroPython (Raspberry Pi Pico および ttyACM0 ポート) を選択します。
  • Thonny IDE で Pico_ePaper-xxx.py ファイルを開き、現在のスクリプトを実行します (緑色の三角形をクリックします)。

Pico e-Paper 2.13のサンプルコード

ここからはPico e-Paper 2.13のサンプルコードの処理内容について解説します。

2024年2月現在、最新のハードウェアリビジョンであるv4で実行する場合の解説となります。

Pythonサンプルコード

以下がWAVESHAREが公開しているサンプルコードPico_ePaper-2.13_V4.pyです。(コメントがV3のファイル名となっていますがおそらく修正ミスと思われます)

# *****************************************************************************
# * | File        :   Pico_ePaper-2.13_V3.py
# * | Author      :   Waveshare team
# * | Function    :   Electronic paper driver
# * | Info        :
# *----------------
# * | This version:   V1.0
# * | Date        :   2021-11-01
# # | Info        :   python demo
# -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documnetation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to  whom the Software is
# furished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#

from machine import Pin, SPI
import framebuf
import utime


EPD_WIDTH       = 122
EPD_HEIGHT      = 250

RST_PIN         = 12
DC_PIN          = 8
CS_PIN          = 9
BUSY_PIN        = 13

class EPD_2in13_V4_Portrait(framebuf.FrameBuffer):
    def __init__(self):
        self.reset_pin = Pin(RST_PIN, Pin.OUT)
        
        self.busy_pin = Pin(BUSY_PIN, Pin.IN, Pin.PULL_UP)
        self.cs_pin = Pin(CS_PIN, Pin.OUT)
        if EPD_WIDTH % 8 == 0:
            self.width = EPD_WIDTH
        else :
            self.width = (EPD_WIDTH // 8) * 8 + 8
        self.height = EPD_HEIGHT

        self.spi = SPI(1)
        self.spi.init(baudrate=4000_000)
        self.dc_pin = Pin(DC_PIN, Pin.OUT)

        self.buffer = bytearray(self.height * self.width // 8)
        super().__init__(self.buffer, self.width, self.height, framebuf.MONO_HLSB)
        self.init()
    
    '''
    function :Change the pin state
    parameter:
        pin : pin
        value : state
    '''
    def digital_write(self, pin, value):
        pin.value(value)

    '''
    function : Read the pin state 
    parameter:
        pin : pin
    '''
    def digital_read(self, pin):
        return pin.value()

    '''
    function : The time delay function
    parameter:
        delaytime : ms
    '''
    def delay_ms(self, delaytime):
        utime.sleep(delaytime / 1000.0)
        
    '''
    function : Write data to SPI
    parameter:
        data : data
    '''
    def spi_writebyte(self, data):
        self.spi.write(bytearray(data))

    '''
    function :Hardware reset
    parameter:
    '''
    def reset(self):
        self.digital_write(self.reset_pin, 1)
        self.delay_ms(20)
        self.digital_write(self.reset_pin, 0)
        self.delay_ms(2)
        self.digital_write(self.reset_pin, 1)
        self.delay_ms(20)   

    '''
    function :send command
    parameter:
     command : Command register
    '''
    def send_command(self, command):
        self.digital_write(self.dc_pin, 0)
        self.digital_write(self.cs_pin, 0)
        self.spi_writebyte([command])
        self.digital_write(self.cs_pin, 1)
    
    '''
    function :send data
    parameter:
     data : Write data
    '''
    def send_data(self, data):
        self.digital_write(self.dc_pin, 1)
        self.digital_write(self.cs_pin, 0)
        self.spi_writebyte([data])
        self.digital_write(self.cs_pin, 1)
        
    def send_data1(self, buf):
        self.digital_write(self.dc_pin, 1)
        self.digital_write(self.cs_pin, 0)
        self.spi.write(bytearray(buf))
        self.digital_write(self.cs_pin, 1)
    
    '''
    function :Wait until the busy_pin goes LOW
    parameter:
    '''
    def ReadBusy(self):
        print('busy')
        self.delay_ms(10)
        while(self.digital_read(self.busy_pin) == 1):      # 0: idle, 1: busy
            self.delay_ms(10)    
        print('busy release')
    
    '''
    function : Turn On Display
    parameter:
    '''
    def TurnOnDisplay(self):
        self.send_command(0x22) # Display Update Control
        self.send_data(0xf7)
        self.send_command(0x20) # Activate Display Update Sequence
        self.ReadBusy()

    '''
    function : Turn On Display Fast
    parameter:
    '''
    def TurnOnDisplay_Fast(self):
        self.send_command(0x22) # Display Update Control
        self.send_data(0xC7)    # fast:0x0c, quality:0x0f, 0xcf
        self.send_command(0x20) # Activate Display Update Sequence
        self.ReadBusy()
    
    '''
    function : Turn On Display Part
    parameter:
    '''
    def TurnOnDisplayPart(self):
        self.send_command(0x22) # Display Update Control
        self.send_data(0xff)    # fast:0x0c, quality:0x0f, 0xcf
        self.send_command(0x20) # Activate Display Update Sequence
        self.ReadBusy()
    
    '''
    function : Setting the display window
    parameter:
        Xstart : X-axis starting position
        Ystart : Y-axis starting position
        Xend : End position of X-axis
        Yend : End position of Y-axis
    '''
    def SetWindows(self, Xstart, Ystart, Xend, Yend):
        self.send_command(0x44)                #  SET_RAM_X_ADDRESS_START_END_POSITION
        self.send_data((Xstart >> 3) & 0xFF)
        self.send_data((Xend >> 3) & 0xFF)
        
        self.send_command(0x45)                #  SET_RAM_Y_ADDRESS_START_END_POSITION
        self.send_data(Ystart & 0xFF)
        self.send_data((Ystart >> 8) & 0xFF)
        self.send_data(Yend & 0xFF)
        self.send_data((Yend >> 8) & 0xFF)
        
    '''
    function : Set Cursor
    parameter:
        Xstart : X-axis starting position
        Ystart : Y-axis starting position
    '''
    def SetCursor(self, Xstart, Ystart):
        self.send_command(0x4E)             #  SET_RAM_X_ADDRESS_COUNTER
        self.send_data(Xstart & 0xFF)
        
        self.send_command(0x4F)             #  SET_RAM_Y_ADDRESS_COUNTER
        self.send_data(Ystart & 0xFF)
        self.send_data((Ystart >> 8) & 0xFF)

    '''
    function : Initialize the e-Paper register
    parameter:
    '''
    def init(self):
        print('init')
        self.reset()
        self.delay_ms(100)
        
        self.ReadBusy()
        self.send_command(0x12)  # SWRESET
        self.ReadBusy()
        
        self.send_command(0x01)  # Driver output control 
        self.send_data(0xf9)
        self.send_data(0x00)
        self.send_data(0x00)
        
        self.send_command(0x11)  #data entry mode 
        self.send_data(0x03)
        
        self.SetWindows(0, 0, self.width-1, self.height-1)
        self.SetCursor(0, 0)
        
        self.send_command(0x3C)  # BorderWaveform
        self.send_data(0x05)
        
        self.send_command(0x21) # Display update control
        self.send_data(0x00)
        self.send_data(0x80)
        
        self.send_command(0x18) # Read built-in temperature sensor
        self.send_data(0x80)
        
        self.ReadBusy()
        
    '''
    function : Initialize the e-Paper fast register
    parameter:
    '''
    def init_fast(self):
        print('init_fast')
        self.reset()
        self.delay_ms(100)

        self.send_command(0x12)  #SWRESET
        self.ReadBusy() 

        self.send_command(0x18) # Read built-in temperature sensor
        self.send_command(0x80)

        self.send_command(0x11) # data entry mode       
        self.send_data(0x03)    

        self.SetWindow(0, 0, self.width-1, self.height-1)
        self.SetCursor(0, 0)
        
        self.send_command(0x22) # Load temperature value
        self.send_data(0xB1)
        self.send_command(0x20)
        self.ReadBusy()

        self.send_command(0x1A) # Write to temperature register
        self.send_data(0x64)
        self.send_data(0x00)
                        
        self.send_command(0x22) # Load temperature value
        self.send_data(0x91)
        self.send_command(0x20)
        self.ReadBusy()
        
        return 0
       
    '''
    function : Clear screen
    parameter:
    '''
    def Clear(self):
        self.send_command(0x24)
        self.send_data1([0xff] * self.height * int(self.width / 8))
                
        self.TurnOnDisplay()    
    
    '''
    function : Sends the image buffer in RAM to e-Paper and displays
    parameter:
        image : Image data
    '''
    def display(self, image):
        self.send_command(0x24)
        self.send_data1(image) 
        self.TurnOnDisplay()
    
    def display_fast(self, image):
        self.send_command(0x24)
        self.send_data2(image) 
        self.TurnOnDisplay_Fast()
    
    '''
    function : Refresh a base image
    parameter:
        image : Image data
    '''
    def Display_Base(self, image):
        self.send_command(0x24)
        self.send_data1(image)
                
        self.send_command(0x26)
        self.send_data1(image)
                
        self.TurnOnDisplay()
        
    '''
    function : Sends the image buffer in RAM to e-Paper and partial refresh
    parameter:
        image : Image data
    '''    
    def displayPartial(self, image):
        self.reset()

        self.send_command(0x3C) # BorderWavefrom
        self.send_data(0x80)

        self.send_command(0x01) # Driver output control      
        self.send_data(0xF9) 
        self.send_data(0x00)
        self.send_data(0x00)

        self.send_command(0x11) # data entry mode       
        self.send_data(0x03)

        self.SetWindows(0, 0, self.width-1, self.height-1)
        self.SetCursor(0, 0)
        
        self.send_command(0x24) # WRITE_RAM
        self.send_data1(image)  
        self.TurnOnDisplayPart()
    
    '''
    function : Enter sleep mode
    parameter:
    '''
    def sleep(self):
        self.send_command(0x10) #enter deep sleep
        self.send_data(0x01)
        self.delay_ms(100)
        

class EPD_2in13_V4_Landscape(framebuf.FrameBuffer):
    def __init__(self):
        self.reset_pin = Pin(RST_PIN, Pin.OUT)
        
        self.busy_pin = Pin(BUSY_PIN, Pin.IN, Pin.PULL_UP)
        self.cs_pin = Pin(CS_PIN, Pin.OUT)
        if EPD_WIDTH % 8 == 0:
            self.width = EPD_WIDTH
        else :
            self.width = (EPD_WIDTH // 8) * 8 + 8

        self.height = EPD_HEIGHT
        
        self.spi = SPI(1)
        self.spi.init(baudrate=4000_000)
        self.dc_pin = Pin(DC_PIN, Pin.OUT)

        self.buffer = bytearray(self.height * self.width // 8)
        super().__init__(self.buffer, self.height, self.width, framebuf.MONO_VLSB)
        self.init()

    def digital_write(self, pin, value):
        pin.value(value)

    def digital_read(self, pin):
        return pin.value()

    def delay_ms(self, delaytime):
        utime.sleep(delaytime / 1000.0)

    def spi_writebyte(self, data):
        self.spi.write(bytearray(data))

    def reset(self):
        self.digital_write(self.reset_pin, 1)
        self.delay_ms(20)
        self.digital_write(self.reset_pin, 0)
        self.delay_ms(2)
        self.digital_write(self.reset_pin, 1)
        self.delay_ms(20)   

    def send_command(self, command):
        self.digital_write(self.dc_pin, 0)
        self.digital_write(self.cs_pin, 0)
        self.spi_writebyte([command])
        self.digital_write(self.cs_pin, 1)

    def send_data(self, data):
        self.digital_write(self.dc_pin, 1)
        self.digital_write(self.cs_pin, 0)
        self.spi_writebyte([data])
        self.digital_write(self.cs_pin, 1)
        
    def send_data1(self, buf):
        self.digital_write(self.dc_pin, 1)
        self.digital_write(self.cs_pin, 0)
        self.spi.write(bytearray(buf))
        self.digital_write(self.cs_pin, 1)

    def ReadBusy(self):
        print('busy')
        self.delay_ms(10)
        while(self.digital_read(self.busy_pin) == 1):      # 0: idle, 1: busy
            self.delay_ms(10)    
        print('busy release')

    '''
    function : Turn On Display
    parameter:
    '''
    def TurnOnDisplay(self):
        self.send_command(0x22) # Display Update Control
        self.send_data(0xf7)
        self.send_command(0x20) # Activate Display Update Sequence
        self.ReadBusy()

    '''
    function : Turn On Display Fast
    parameter:
    '''
    def TurnOnDisplay_Fast(self):
        self.send_command(0x22) # Display Update Control
        self.send_data(0xC7)    # fast:0x0c, quality:0x0f, 0xcf
        self.send_command(0x20) # Activate Display Update Sequence
        self.ReadBusy()
    
    '''
    function : Turn On Display Part
    parameter:
    '''
    def TurnOnDisplayPart(self):
        self.send_command(0x22) # Display Update Control
        self.send_data(0xff)    # fast:0x0c, quality:0x0f, 0xcf
        self.send_command(0x20) # Activate Display Update Sequence
        self.ReadBusy()
    
    '''
    function : Setting the display window
    parameter:
        Xstart : X-axis starting position
        Ystart : Y-axis starting position
        Xend : End position of X-axis
        Yend : End position of Y-axis
    '''
    def SetWindows(self, Xstart, Ystart, Xend, Yend):
        self.send_command(0x44)                #  SET_RAM_X_ADDRESS_START_END_POSITION
        self.send_data((Xstart >> 3) & 0xFF)
        self.send_data((Xend >> 3) & 0xFF)
        
        self.send_command(0x45)                #  SET_RAM_Y_ADDRESS_START_END_POSITION
        self.send_data(Ystart & 0xFF)
        self.send_data((Ystart >> 8) & 0xFF)
        self.send_data(Yend & 0xFF)
        self.send_data((Yend >> 8) & 0xFF)
        
    '''
    function : Set Cursor
    parameter:
        Xstart : X-axis starting position
        Ystart : Y-axis starting position
    '''
    def SetCursor(self, Xstart, Ystart):
        self.send_command(0x4E)             #  SET_RAM_X_ADDRESS_COUNTER
        self.send_data(Xstart & 0xFF)
        
        self.send_command(0x4F)             #  SET_RAM_Y_ADDRESS_COUNTER
        self.send_data(Ystart & 0xFF)
        self.send_data((Ystart >> 8) & 0xFF)

    '''
    function : Initialize the e-Paper register
    parameter:
    '''
    def init(self):
        print('init')
        self.reset()
        self.delay_ms(100)
        
        self.ReadBusy()
        self.send_command(0x12)  # SWRESET
        self.ReadBusy()
        
        self.send_command(0x01)  # Driver output control 
        self.send_data(0xf9)
        self.send_data(0x00)
        self.send_data(0x00)
        
        self.send_command(0x11)  #data entry mode 
        self.send_data(0x07)
        
        self.SetWindows(0, 0, self.width-1, self.height-1)
        self.SetCursor(0, 0)
        
        self.send_command(0x3C)  # BorderWaveform
        self.send_data(0x05)
        
        self.send_command(0x21) # Display update control
        self.send_data(0x00)
        self.send_data(0x80)
        
        self.send_command(0x18) # Read built-in temperature sensor
        self.send_data(0x80)
        
        self.ReadBusy()
        
    '''
    function : Initialize the e-Paper fast register
    parameter:
    '''
    def init_fast(self):
        print('init_fast')
        self.reset()
        self.delay_ms(100)

        self.send_command(0x12)  #SWRESET
        self.ReadBusy() 

        self.send_command(0x18) # Read built-in temperature sensor
        self.send_command(0x80)

        self.send_command(0x11) # data entry mode       
        self.send_data(0x07)    

        self.SetWindow(0, 0, self.width-1, self.height-1)
        self.SetCursor(0, 0)
        
        self.send_command(0x22) # Load temperature value
        self.send_data(0xB1)
        self.send_command(0x20)
        self.ReadBusy()

        self.send_command(0x1A) # Write to temperature register
        self.send_data(0x64)
        self.send_data(0x00)
                        
        self.send_command(0x22) # Load temperature value
        self.send_data(0x91)
        self.send_command(0x20)
        self.ReadBusy()
        
        return 0
       
    '''
    function : Clear screen
    parameter:
    '''
    def Clear(self):
        self.send_command(0x24)
        self.send_data1([0xff] * self.height * int(self.width / 8))
                
        self.TurnOnDisplay()    
    
    '''
    function : Sends the image buffer in RAM to e-Paper and displays
    parameter:
        image : Image data
    '''
    def display(self, image):
        self.send_command(0x24)
        for j in range(int(self.width / 8) - 1, -1, -1):
            for i in range(0, self.height):
                self.send_data(image[i + j * self.height])
        self.TurnOnDisplay()
    
    def display_fast(self, image):
        self.send_command(0x24)
        for j in range(int(self.width / 8) - 1, -1, -1):
            for i in range(0, self.height):
                self.send_data(image[i + j * self.height])
        self.TurnOnDisplay_Fast()
    
    '''
    function : Refresh a base image
    parameter:
        image : Image data
    '''
    def Display_Base(self, image):
        self.send_command(0x24)
        for j in range(int(self.width / 8) - 1, -1, -1):
            for i in range(0, self.height):
                self.send_data(image[i + j * self.height])
                
        self.send_command(0x26)
        for j in range(int(self.width / 8) - 1, -1, -1):
            for i in range(0, self.height):
                self.send_data(image[i + j * self.height])
                
        self.TurnOnDisplay()
        
    '''
    function : Sends the image buffer in RAM to e-Paper and partial refresh
    parameter:
        image : Image data
    '''    
    def displayPartial(self, image):
        self.reset()

        self.send_command(0x3C) # BorderWavefrom
        self.send_data(0x80)

        self.send_command(0x01) # Driver output control      
        self.send_data(0xF9) 
        self.send_data(0x00)
        self.send_data(0x00)

        self.send_command(0x11) # data entry mode       
        self.send_data(0x07)

        self.SetWindows(0, 0, self.width-1, self.height-1)
        self.SetCursor(0, 0)
        
        self.send_command(0x24) # WRITE_RAM
        for j in range(int(self.width / 8) - 1, -1, -1):
            for i in range(0, self.height):
                self.send_data(image[i + j * self.height])
        self.TurnOnDisplayPart()
    
    '''
    function : Enter sleep mode
    parameter:
    '''
    def sleep(self):
        self.send_command(0x10) #enter deep sleep
        self.send_data(0x01)
        self.delay_ms(100)
        
        
if __name__=='__main__':
    epd = EPD_2in13_V4_Landscape()
    epd.Clear()
    
    epd.fill(0xff)
    epd.text("Waveshare", 0, 10, 0x00)
    epd.text("ePaper-2.13_V4", 0, 20, 0x00)
    epd.text("Raspberry Pico", 0, 30, 0x00)
    epd.text("Hello World", 0, 40, 0x00)
    epd.display(epd.buffer)
    epd.delay_ms(2000)
    
    epd.vline(5, 55, 60, 0x00)
    epd.vline(100, 55, 60, 0x00)
    epd.hline(5, 55, 95, 0x00)
    epd.hline(5, 115, 95, 0x00)
    epd.line(5, 55, 100, 115, 0x00)
    epd.line(100, 55, 5, 115, 0x00)
    epd.display(epd.buffer)
    epd.delay_ms(2000)
    
    epd.rect(130, 10, 40, 80, 0x00)
    epd.fill_rect(190, 10, 40, 80, 0x00)
    epd.Display_Base(epd.buffer)
    epd.delay_ms(2000)
    
    epd.init()
    for i in range(0, 10):
        epd.fill_rect(175, 105, 10, 10, 0xff)
        epd.text(str(i), 177, 106, 0x00)
        epd.displayPartial(epd.buffer)
        
    print("sleep")
    epd.init()
    epd.Clear()
    epd.delay_ms(2000)
    epd.sleep()
    
    
    
    epd = EPD_2in13_V4_Portrait()
    epd.Clear()
    
    epd.fill(0xff)
    epd.text("Waveshare", 0, 10, 0x00)
    epd.text("ePaper-2.13_V4", 0, 30, 0x00)
    epd.text("Raspberry Pico", 0, 50, 0x00)
    epd.text("Hello World", 0, 70, 0x00)
    epd.display(epd.buffer)
    epd.delay_ms(2000)
    
    epd.vline(10, 90, 60, 0x00)
    epd.vline(90, 90, 60, 0x00)
    epd.hline(10, 90, 80, 0x00)
    epd.hline(10, 150, 80, 0x00)
    epd.line(10, 90, 90, 150, 0x00)
    epd.line(90, 90, 10, 150, 0x00)
    epd.display(epd.buffer)
    epd.delay_ms(2000)
    
    epd.rect(10, 180, 50, 40, 0x00)
    epd.fill_rect(60, 180, 50, 40, 0x00)
    epd.Display_Base(epd.buffer)
    epd.delay_ms(2000)
    
    epd.init()
    for i in range(0, 10):
        epd.fill_rect(40, 230, 40, 10, 0xff)
        epd.text(str(i), 60, 230, 0x00)
        epd.displayPartial(epd.buffer)
        
    print("sleep")
    epd.init()
    epd.Clear()
    epd.delay_ms(2000)
    epd.sleep()

サンプルコード解説

先ほどのサンプルコード内でif name=='main':より前の部分は、各機能が関数として定義されているので触る必要がありません。

これらの関数を使用し、描画したい処理内容をmain文の中に記述していくことでディスプレイの表示を変更することができます。

main文のコードに日本語を追加したものを作成しましたので、コメントの処理内容を参考に実装してみてください。

if __name__=='__main__':
    # 電子ペーパーのインスタンスを横向きモードで初期化
    epd = EPD_2in13_V4_Landscape()
    epd.Clear()  # 画面をクリアする
    
    # 白色で画面を塗りつぶし後、テキストを表示
    epd.fill(0xff)
    epd.text("Waveshare", 0, 10, 0x00)  # "Waveshare"テキストを表示
    epd.text("ePaper-2.13_V4", 0, 20, 0x00)  # モジュール名を表示
    epd.text("Raspberry Pico", 0, 30, 0x00)  # "Raspberry Pico"テキストを表示
    epd.text("Hello World", 0, 40, 0x00)  # "Hello World"テキストを表示
    epd.display(epd.buffer)  # 画面を更新して表示
    epd.delay_ms(2000)  # 2秒間待機

    # 線を描画して形を作成
    epd.vline(5, 55, 60, 0x00)  # 垂直線を描画
    epd.vline(100, 55, 60, 0x00)  # 別の垂直線を描画
    epd.hline(5, 55, 95, 0x00)  # 水平線を描画
    epd.hline(5, 115, 95, 0x00)  # 別の水平線を描画
    epd.line(5, 55, 100, 115, 0x00)  # 斜め線を描画
    epd.line(100, 55, 5, 115, 0x00)  # 別の斜め線を描画
    epd.display(epd.buffer)  # 画面を更新して表示
    epd.delay_ms(2000)  # 2秒間待機

    # 四角形と塗りつぶされた四角形を描画
    epd.rect(130, 10, 40, 80, 0x00)  # 枠線のみの四角形を描画
    epd.fill_rect(190, 10, 40, 80, 0x00)  # 内部を塗りつぶした四角形を描画
    epd.Display_Base(epd.buffer)  # ベースイメージとして設定して画面を更新
    epd.delay_ms(2000)  # 2秒間待機

    # ディスプレイを再初期化し、部分的に画面を更新
    epd.init()  # ディスプレイを初期化
    for i in range(0, 10):
        epd.fill_rect(175, 105, 10, 10, 0xff)  # 白色で四角形を塗りつぶし
        epd.text(str(i), 177, 106, 0x00)  # カウンタの値をテキストで表示
        epd.displayPartial(epd.buffer)  # 部分的に画面を更新

    print("sleep")  # コンソールにスリープモードへの移行を表示
    epd.init()  # ディスプレイを再初期化
    epd.Clear()  # 画面をクリア
    epd.delay_ms(2000)  # 2秒間待機
    epd.sleep()  # スリープモードに移行

    # 縦向きモードでのディスプレイ処理を開始
    epd = EPD_2in13_V4_Portrait()  # 縦向きモードでインスタンスを初期化
    epd.Clear()  # 画面をクリア

    # 白色で画面を塗りつぶし後、テキストを表示
    epd.fill(0xff)  # 画面を白色で塗りつぶし
    epd.text("Waveshare", 0, 10, 0x00)  # テキストを表示
    epd.text("ePaper-2.13_V4", 0, 30, 0x00)  # モジュール名を表示
    epd.text("Raspberry Pico", 0, 50, 0x00)  # "Raspberry Pico"テキストを表示
    epd.text("Hello World", 0, 70, 0x00)  # "Hello World"テキストを表示
    epd.display(epd.buffer)  # 画面を更新して表示
    epd.delay_ms(2000)  # 2秒間待機

    # 線を描画して形を作成
    epd.vline(10, 90, 60, 0x00)  # 垂直線を描画
    epd.vline(90, 90, 60, 0x00)  # 別の垂直線を描画
    epd.hline(10, 90, 80, 0x00)  # 水平線を描画
    epd.hline(10, 150, 80, 0x00)  # 別の水平線を描画
    epd.line(10, 90, 90, 150, 0x00)  # 斜め線を描画
    epd.line(90, 90, 10, 150, 0x00)  # 別の斜め線を描画
    epd.display(epd.buffer)  # 画面を更新して表示
    epd.delay_ms(2000)  # 2秒間待機

    # 四角形と塗りつぶされた四角形を描画
    epd.rect(10, 180, 50, 40, 0x00)  # 枠線のみの四角形を描画
    epd.fill_rect(60, 180, 50, 40, 0x00)  # 内部を塗りつぶした四角形を描画
    epd.Display_Base(epd.buffer)  # ベースイメージとして設定して画面を更新
    epd.delay_ms(2000)  # 2秒間待機

    # 部分的に画面を更新 (縦向きモード)
    epd.init()  # ディスプレイを初期化
    for i in range(0, 10):
        epd.fill_rect(40, 230, 40, 10, 0xff)  # 白色で四角形を塗りつぶし
        epd.text(str(i), 60, 230, 0x00)  # カウンタの値をテキストで表示
        epd.displayPartial(epd.buffer)  # 部分的に画面を更新

    print("sleep")  # コンソールにスリープモードへの移行を表示
    epd.init()  # ディスプレイを再初期化
    epd.Clear()  # 画面をクリア
    epd.delay_ms(2000)  # 2秒間待機
    epd.sleep()  # スリープモードに移行

まとめ

今回はWAVESHAREから発売されている電子ペーパーPico e-Paper 2.13のサンプル子コードについて解説しました。

このコードをベースにして、色々な機能を実装してみてください。

それでは、また次の記事でお会いしましょう。

参考

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次