Pico PR

【直結でOK】RaspberryPi Pico MicroPythonでLCDを使う方法 【I2C・SSD1306】

RaspberryPi PicoでLCDを使う方法の記事のアイキャッチ
記事内に商品プロモーションを含む場合があります

はじめに

RaspberryPi PicoでLCD(液晶ディスプレイ)を使う方法を解説します。言語はMicroPython、ディスプレイはI2Cで接続できる「Aideepen社 0.97インチのOLED(有機EL)ディスプレイ SSD1306対応品」を使用します。

液晶ディスプレイについてですが、最近では電卓のような「液晶」よりも、小型・低価格な「有機EL型」を使う方が主流のようです(テレビと同じですね)。

そのため、今回は最近主流となっている「有機EL型ディスプレイ」をPicoで使う方法について解説したいと思います。ライブラリが使えてプログラムも簡単なので、参考にしていただけたらうれしいです。

環境

この記事は以下の環境で作成しています。

環境 バージョン 備考
開発用PCのOS Windows11 Windows10でもOKです
開発環境 Thonny 4.1.4
ライブラリ ssd1306 0.1.0 MITライセンス
ボード RaspberryPi Pico
ディスプレイ Aideepen 0.97OLED ディスプレイ

※ Picoのセットアップ方法については、こちらの記事をご覧ください。

Aideepen 0.97インチのOLED(有機EL)ディスプレイ SSD1306対応品

今回使用する有機EL(OLED)ディスプレイを、ざっくりと紹介します。

特徴

RaspberryPi Picoと直結で使える、小型のI2C・SPI通信対応のディスプレイです。「SSD1306」というライブラリを使って、簡単にプログラミングすることが出来ます。価格も2個で1000円の超低価格、納期も2022年のGW直前発注~2日後到着の短納期でした。

  • 小型・低価格・短納期
  • 配線4本を直結でつなげるだけ
  • SSD1306でプログラミングが簡単

UnBox

購入開封時の外観です。後述のAmazonのリンクから購入しています。

以外にも(?)きれいな化粧箱で、パッケージもきちんとされていました。ピンヘッダは同梱ですが、半田付け(4か所)が必要です。

ディスプレイを開封した時の画像

Picoとディスプレイの接続

Picoとディスプレイの接続方法です。配線4本を直結で接続します。

Picoとディスプレイの配線方法を説明する画像
PicoとOLEDディスプレイを接続する方法をイラストで分かりやすく解説
ピン番号 内容 備考
36 3V3(OUT) 電源(3.3V)
23 GND グラウンド
22 GP17 I2C SCL
21 GP16 I2C SDA

Picoピンアサイン(Pin-Out)

RaspberryPi Picoのピンアサイン(pinout)の画像

Pico公式サイトより引用

使用する部品

今回記事では以下の部品を使用します。

OLEDディスプレイ

冒頭でも紹介した、I2C・SPIで使えるディスプレイです。Aideepen社のものは品切れとなったため、リンクは同一仕様のDiyStudioの物を掲載しています。

ジャンパワイヤ(セット)

固いジャンパワイヤがセットになったキットです。やわらかい配線よりスッキリした回路が作れます。

ジャンパワイヤ(自作用)

キットだと丁度いい長さがない、色がない。という方は以下の配線で自作できます。ジャンパワイヤとほぼ同じ固さの配線なので、切って曲げるだけで理想のジャンパワイヤが作れます。

ブレッドボード

国内サンハヤト製のブレッドボードです。少々堅めの指し心地ですが、海外製と違ってピン穴の番号がすべて印刷されており、品質も高いのでおすすめです。

プログラムの概要

プログラムの概要は以下の通りです。ディスプレイにテキスト・線・四角形を表示します。

  • I2Cの設定
  • ディスプレイ(SSD1306)の設定
  • テキストを表示
  • 縦・横・斜め線を表示
  • 四角形を表示(塗りつぶし有/無)
  • 色(ネガポジ)を反転表示

実行結果

後述する配線を行って、プログラムを実行すると、以下のようにディスプレイを表示することができます。

配線とプログラムをした後の実行結果

ライブラリのインストール

コードを書く前に「SSD1306」ライブラリをインストールします。手順は以下の通りです。

manage packages画面を開く

Thonnyの「ツール」メニューから「パッケージの管理」をクリックします。

Thonnyでパッケージの管理画面を開く方法を画像で解説。
パッケージの管理を選択

ssd1306を検索する

manage packages 画面の検索ボックスで「ssd1306」と入力して、「micropython-lib/PyPlで検索」ボタンを押します。

ssd1306のパッケージの検索方法を画像で解説
ssd1306を検索

画面上に「ssd1306」が表示されるので、クリックします。

検索されたssd1306の選択方法を画像で解説
ssd1306を選択

ssd1306をインストールする

検索結果をクリックすると、以下の「ssd1306」が表示されるので、「インストール」ボタンをクリックします。

ssd1306のインストール方法を画像で説明
ssd1306のインストール

以下の内容が表示されれば、「ssd1306ライブラリ」のインストールは完了です。「閉じる」ボタンを押して、元の画面に戻ります。

ssd1306のインストール完了を確認する方法を画像で解説
インストールの完了

全体コード

プログラムの全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。公式のリファレンスも併せてご覧ください。

from machine import Pin, I2C
import ssd1306

#
# I2Cの設定です。
# 識別するID(0), SDA(16), SCL(17)を設定します
#
i2c = I2C(0, sda=Pin(16), scl=Pin(17) )

#
# デバイスのアドレスを取得します
# 0x30(60)でない場合はライブラリの修正が必要です。
#
addr = i2c.scan()
print( "address is :" + str(addr) )

#
# ディスプレイを設定します
# 使用するディスプレイの縦・横のサイズ、I2Cの変数を渡します
#
display = ssd1306.SSD1306_I2C(128, 64, i2c)

# テキスト表示を設定します
display.text('Display Test', 0, 0, 1)

# 横線を設定します
display.hline(10, 10, 20, 1)

# 縦線を設定します
display.vline(10, 10, 20, 1)

# 斜め線を設定します
display.line(10, 10, 30, 30, 1)

# 四角系を設定します(塗りつぶしなし)
display.rect(10, 40, 10, 10, 1)

# 四角形を設定します(塗りつぶしあり) 
display.fill_rect(30, 40, 10, 10, 1)

# 明暗の反転を設定します
#display.invert(1) 

# 設定した内容をディスプレイに表示します
display.show()

コードのポイント

I2Cの設定とスキャン

I2C通信用の変数に、「識別用のID」「使用するSDA・SCLのピン番号」を指定します。

ピンアサインの図上の「GP〇〇」の数字を指定してください。

デバイスのアドレスをスキャンして「0x30(60)でない場合」はライブラリの修正が必要なようです。

i2c = I2C(0, sda=Pin(16), scl=Pin(17) )

addr = i2c.scan()
print( "address is :" + str(addr) )

ディスプレイの設定

ディスプレイ用の変数を作成します。引数にはディスプレイの縦・横の大きさと、前述したI2Cの変数を渡します。

display = ssd1306.SSD1306_I2C(128, 64, i2c)

横線・縦線の設定

「横線」「縦線」を設定します。引数の内容は2つの関数で同一です。

hline( X軸の開始位置Y軸の開始位置線の長さ色の指定)

# 横線を設定します
display.hline(10, 10, 20, 1)

# 縦線を設定します
display.vline(10, 10, 20, 1)

※ 紹介しているAideepenのディスプレイでは、色の指定は無視されます。

斜め線の設定

座標指定できるline関数を使って「斜め線」を設定します。引数の内容は以下の通りです。

line(Y軸の開始位置Y軸の開始位置X軸の終了位置Y軸の終了位置色の指定)

# 斜め線を設定します
display.line(10, 10, 30, 30, 1)

四角形の設定(塗りつぶし有/無 )

塗りつぶし有/無しで、以下2つの関数を使い分けます。

  • 塗りつぶしなしの四角形 rect関数
  • 塗りつぶしありの四角形 fill_rect関数

引数の内容は2つの関数で同一です。3,4番目の引数は「X/Y軸方向の線の長さ」なので、注意が必要です。

rect(X軸の開始位置,Y軸の開始位置,X軸の線の長さ,Y軸の線の長さ,色の指定)

# 四角系を設定します(塗りつぶしなし)
display.rect(10, 40, 10, 10, 1)

# 四角形を設定します(塗りつぶしあり) 
display.fill_rect(30, 40, 10, 10, 1)

明暗の反転設定

表示上の明暗(ネガポジ)の反転には、invert関数を使います。デフォルト(0) は「黒背景に白文字」、反転(1)指定で「白背景に黒文字」となります。

# 明暗を判定します
#display.invert(1) 

明暗の反転を実行したときの画像

公式リファレンスには、表示方向を180回転させる「rotate関数」の記載がありますが、私の環境では実行時に構文エラー(存在していない関数)となってしまい、使用できませんでした。

表示の実行

show関数で前述で設定したテキストや線などを、ディスプレイに表示します。


# 設定した内容をディスプレイに表示します
display.show()

まとめ

RaspberryPi Picoで、Aideepen製の0.97インチOLEDディスプレイを使う方法について解説しました。参考になればうれしいです

Picoで使えるI2C通信対応デバイス

ディスプレイ以外にも、PicoとI2Cで接続できるおもしろい機器がたくさんあります。ぜひ他のデバイスにもチャレンジしてみてください。

CO2センサ

二酸化炭素濃度を測るセンサーです。コロナ渦ですっかり身近になりました。3V~5Vで動作するのでPicoでも扱えます。

IMU (3軸角度/加速度センサー)

3.3V、I2Cで使える3軸の角度/加速度センサーです。とても安価ですが、遊びや勉強用途には十分な性能を持つセンサーです。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

POSTED COMMENT

  1. chopcookie より:

    表示する文字を2倍角にするにはどのようにすればよいのでしょうか?

    • えす より:

      chopcookieさん

      コメントありがとうございます、えすです。
      ちょっと調べてみますね。

    • えす より:

      chopcookieさん

      えすです。

      遅くなってすみません。記事で紹介したPico + MicroPythonでは文字の大きさを変更できませんが、Pico + Arduino言語を使う場合は変更できそうです。
      以下のqittaの記事が参考になるかと思います。

      https://qiita.com/jakalada/items/793a6cf5ff2796db4e86

      • chopcookie より:

        ありがとうございます!参考になります。

Index