Raspberry Pi PicoのMicroPythonでSDカードを利用する


先週、Raspberry Pi PicoのMicroPythonにFATFSのサポートが追加されました。 これで FAT 形式の SD カードの読み書きが可能になります。

rp2: Add SD card + FAT support. by StereoRocker · Pull Request #6840 · micropython/micropython
manifest.py: Added sdcard module. mpconfigport.h: Added FAT driver and configuration.

というわけで早速試してみました。

利用するのは手元にあったArduino用(たぶん)の SD カードリーダです。 これはmicroSD カードを SPI モードで読み書きするものです。(MISOがMOSOになっているあたり、微妙な製品ですが・・・)

最新のMicroPythonをPicoにインストールし、次にSDカードドライバをMicroPythonのシステムに追加します。このドライバはSDカードをブロックデバイスとして読み書きするもので、MicroPythonで書かれています。(これ自体は以前から提供されています。)Thonnyなどでこのドライバ(sdcard.py)をMicroPython側のファイルシステムに保存すれば準備完了です。

 

カードリーダとPicoの結線は、以下のようにしました。現状、PicoのMicroPythonはSPIで使用するピンが決まっています。CSは任意のピンが使えますが、私は先人の業績を拝借したのでGP28を使っています。

Pico Pin Function SD-Card
6 GP4 SPI RX MISO
9 GP6 SPI CLK SCK
10 GP7 SPI TX MOSI
34 GP28 SPI CS CS
39 VSYS +5V VCC
GND GND

今回使ったカードリーダモジュールは電源が5V系だったので(信号線は3.3V/5V両用)、VCCはVSYSにつないでいます。

これで、以下のコードを実行すると、無事microSDにアクセスできました。

【2021/4/22追記】
現在のところ、microSDカードによってエラーになることがありますが、以下のリンクにあるように、タイムアウトを調整することで回避できる場合もあるようです。

Re: sdcard.py, no sd card error
At the beginning of the “sdcard.py” program I’m using is this code:
Code: Select all

from micropython import const
import time
_CMD_TIMEOUT = const(100)
I have a black 8GB SanDisk card that looks much like several in your “not working” pile. My card also did not work.

I changed that _CMD_TIMEOUT value in sdcard.py from 100 to 1000, and then my card worked!
(Not right away, after changing the code I also had to pull it out and re-insert, but then it did work.)
So that is probably worth a try.

There was a saying where I used to work about the reliability of systems that need various “magic numbers” for time delays.
A timeout limit is not quite the same as a fixed delay, but the idea still seems applicable here.

コメント