Pico

【直結で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 3.3.13
ボード 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とディスプレイの配線方法を説明する画像

ピン番号 内容 備考
36 3V3(OUT) 電源(3.3V)
23 GND グラウンド
22 GP17 I2C SCL
21 GP16 I2C SDA

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

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

Pico公式サイトより引用

使用する部品

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

あきばお〜楽天市場支店
¥945 (2022/09/18 00:07時点 | 楽天市場調べ)

プログラムの概要

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

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

実行結果

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

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

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

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

manage packages画面を開く

Thonnyのツールメニューから「manage packages」の画面を開きます。

Manage packages画面の表示

ssd1306を検索する

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

ssd1306の検索

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

検索されたssd1306を選択

ssd1306をインストールする

検索結果をクリックすると、以下の「micropython-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でも扱えます。

気圧センサ

温度・気圧を測れるセンサーです。温度の後は、気圧を測ってみるのも面白いです。ローム社製の「BM1383AGLV」搭載で、販売元もスイッチサイエンスなので安心です。今回解説したように複数のデータを取得・結合することで気圧データを取得することができます。

¥660 (2022/06/11 22:26時点 | Amazon調べ)

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

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

UdemyにRaspberryPiの講座があります

実はUdemyで『RaspberryPi』『Pico』『Arduino』の基礎/実践講座が見れます。無料もあるので「動画で学びたい」「本は読み尽くした」という方は以下のリンクをご覧ください。

⇒ RaspberryPiの講座一覧はこちら

以下の記事で、RaspberryPi・RaspberryPi Picoのおすすめ講座3選も解説しています。

M5StackならWiFi・画面・バッテリー付きです

「やっぱりWifiやディスプレイも欲しい…」「基盤むき出しはちょっと怖い」という方には「M5Stack Core2」があります。Wifi・タッチ画面・バッテリー搭載で、より高度なIoT機器が追加部品なしで作れます。GPIOなどももちろんありますよ。

※ セットアップ方法もこちらで解説しています。

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

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

COMMENT

メールアドレスが公開されることはありません。