✏️

Raspberry Pi Picoノート

に公開

Raspberry Pi Picoを使った工作用のノート

製品全般

Raspberry Pi Picoファミリーについて

Picoは2021年1月リリースの第一世代、2024年8月リリースの第二世代がある。

ラズベリーパイ財団からはFlash ROM等を搭載したマイコンボードとしてPico1やPico2がリリースされているが、チップ単品も購入することが出来るため、オリジナルのハードウェアにPicoのチップを搭載することも出来る。

チップ単体のスペック

チップ単体のスペックは以下の通り。

Name Pico1 Pico2
世代 第一世代 第二世代
リリース 2022.1 2024.8
チップ RP2040 RP2350
コア Dual ARM Cortex-M0+ 133MHz Dual Cortex-M33 150MHzとDual Hazard3 RISC-V 150MHzを搭載(同時使用不可)
SRAM 264kB 520KB
外付けFlashROM 16MBまで対応 16MBまで対応
GPIO数 30ピン(内アナログ入力は4ピン) 30ピン(内アナログ入力は4ピン)
UART 2 2
SPI 2 2
I2C 2 2
PWM 16 24
USB 1(ホストとデバイスに対応) 1(ホストとデバイスに対応)
PIO 8 12

※内蔵Flashの有無やGPIO数、アナログ入力数が異なるデバイスファミリーも存在するので詳細は下記データシートを参照。

RP2040 https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf
RP2350 https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf

※第二世代はセキュアブート等のセキュリティ機能も搭載している。

マイコンボードのスペック

主要なマイコンボードのスペックを記載する。

Pico1

オフィシャルからはRaspberry Pi Pico、Pico H、Pico W、Pico WHの4種類がリリースされている。

Name Pico Pico H Pico W Pico WH
チップ RP2040 RP2040 RP2040 RP2040
SRAM 256KB 256KB 256KB 256KB
ROM 2MB 2MB 2MB 2MB
GPIO数 26 26 26 26
ADC 3 3 3 3
UART 2 2 2 2
SPI 2 2 2 2
I2C 2 2 2 2
PWM 16 16 16 16
PIO 8 8 8 8
WiFi 未対応 未対応 802.11n 802.11n
Bluetooth 未対応 未対応 Bluetooth5.2 Classic/LE Bluetooth5.2 Classic/LE
ピンヘッダー 未取付 ハンダ済み 未取付 ハンダ済み

ペリフェラルのピンアサイン

各ペリフェラル毎に使用可能なピンが決まっている。ペリフェラル毎のピンアサインを記載する。

SPI
Name GPIO
SPI0 RX GP0,4,16,20
SPI0 CSn GP1,5,17,21
SPI0 SCK GP2,6,18,22
SPI0 TX GP3,7,19,23
SPI1 RX GP8,12,24,28
SPI1 CSn GP9,13,25,29
SPI1 SCK GP10,14,26
SPI1 TX GP11,15,27

Pico2

オフィシャルからはRaspberry Pi Pico2、Pico2 Wの2種類がリリースされている。

Name Pico2 Pico2 W
チップ RP2350 RP2350
SRAM 520KB 520KB
ROM 4MB 4MB
GPIO数 26 26
ADC 3 3
UART 2 2
SPI 2 2
I2C 2 2
PWM 24 24
PIO 8 8
WiFi 未対応 802.11n
Bluetooth 未対応 Bluetooth5.2 Classic/LE
ピンヘッダー 未取付 未取付

購入したボード

購入したボードのノート

RP2040-Zero

ブレッドボードで使いやすいボードを探してAliexpressで購入。
左右9ピンで、下に5ピン出ている。下のヘッダーをつけるとブレッドボードに刺さらないので、左右だけつけて使用。

コネクタ:USB Type-C
スイッチ:BOOT, RESET
RGB LED(WS2812):1個
GPIO:20ピン+9パッド

ブレッドボードの接続構成

ブレッドボードで回路を作った際のノート

RP2040-ZeroとLCD, SD Card Slotを接続

LCD ST7735S 128*160 4-Wire SPI, VCC 3.3V-5V, Logic 3.3V, SD Card slot 4-Wire SPI

ピンアウト

Pico LCD SD Card Slot PWM Audio Out Touch
5V - - - -
GND GND - - -
3.3V VCC,LED - - -
GP29 - - -
GP28 CS - - -
GP27 RESET - - -
GP26 A0(DC) - - -
GP15(SPI1 TX) SDA - - -
GP14(SPI1 SCK) SCK - - -
GP0 - Audio Out -
GP1 - - -
GP2 - - -
GP3 - - -
GP4(SPI0 RX) SD_MISO - -
GP5(SPI0 CS) SD_CS - -
GP6(SPI0 SCK) SD_SCK - -
GP7(SPI0 TX) SD_MOSI - -
GP8 - - -

開発環境の種類

標準の開発環境としては、Raspberry Pi Pico C/C++ SDKとRaspberry Pi Pico Python SDKの2種類をリリースしている。Python SDKはMicroPythonというマイクロコントローラ向けに作成されたPython3相当のソフトウェアをポーティングしたものとなっている。
オフィシャル以外の開発環境として、MicroPythonから派生したCircuitPython、Arduino IDE、rustなどが存在する。

Name C/C++ SDK Python SDK(MicroPython) CircuitPython Arduino IDE Rust
開発言語 C/C++ Python Python C/C++ Rust
開発元 オフィシャル オフィシャル Adafruit OSS OSS
特徴 オフィシャルサポート。Picoの機能を深く使える。 オフィシャルサポート。Picoの機能をPicoの機能を深く使える。 Adafruit社のオフィシャル環境。同社販売のデバイスを中心に多くの機能に対応している Arduioのスケッチが動く Rustで開発出来る
Debug Probe対応 - -

C/C++ https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf
C/C++ https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-c-sdk.pdf
MicroPython https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-python-sdk.pdf
MicroPython https://docs.micropython.org/en/latest/rp2/quickref.html
CircuitPython https://circuitpython.org/board/raspberry_pi_pico/

Micro Python

REPLを使う

USBケーブルで接続してPythonのコードをコマンド実行することが出来る。

手順

  1. 下記ページより該当するPicoのMicroPython UF2ファイルをダウンロードする。
    https://www.raspberrypi.com/documentation/microcontrollers/micropython.html
  2. PCとPicoをUSBケーブルで接続する。
  3. PicoがUSBドライブ(RPI-RP2)として見えたら、ダウンロードしたUF2ファイルをコピーする。
    ※USBドライブが見えない場合は、BOOTボタンを押しながらRESETボタンを押して試す。
  4. コピーが完了したらPicoをリセットする。
  5. TeraTermなどのシリアルターミナルからPicoに接続するとREPLが使える。
>>> import os
>>> os.uname()
(sysname='rp2', nodename='rp2', release='1.24.1', version='v1.24.1 on 2024-11-2)

RGB LED(WS2812)を使う

RP2040-Zeroに搭載されているRGB LEDを使う。
RP2040-ZeroではWS2812というRGB LEDが搭載されており、WS2812の信号入力ピンDINがPicoのGP16に接続されている。

MicroPythonは標準でWS2812に対応したNeoPixelというライブラリが含まれているため、このライブラリを使用してLEDをコントロールすることが出来る。

マニュアル:https://docs.micropython.org/en/latest/library/neopixel.html

ライブラリを読み込み初期化後、赤、緑、青の順番にRGB LEDを点灯させる。
NeoPixelメソッドは、ポート(GP16)とRGBのLEDの数(1つ)を設定している。
NeoPixelはインスタンスがLED数分の配列になっており、配列にRGBの値(0-255)をタプル形式(R,G,B)でセットし、writeメソッドを実行することでRGB LEDに色を設定することが出来る。

>>> import neopixe
>>> p = machine.Pin.board.GP16
>>> n = neopixel.NeoPixel(p, 1)
>>> n[0] = (255,0,0)
>>> n.write()
>>> n[0] = (0,255,0)
>>> n.write()
>>> n[0] = (0,0,255)
>>> n.write()

Circuit Python

REPLを使う

USBケーブルで接続してPythonのコードをコマンド実行することが出来る。

手順

  1. 下記ページより該当するボードのダウンロードページに行き、ダウンロードボタンを押してMicroPython UF2ファイルをダウンロードする。
    https://circuitpython.org/downloads
  2. PCとPicoをUSBケーブルで接続する。
  3. PicoがUSBドライブ(RPI-RP2)として見えたら、ダウンロードしたUF2ファイルをコピーする。
    ※USBドライブが見えない場合は、BOOTボタンを押しながらRESETボタンを押して試す。
  4. コピーが完了したらPicoをリセットする。
  5. TeraTermなどのシリアルターミナルからPicoに接続するとREPLが使える。
Auto-reload is on. Simply save files over USB to run them or enter REPL to disa.

Press any key to enter the REPL. Use CTRL-D to reload.
0;🐍REPL | 9.2.7
Adafruit CircuitPython 9.2.7 on 2025-04-01; Waveshare RP2040-Zero with rp2040
>>> import os
>>> os.uname()
(sysname='rp2040', nodename='rp2040', release='9.2.7', version='9.2.7 on 2025-0)

Pico https://circuitpython.org/board/raspberry_pi_pico/
Pico W https://circuitpython.org/board/raspberry_pi_pico_w/
Pico2 https://circuitpython.org/board/raspberry_pi_pico2/
Pico2 W https://circuitpython.org/board/raspberry_pi_pico2_w/
RP2040-Zero https://circuitpython.org/board/waveshare_rp2040_zero/

トラブルシューティング

CIRCUITPYファルダのファイルが書けなくなった場合

ファイル書き込み途中にリセットボタンを押すなどの理由でファイルシステムが破損する場合があり、
その場合はCIRCUITPYフォルダを初期化することで治る場合がある。

手順

  1. REPLに接続する。
  2. 初期化コードを入力して初期化を実行する。
import storage
storage.erase_filesystem()

Code Editorを使う

CircuitPythonはCircuitPythonのWebサイト上で、Code Editorという開発環境を提供している。
Code EditorはUSB(対応ボードの場合はWiFi、Bluetoothも可能)でPicoに接続し、プログラミングや実行することが出来る。

  1. PCとPicoをUSBケーブルで接続する。
  2. Code Editorを開く。
    https://code.circuitpython.org/
  3. WiFi, Bluetooth, USBから接続するインタフェースを選択。(ここではUSBを選択)
  4. Connect to Deviceをクリックすると、PCが認識しているシリアルポートの一覧が表示される。
  5. Picoが接続されているポートを選択する。
  6. Select USB Host Folderをクリックし、PCが認識しているCIRCUITPYのファルダを選択する。
  7. Code Editor上でコードの変更やREPLが使用できる。

拡張ライブラリ(バンドル)について

CircuitPythonでは標準の環境に含まれない機能をライブラリバンドル(以下バンドル)という形で提供しおり、必要な機能のバンドルファイルをCIRCUITPYフォルダの下のライブラリフォルダにコピーすることで機能を追加することが出来るようになっている。

バンドルは以下のサイトよりダウンロードする。
https://circuitpython.org/libraries
バンドルはCircuitPythonのメジャーバージョン毎に配布されており、9.x.x系だと「Bundle for Version 9.x」を10.x.x系だと「Bundle for Version 10.x」をダウンロードして使用する。今回は9.2.7を使っているので「Bundle for Version 9.x」を使用した。

ダウンロードしてZIPファイルを展開すると以下のフォルダが含まれている。
examples:各種サンプルコードが入っている。
lib:各種ライブラリが入っている。
requirements:各種ライブラリが依存するライブラリの情報が入っている。

バンドルの使い方

Adafruit binascii Libraryを使う場合の例。

ドキュメント https://docs.circuitpython.org/projects/binascii/en/stable/index.html

  1. Picoを起動してCIRCUITPYフォルダを開く。
  2. バンドルのlibフォルダにあるadafruit_binascii.mpyをCIRCUITPYの下のlibフォルダにコピーする。
  3. ライブラリが使用できるようになったので、REPLから使用してみる。
>>> from adafruit_binascii import hexlify, unhexlify
>>> hexlify(b'123')
b'313233'
>>> unhexlify(b'313233')
b'123'

タッチ入力をする

タッチ入力を行うモジュールとして、touchioが提供されている。

ドキュメント https://docs.circuitpython.org/en/latest/shared-bindings/touchio/

必要な部品

  • 1MΩ抵抗
    タッチ入力にはポート毎に1MΩの抵抗でプルダウンする必要がある。
    ※抵抗を付け忘れるとエラーがでる。

使用方法

GP8ピンに1MΩのプルダウン抵抗を付け、REPLでタッチ入力を試してみる。
TouchInメソッドで初期化してvalueプロパティでタッチ状態を読むことが出来る。

>>> import touchio
>>> import board
>>> import time
>>> tp1 = touchio.TouchIn(board.GP8)
>>> while True: tp1.value; time.sleep(0.5)
...
False
False
False
True 
True

raw_valueの値を読むと、判定に使用している素の値を見ることが出来る。
下記の例だと1000付近が指を離した状態で、タッチすると2000以上の値になった。

>>> while True: tp1.raw_value; time.sleep(0.5)
...
1120
1148
1146
2265
2903
3249
5630
10000
10000
4548

LCDを使うためのディスプレイシステム

LCDを使用する際は、Displayioライブラリが提供するディスプレイシステムを使用する。
ディスプレイシステムはI2C、SPI、パラレルインタフェースを提供するディスプレイバス、ディスプレイバスを使用して各種LCDコントローラ向けのアクセス機能を提供するディスプレイドライバを組み合わせて使用する。
Displayioライブラリ自体は簡単なグラフィック描画機能しか搭載していないので、テキストなどの表示を行う場合はDisplayioに対応したグラフィックライブラリを組み合わせて使用する。

下記に各ライブラリ間の接続図を記載する。

例としてSPIインタフェースを使用するST7735Sコントローラを使用したLCDでテキスト表示を行う場合は以下のような組み合わせで使用する。

LCD関係の各種ライブラリ

LCDを使用するための各種ライブラリ。必要に応じて組み合わせて使用する。内蔵はCircuitPythonにあらかじめ入っているもの、バンドルはバンドルとして提供されているのでファイル名に記載のファイルをlibフォルダにコピーする必要がある。

Category Name Description 内蔵/バンドル ファイル名
Display System displayio ディスプレイシステム
Display Bus SPI - FourWire SPI用バスクラス
Display Bus I2C - I2CDisplayBus I2C用バスクラス
Display Bus Parallel - ParallelBus パラレルインタフェース用バスクラス
Display Driver ST7735S, ST7735R ST7735S, ST7735R用ディスプレイドライバ バンドル
GRAPHIC adafruit_display_text テキスト表示
GraphicsLibrary adafruit_bitmap_font ビットマップフォント読み込み
GraphicsLibrary adafruit_imageload イメージファイル読み込み
GraphicsLibrary adafruit_display_shapes 四角形などの形状を表示
GraphicsLibrary adafruit_button ボタン表示
GraphicsLibrary adafruit_progressbar プログレスバー表示
GraphicsLibrary adafruit_display_notification 通知表示
GraphicsLibrary adafruit_displayio_layout レイアウト管理
GraphicsLibrary adafruit_slideshow スライドショー表示

LCDコントローラ ST7735R、ST7735Sを使用する

ここではLCDコントローラとしてST7735Rや、ST7735Sが使われているLCDを使って表示を行う。
ハードウェアはRP2040-ZeroとLCDを接続を使用。
ST735RやST7735Sを使用する場合は、バンドルに含まれるAdafruit ST7735R Libraryを使用する。

ドキュメント https://docs.circuitpython.org/projects/st7735r/en/stable/index.html

使用手順

  1. バンドルに含まれるadafruit_st7735r.mpyをPicoにコピーする。
    ※ST7735Bはadafruit_st7735.mpyを使用するので間違えないように注意。
  2. REPLから使用してみる。
  3. 下記コードを入力すると、LCDにもREPLの出力が表示される。
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)

LCDのスクリーンショットを保存する

LCDに表示された内容をファイルに保存するには、adafruit_bitmapsaverライブラリを使用する。

リファレンス https://docs.circuitpython.org/projects/bitmapsaver/en/latest/api.html

スクリーンショット保存手順

  1. バンドルに含まれるlibフォルダの下のadafruit_bitmapsaver.mpyファイルをCIRCUITPY/libフォルダにコピーする。
  2. 内蔵ストレージを読み書き可能なモードにするため、CIRCUITPY/boot.py(無ければ新規作成する)に下記のコードを記載してリセットする。
import storage
storage.remount("/", False)
  1. スクリーンショット取得時は下記のようにadafruit_bitmapsaverライブラリ
    のsave_pixelsメソッドを使用する。
from adafruit_bitmapsaver import save_pixels
save_pixels("/1.bmp", display)
  1. 保存が完了したら、Picoをリセットする。
  2. CIRCUITフォルダ下に保存した1.bmpがある。※LCDを回転して使用している場合は回転前の状態で保存されるので、PC側で回転する必要がある。

サンプルコード

# ST7735Rを使用した場合
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)
# 以降がスクリーンショット保存処理
from adafruit_bitmapsaver import save_pixels
save_pixels("/1.bmp", display)

LCDにテキストを表示する

テキストの表示にはadafruit_display_textライブラリを使用する。本ライブラリは内蔵フォントやフォントファイル使用して様々なデザインのフォントを表示することができる。

ライブラリ使用手順

  1. バンドルに含まれるlibフォルダの下のadafruit_display_textフォルダをCIRCUITPY/libフォルダにコピーする。

ラベルによる表示

label.Labelクラスを使用してテキスト表示を行う。

リファレンス https://docs.circuitpython.org/projects/display_text/en/latest/api.html#adafruit_display_text.label.Label

Labelクラスは初期化時にフォントや表示するテキストなどをパラメータとして指定する。
ここではCicuitPythonに内蔵されているterminalioフォントを使用してテキストを表示する。

# ST7735Rを使用した場合
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)
# 以降がテキスト表示処理
import terminalio
from adafruit_display_text import label
main_group = displayio.Group()
display.root_group = main_group
text1 = label.Label(terminalio.FONT, text="ABC", x=10, y=10)
text2 = label.Label(terminalio.FONT, text="1234",color=0xFF0000, x=10, y=20)
main_group.append(text1)
main_group.append(text2)

ビットマップラベルによる表示

bitmap_label.Labelクラスを使用してテキスト表示を行う。ラベルによる表示と似ているが、ビットマップラベルのほうがメモリ使用量を抑えることが出来る。

リファレンス https://docs.circuitpython.org/projects/display_text/en/latest/api.html#adafruit_display_text.bitmap_label.Label

# ST7735Rを使用した場合
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)
# 以降がテキスト表示処理
import terminalio
from adafruit_display_text import bitmap_label
main_group = displayio.Group()
display.root_group = main_group
text1 = bitmap_label.Label(terminalio.FONT, text="ABC", x=10, y=10)
text2 = bitmap_label.Label(terminalio.FONT, text="1234",color=0xFF0000, x=10, y=20)
main_group.append(text1)
main_group.append(text2)

テキストスクロール

scrolling_label.ScrollingLabelクラスを使用してテキスト表示のスクロールを行う。

リファレンス https://docs.circuitpython.org/projects/display_text/en/latest/api.html#adafruit_display_text.scrolling_label.ScrollingLabel

ScrollingLabelクラスは初期化時に表示する文字数や、スクロールアニメーションの時間を指定する。
また、スクロール動作を行うためにupdateメソッドを定期的に呼び出す必要がある。

# ST7735Rを使用した場合
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)
# 以降がテキスト表示処理
import terminalio
from adafruit_display_text.scrolling_label import ScrollingLabel
main_group = displayio.Group()
display.root_group = main_group
text1 = ScrollingLabel(terminalio.FONT, text="ABCD1234", x=10, y=10, max_characters=4, animate_time=0.3)
main_group.append(text1)
while True:
    text1.update()

アウトラインラベルによる表示

OutlinedLabelクラスを使用して縁取りされたテキストの表示を行う。

リファレンス https://docs.circuitpython.org/projects/display_text/en/latest/api.html#adafruit_display_text.outlined_label.OutlinedLabel

OutlinedLabelクラスは初期化時に縁取りの色(outline_color)や太さ(outline_size)などをパラメータとして指定する。

# ST7735Rを使用した場合
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)
# 以降がテキスト表示処理
import terminalio
from adafruit_display_text import outlined_label
main_group = displayio.Group()
display.root_group = main_group
text1 = outlined_label.OutlinedLabel(terminalio.FONT, text="ABC", x=10, y=50, color=0xFF00FF, outline_color=0x00FF00, outline_size=1, scale=3)
main_group.append(text1)

テキストボックスによる表示

TextBoxクラスを使用して横幅を超える文字数のテキストをセットした場合に自動的に改行して表示を行う。また、プロパティのalignに左寄せ(TextBox.ALIGN_LEFT)、センター(TextBox.ALIGN_CENTER)、右寄せ(TextBox.ALIGN_RIGHT)を指定することが出来る。

リファレンス https://docs.circuitpython.org/projects/display_text/en/latest/api.html#adafruit_display_text.text_box.TextBox

# ST7735Rを使用した場合
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)
# 以降がテキスト表示処理
import terminalio
from adafruit_display_text.text_box import TextBox
main_group = displayio.Group()
display.root_group = main_group
text1 = TextBox(terminalio.FONT, text="ABCDEFGHIJK0123456789", width=50, height=TextBox.DYNAMIC_HEIGHT, align=TextBox.ALIGN_CENTER, x=50, y=10)
main_group.append(text1)

BDFフォントの表示

adafruit_bitmap_fontライブラリを使用することで、BDFフォントファイルをロードして様々なフォントを表示することが出来る。

ライブラリ使用手順

  1. バンドルに含まれるlibフォルダの下のadafruit_bitmap_fontフォルダをCIRCUITPY/libフォルダにコピーする。
  2. BDFファイルをCIRCUITPYにコピーする。※サイズが大きいと容量が足りずにコピーに失敗する。
  3. 下記のコードでフォントを読み込む。
from adafruit_bitmap_font import bitmap_font
font = bitmap_font.load_font("fontfile.bdf") 
  1. テキスト表示時に読み込んだフォントを指定する。
text1 = label.Label(font, text="0123456789", x=10, y=10)

ここでは7セグフォントを表示するために、keshikan/DSEGというフォントを利用した例を記載。
https://www.keshikan.net/fonts.html

配布されているフォントはTrueType形式(.ttf)なので、BDF形式に変換する。
Linuxの場合はotf2bdfツールが使用できる。

$ otf2bdf DSEG7Classic-Bold.ttf -o dseg7.bdf

変換したdseg7.bdfをCITCUITPYフォルダにコピーする。
下記のようにdseg7.bdfを読み込んで使用する。

# ST7735Rを使用した場合
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)
# 以降がテキスト表示処理
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
font = bitmap_font.load_font("dseg7.bdf") 
main_group = displayio.Group()
display.root_group = main_group
text1 = label.Label(font, text="0123456789", x=10, y=10)
main_group.append(text1)

LCDにグラフィックを表示する

LCDにグラフィックを表示するには、adafruit_imageloadライブラリを使用する。

リファレンス https://docs.circuitpython.org/projects/imageload/en/stable/index.html

事前準備

  1. バンドルに含まれるlibフォルダの下のadafruit_imageloadフォルダをCIRCUITPY/libフォルダにコピーする。
  2. 表示データを用意する。
    ※データはLCDのサイズに合わせて横160ドット縦128ドットのBMPイメージを用意。
  3. 表示データをCIRCUITPYフォルダにコピーする。

CIRCUIPY/dataフォルダに保存した1.bmpを表示する例

# ST7735Rを使用した場合
import board, busio
import displayio
import fourwire
from adafruit_st7735r import ST7735R
spi = busio.SPI(clock=board.GP14, MOSI=board.GP15) 
displayio.release_displays()
display_bus = fourwire.FourWire(spi, command=board.GP26, chip_select=board.GP28, reset=board.GP27)
display = ST7735R(display_bus, width=160, height=128, rotation=270, bgr=True)
# 以降がイメージ表示処理
import adafruit_imageload
image, palette = adafruit_imageload.load("data/1.bmp", bitmap=displayio.Bitmap, palette=displayio.Palette)
tile_grid = displayio.TileGrid(image, pixel_shader=palette)
group = displayio.Group()
group.append(tile_grid)
display.root_group = group

SD Cardを使用する

SD Cardには複数の接続方式があり、接続方式により読み書きの速度が変わる。
Circuit PythonのPico向けは現状SPI Bus Modeのみの対応[1]となっている。

接続方式 モジュール Picoの対応
SPI Bus Mode sdcardio 対応
1bit SD Bus Mode sdioio 未対応
4bit SD Bus Mode sdioio 未対応
# SD Cardを/sdにマウント
import board, busio
import sdcardio
import storage
spi = busio.SPI(clock=board.GP6, MOSI=board.GP7, MISO=board.GP4)
sd = sdcardio.SDCard(spi, board.GP5)
vfs = storage.VfsFat(sd)
storage.mount(vfs, '/sd')

各種ファイル操作

>>> import os
# ディレクトリ、ファイル一覧を取得
>>> os.listdir('/sd')                                                        
[]
# ディレクトリを作成
>>> os.mkdir("/sd/test")                                                     
>>> os.listdir('/sd')                                                        
['test']                                                                     
# ファイルを書き込みモードで開き、テキストを書き込み
>>> with open("/sd/test/test.txt", "w") as f:
        f.write("test 1234")
>>> os.listdir('/sd/test')                                                   
['test.txt']
# ファイルを読み込みモードで開き、テキストを読み込み
>>> with open('/sd/test/test.txt', 'r') as f:
        f.read()
'test 1234'
# ファイルを削除
>>> os.remove('/sd/test/test.txt')
# ディレクトリを削除
>>> os.rmdir('/sd/test')                                                     
>>> os.listdir('/sd')                                                        
[] 

オーディオ出力モジュール

Circuit Pythonで使用可能なオーディオモジュールのリスト。

Category Name Description 内蔵/バンドル ファイル名
Audio Core Module audiocore オーディオRAWサンプル及びWAVファイルの再生 内蔵
Audio Interface audiopwmio PWMでオーディオ出力する 内蔵
Audio Interface audiobusio I2Sインタフェースでオーディオ入出力する 内蔵
Audio Effect audiodelays ディレイエフェクト 内蔵
Audio Effect synthio マルチチャネルオーディオの合成 内蔵
Audio Effect audiofilters オーディオフィルタエフェクト 内蔵
Audio Effect audiofreeverb freeverbエフェクト 内蔵
Audio Effect audiomixer オーディオミキサー 内蔵
Audio Codec audiomp3 MP3ファイルを再生する 内蔵

PWMでオーディオ出力する

audiopwmioモジュールを使用してPWM出力によりオーディオ出力を行う。
ここではGP0ピンに330Ωの抵抗経由でスピーカを接続。

サイン波の出力

サンプリング周波数8KHZで440Hzのサイン波を出力する。

import audiocore
import audiopwmio
import board
import array
import time
import math
# 440Hzの時のサンプル数を計算
length = 8000 // 440
sine_wave = array.array("H", [0] * length)
for i in range(length):
    sine_wave[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 15) + 2 ** 15)
# GP0ピンに出力
dac = audiopwmio.PWMAudioOut(board.GP0)
sine_wave = audiocore.RawSample(sine_wave, sample_rate=8000)
# サイン波を出力。loop=Trueにするとループ再生する。
dac.play(sine_wave, loop=True)
time.sleep(1)
dac.stop()

WAVファイルを再生する

あらかじめCIRCUITPYフォルダに入れたtest.wavを再生する。

import board
import audiocore
import audiopwmio
import digitalio

data = open("test.wav", "rb")
wav = audiocore.WaveFile(data)
# GP0ピンに出力
audio = audiopwmio.PWMAudioOut(board.GP0)
# playで再生する。(ノンブロッキング)
audio.play(wav)
while audio.playing:
  pass

SD CardからMP3を再生する

SD Cardに保存したMP3を再生する場合はSDカードをファイルシステムにマウント後、audiomp3モジュールのMP3DecoderクラスでMP3ファイルを指定して使う。

ドキュメント https://docs.circuitpython.org/en/latest/shared-bindings/audiomp3/index.html

SD CardをSPIインタフェースで接続し、PWM AudioとしてGP0でオーディオ出力する。

>>> import board, busio
>>> import sdcardio
>>> import storage
>>> spi = busio.SPI(clock=board.GP6, MOSI=board.GP7, MISO=board.GP4)
>>> sd = sdcardio.SDCard(spi, board.GP5)
>>> vfs = storage.VfsFat(sd)
# /sdにSDカードをマウント
>>> storage.mount(vfs, '/sd')
# SDカード上のMP3ファイルが見えることを確認。
>>> import os
>>> os.listdir('/sd')         
['1.mp3', '2.mp3', '3.mp3']
# PWMAudioを使用する処理。GP0に出力する。
>>> import audiopwmio
>>> import audiocore
>>> audio = audiopwmio.PWMAudioOut(board.GP0)
# MP3を再生する処理。
>>> import audiomp3
>>> mp3 = audiomp3.MP3Decoder("/sd/1.mp3")
# 再生
>>> audio.play(mp3)
# 停止
>>> audio.stop()
# 別のファイルを再生
>>> mp3 = audiomp3.MP3Decoder("/sd/2.mp3")
>>> audio.play(mp3)
>>>
ToDo

7セグLEDを使う
音を出す
Picoで音を出す場合、内蔵のPWM機能を使用する方法と、I2S機能を使用する方法がある。
PWMはパルス信号を出力するモジュールで、外付けの抵抗とコンデンサでアナログ信号に変換する事で音を出すことが出来る。
I2Sはオーディオ用の通信規格で、I2Sに対応したオーディオコーデックICを接続することで高音質な音を出すことが出来る。

circuit pythonではどちらの方式にも対応しており、それぞれのスペックは以下となる。

信号再生
サイン波などの信号を再生する
PWM
I2S

WAVファイルの再生

MP3再生
PWM
SDカードからMP3再生

脚注
  1. raspberrypi: support sdioio #8160 ↩︎

Discussion