はじめに
RaspberryPi PicoでLCD(液晶ディスプレイ)を使う方法を解説します。言語はMicroPython、ディスプレイはI2Cで接続できる「Aideepen社 0.97インチのOLED(有機EL)ディスプレイ SSD1306対応品」を使用します。
液晶ディスプレイについてですが、最近では電卓のような「液晶」よりも、小型・低価格な「有機EL型」を使う方が主流のようです(テレビと同じですね)。
そのため、今回は最近主流となっている「有機EL型ディスプレイ」をPicoで使う方法について解説したいと思います。ライブラリが使えてプログラムも簡単なので、参考にしていただけたらうれしいです。
~ この記事の内容 / Contents ~
環境
この記事は以下の環境で作成しています。
環境 | バージョン | 備考 |
開発用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本を直結で接続します。
ピン番号 | 内容 | 備考 |
36 | 3V3(OUT) | 電源(3.3V) |
23 | GND | グラウンド |
22 | GP17 | I2C SCL |
21 | GP16 | I2C SDA |
Picoピンアサイン(Pin-Out)
※ Pico公式サイトより引用
使用する部品
今回記事では以下の部品を使用します。
OLEDディスプレイ
冒頭でも紹介した、I2C・SPIで使えるディスプレイです。Aideepen社のものは品切れとなったため、リンクは同一仕様のDiyStudioの物を掲載しています。
ジャンパワイヤ(セット)
固いジャンパワイヤがセットになったキットです。やわらかい配線よりスッキリした回路が作れます。
ジャンパワイヤ(自作用)
キットだと丁度いい長さがない、色がない。という方は以下の配線で自作できます。ジャンパワイヤとほぼ同じ固さの配線なので、切って曲げるだけで理想のジャンパワイヤが作れます。
ブレッドボード
国内サンハヤト製のブレッドボードです。少々堅めの指し心地ですが、海外製と違ってピン穴の番号がすべて印刷されており、品質も高いのでおすすめです。
プログラムの概要
プログラムの概要は以下の通りです。ディスプレイにテキスト・線・四角形を表示します。
- I2Cの設定
- ディスプレイ(SSD1306)の設定
- テキストを表示
- 縦・横・斜め線を表示
- 四角形を表示(塗りつぶし有/無)
- 色(ネガポジ)を反転表示
実行結果
後述する配線を行って、プログラムを実行すると、以下のようにディスプレイを表示することができます。
ライブラリのインストール
コードを書く前に「SSD1306」ライブラリをインストールします。手順は以下の通りです。
manage packages画面を開く
Thonnyの「ツール」メニューから「パッケージの管理」をクリックします。
ssd1306を検索する
manage packages 画面の検索ボックスで「ssd1306」と入力して、「micropython-lib/PyPlで検索」ボタンを押します。
画面上に「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です。
表示する文字を2倍角にするにはどのようにすればよいのでしょうか?
chopcookieさん
コメントありがとうございます、えすです。
ちょっと調べてみますね。
chopcookieさん
えすです。
遅くなってすみません。記事で紹介したPico + MicroPythonでは文字の大きさを変更できませんが、Pico + Arduino言語を使う場合は変更できそうです。
以下のqittaの記事が参考になるかと思います。
https://qiita.com/jakalada/items/793a6cf5ff2796db4e86
ありがとうございます!参考になります。