🐷

プログラム不要! コマンド操作で Pico ボードに SD カード・RTC モジュールを接続しよう

に公開

pico-jxgLABO は、USB ケーブル一本でマイコンボード RaspberryPi Pico の様々な機能を試すことができる実験プラットフォームです。

今回は、pico-jxgLABO を使って Pico ボードに SD カードと RTC (Real Time Clock) モジュールを接続します。

pico-jxgLABO では、Pico ボードのフラッシュメモリの一部を L: ドライブとしてマウントし、ファイルの読み書きができるようにしています。このドライブの容量は、Pico2 ボードの場合で約 2.5 MByte、Pico ボードですと 0.5 MByte (500 KByte) 程度です。テキストデータの保存程度ならば実用的に使えますが、画像データや音声データなどの大容量データを扱うには不十分です。

SD カードを接続すれば、GByte 単位の大容量ストレージが利用できるようになり、Pico ボードの活用範囲が大きく広がります。SD カードは安価で入手しやすく、Pico ボードの SPI インターフェースに接続して使うことができます。

さらに、RTC モジュールを接続すると、現在時刻を正確に取得することが可能になり、ファイルを作成・更新したときのタイムスタンプを記録できます。RTC モジュールは I2C インターフェースに接続して使います。

pico-jxgLABO を使うと、プログラムを書くことなく、コマンド操作だけでこれらのデバイスを接続できます。Pico ボードに SD カードと RTC モジュールを接続して、ストレージ機能を充実させましょう!

接続するデバイスについて

SD カードリーダモジュール

SD カードリーダモジュールは、基本的に SD カードスロットといくつかの抵抗や電圧レギュレータが載っているだけのシンプルなものですが、供給電圧や信号のレベル、プルアップ抵抗の有無などがモジュールによって異なるので注意が必要です。

以下に、手元にあった SD カードリーダモジュール (主に Amazon で入手) の外観を示し、供給電圧やプルアップ抵抗の有無、信号レベルについてまとめました。

外観 注釈
sdcard-adapter 標準 SD カードのモジュールです。供給電圧は 5V3.3V の両方の端子が用意されていて、5V の場合は電圧レギュレータで 3.3V に降圧して SD カードに供給されます。すべての信号線に 10kΩ のプルアップ抵抗がついているので、外部のプルアップ抵抗は必要ありません。信号レベルは 3.3V です。
ILI9341-back TFT LCD ILI9341 についている標準 SD カードのスロットです。電源は TFT LCD 用のコネクタから 3.3V を供給します。外部のプルアップ抵抗が必要です[1]。信号レベルは 3.3V です。
u-sdcard-adapter-1 microSD カードのモジュールです。供給電圧は 5V で、電圧レギュレータで 3.3V に降圧して SD カードに供給されます。外部のプルアップ抵抗は必要ありません。信号線にはバッファ (74HC125) が入っており、3.3V5V の両方の信号レベルに接続できます。
u-sdcard-adapter-2 microSD カードのモジュールです。供給電圧は 3.3V です。すべての信号線に 10kΩ のプルアップ抵抗がついているので、外部のプルアップ抵抗は必要ありません。信号レベルは 3.3V です。

供給電圧の見分け方ですが、SD カードリーダモジュールの基板上に以下に示すような電圧レギュレータが載っている場合は 5V 供給、載っていない場合は 3.3V 供給と考えてよいでしょう。

sdcard-adapter-voltage

RTC モジュール

RTC モジュールは、リアルタイムの日時を保持するためのハードウェアです。初代 Pico (RP2040) にはチップ内に RTC が内蔵されていて、外付けハードウェアなしに日時情報を得られると期待されていましたが、残念ながら電源を切ると日時情報が失われてしまうのであまり実用的ではありません。何にせよ、後継の Pico2 (RP2350) ではこのモジュールが取り除かれてしまったので、実使用の候補にはならないでしょう。

RTC を使う実用的な方法は、Pico ボードにバックアップ電池を装備した RTC モジュールを接続することです。これで Pico ボードの電源状態にかかわらず日時情報を保持できるようになります。

電子工作でよく使われている RTC モジュールというと、I2C で接続ができる DS3231 がよく挙げられます。DS1307 という廉価版もありますが、一日に数秒もずれるらしいので、わずかな価格差で高精度な DS3231 を使うのが良いでしょう。

僕が Amazon で購入した DS3231 モジュールは、以下のようなものです。

rtc-ds3231

バックアップ電池が初めから装備されていますし、コンパクトな形状をしているのが良い感じです。基板に印刷されている信号名が分かりづらいのですが、以下のように対応しています。

基板上の印字 信号名
+ VCC
D SDA
C SCL
- GND

pico-jxgLABO の書き込み

Pico ボードへの pico-jxgLABO の書き込みと基本的な使い方はこちら。特別なハードウェアは必要なく、Pico W や Pico 2 W ボードを USB ケーブルで PC に接続するだけで始められます。

この記事で説明する実験を行うには、バージョン 0.4.0 以降の pico-jxgLABO が Pico ボードに書き込まれている必要があります。ターミナルソフトで about-me コマンドを実行すると pico-jxgLABO のバージョンを確認できます。

L:/>about-me
Program Information
 name:              pico-jxgLABO
 version:           0.4.0
     :
     :

デバイスの接続と動作確認

SD カードリーダモジュール

SD カードリーダモジュールは SPI インターフェースに接続します。Pico ボードの SPI0 または SPI1 を使うことができ、ピンレイアウトもコマンドで自由に設定できます。ここでは SPI0 を使い、以下のように接続します。

SD カードリーダモジュール Pico ピン番号 GPIO ファンクション
VCC 39 or 36 VSYS or 3V3
GND 3 GND
SCK 4 GPIO2 SPI0 SCK
MOSI 5 GPIO3 SPI0 TX (MOSI)
MISO 6 GPIO4 SPI0 RX (MISO)
CS 7 GPIO5 SIO

配線図を以下に示します。GND は Pico ボード上で複数出ているので、どこに接続しても構いません。

circuit-sdcard

以下のコマンドを実行して、SPI0 の GPIO 割り当てを GPIO2 (SPI0 SCK), GPIO3 (SPI0 TX), GPIO4 (SPI0 RX) に設定します。適切なファンクション割り当てが自動的に行われるので、記述の順序は気にしなくて大丈夫です。

L:/>spi0 -p 2,3,4

以下のコマンドを実行して、SD カードを接続する SPI インターフェースを SPI0、CS ピンを GPIO5 に設定します。またドライブ名として M を指定します。

L:/>sdcard setup {spi:0 cs:5 drive:'M'}

これで SD カードのセットアップは完了です。

ls-drive コマンドで利用可能なドライブの一覧を表示してみましょう。

L:/>ls-drive
 Drive  Format           Total
*L:     FAT12          2621440
 M:     unmounted            0

まだスロットに SD カードが挿入されていないので unmounted になっています。SD カードを入れてから、再度 ls-drive コマンドを実行してみましょう。ここでは FAT フォーマットされた 32 GByte の SD カードを挿入しました。

L:/>ls-drive
 Drive  Format        Total
*L:     FAT12       2621440
 M:     FAT32   30945574912

いろいろなファイル操作を試してみてください。こちら に pico-jxgLABO[2] が提供するファイル操作コマンドの使い方をまとめてあります。

L:/>M:
M:/>dir
...

RTC モジュール DS3231

RTC モジュール DS3231 は I2C インターフェースに接続します。Pico ボードの I2C0 または I2C1 を使うことができ、ピンレイアウトもコマンドで自由に設定できます。ここでは I2C0 を使い、以下のように接続します。

DS3231 Pico ピン番号 GPIO ファンクション
VCC 36 3V3
GND 8 GND
SDA 11 GPIO8 I2C0 SDA
SCL 12 GPIO9 I2C0 SCL

配線図を以下に示します。GND は Pico ボード上で複数出ているので、どこに接続しても構いません。

circuit-rtc

以下のコマンドを実行して、I2C0 の GPIO 割り当てを GPIO8 (I2C0 SDA), GPIO9 (I2C0 SCL) に設定します。適切なファンクション割り当てが自動的に行われるので、記述の順序は気にしなくて大丈夫です。

L:/>i2c0 -p 8,9

I2C バスに接続されているデバイスをスキャンして、RTC モジュールが正しく接続されていることを確認します。DS3231 は I2C アドレス 0x68 を持っています。

L:/>i2c0 scan
Bus Scan on I2C0
   0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
00 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60 -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

以下のコマンドを実行して、DS3231 RTC モジュールのセットアップを行います。

L:/>rtc-ds3231 setup {i2c:0}

これで RTC モジュール DS3231 のセットアップは完了です。

rtc コマンドを実行して、RTC モジュールから現在時刻を取得します。

L:/>rtc
2000-01-01 00:00:00.000

引数に日時を指定して rtc コマンドを実行すると、RTC モジュールに日時を設定できます。

L:/>rtc 2025-10-18 16:20:52
2025-10-18 16:20:52.000

Pico ボードが Wi-Fi に接続されている場合は、ntp コマンドに -r オプションを付けて実行することで、NTP サーバから正確な時刻を取得して RTC モジュールに設定することができます。

L:/>ntp -r
2025-10-18 16:27:31
RTC updated
L:/>rtc
2025-10-18 16:27:33.000

ファイルを作成して、タイムスタンプが正しく記録されることを確認してみましょう。

L:/>touch testfile.txt
L:/>dir
-a--- 2025-10-18 16:28:02      0 testfile.txt

まとめ

今回は、pico-jxgLABO を使って Pico ボードに SD カードリーダモジュールと RTC モジュールを接続しました。これで大容量ストレージと正確な日時情報が利用できるようになり、Pico ボードの活用範囲が大きく広がります。 pico-jxgLABO を使うと、プログラムを書くことなく、コマンド操作だけでこれらのデバイスを接続できるので、ぜひ試してみてください。

脚注
  1. 手元の SD カードで試したところ、プルアップ抵抗がなくても動作しましたが、SD カードの種類によってはプルアップ抵抗が必要な場合があります。動作しない場合は、プルアップ抵抗の有無を確認してください。 ↩︎

  2. pico-jxgLABO の機能は、ライブラリ pico-jxglib に基づいています。 ↩︎

GitHubで編集を提案

Discussion