【パワーメーター2019】クランク用ATMEGA328P_8MHz_uSD速度測定<十分速い>

前回の手持ち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

パワーメーター】ANT+とARDUINO接続できた<DGRADEDIY様に感謝>

今回は、プログラムをデバッグ繰り返すので、専用基板を作って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);
Serial pc(USBTX,USBRX);
Serial atmega(PA_9,PA_10);
Timer t;
char data[1100];
int data_index = 0;
int main() {
pc.baud(115200);
atmega.baud(9600);
t.start();
while(1) {

if (atmega.readable()){

char c = atmega.getc();
data[data_index++] = c;
if (c == ‘\n’)
{
data[data_index] = ‘\0’;
pc.printf(“time=%d:GETC=”,t.read_ms());
pc.puts(data);
data_index = 0;
}
}

}
}

●μ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もつなげられるようにしておきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です