マイコンの有効活用

2022年技術ブログ集

マイコンの有効活用その1
インテリジェントセンサの開発

これまでのマイコンを使った電子工作を振り返って、ArduinoやESP32などのマイコンと
Windows-PCのインターフェースソフトを合理的に開発したいという思いがあります。
また、マイコンのEPROM使用量が少なくもったいないこと、そして最近は半導体不足で
マイコンの価格が上がっていることを考えて、マイコンに複数のプログラムを収納し複数
のコマンドコードモードに対応した処理が行える標準化したマイコンプログラムを開発し
ました。センサを変更しても予め搭載したコマンド処理で対応し、わざわざソフトウェア
の書き替えを行う作業が省略できるようにしました。このマイコンをInterigentsensorと
しました。Inteligetsensor1は信号処理専用、Inteligentsensor2は多変量処理用としまし
た。以下、Inteligentsensor1(信号処理用)を主に説明します。

これまでのマイコンプログラムは信号処理用途に応じてサンプリングタイムを設定し
マイコンからのデータは垂れ流しすることを基本としていました。
(マイコン単価が安いため個別に開発しても経済的負荷が小さいことが理由)
しかし、用途により必要とするサンプリングが異なっていることに加え、マイコン側
のプログラムのみならずPC側のプログラムも個別開発しなくてはならず効率が良くな
いと痛感しました。そこでマイコンプログラムを脱ロープ処理としPC側からのコマンドに従い処理を行い用途に応じたデータを送信します。

Inteligentsensor1 ESP8266(D1mini)の配線図

(インテリジェントセンサ1のコマンドと測定モード一覧)

①アナログ入力信号(マイク)のシリアル出力処理

②アナログ入力信号(マイク)の統計値抽出

アナログ入力信号のシリアル出力及び統計値抽出処理コードの統合化

以下にここまでの集大成として8個のコマンドに対応するプログラムコードを示します。

マイコンの有効活用その2
マイコンによるFFT処理のの追加

マイコンでのFFT処理はマイコン性能による制限があり、整数処理であることと
サンプリング数がバイナリな数値に限られます。例えばサンプリング数は32とか
64とか…..1024とかです。それでもマイコン内部でFFT処理ができるメリットは
大きいです。Inteligentsensor1にFFT処理コマンドを追加することにしました。

③アナログ入力信号(マイク)のFFT処理
参考 https://a-tomi.hatenablog.com/entry/2021/04/05/150056

(サンプリング限界調査)

ArduinoIDEにFFTライブラリがありこれまでも活用してきた経緯があります。Arduinoではサンプリング周波数は2~3KHz程度が限界でサンプリング数を256にするとフラッシュエリアがオーバーする(109%とか)ため128が限界です。

ESP8266はArduinoよりクロックが早くフラッシュ領域も大きいので限界までサンプリング数を高める検討を行ってみました。結果2048まで(フラッシュ領域占有74%)は可能、4096ではエラーとなりました。この結果からコマンドを以下のように設定しました。

ArduinoNanoでは、サンプル数を128に固定し100Hz,1KHz,5KHzモードを選択できるようにしました。
ESP8266では、サンプル数を2048に固定し100Hz,1KHz,5KHz,10KHz,20KHzモードを選択できるようにしました。

参考にしたコードは、https://a-tomi.hatenablog.com/entry/2021/04/05/150056です。繰り返し測定が前提になっていたり周波数やサンプル数を固定していますので、複数モード別にパラメータ書き換えを行っています。また出力はFFT値のみを改行していますが、周波数,FFT値をコンマで区切って出力するようにしています。
以下、FFTモード(コマンド)とマイコンの出力をまとめました。

FFT基本コード

参考コード「https://a-tomi.hatenablog.com/entry/2021/04/05/150056」ではArduinoではなくTeensy4.0を使用していました。またボタンSWを押したときに測定を開始し、SDカードに書き込む機能付きです。余分なコードをはぎ取って、繰り返し動作を止めています。

マイコンによるFFT処理と測定周波数の確認

サイン波発信器を基準周波数音源として、ESP8266のマイク入力信号をFFT処理し発振周波数(ピーク)を求めました。
結果、低域での線形性は良くないことが判りました。

ArduinoNanoインテリジェントセンサコード(1/2)

ArduinoNanoインテリジェントセンサコード(2/2)

本マイコンプログラムコードでArduinoNano対応で計画した信号処理コード全体を
含めています。

ESP8266インテリジェントセンサコード(1/4)

ESP8266インテリジェントセンサコード(2/4)

ESP8266インテリジェントセンサコード(3/4)

ESP8266インテリジェントセンサコード(4/4)

if (val ==’o’){
int sFreq = 20000; // sampling Hz <55000 (ADC 17.5 micro sec)
//int nSamp = 256; // number of samplings
sDur = round(1000000 * (1.0 / sFreq)); // calc. sampling dur.μS
for (int i = 0; i < nSamp; i++) { // do a cycle of samplings
micS = micros(); // save sampling-start-time
vR[i] = analogRead(A0);
vI[i] = 0; // set zero to imaginal part
while (micros() < (micS + sDur)) {} // wait until cycle-end
}
// apply Hamming windowing
FFT.Windowing(vR, nSamp, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vR, vI, nSamp, FFT_FORWARD); // calculate FT
FFT.ComplexToMagnitude(vR, vI, nSamp); // mag. to vR 1st half
double peak = FFT.MajorPeak(vR, nSamp, sFreq); // get peak freq
// get peak element number
int ip = round((nSamp / 2) * peak * 1.0 / (sFreq / 2));
// convert results in vR[] into simple integer hh to record to SD
for (int i = 0; i < (nSamp / 2); i++) {
uint16_t ff = round(i * 10000.0 / (nSamp / 2.0)); // get Hz value
uint16_t hh = round(1000.0 * (vR[i] * 1.0 / vR[ip])); // relative Mag.
Serial.print(ff); // plot to Serial-plotter
Serial.print(‘,’);
Serial.println(hh);
//while (digitalRead(sW) == HIGH) {} // wait for sW pushed
// *** Peform next measurement and recording when sW pushed
//}
// end of program
}
}
// char COMMAND MODE

}

本マイコンプログラムコードでESP8266対応の計画した信号処理コード全体を
含めています。ArduinoNanoよりコード規模が大きいのは、FFT処理コマンドに
ESP8266専用のものが含まれているためです。

マイコンの有効活用その3
Windowsソフトウェアの開発


マイコンの有効活用その4
汎用データログ機能   コマンドa,b対応

mode_aは1秒サンプル、mode_bは10秒サンプルで共通です。

基本プログラム1:サンプリングタイム10msec,サンプリング時間1secで合計100データを任意ファイルにcsv形式で保存されます。ファイル名を入れずリターンすると‘temp.csv’にデータが保存されます。

基本プログラム2:サンプリングタイム10msec,サンプリング時間1secで合計100データを任意ファイルにcsv形式で保存し1秒間のデータをグラフ表示しjpgファイルにも保存します。ファイル名を入れずリターンするとデータは保存せずグラフ表示のみ実行します。

基本プログラム3:繰り返し回数を入力して、サンプリングタイム10msec,サンプリング時間1secでグラフ表示を行います。1秒毎のグラフはProcessingで作成した実行形式「LoadingImages.exe」を起動します。(グラフの更新表示機能)
      [Processingで参照する画像ファイルは「test.jpg」]

基本プログラム4:繰り返し回数を入力して、サンプリングタイム10msec,サンプリング時間1secで1sec間の平均値、標準偏差値、最大値、最小値を抽出しタイムスタンプを加え「log1.csv」に保存します。抽出した平均値と標準偏差のグラフ表示を行います。
リアルタイムグラフ表示はProcessingで作成したLoadingImages.exeを使用します。

マイコンの有効活用その5
バイオロギング機能(50秒サンプリング)  コマンドc対応

呼吸数などのバイオ信号を抽出するため10msec,50秒のバイオ信号をサンプリングし
マイコン内蔵のFFT処理ではなくWindows-PCでFFT処理をするプログラムです。

長時間のバイオロギング機能 1分毎集計を繰り返す処理

50秒間測定しFFT処理を行い、呼吸周期、脈拍周期、活性度を特徴値として抽出し csvファイルにタイムスタンプとともに保存します。(間隔は1分となるよう調整) リアルタイム表示はProcessingで作成した「LoadingImages.exe」を使用します。 最大ループ回数は360(6時間)まで確認済。

一分毎にループ回数の信号処理を行い画像ファイルとして保存します。実信号とFFT信号と特徴値の経過グラフが出力されます。また、特徴値はログファイル「ファイル名.csv」に保存されます。

特徴値ログファイル

出力グラフ(実信号,FFT,経時変化)

マイコンの有効活用その6
心拍センサ(APDS9008)測定1msec,30sec 洞調律評価プログラム  コマンドe対応

バイオロギング(mode_c_1.py)コードを利用してサンプリングタイムを10→1msecに
変更して心拍領域内でピーク検出を行い心拍数を求めます。このプログラムではマイコン
内蔵のFFTを使用せずWindows側でFFT処理を行います。

出力グラフ

マイコンの有効活用その7
心拍センサによる交感神経指標抽出(APDS9008)1msec,200sec測定  コマンドf対応

交感神経指標抽出には2Hz以下の低周波数領域データが必要です。1msec,200秒の
長時間心拍波形測定データから洞調律グラフを求め、等時間隔化とオーバーサンプ
リングのために保管処理を行います。このプログラムではマイコン内蔵のFFTを使
用せずWindows側でFFT処理を行います。

ファイル名を入力し⏎すると1msec,200secで測定を開始する。「ファイル名200.csv」に保存されデータ波形が表示されます。

マイコンの有効活用その8
簡易統計処理10msec,1sec測定プログラム  コマンドg対応

データを保存するファイル名を入力⏎、測定回数(1秒間隔)を入力すると1秒間100データ中の
平均、最大、最小の測定を繰り返します。
「ファイル名.csv」にタイムスタンプを付記して保存します。

マイコンの有効活用その9
簡易統計処理100msec,10sec測定プログラム  コマンドh対応

データを保存するファイル名を入力⏎、測定回数(10秒間隔)を入力すると10秒間
100データ中の平均、最大、最小の測定を繰り返します。
「ファイル名.csv」にタイムスタンプを付記して保存します。

マイコンの有効活用その10
マイコンでFFT10KHz/128測定(縦出力) Nano:10KHz/64  コマンドk対応

マイコンでFFT処理を行いWindows-PCにデータを送ります。
データ形式は縦型と横型があります。 縦型は周波数と強度を
出力します。周波数値を変換済で出力します。

マイコンの有効活用その11
マイコンでFFT10KHz/128測定(横出力) Nano:5KHz/64で縦出力  コマンドl対応

マイコンでFFT処理を行いWindows-PCにデータを送ります。
データ形式は縦型と横型があります。 横型はマイコン側で周波数は換算せず
強度をサンプリング数だけコンマ区切りで出力します。(周波数は出力しません)
マイコン側へプロファイルの平均処理をするためです。

マイコンの有効活用その12
マイコンでFFT10KHz/64測定(横出力) Nanoと共通  コマンドk対応

マイコンでFFT処理を行いWindows-PCにデータを送ります。
データ形式は縦型と横型があります。 横型はマイコン側で周波数は換算せず
強度をサンプリング数だけコンマ区切りで出力します。(周波数は出力しません)
マイコン側へプロファイルの平均処理をするためです。

マイコンの有効活用その13
マイコンでFFT20KHz/1024測定(縦出力) Nanoは非対応  コマンドn対応

マイコンでFFT処理を行いWindows-PCにデータを送ります。
データ形式は縦型と横型があります。 縦型は周波数と強度を
出力します。周波数値を変換済で出力します。

マイコンの有効活用その14
マイコンでFFT10KHz/1024測定(縦出力) Nanoは非対応  コマンドo対応

マイコンでFFT処理を行いWindows-PCにデータを送ります。
データ形式は縦型と横型があります。 縦型は周波数と強度を
出力します。周波数値を変換済で出力します。

タイトルとURLをコピーしました