Pico W PR

RaspberryPi5 + BlinkaのコードをPico Wに移植してみた 【SSD1306】

記事内に商品プロモーションを含む場合があります

はじめに

以前紹介した、RaspberryPi 5 + Blinka + CircuitPythonでOLEDディスプレイを使うコードを「RaspberryPi Pico W」に移植したらどうなるか?を検証してみたいと思います。

  • 本当に移植できる?
  • 何が違う?
  • Blinkaとかは知らんけど、CircuitPythonでOLEDディスプレイを表示したい

という人の参考になればうれしいです。

環境

この記事で使用する環境は以下の通りです。

環境 内容 備考
ファーム 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セレクト」(国内の有名ショップ)にして購入してください。

¥1,799 (2025/01/14 10:27時点 | Amazon調べ)

ブレッドボード

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

OLEDディスプレイ

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

プログラム概要

今回のプログラムの概要は以下の通りです。

  • OLEDディスプレイの初期化
  • Wi-Fiに接続
  • IPアドレスの表示

「ライブラリ」と「フォント」のダウンロード

Muエディタにはライブラリなどを自動でインストールしてくれる「パッケージ管理機能」はありません。そのため、OLED用のライブラリと文字表示用「フォントファイル」の手動インストールを行います。

ライブラリのダウンロード

Adafruit社 公式のGitHubから、OLED用のライブラリを2つダウンロードします。

後述するリンク先に進み、「Download raw file」のボタンを押して、Pythonファイルをダウンロードしてください。

GitHub上でファイルをダウンロードする場所を説明する画像
ダウンロードボタンの場所

adafruit-circuitpython-ssd1306

以下のリンク先から「adafruit_ssd1306.py」をダウンロードします。

adafruit-circuitpython-framebuf

以下のリンク先からadafruit_framebuf.pyをダウンロードします。

フォントのダウンロード

ライブラリと同様に、Adafruit社 公式のGitHubから、以下のフォントファイルをダウンロードします。

font5x8.bin

以下のリンク先から「font5x8.bin」(フォントファイル)をダウンロードします。

「ライブラリ」と「フォント」のインストール

PicoWを接続し、表示されている「lib」フォルダにダウンロードしたPythonファイルをコピーします。

libフォルダ
ライブラリのPythonファイルをコピー

フォントファイルは「lib」フォルダと同じ並びにコピーしてください。

フォントファイルの保存場所を説明するための画像
フォントファイルの場所

実行結果

後述するプログラムの実行結果は以下の通りです。

解説するプログラムを実行して、OLEDにIPが表示されている状態を説明する画像
実行結果

全体コード

全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。

# 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です。

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