これまでATmega328系のUNO等をメインで使って、色々な周辺モジュールを制御してきたのですが、中には、先輩方の作ったライブラリを使わせてもらって制御してきたモジュールも多々ありました。
TFTシールドの様に、自前で必要な関数群を作って制御した物に関しては、自分でDUE用にコードを書きかえれば済む話(例えば「#12-1 DUE+TFTシールド」)だったのですが、先輩方の作ったライブラリを使っていたモジュールに関してはどうでしょうか?
SDカードI/Fもそんな中の一例です。今回は、DUEにSDカードI/Fを接続して、SDライブラリな等がすんなり使える物かどうか、試してみたいと思います。
筆者は手作りのSDカードピッチ変換ソケット(下図)を使います。作り方については「#6-5 microSDカードI/Fを自作する」をご覧ください。
※作るのが面倒な方は、市販の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ピンヘッダに引き出されています(下図)。
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
さて、動くでしょうか?以下、実験中の様子です。
実験サンプル:【 】内はシリアルモニタからの送信データ
【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に移植するのも容易だと思われます。