はじめに
以前紹介した、RaspberryPi 5 + Blinka + CircuitPythonでOLEDディスプレイを使うコードを「RaspberryPi Pico W」に移植したらどうなるか?を検証してみたいと思います。
- 本当に移植できる?
- 何が違う?
- Blinkaとかは知らんけど、CircuitPythonでOLEDディスプレイを表示したい
という人の参考になればうれしいです。
~ この記事の内容 / Contents ~
環境
この記事で使用する環境は以下の通りです。
環境 | 内容 | 備考 |
ファーム | CircuitPython | Ver.9.1.1 |
言語 | CircuitPython | |
ライブラリ | adafruit-circuitpython-ssd1306 | Ver.2.12.17 |
adafruit-circuitpython-framebuf | Ver.1.6.5 | |
フォント | font5x8.bin | |
ボード | RaspberryPi Pico W | |
エディタ | Mu | Ver.1.2.0 |
RaspberryPiとの接続
RaspberryPi PicoとOLEDディスプレイを以下のように接続します。

Pico W ピンアサイン(Pin-Out)
※ Pico W公式サイトより引用
使用する部品
今回は以下の部品を使用します。
Pico W 本体
Raspberry Pi Pico W本体です。技適対応品かどうか心配…という方は、以下のページで出品者を「共立エレショップAセレクト」(国内の有名ショップ)にして購入してください。
ブレッドボード
国内サンハヤト製のブレッドボードです。少々堅めの指し心地ですが、海外製と違ってピン穴の番号がすべて印刷されており、品質も高いのでおすすめです。

OLEDディスプレイ
I2C接続のOLEDディスプレイです。SSD1306チップを搭載しています。

プログラム概要
今回のプログラムの概要は以下の通りです。
- OLEDディスプレイの初期化
- Wi-Fiに接続
- IPアドレスの表示
「ライブラリ」と「フォント」のダウンロード
Muエディタにはライブラリなどを自動でインストールしてくれる「パッケージ管理機能」はありません。そのため、OLED用のライブラリと文字表示用「フォントファイル」の手動インストールを行います。
ライブラリのダウンロード
Adafruit社 公式のGitHubから、OLED用のライブラリを2つダウンロードします。
後述するリンク先に進み、「Download raw file」のボタンを押して、Pythonファイルをダウンロードしてください。
adafruit-circuitpython-ssd1306
以下のリンク先から「adafruit_ssd1306.py」をダウンロードします。
adafruit-circuitpython-framebuf
以下のリンク先から「adafruit_framebuf.py」をダウンロードします。
フォントのダウンロード
ライブラリと同様に、Adafruit社 公式のGitHubから、以下のフォントファイルをダウンロードします。
font5x8.bin
以下のリンク先から「font5x8.bin」(フォントファイル)をダウンロードします。
「ライブラリ」と「フォント」のインストール
PicoWを接続し、表示されている「lib」フォルダにダウンロードしたPythonファイルをコピーします。
フォントファイルは「lib」フォルダと同じ並びにコピーしてください。
実行結果
後述するプログラムの実行結果は以下の通りです。
全体コード
全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。
# CircuitPythonの各モジュールをインポートします
#from board import SCL, SDA
import board
import busio
# CircuitPython-ssd1306ライブラリをインポートします
import adafruit_ssd1306
# ipgetの代わりに組込のwifiモジュールを使います
import wifi
# i2c通信用のオブジェクトを生成します
#i2c = busio.I2C(board.SCL, board.SDA)
i2c = busio.I2C(board.GP17, board.GP16)
# OLEDディスプレイ用のオブジェクトを生成します
# 引数は横のピクセル数、縦のピクセル数、I2C通信用のオブジェクトです
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
# ディスプレイの表示内容を初期化します
display.fill(0)
display.show()
# ipget用のオブジェクト生成します
# ip = ipget.ipget()
# 無線LANのIPアドレスを取得します
# ip_str = ip.ipaddr("wlan0")
# SSIDに接続
wifi.radio.connect(ssid = "お使いのSSID", password = "お使いのパスワード^")
# IPアドレスを取得
ip_str = str(wifi.radio.ipv4_address)
# お使いの環境に合わせて修正してください。
#font_path = "/home/esu/src_python/font5x8.bin"
font_path = "font5x8.bin"
# 取得したIPアドレスの表示を準備します
display.text("My IP Addr is", 0, 10 ,1,font_name=font_path)
display.text(ip_str, 0, 20 ,1, font_name=font_path)
# 準備した内容を表示します
display.show()
プログラムの実行
プログラムを実行するにはMuエディタでプロンプト部分で、ファイルを保存するか、下部のターミナル部分で「Ctrl+D」を押してください。
プログラムの「自動」実行
PicoWに電源を入れた後にプログラムを自動実行させたい場合は、ファイル名を「main.py」という名前に変更してください。
コードのポイント
モジュールのインポート
PicoのCircuitPythonでは、なぜか「SCL」「SDA」が定義されておらず、Pi5の時のコードのままだと、import文のところでエラーになってしまいます。
そのため、代替えとして同じboardモジュール内で定義されている「GPIO番号」を使って、I2Cオブジェクトの初期化を行います。
# CircuitPythonの各モジュールをインポートします
#from board import SCL, SDA
import board
import busio
# CircuitPython-ssd1306ライブラリをインポートします
import adafruit_ssd1306
# i2c通信用のオブジェクトを生成します
# SCLが使えないので
# busio.I2C(SCL,SDA)
# 番号で代替する
i2c = busio.I2C(board.GP17, board.GP16)
OLEDディスプレイ用のオブジェクトの生成
OLED用のオブジェクトを生成し、fill関数とshow関数でディスプレイを全面黒(0)で埋めます。
ここの処理に関してはPi5と何も変更せずに使用可能でした。
# OLEDディスプレイ用のオブジェクトを生成します
# 引数は横のピクセル数、縦のピクセル数、I2C通信用のオブジェクトです
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
# ディスプレイの表示内容を初期化します
display.fill(0)
display.show()
ipgetの代わりに、組込のwifiモジュールを使う
Pi5で使用した「ipget」ライブラリは Python(CPython)専用なので、代わりに
CircuitPythonに組み込まれている「wifi」モジュールを使用します。
import wifi
Wi-Fiへ接続する
connect関数でWi-Fiに接続します。
引数には、お使いの無線LANの「SSID」「パスワード」を指定してください。
# SSIDに接続
wifi.radio.connect(ssid = "お使いのSSID", password = "お使いのパスワード^")
IPアドレスを取得する
接続完了後、ipv4_addressのプロパティを使ってPicoWのIPアドレスを取得します。
# IPアドレスを取得
ip_str = str(wifi.radio.ipv4_address)
IPアドレスを表示する
X,Y座標を指定して、IPアドレスを表示します。
Pi5の場合、自動起動のからみで「フォントファイルの絶対バス」が必要でした。
PicoWでは前述のように「プログラムと同じ場所」にフォントファイルを置いていれば、ファイル名を指定するだけで、IPアドレスの表示ができます。
表示する文字列をセットしたら、show関数でディスプレイに表示します。
この部分も「パスの指定」以外は、Pi5と同じコードで動かすことができました。
# お使いの環境に合わせて修正してください。
#font_path = "/home/esu/src_python/font5x8.bin"
font_path = "font5x8.bin"
# 取得したIPアドレスの表示を準備します
display.text("My IP Addr is", 0, 10 ,1,font_name=font_path)
display.text(ip_str, 0, 20 ,1, font_name=font_path)
# 準備した内容を表示します
display.show()
まとめ
RaspberryPi 5 + Blinka + CircuitPythonを使ってOLEDディスプレイを使うコードを「RaspberryPi Pico W」に移植したらどうなるか?検証してみました。
実際試してみると、SLAの定義の有り無しで少し違いはありましたが、それ以外はちょっとした修正のみで動かすことができます。
移植の手間もかからず、ボードごとに異なるライブラリ覚える必要もなくなるので、気になった方は是非BlinkaとCircuitPythonを使ってみてください。
参考になればうれしいです
お知らせ
MicroPythonのプログラミングガイドブックが遂に発売!
「MicroPython」の本が遂にでました。
この一冊で、MicroPythonの言語仕様から、プログラミングの仕方まで”ガッツリ”学べます!
内容は、普段別言語で開発している人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。しかし、「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学ぶことができます。
全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。

Pico/Pico W関連のおすすめ本
RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。
おすすめ書籍
MicroPythonのプログラミングガイドブックがついに登場!
「MicroPython」の専門書がついに発売になりました!
この一冊で、MicroPythonの言語仕様から、プログラミングの仕方までが、”ガッツリ”学べます!
別言語を使っている人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。しかし、「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学びたい人におすすめの内容となっています。
全ての内容はここでは紹介しきれないので、詳細は以下からご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。

質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。