📺

ラズパイを使って、OLED表示デバイスに文字列や画像を表示するよ

2021/05/23に公開

💡やること

SSD1306表示デバイスを使って、いろいろ表示させます。

🏁デモ

🔧パーツ一覧

no 部品名 個数 備考
1 ラズベリーパイ 1 今回は4Bで確認
2 128x64ドット有機ELディスプレイ 1 秋月電子
3 ジャンパー線 適量 -
4 ブレッドボード 1 -

接続図

💻環境

開発環境

  • ラズベリーパイ
    • Linux rpi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux
  • Python
    • Python 3.7.3 (default, Jan 22 2021, 20:04:44)

ラズベリーパイの設定

本デバイスは、I2C通信を使って制御します。
I2C通信を使用できるように設定する必要があります。
I2Cの有効化は、以下のコマンドから実施できます。

$ sudo raspi-config
  • Interface Optionsを選択
  • I2Cを選択
  • "はい"(or "Yes")を選択
  • これで有効化されます(1回行えばOKです)

モジュールのインストール

apt

日本語を表示するためにフォントをインストールします。

$ sudo apt-get install fonts-ipafont

pip

Pythonに関するモジュールをインストールします。

$ python3 -m venv env
$ source env/bin/activate
(env) $ pip install adafruit-circuitpython-ssd1306
(env) $ pip install smbus2
(env) $ pip install pillow

📝手順

下記を表示します。

  • コード1 : "Hello World"を表示
  • コード2 : "日本語"を表示
  • コード3 : 画像を表示
    • 使用する画像は、graphとなります

接続されているかを確認

i2cdetectコマンドを使って、表示デバイスが接続されている確認します。

(env) $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

"3c"が、表示デバイスのデバイスアドレスとなります。

コード - 1 : "Hello World"を表示

ssd1306_text.py
import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
from time import sleep

# SSD1306のピン設定
DEVICE_ADR = 0x3C
DISP_WIDTH = 128
DISP_HEIGHT = 64

def main():

    # Setting some variables for our reset pin etc.
    RESET_PIN = digitalio.DigitalInOut(board.D4)

    # Very important... This lets py-gaugette 'know' what pins to use in order to reset the display
    i2c = board.I2C()
    oled = adafruit_ssd1306.SSD1306_I2C(DISP_WIDTH, DISP_HEIGHT, i2c, addr=DEVICE_ADR, reset=RESET_PIN)

    # Clear display.
    oled.fill(0)
    oled.show()

    # Create blank image for drawing.
    image = Image.new("1", (oled.width, oled.height))
    draw = ImageDraw.Draw(image)

    # Load a font in 2 different sizes.
    font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 28)
    font2 = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 14)

    # Draw the text
    draw.text((0, 0), "Hello!", font=font, fill=255)
    draw.text((0, 30), "Hello!", font=font2, fill=255)
    draw.text((34, 46), "Hello!", font=font2, fill=255)

    # Display image
    oled.image(image)
    oled.show()
    
    sleep(5)

    # Clear display.
    oled.fill(0)
    oled.show()
    
    return

if __name__ == "__main__":
    main()

実行手順 - 1

(env) $ python ssd1306_text.py

コード - 2 : "日本語"を表示

ssd1306_nihongo.py
import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
from time import sleep

# SSD1306のピン設定
DEVICE_ADR = 0x3C
DISP_WIDTH = 128
DISP_HEIGHT = 64

def main():

    # Setting some variables for our reset pin etc.
    RESET_PIN = digitalio.DigitalInOut(board.D4)

    # Very important... This lets py-gaugette 'know' what pins to use in order to reset the display
    i2c = board.I2C()
    oled = adafruit_ssd1306.SSD1306_I2C(DISP_WIDTH, DISP_HEIGHT, i2c, addr=DEVICE_ADR, reset=RESET_PIN)

    # Clear display.
    oled.fill(0)
    oled.show()

    # Create blank image for drawing.
    image = Image.new("1", (oled.width, oled.height))
    draw = ImageDraw.Draw(image)

    # Load a font in 2 different sizes.
    font = ImageFont.truetype("/usr/share/fonts/truetype/fonts-japanese-gothic.ttf", 28)
    font2 = ImageFont.truetype("/usr/share/fonts/truetype/fonts-japanese-gothic.ttf", 14)

    # Draw the text
    draw.text((0, 0), "日本語!", font=font, fill=255)
    draw.text((0, 30), "Hello!", font=font2, fill=255)
    draw.text((34, 46), "Hello!", font=font2, fill=255)

    # Display image
    oled.image(image)
    oled.show()
    
    sleep(5)

    # Clear display.
    oled.fill(0)
    oled.show()

    return

if __name__ == "__main__":
    main()

実行手順 - 2

(env) $ python ssd1306_nihongo.py

コード3 : 画像を表示

ssd1306_img.py
import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
from time import sleep

# SSD1306のピン設定
DEVICE_ADR = 0x3C
DISP_WIDTH = 128
DISP_HEIGHT = 64

def main():

    # Setting some variables for our reset pin etc.
    RESET_PIN = digitalio.DigitalInOut(board.D4)

    # Very important... This lets py-gaugette 'know' what pins to use in order to reset the display
    i2c = board.I2C()
    oled = adafruit_ssd1306.SSD1306_I2C(DISP_WIDTH, DISP_HEIGHT, i2c, addr=DEVICE_ADR, reset=RESET_PIN)

    # Clear display.
    oled.fill(0)
    oled.show()

    # Create blank image for drawing.
    image = Image.open("graph.png")
    draw = ImageDraw.Draw(image)

    # Display image
    oled.image(image)
    oled.show()
    
    sleep(5)

    # Clear display.
    oled.fill(0)
    oled.show()
    return

if __name__ == "__main__":
    main()

実行手順 - 3

(env) $ python ssd1306_img.py

デモの結果になります。

🔎ポイント

画像を作成して描画

コード上で使用しているPillowモジュールはサードパーティ製の画像処理モジュールです。
今回のコードでは、文字列であっても一旦画像にしています(Pillowを使用)。
oled.image()へ128x64 のモノクロ画像を渡しています。

さいごに

この記事も含め、ラズパイの活用方法を

https://zenn.dev/kotaproj/books/raspberrypi-tips

としてまとめ中です。

GitHubで編集を提案

Discussion