今回は、microSDカード用の「AE-MICRO-SD-DIP」モジュールを使って、
MicroPythonでmicroSDカードにデータを読み書きする方法を紹介します。公式ライブラリを使い、SPI通信で簡単にデータを書き込みます。
🔄 SPI通信とは?
SPI(エスピーアイ)通信は、マイコン(例:Raspberry Pi Pico W)と周辺の電子部品(SDカード・液晶など)をつなぐための「データのやりとり方法」の一つです。
かんたんに言えば…
📡 SPIは、“マイコンと部品が会話するためのルール” です。
💬 どんなふうに通信するの?
SPI通信では、4本の線を使ってやりとりします。
信号線の名前 | はたらき | Pico W の例 |
---|---|---|
SCK(クロック) | データのタイミングを決める時計のようなもの | GP18 など |
MOSI(モジー) | マイコンから部品へデータを送る | GP19 など |
MISO(ミソー) | 部品からマイコンへデータを返す | GP16 など |
CS(チップセレクト) | どの部品と通信するかを選ぶスイッチ | GP17 など |
📝 MOSI = 「Master Out / Slave In」
📝 MISO = 「Master In / Slave Out」
👉 マスター(=Pico)がデータを出す/受け取る方向を表しています。
📝 MISO = 「Master In / Slave Out」
👉 マスター(=Pico)がデータを出す/受け取る方向を表しています。
💡 SPIの特徴(いいところ)
-
✅ 速い!
データのやりとりがとても速いので、SDカードや画面の表示などに向いています。 -
✅ 同時に送って同時に受け取れる
データを送りながら同時に受け取ることもできます(これを「全二重通信」といいます)。 -
✅ たくさんの部品をつなげられる
CSピンを部品ごとに分ければ、複数の部品をひとつのSPIにつなげられます。
📚 I2Cとの違いって?
I²Cも似た通信方法ですが、次のような違いがあります。
項目 | SPI通信 | I²C通信 |
---|---|---|
配線の数 | 4本(SCK, MOSI, MISO, CS) | 2本(SCL, SDA) |
速さ | とても速い(数MHz〜) | やや遅め(〜1MHz) |
配線のシンプルさ | やや多い | 少なくてすっきり |
よく使う場面 | SDカード・画面・センサー | 小さいセンサーなど |
ライブラリを入れる手順
-
Thonny IDE を起動
Pico を USB でつないだら、Thonny のメニューから
[ツール] → [パッケージを管理...] を選びます。 -
ライブラリをインストール
検索ボックスにsdcard
と入力し、結果一覧から sdcard を選択して Install。
自動的に Pico 内のlib
フォルダ にsdcard.py
がコピーされます。
回路図
接続方法:
AE-MICRO-SD-DIPの④VDDをRaspberry Pi Pico Wの3.3Vに接続
AE-MICRO-SD-DIPの⑥GNDをRaspberry Pi Pico WのGNDに接続
AE-MICRO-SD-DIPの⑦DATA0をRaspberry Pi Pico WのGPIO16(MISO)に接続
AE-MICRO-SD-DIPの③CMDをRaspberry Pi Pico WのGPIO19(MOSI)に接続
AE-MICRO-SD-DIPの⑤CLKをRaspberry Pi Pico WのGPIO18(CLK)に接続
AE-MICRO-SD-DIPの②CD/DAT3をRaspberry Pi Pico WのGPIO17(CS)に接続
AE-MICRO-SD-DIPの⑥GNDをRaspberry Pi Pico WのGNDに接続
AE-MICRO-SD-DIPの⑦DATA0をRaspberry Pi Pico WのGPIO16(MISO)に接続
AE-MICRO-SD-DIPの③CMDをRaspberry Pi Pico WのGPIO19(MOSI)に接続
AE-MICRO-SD-DIPの⑤CLKをRaspberry Pi Pico WのGPIO18(CLK)に接続
AE-MICRO-SD-DIPの②CD/DAT3をRaspberry Pi Pico WのGPIO17(CS)に接続
ソースコード
# ─────────────────────────────────────────────────────────────
# Raspberry Pi Pico W + microSD (SPI0 接続・MicroPython)
#
# SD ↔ Pico W(3.3 V ロジック専用)
# ┌─────────┬──────────────┐
# │ microSD │ Pico GPIO │
# ├─────────┼──────────────┤
# │ CS │ GP17 (任意) │
# │ SCK │ GP18 (SPI0) │
# │ MOSI │ GP19 (SPI0) │
# │ MISO │ GP16 (SPI0) │
# │ VCC │ 3V3(OUT) │
# │ GND │ GND │
# └─────────┴──────────────┘
#
# ⚠ 5 V ロジックの SD モジュールを使う場合はレベル変換必須
# ⚠ SD カードは FAT32 でフォーマット(exFAT 非対応)
# ⚠ /lib/sdcard.py を本体にコピーしておくこと
# ─────────────────────────────────────────────────────────────
from machine import Pin, SPI
import os, sdcard
# ── 1. SPI0 & SDCard ドライバ初期化 ────────────────────
spi = SPI(
0, # SPI0
baudrate=1_000_000,
polarity=0,
phase=0,
sck=Pin(18),
mosi=Pin(19),
miso=Pin(16),
)
cs = Pin(17, Pin.OUT)
print("🔄 SD 初期化中 …")
try:
sd = sdcard.SDCard(spi, cs)
vfs = os.VfsFat(sd)
os.mount(vfs, "/sd")
print("✅ SD mounted at /sd")
except Exception as e:
print("❌ SD mount failed:", e)
raise SystemExit # ここで停止して原因を確認
# ── 2. 書込みテスト ───────────────────────────────────
filename = "/sd/hello.txt"
try:
with open(filename, "w") as f:
f.write("HelloWorld\n")
print("📝 書込み完了:", filename)
except Exception as e:
print("❌ 書込み失敗:", e)
os.umount("/sd")
raise SystemExit
# ── 3. 読み出し確認 ───────────────────────────────────
try:
with open(filename, "r") as f:
content = f.read()
print("📖 読み出し結果:", content)
except Exception as e:
print("❌ 読み出し失敗:", e)
# ── 4. アンマウント ──────────────────────────────────
os.umount("/sd")
print("🔌 SD unmounted — done!")
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot
🔄 SD 初期化中 …
✅ SD mounted at /sd
📝 書込み完了: /sd/hello.txt
📖 読み出し結果: HelloWorld
🔌 SD unmounted — done!
>>>
処理の流れ
sd = sdcard.SDCard(spi, cs) # SD ドライバ生成
vfs = os.VfsFat(sd) # FAT ラッパ
os.mount(vfs, "/sd") # /sd フォルダにマウント
成功すれば ✅ SD mounted at /sd と表示。失敗時はエラーを出してプログラム終了。
5.📝 ファイル書込みテスト
/sd/hello.txt
を開き "HelloWorld\n"
を書き込む。完了後に 書込み完了 のメッセージ。 6.📖 読み出し確認
同じファイルを再オープン → 内容を
print()
し、正しく保存できたかチェック。 7.🔌 アンマウント
os.umount("/sd")
でファイルシステムを安全に解除し、SD unmounted — done! と表示して終了。
コメント
コメントを投稿