外付けマイクロSDカードリーダでArduinoプロジェクトを拡張する

6/13/2022 | Maker.io Staff

image

Arduinoを使ったプロジェクトの多くは、開発ボードにデータを保存することで大きなメリットを得ることができます。しかし、ほとんどのArduinoボードは、揮発性メモリにいくつかの変数を保持するか、内蔵EEPROMに数バイトを恒久的に保持できる最小限のストレージ機能しか持っていません。そのため、ログファイルやオーディオサンプル、収集したビデオデータなどを保存するためには、何らかの形で外部メモリを追加する必要があります。 そこで、この記事では、あらゆるArduinoプロジェクトに外付けマイクロSDカードリーダを追加して、大容量ファイルを保存する方法について説明します。

image

プロジェクトに合ったSDカードリーダを選ぶ

プロジェクトでSDカードリーダを選ぶ際、いくつか注意すべき点があります。まず、デバイスの物理的なサイズから検討しましょう。一般的なSDカードリーダと、小型のマイクロSDカードリーダから選択するのが一般的です。次に、デバイスがサポートする電源電圧について、必ずお読みください。

マイクロSDカードは厳密な3.3Vデバイスであり、過電圧による損傷や電圧レベルの変動に弱いという特徴があります。さらに、動作する際に、数百ミリアンペアが必要なストレージデバイスもあります。そのため、使用するモジュールには高品質の電源回路を搭載し、繊細なSDカードに最適かつ安全な動作条件を確保するようにしてください。

さらに、SDカードは正しくフォーマットされていないと問題が発生する可能性があるため、プロジェクトで使用する前に必ず再フォーマットしてください。ほとんどのArduino用SDライブラリは、少なくともFAT16とFAT32をサポートしています。フォーマットすると、メモリカードに保存されているすべてのデータが消去されることに注意してください。最後に、ほとんどのArduinoのコードは低速で負荷の少ないSPIモードを使用するため、SPIモードをサポートするモジュールを購入してください。

これらの条件を考慮し、このAdafruitのマイクロSDカードブレークアウトモジュールを使用しました。適切な降圧回路と論理レベル変換回路を搭載しているので、3.3Vと5VのArduinoボードでモジュールを使用することができます。

AdafruitのマイクロSDカードモジュールをArduinoに接続する

SDカードモジュールのインターフェースには、ArduinoボードのハードウェアSPIピンを使用することをお勧めします。これにより、SDカードによくあるデータ量の多い転送にMCUが追従しやすくなり、より高速な転送が可能になります。SPIピンの他に、他のデジタルGPIOラインを使ってチップセレクト(CS)ピンを追加で接続する必要があります。最後に、SDカードモジュールをArduinoの+5VとGNDピンに接続します。




この回路図のように、SDカードリーダモジュールをArduinoに接続します。CDラインにプルアップ抵抗を追加して、リーダにSDカードが入っていないときにピンがフローティングにならないようにします。


SDカードリーダモジュールの3V端子は、オンボード電圧レギュレータからの出力であることにご注意ください。したがって、3.3Vの開発ボードを使用する場合でも、Arduinoの電源ピンを必ずブレークアウトモジュールの5V入力端子に接続してください。さらに、CD出力を使って、SDカードが差し込まれているかどうかを検出することができます。カードが挿入されている場合、コネクタはこのピンをハイに引き上げます。ただし、モジュールによっては、このビットを反転させて、カード選択時にロー信号を返すものもあるので、選択したモジュールのドキュメントを再確認してください。

image
ジャンパ線とブレッドボードを使って、Arduinoと外部SDカードリーダモジュールを接続します。

SD Arduinoライブラリを使用してSDカードリーダを初期化する

Arduino IDEにはSDカードリーダライブラリが付属しており、最小限の労力でSDカードに簡単にアクセスできます。次のスケッチは、ユーザーがストレージデバイスをリーダスロットに挿入したと仮定して、標準的なハードウェアSPIピンを使用して外部SDカードモジュールを初期化するものです。

コピーコード

ご覧のように、このコードではまず標準的なSPIとSDのライブラリを取り込んでいます。そして、セットアップメソッドでSDリーダモジュールを選択するためのSerial出力とGPIOピン、およびカードがあるかどうかを検出するための入力を初期化します。次に、スケッチでカードが挿入されていることを示すCD入力がハイであるかどうかをチェックします。信号がローの場合、プログラムはシリアルコンソールにメッセージを出力し、ユーザーがマイクロSDカードを挿入するのを待ちます。Arduinoがカードを検出すると、外部モジュールの初期化を続行します。カードがリーダに差し込まれていない場合は、この呼び出しは常に失敗するのでご注意ください。

データの読み出しと書き込み

幸いなことに、SDカードへのデータ書き込みや既存ファイルからのデータ読み込みも、便利なSD標準ライブラリで簡単に操作できます。

コピーコード

ご覧のように、writeLog関数はまずFILE_WRITEアクセスフラグを使用してファイルをオープンします。一度に開くことができるのは1つのファイルだけであり、別のファイルを開く前にファイルを閉じなければならないことに注意してください。

次に、この関数は、オープン操作が成功したかどうかをチェックします。成功した場合、このメソッドはおなじみのprintln関数呼び出しを使用してログファイルにデータを書き込みます。そして最後に、プログラムの他の部分が異なるファイルにアクセスできるように、開いているファイルを閉じます。

同様に、readLog関数は、まずファイルを開きます。ファイルの内容を読み込むための特別なフラグを指定する必要はありません。上記と同様に、readLogファイルはオープン操作が成功したかどうかをチェックし、成功した場合、このメソッドはログファイルから読み込めるバイトがある限り、バイトを読み込みます。次に、Serialクラスのwriteメソッドを使って、受信したバイトをシリアルコンソールに出力します。最後に、他の関数がSDカード上の他のファイルにアクセスできるように、ファイルを閉じます。

最後に、loopメソッドは、以下のようにwriteLog関数とreadLog関数を呼び出します。

コピーコード

まとめ

image
わずかな部品を使って、Arduinoプロジェクトに数GBの外部ストレージを簡単に追加できます。


ほとんどの開発ボードは数キロバイトの不揮発性メモリしか搭載していないため、グラフィックやサウンド、またはデータロギング機能を必要とするプロジェクトでは、外部ストレージを追加する必要があります。SDカードリーダを選ぶ際には、使用するボードの電源電圧に対応したものを選ぶようにしましょう。一般的な開発ボードの多くはまだ5Vデバイスですが、SDカードは厳密に3.3Vで動作します。

開発ボードを外部SDカードリーダモジュールと接続する場合は、必ず開発ボードのハードウェアSPIラインを使用してください。Arduino UNOの場合、それらは11、12、13番ピンです。さらに、CSピンを接続する必要がありますが、これはUNOの場合、伝統的に10番ピンです。しかし、デジタルGPIOピンであれば、どのようなものでも問題なく動作します。最後に、ユーザーがカードを挿入したかどうかをプログラムでチェックできるように、CDピンを使用することをお勧めします。

Arduino IDEの標準SDライブラリを使えば、モジュールの初期化、SDカードへのデータ書き込み、ファイル内容の読み込みが簡単にできます。これらの操作はすべて1行のコードで済み、ライブラリの関数名はArduinoの標準的なメソッド名を模倣しています。



オリジナル・ソース(English)