2025年8月12日火曜日

microSDモジュールを使ってデータを読み書き

 今回は、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)がデータを出す/受け取る方向を表しています。


💡 SPIの特徴(いいところ)

  • ✅ 速い!
    データのやりとりがとても速いので、SDカードや画面の表示などに向いています。

  • ✅ 同時に送って同時に受け取れる
    データを送りながら同時に受け取ることもできます(これを「全二重通信」といいます)。

  • ✅ たくさんの部品をつなげられる
    CSピンを部品ごとに分ければ、複数の部品をひとつのSPIにつなげられます。

📚 I2Cとの違いって?

I²Cも似た通信方法ですが、次のような違いがあります。

項目SPI通信I²C通信
配線の数4本(SCK, MOSI, MISO, CS)2本(SCL, SDA)
速さとても速い(数MHz〜)やや遅め(〜1MHz)
配線のシンプルさやや多い少なくてすっきり
よく使う場面SDカード・画面・センサー小さいセンサーなど

ライブラリを入れる手順

  1. Thonny IDE を起動
    Pico を USB でつないだら、Thonny のメニューから
    [ツール] → [パッケージを管理...] を選びます。


  2. ライブラリをインストール
    検索ボックスに 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)に接続

ソースコード

# ─────────────────────────────────────────────────────────────
# 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!
>>>
今回は、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)がデータを出す/受け取る方向を表しています。

💡 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)に接続

ソースコード
# ─────────────────────────────────────────────────────────────
# 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!
>>> 

処理の流れ
🐍 ライブラリ読み込み
machine から Pin / SPI、標準モジュール os / sdcard を import して準備。

🔧 SPI0 バス設定
SPI(0, baudrate=1 MHz, polarity=0, phase=0, sck=GP18, mosi=GP19, miso=GP16) — SDカード用に 1 MHz でオープン。

📎 チップセレクト(CS)ピン準備
cs = Pin(17, Pin.OUT) で CS ラインを制御可能に。

🔄 SD 初期化 & マウント

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! と表示して終了。

処理の流れ

  1. 🐍 ライブラリ読み込み
    machine から Pin / SPI、標準モジュール os / sdcard を import して準備。

  2. 🔧 SPI0 バス設定
    SPI(0, baudrate=1 MHz, polarity=0, phase=0, sck=GP18, mosi=GP19, miso=GP16) — SDカード用に 1 MHz でオープン。

  3. 📎 チップセレクト(CS)ピン準備
    cs = Pin(17, Pin.OUT) で CS ラインを制御可能に。

  4. 🔄 SD 初期化 & マウント

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! と表示して終了。

0 件のコメント:

コメントを投稿

Google Spread Sheetの利用

  以前に ESP32 で作っていたものを、Raspberry Pi Pico W + MicroPythonで再現してみました。 1.Googleスプレッドシートの設定 1.Google Drive → 右クリック → Google スプレッドシート 2.作成して共有をクリック