前回の手持ちCPUのクランク基板への適応性検討で、TOTALバランスの良かったATMEGA328P(3.3V8MHz内部クロック)で、μSDカード書き込み速度を測定してみました。
●結果
200μsecと十分高速でしたので、他の処理をいれてもクランクのデータロガーとして8MHzでも十分であることが判って良かったです。3.3VのArduinoなので、センサ、無線モジュール、μSDともダイレクトに接続できるので、結構使えることが判って良かったです。
●ATMEGA328P書き込み基板作った
昔DgradeDIY様から教えていただいた記事を思い出しながら
Arduinoの本家様https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard
Arduinoの解説が詳細なこのお方のブログ
https://ht-deko.com/arduino/atmega328p.html
今回は、プログラムをデバッグ繰り返すので、専用基板を作ってUNO上に設置しました。単純にシリアルとRESETをつないだだけで、UNOはCPUレスです。ですので、USBシリアル変換モジュールとつなぐのと同じ意味ですが、UNOが土台になって作業性はよいです。できるなら、ATMEGAを頻繁に抜き差しすので、
ゼロプレッシャーICソケット (28P)が欲しかったです。
●ブレッドボードでμSDデバッグ
ATMAEGAなどUSBコネクタがついてないCPUの場合デバッグが非常に大変なので、今回は、使い慣れたmbed NucleoL432KCを3.3V電源とATMEGAからシリアル通信データをUSBでPCへ表示させる役割をさせます。
mbed側のプログラムも備忘録しておきます。ATMEGAがからシリアル受信してPCへUSBTXするだけです。
#include “mbed.h”
DigitalOut myled(LED1); if (atmega.readable()){ char c = atmega.getc(); } |
●μSDカード書き込みプログラム
Arduinoは、初心者なのですが、mbedより格段にユーザー数が多く、ありとあらゆるアプリケーションのプログラムが公開されているのがArduinoの資産だと思います。
ですので、私は、mbedオンリーなのですが、Arduinoもいじらないと電子工作活動がなりたたないということで、使わさせていただいております。
秋月のマイクロSD基板の使い方はQIITA記事にありました
https://qiita.com/hikoalpha/items/c7812a34182db07036ef
参考にさせていただいたプログラム作者様のブログ
SDカードライブラリの基本
https://garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SD/card_notes.html
①ATMEGA328PでSDカード書き込みを製作された方
http://tyk-systems.com/ATmega328-2/ATmega328-2.html
②Arduinoで高速SDカードロガーを製作された方のブログ
https://offgridkin.com/archives/780
これらプログラムをコピペさせていただいて、自分の評価用を作りました。
#include <SD.h > //SDカードライブラリーを読み込む unsigned long timeMS=0; String dataString = “”; const int chipSelect = 10; //chipselect 10 SPIはデフォルト File dataFile; int i=0; void setup() {Serial.begin(9600); pinMode(chipSelect, OUTPUT); // pinMode(8, OUTPUT); //LED if (!SD.begin(chipSelect)) { // check the SD card is available or not, SDカードが利用可能などうか確認 Serial.println(“Card failed, or not present”); // in the case of SD card error, SDカード読み取りエラーの時のメッセージ digitalWrite(8,HIGH); }else{ digitalWrite(8,HIGH); delay(500); digitalWrite(8,LOW); Serial.println(“Card initialized.”); //in the case of SD card is available, SDカードが読み取れた時のメッセージ }}void loop() {Serial.println(dataString); PrintToFile(dataString,100); delay(10); } // Subroutine for writing data in SD card, SDカードへのデータ書き込みのためのサブルーチン void PrintToFile(String dataIn,int dnum){ digitalWrite(8,HIGH); //delay(20); //check data writing File dataFile = SD.open(“datalog.txt”, FILE_WRITE); // define the filename, ファイル名を定義。 for (i=1;i<dnum;i++) { timeMS=millis(); dataString=String(timeMS,DEC); if (dataFile) { //if the file in the SD card was open to wrihte, SDカードの対象ファイルを開くことができれば dataFile.println(dataString); // write data into the file, データの記入 //Serial.println(dataIn); // print to the serial port too,シリアルポートにも出力して確認。 }else { // if the file isn’t open, pop up an error message, ファイルが開けないときのエラーメッセージ Serial.println(“error opening file”); } } dataFile.close(); digitalWrite(8,LOW); //check data writing } |
●結果
100個ずつ時間データを測定して、ファイルCLOSEしてSD書き込みするというLOOPをくりかえして、周期は5個で1msecなので200μsecでした。
グラフをみると、100個書いてCLOSEしてまたOPENするまで38msecかかってますので、バッファにためこんで、まとめて書き込む方式でやれば途切れが少ないデータログができると思います。他のデータロガーは、割り込みを使っているのが多いのでCLOSE-OPEN間の遅延をどう処理しているかをみてみます。
●以後
ひずみゲージセンサとIMUと接続してシステム全体でのスループット電力消費を測定してみます。Xbeeもつなげられるようにしておきます。