ESP32のMicroPythonでディスプレイモジュールを使う方法
この記事では、ESP32とMicroPythonを使ってディスプレイモジュールに文字、図形を表示する方法を解説します。
この記事で学べること
- ESP32とディスプレイモジュールの接続方法
- MicroPythonのコード例
- ディスプレイの表示方法
ステップごとの解説
- 必要な部品を準備する
今回も前回、MicroPythonをインストールしたM5STACK社のM5StampS3を使います。
M5StampS3は、Amazon、スイッチサイエンス社、マルツエレック社などで購入することができます。 - M5StampS3にMicroPythonをインストールする
前回の記事を参考にMicroPythonをインストールします。 - ディスプレイモジュールを準備する
今回はディスプレイモジュールとして、有機LED(OLED)を用いたI2C制御の128×64グラフィックディスプレイモジュールを使います。モジュールで使われている制御チップSSD1306はArduinoやRaspberryPi等でライブラリが多くある定番ICです。MicroPythonのライブラリもあるので、今回はライブラリを使います。SSD1306のインタフェースはI2Cを実装しているので、M5StampS3とはI2Cインタフェース接続となります。SSD1306のデータシートはここにあります。

- M5StampS3のI2Cインタフェース
M5StampS3のI2CインタフェースであるSDAとSCLは下図をみると、GPIO13がSDA、GPIO15がSCLであることがわかります。

- M5StampS3とディスプレイモジュールとの接続
ディスプレイモジュールのSDAとM5StampS3のSDA(GPIO13)、ディスプレイモジュールのSCLとM5StampS3のSCL(GPIO15)を接続します。

- ディスプレイモジュールとM5StampS3をブレッドボード上で接続する
下表と写真を参考に接続します。
ジャンパーワイヤは、秋月電子やAmazonで入手できます。
|
部品 3246_ddd341-16> |
ピン 3246_4a7c12-34> |
ブレッドボードマトリックス番号 3246_9c9923-58> |
|
M5StampS3 3246_1610d2-1d> |
G1 3246_c70cab-09> |
22 – I 3246_b11b7c-10> |
| 3246_4aa025-45> |
G3 3246_b741c8-8a> |
23 – I 3246_5b02b2-3f> |
| 3246_1d46de-c6> |
G5 3246_86073d-68> |
24 – I 3246_38623b-02> |
| 3246_91041c-d4> |
G7 3246_bab98e-9b> |
25 – I 3246_6864a3-ba> |
| 3246_51448b-2e> |
G9 3246_6bdd02-48> |
26 – I 3246_d2ff2f-59> |
| 3246_7868a9-61> |
GND 3246_c84468-21> |
27 – I 3246_2891d6-06> |
| 3246_7f80e8-ee> |
5V 3246_374faf-ca> |
28 – I 3246_29a322-c5> |
| 3246_3f9e8a-6f> |
G13 3246_d92998-d3> |
29 – I 3246_c56c5f-2d> |
| 3246_4a7cec-c3> |
G15 3246_e8fe76-0c> |
30 – I 3246_e1ad23-f4> |
| 3246_2b6d21-df> |
3V3 3246_d94d07-f2> |
25 – E 3246_33fe4a-de> |
| 3246_eb6b84-1c> |
G43 3246_ffa835-22> |
26 – E 3246_bc63af-f5> |
| 3246_8d5eb4-87> |
G44 3246_6a1573-fe> |
27 – E 3246_c0bd81-4f> |
| 3246_ede67f-8c> |
EN 3246_9c9acc-04> |
28 – E 3246_4ea775-1d> |
| 3246_d41452-87> |
G0 3246_61c251-76> |
29 – E 3246_695464-e0> |
| 3246_8d64fa-42> |
GND 3246_d606f1-31> |
30 – E 3246_94be0e-01> |
|
ディスプレイモジュール 3246_cf7f19-16> |
GND 3246_800ec1-d9> |
10 – H 3246_9e3231-f5> |
| 3246_054de7-3a> |
VCC 3246_d2ad37-ef> |
9 – H 3246_c1be61-e2> |
| 3246_dc0495-70> |
SCL 3246_0f8ddd-b2> |
8 – H 3246_61fe8f-35> |
| 3246_cae240-bf> |
SDA 3246_419c7f-60> |
7 – H 3246_a17a41-9f> |
|
ジャンパーワイヤ 3246_3984db-93> |
ブレッドボードマトリックス番号 3246_b8dad8-3a> |
|
ジャンパーワイヤ1 3246_901e34-c4> |
28 – L === 5V 3246_ec18fa-1d> |
|
ジャンパーワイヤ2 3246_35c9ff-37> |
27 – L === GND 3246_dd0f72-86> |
|
ジャンパーワイヤ3 3246_11f83d-49> |
30 – J === 8 – J 3246_3762a9-c3> |
|
ジャンパーワイヤ4 3246_efaf62-98> |
29 – K === 7 – K 3246_6b6d1a-fc> |
|
ジャンパーワイヤ5 3246_e9befa-5e> |
9 – L === 5V 3246_f4f887-1a> |
|
ジャンパーワイヤ6 3246_c190cd-db> |
10 – L === GND 3246_6c5408-f4> |

- M5StampS3をPCに接続する
M5StampS3とPCをUSBケーブルで接続します。接続できているか確認します。
ls -l /dev/tty.usbmodem*
crw-rw-rw- 1 root wheel 0x9000006 8 24 16:37 /dev/tty.usbmodem11401
- VSCodeで以前、作ったプロジェクトを選択する
VSCodeを起動して、以前、作ったプロジェクトを選択します。

- エディタで新しいファイルを作成する
左側のエクスプローラにて右クリックして、「新しいファイル」を選択します。ファイル名を入力する欄が表示されるので、適当に名前を入力します。今回は、「display.py」としました。

- ディスプレイモジュールのドライバをインストールする
ディスプレイモジュール(SSD1306)には簡単に使えるようにドライバが公開されているので、インストールします。
モジュールはここにあるので、ssd1306.pyをダウンロードします。
ダウンロードしたら、ssd1306.pyをプロジェクトフォルダに保存します。保存したら、ssd1306.pyを選択して、右クリックから、「Upload file to Pico」をクリックすると、ssd1306.pyがM5StampS3内に保存されます。

- 下記コードをエディターで記入する
「display.py」を選択すると、エディター画面が開くので、下記コードを記入して保存します。
from machine import Pin, I2C
import ssd1306
# using default address 0x3C
i2c = I2C(sda=Pin(13), scl=Pin(15))
display = ssd1306.SSD1306_I2C(128, 64, i2c)
display.text('Hello, World!', 0, 0, 1)
display.show()
- 「display.py」を実行する
左のエクスプローラにて、「display.py」を選択して、右クリックから、「Run current file on Pico」をクリックすると、ディスプレイモジュールに、「Hello, World!』が表示されます。

- SSD1306の基本関数
基本関数は以下のとおりです。
display.poweroff() # ディスプレイの電源オフ、ピクセルはメモリに残存
display.poweron() # ディスプレイの電源オン、ピクセルを再描画
display.contrast(0) # 暗くする
display.contrast(255) # 明るくする
display.invert(1) # 反転
display.invert(0) # 通常表示
display.rotate(True) # 180度回転
display.rotate(False) # 0度回転
display.show() # FrameBuffer の内容をディスプレイメモリに書き出す
display.fill(0) # スクリーン全体を colour=0 で埋める
display.pixel(0, 10) # x=0, y=10 のピクセルを取得
display.pixel(0, 10, 1) # x=0, y=10 のピクセルに colour=1 を設定
display.hline(0, 8, 4, 1) # x=0, y=8, width=4, colour=1 で水平線を描画
display.vline(0, 8, 4, 1) # x=0, y=8, height=4, colour=1 で垂直線を描画
display.line(0, 0, 127, 63, 1) # 0,0 から 127,63 に線を描画
display.rect(10, 10, 107, 43, 1) # 10,10 と 117,53 の間、colour=1 で長方形を描画
display.fill_rect(10, 10, 107, 43, 1) # 10,10 と 117,53 の間、colour=1 で塗り潰した長方形を描画
display.text('Hello World', 0, 0, 1) # x=0, y=0, colour=1 でテキストを描画
display.scroll(20, 0) # 20 ピクセルだけ右にスクロール
- 描画の方法
MicroPython のロゴを描画し、テキストを印字します。
from machine import Pin, I2C
import ssd1306
# using default address 0x3C
i2c = I2C(sda=Pin(13), scl=Pin(15))
display = ssd1306.SSD1306_I2C(128, 64, i2c)
display.fill(0)
display.fill_rect(0, 0, 32, 32, 1)
display.fill_rect(2, 2, 28, 28, 0)
display.vline(9, 8, 22, 1)
display.vline(16, 2, 22, 1)
display.vline(23, 8, 22, 1)
display.fill_rect(26, 24, 2, 4, 1)
display.text('MicroPython', 40, 0, 1)
display.text('SSD1306', 40, 12, 1)
display.text('OLED 128x64', 40, 24, 1)
display.show()

まとめ
ESP32とMicroPythonを使えば、シンプルなコードでディスプレイに表示をすることができます。応用すればIoTデバイスに簡単に組み込めます。
