公開日:2020/09/05
title.png

12th Season


#12-6 DUEにSDカードI/Fを接続する

 これまでATmega328系のUNO等をメインで使って、色々な周辺モジュールを制御してきたのですが、中には、先輩方の作ったライブラリを使わせてもらって制御してきたモジュールも多々ありました。
 TFTシールドの様に、自前で必要な関数群を作って制御した物に関しては、自分でDUE用にコードを書きかえれば済む話(例えば「#12-1 DUE+TFTシールド」)だったのですが、先輩方の作ったライブラリを使っていたモジュールに関してはどうでしょうか?

 SDカードI/Fもそんな中の一例です。今回は、DUEにSDカードI/Fを接続して、SDライブラリな等がすんなり使える物かどうか、試してみたいと思います。

SDカードI/Fを接続しよう

 筆者は手作りのSDカードピッチ変換ソケット(下図)を使います。作り方については「#6-5 microSDカードI/Fを自作する」をご覧ください。

ar65_sdsock.jpg

※作るのが面倒な方は、市販のSDカードI/Fモジュール(SPI接続のもの)でもOKです。ただし、UNO用に市販されているものは、インターフェイスが5V I/Oになっている場合があるので、注意して下さい。

 SDカードは3.3Vインターフェイスの機器なので、5VのUNOではL/Sが必要でした。デフォルトで4MHzという高速なSPI通信が必要なため、L/Sの速度が足りず、途中でインターフェイス回路の対策を実施しています(「#9-6 SDカードI/F回路の改定」を参照)。
 DUEはSDカードと同じ3.3V I/Oの機体ですので、L/S無しで接続することが可能です(以下接続表)。

Arduino DUE STM32 接続 SDカードI/F
D22(SS) PA4(SS) 1 CS
D75(MOSI) PA7(MOSI) 2 DI
GND 3 VSS
3.3V 4 VDD
D76(SCK) PA5(SCK) 5 SCLK
GND 6 VSS2
D74(MISO) PA6(MISO) 7 DO

 後ほどリンクするプログラムは、UNO,STM32にも対応してあるため、改めてSTM32との接続端子も記載しておきました。UNOとの接続にはL/Sが要るので、こちらの回路図をご確認ください。また、DUEのSS端子は、TFTシールドを装着した場合に使えなくなるピンソケットを避け、2列ピンソケットの中からD24を選択しています。

 DUEがやってきた時に作ったこちらの表を見ても、SPIに割り当てられたD74〜D76という端子は載っていません。基板周辺部に配置されたピンソケットのみを表に起こしたためです。DUEのSPI端子は、ICSPピンヘッダに引き出されています(下図)。

a126_spipin.jpg

 UNOのICSPピンヘッダと互換になっているので、ここの電源端子=5Vです。3.3Vではないので、SDカードI/FのVdd端子に繋いではいけません。SDカードへは、DUEの3.3Vピンソケットから給電してください。

 上の表と図を頼りに、DUEとSDカードI/Fを接続してください🔌

制御プログラム

 UNOを使ったSDカード上のファイル操作プログラムは、「#6-6 ポータブル気温・湿度ロガ」で作ったポータブルロガ(portbl_logger.ino)に集約されています。時々、SDカード上のファイルを操作・閲覧したい時に使いたくなるのですが、起動すると自動的に気温・湿度データを計測してログを書き込みに行ってしまうため、SDカードの閲覧には使い難いプログラムでした。
 これを機に、portbl_logger.inoのSDカード操作機能だけを抽出して、新たにSDファイラ(sd_filer.ino)を作ろうと思います。以下、portbl_logger.inoにインプリしてあった機能を包含して、SDファイラのコマンド目標仕様とします。

動くかな?

 元のプログラム(portbl_logger.ino)から該当箇所を抜き出して、追加機能をインプリするだけでしたので、あっさりとコンパイルは通ってしまいました。完成版プログラムをリンクしておきます。

  完成プログラム:sd_filer.ino

 さて、動くでしょうか?以下、実験中の様子です。

a126_expr.jpg

  実験サンプル:【 】内はシリアルモニタからの送信データ
  【dir】
  OK+ dir /
  SYSTEM~1/
    INDEXE~1    76
  A.WAV    217468
  A.TXT    951
  OK: dir

 SDカード内のファイル一覧を表示できました。良い様です(1^−^)。素晴らしい。


 全機能と、追加した機能をざっと確認しておきました(↓)。

  実験サンプル:【 】内はシリアルモニタからの送信データ
  【dump,a.wav】
  00000000: 52 49 46 46 74 51 03 00 57 41 56 45 66 6d 74 20 RIFFtQ..WAVEfmt
  00000010: 10 00 00 00 01 00 01 00 2b 24 00 00 2b 24 00 00 ........+$..+$..
  00000020: 01 00 08 00 64 61 74 61 50 51 03 00 80 80 80 80 ....dataPQ......
  00000030: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  00000040: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  00000050: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  00000060: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  00000070: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  00000080: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  00000090: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  000000a0: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  000000b0: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  000000c0: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  000000d0: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  000000e0: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  000000f0: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ................
  ---- (n)ext / (q)uit / (h)ead / (b)urst > Quit
    【q】 …… (q)uitコマンドを送信
  OK: dump


  【more,a.txt】
    : 表示結果は省略。
    :  ・ファイル(a.txt)の内容が16行毎に表示される。
    :  ・サブコマンドが受け付けられた。
  OK: more

 これで、SDカードアクセスに関してはUNOと同様にプログラムして実行できることが判りました。

アクセス速度計測

 「#6-8 ATmegaのEEPROMを使ってみる」で作ったプログラム(test_eeprom.ino)をDUE用に少しだけ改造して使い、SDカードへのアクセス速度も測定しておこうと思います。

  計測用プログラム:test_eeprom.ino

 参照記事のタイトルも、プログラム名も、「ん?合ってる?」って、なりますが、この回でEEPROMのみならず、SDカードのアクセス速度測定も実施していますので、合っています(不揮発メモリつながり!)。
 シリアルモニタから実行可能なコマンドについては、こちらをご覧ください。

  実験サンプル:【 】内はシリアルモニタからの送信データ
  【bench】
  OK+ SD benchmark 32[KB]: WR.
  OK+ check sum: 0x0(write), 0x0(read)
  OK+ write: 32768[B], 403.58[ms], 81192.31[B/s]
  OK+ read: 32768[B], 317.04[ms], 103354.74[B/s]
  OK: benchmark finished

 以前ベンチマークテストに使っていた2GバイトのSDカードが壊れてしまったため、新たに16GバイトのSDカード(クラス4)を用い、UNO,DUE,STM32でデータを取り直したので、以下にまとめておきます。

Arduino アクセス速度
[バイト/s]
16Gバイト
C4,FAT32
UNO write 21,030
read 24,607
DUE write 81,192
read 103,355
STM32 write 72,060
read 94,412

 UNO @16MHzに対して、DUE @84MHz、STM32 @72MHzですので、MCUの周波数比程の向上は見られませんが、やはりDUEとSTM32は速いです。


 SDライブラリが何の問題もなく動いてしまいました。同一仕様で作られたSPIライブラリが吸収してくれたようです。過去にUNO+SDカードを使ったアプリケーションもいくつか作ってきているのですが、必要があればDUEに移植するのも容易だと思われます。


btn_arduino.png

btn_prev.png btn_next.png

home