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のコードをコマンド実行することが出来る。
手順
- 下記ページより該当するPicoのMicroPython UF2ファイルをダウンロードする。
https://www.raspberrypi.com/documentation/microcontrollers/micropython.html - PCとPicoをUSBケーブルで接続する。
- PicoがUSBドライブ(RPI-RP2)として見えたら、ダウンロードしたUF2ファイルをコピーする。
※USBドライブが見えない場合は、BOOTボタンを押しながらRESETボタンを押して試す。 - コピーが完了したらPicoをリセットする。
- 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のコードをコマンド実行することが出来る。
手順
- 下記ページより該当するボードのダウンロードページに行き、ダウンロードボタンを押してMicroPython UF2ファイルをダウンロードする。
https://circuitpython.org/downloads - PCとPicoをUSBケーブルで接続する。
- PicoがUSBドライブ(RPI-RP2)として見えたら、ダウンロードしたUF2ファイルをコピーする。
※USBドライブが見えない場合は、BOOTボタンを押しながらRESETボタンを押して試す。 - コピーが完了したらPicoをリセットする。
- 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フォルダを初期化することで治る場合がある。
手順
- REPLに接続する。
- 初期化コードを入力して初期化を実行する。
import storage
storage.erase_filesystem()
Code Editorを使う
CircuitPythonはCircuitPythonのWebサイト上で、Code Editorという開発環境を提供している。
Code EditorはUSB(対応ボードの場合はWiFi、Bluetoothも可能)でPicoに接続し、プログラミングや実行することが出来る。
- PCとPicoをUSBケーブルで接続する。
- Code Editorを開く。
https://code.circuitpython.org/ - WiFi, Bluetooth, USBから接続するインタフェースを選択。(ここではUSBを選択)
- Connect to Deviceをクリックすると、PCが認識しているシリアルポートの一覧が表示される。
- Picoが接続されているポートを選択する。
- Select USB Host Folderをクリックし、PCが認識しているCIRCUITPYのファルダを選択する。
- Code Editor上でコードの変更やREPLが使用できる。
拡張ライブラリ(バンドル)について
CircuitPythonでは標準の環境に含まれない機能をライブラリバンドル(以下バンドル)という形で提供しおり、必要な機能のバンドルファイルをCIRCUITPYフォルダの下のライブラリフォルダにコピーすることで機能を追加することが出来るようになっている。
バンドルは以下のサイトよりダウンロードする。
バンドルは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
- Picoを起動してCIRCUITPYフォルダを開く。
- バンドルのlibフォルダにあるadafruit_binascii.mpyをCIRCUITPYの下のlibフォルダにコピーする。
- ライブラリが使用できるようになったので、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
使用手順
- バンドルに含まれるadafruit_st7735r.mpyをPicoにコピーする。
※ST7735Bはadafruit_st7735.mpyを使用するので間違えないように注意。 - REPLから使用してみる。
- 下記コードを入力すると、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
スクリーンショット保存手順
- バンドルに含まれるlibフォルダの下のadafruit_bitmapsaver.mpyファイルをCIRCUITPY/libフォルダにコピーする。
- 内蔵ストレージを読み書き可能なモードにするため、CIRCUITPY/boot.py(無ければ新規作成する)に下記のコードを記載してリセットする。
import storage
storage.remount("/", False)
- スクリーンショット取得時は下記のようにadafruit_bitmapsaverライブラリ
のsave_pixelsメソッドを使用する。
from adafruit_bitmapsaver import save_pixels
save_pixels("/1.bmp", display)
- 保存が完了したら、Picoをリセットする。
- 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ライブラリを使用する。本ライブラリは内蔵フォントやフォントファイル使用して様々なデザインのフォントを表示することができる。
ライブラリ使用手順
- バンドルに含まれるlibフォルダの下のadafruit_display_textフォルダをCIRCUITPY/libフォルダにコピーする。
ラベルによる表示
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クラスを使用してテキスト表示を行う。ラベルによる表示と似ているが、ビットマップラベルのほうがメモリ使用量を抑えることが出来る。
# 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クラスを使用してテキスト表示のスクロールを行う。
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クラスを使用して縁取りされたテキストの表示を行う。
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)を指定することが出来る。
# 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フォントファイルをロードして様々なフォントを表示することが出来る。
ライブラリ使用手順
- バンドルに含まれるlibフォルダの下のadafruit_bitmap_fontフォルダをCIRCUITPY/libフォルダにコピーする。
- BDFファイルをCIRCUITPYにコピーする。※サイズが大きいと容量が足りずにコピーに失敗する。
- 下記のコードでフォントを読み込む。
from adafruit_bitmap_font import bitmap_font
font = bitmap_font.load_font("fontfile.bdf")
- テキスト表示時に読み込んだフォントを指定する。
text1 = label.Label(font, text="0123456789", x=10, y=10)
ここでは7セグフォントを表示するために、keshikan/DSEGというフォントを利用した例を記載。
配布されているフォントは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
事前準備
- バンドルに含まれるlibフォルダの下のadafruit_imageloadフォルダをCIRCUITPY/libフォルダにコピーする。
- 表示データを用意する。
※データはLCDのサイズに合わせて横160ドット縦128ドットのBMPイメージを用意。 - 表示データを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再生
Discussion