最終修正日:2021年3月2日
RaspberryPiではSDカードが標準で接続されており、記憶媒体として使用できます。
一方Arduinoでは一時的にはユーザメモリ上に記録できますが、ユーザ用の記憶媒体はありません。
一般的な記憶媒体はSDカードだと思うのでモジュールを探しました。
幾つかモジュールが提供されていますが情報がきちんと提供されているものがなかなかありません。とりあえずMicro-SD-Card-Moduleというのを入手したのでこれを使える様にしたいと思います。※LabVIEWとは関係なく、Arduino単体でSDカードを使う案件を検討するにあたり別途調査しました。
接続ですが、ちょっと癖があるようです。ライブラリの制限から一部PIN固定のようです。CSのみ変更可能のようです。
※SDシールドとの接続が前提でライブラリが作成されているのが理由かもしれません。SDカードは基本3.3Vのはずですが、このモジュールはレベル変換回路が入っており、5VでOKです。
基本SPIバス通信です。1Mbps程度かと思われます
https://garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SD/card_notes.html
ArduinoPin 意味合い Micro-SD-Card-ModulePin(J2) GND グランド GND 5V 電源 5V供給し、内部で3.3V VCC D12 データ入力 MISO D11 データ出力 MOSI D13 シリアルクロック SCK D4 チップセレクト CS
ArduinoPin 意味合い GY-2561(TSL2561) 3V3 電源 3.3V VCC GND グランド GND A4 マスタが送信するクロック信号 SCL A5 データ信号 SDA - INT モジュール基板の情報が定かで無い。亜種基板がたくさんあり、中華版は資料すら提供していない。オリジナルモデルを特定できないと使えないと云った事態です。
LINXおよびLIFAにはSDカードに対する読み書きのExampleは有りません。SPIでの読み書きなので一生懸命書けば出来るはずですが、Exampleがないのは辛いですね。
また、TSL2561のEXAMPLEについてもLINXおよびLIFAには有りません。レジスタの扱いだけですが、ちょっと、、って感じです。
ちなみに、Arduino Compatible Compiler for LabVIEW(Aledyne-TSXperts)ではSDカード読み書きのExampleが有りますので、これを参照してLINXで書いてみることは可能です。また、TSL2561については残念ながらExampleは用意されていませんでした。Arduino-Cで書くとどの程度の規模なのか検討しました。
SDカードの読み書きもTSL2561の遣り取りもライブラリは見つかりました。ところが、
- TSL2561のライブラリは、サンプリングが13msecの時は動くものの、なぜか101msecや402msecに変更すると動きません。
Arduino-Cではパラメータを外部から入力して動かすという使い方を実現しようとすると、なかなか難しい部分にあります。
やはり、自分でちゃんと書かないといけません。リンクしたライブラリファイル自体に問題があった場合、なかなか修正が厄介です。- SDカードについてはスケッチ例が6つ(CardInfo/DataLogger/DumpFile/Files/Listfiles/ReadWrite)が用意されています。
手元にあったSDDC/16GBのMicroSDカードで確認しました。フォーマットはFAT32です。
- Ex)ReadWriteはTEST.txtを作成して値の読み書きをするのですが、これは出来ていました。
- Ex)Filesはexample.txtというファイルを処理するようですが、よくわからない結果です。
- Ex)CardInfoは動くには動きますがおかしな値を返しました。16GBなのですが2.6GBと云っています。そして書き込まれているファイルの日時がおかしいです。
日付は自身がRTCを持っていないからかもしれません。2000年1月1日0:00から始まっているようです。
カード容量はFAT32の制限でしょうか?上限4GBと云う制限があります。ボリュームサイズは2TB制限ですが、空き容量の計算は32bitで扱うとすれば、こんな結果になるのかと思います。- Ex)DataLoggerはアナログ入力の0..2の3chをずっとADC変換してファイルに書き出しています。
DATALOG.txtとして保存しています。タイムスタンプはやっぱりおかしいです。- Ex)Listfilesはコマンドラインで dir と打ち込んだときの結果のようです。タイムスタンプも出してほしいですね
- Ex)DumpFileは登録されているSDカード内の中身を読み出して標準出力に書き出すというもののようです。
基本的な動きの確認は出来ました。
DataLoggerのExampleのAD取込部をTSL2561のデータRead部に置き換えれば、照度のデータログを作成することは出来そうです。
これに関してはスンナリ出来ました。折角なので Arduino Compatible Compiler for LabVIEW で 実現出来ないか トライします。7日間の評価期間で、、、、
結論からすると、ACC4LVに用意されているExampleのSD・・・を組み合わせてゆけば実現出来ます。
幾つか判ったこととして、
- SDカード用の関数は幾つか(18)用意されています。その中の“SD Data Logger VI”のダイアグラムを確認すると、1回のデータの書き込みに対してOpen/Closeを毎回行っていることが判ります。
Loopでログを継続的に書き込む場合、Open/CloseはLoopの外に置くものなのですが、これはデータが書き込まれないという結果に至ります。- ファイルサイズやVolumeサイズが取得出来るのですが、SDカードのフォーマットとして基本FAT32にしますのでファイルサイズは4GBMaxです。そしてVolumeの最大は32GBのようです。で空き容量を確認すると、4GB以下の値が返ります。変数がU32だからだと思います。
- 書込速度についての確認をしたいのですが、今のところ確認方法を見いだせていません。
少なくとも1msecのEvent毎にSDカードに書き込むと云う事は実現出来るという記事を確認しました。後は書き込む文字列サイズ次第になりますが、この辺りは検証のための方法論から確認しないといけません。SPIのクロックは1MHzのようです。- シリアルモニタを考えた場合、LoopRateは100msec程度が限界になってしまいます。
オンボードでの処理とモニタのための出力を別タスクにしたいところですが、Arduinoはそのような処理は出来ないため、自分で調整するような方法を検討する必要があります。
割り込み処理は可能なので、そちらを駆使すると云う事になりそうです。ACC4LVにはそのExampleは用意されています。実際にExampleを実行した例を挙げておきます。
![]() |
![]() |
![]() |
免責事項
本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。
商標・登録商標
Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。