Arduinoの測定機応用

2021年技術ブログ集

Arduinoの測定機応用その1
音響特性測定装置(TW-02)

Processingを学んで一番大きな収穫は、”PCとのきちんとした通信”をすることで応用
範囲が広がることでした。
これまでのArduinoの使い方は、IoTエッジマイコンとして使えればよいということで
電源投入から始まる無限ループコードを使用してデータ垂れ流すことができればよしと
考えてきました。(データロガー、IoTシステム、Loraシステム、UDP通信[ESP32])
Arduino活用として複数のコマンドをArduinoに送りコマンド毎のプログラムを実行する
という”無限ループ活用からの脱却”をしてみたいと思いました。
別々に試作した音響測定装置とRGB測定装置を合体させるという報告をしたいと思います。

(音響特定測定装置の基本仕様)  
  周波数掃引方式を選択しプログラマブル発振はArduinoのTONE関数を使用
  アボカドの音響特性は各周波数ごとの入力波の減衰(吸収)を測定
  周波数特性(減衰量)はマイク信号AC振幅(256回分)の残差平方和を計算

  測定データの蓄積と表示はWindows-PCとUSB接続(UART通信9600bps)
  データ保存するファイル名を入力改行すると測定装置がスタート信号を受け
  て一連の測定を開始測定が終了すると同一フォルダー内に“ファイル名.csv”
  でデータが保存される。(エクセルでの編集が可能) 

音響特性実験機

発振機:ArduinoのTONE関数を使用して矩形波(Duty=50%)を発振
周波数を50~1000Hzまで1Hz刻み矩形波振幅は0-5V
各周波数で阪神時間は100mSec (デジタルPINは11番を使用)
マイクロスピーカユニット(2W,8Ω)をArduinoデジタルピンに直結
受信機:コンデンサマイクユニット(OPアンプ付き)
Arduino内臓のADC(10bit)を使用し上記角周波数ごとに256回サンプリング
を行いOffset電圧(1.78V:ADC値で366)を補正し各周波数での平均パワー
を計算
通信方式:シリアル(UART:9600bps)で周波数とパワーをコンマ区切りで出力

音響測定装置(TW-02)

Arduinoプログラム Avocado02.ino

Arduinoの測定機応用その2
音響特性・RGB測定装置(TW-03)

(開発ポイント)
 RGB測定と音響特性測定を同一の測定装置で行うことができる
 測定モードごとにインジケータLEDで表示

(TW-03の筐体内部)
 ・ArduinoにD級アンプを介して発信機(振動ユニット)
  受信機(マイクユニット)RGBセンサを接続
 ・将来的にはRGB全周測定用サーボモータの接続も可能

Arduinoの測定機応用その3
高速広帯域測定装置開発  TWTSP-01

Arduinoによるプログラマブル発信機では測定速度が遅いため、短時間でより広帯域を測定するTSP方式を検討しました。Arduinoは使用せず、Windows-PCのオーディオインターフェースを使用しました。インパルス応答のフーリエ変換が伝達関数であることは既知ですが、パルスをTSP(Time Spread Pulse)というsinは合成パルスを使用します。

TSP音源の設計とチャープ波形の確認  

TSP(Time Spreaded Pulse)音源波形のAC解析

TSP(Time Spreaded Pulse)音源による測定試験

Wavデータ収集プログラム  TSP_RECORDING

TSP測定システム操作方法

高速広帯域測定装置開発  TWTSP-01

主要情報は1000Hz以下にあるがエコーなどの多ピークノイズ影響が大きい。3000Hz付近の
サブピーク領域にあることが判明しました。

補足:TSP音源の生成プログラム   “TSP音源生成.ipynb“

Arduinoの測定機応用その4
フィルム型圧力センサによる硬度(降伏応力)測定

フィルムセンサ硬度計プロトタイプ

圧力最大値で1000となるように調整、Max値1000で500g相当と思われます。

フィルム型圧力センサによる硬度測定

ハンディタイプ果実硬度計の製作 :OLEDによる硬度表示

ArduinoNanoプログラムコード

圧力センサグローブの試作

従来の圧力センサはアボカド外皮にフィルムセンサを押しあて飽和値を測定するため損傷が問題でした。今回はグローブでアボカドを持ち上げアボカド自重を3点で分散させて損傷を抑制する方法を検討しました。また3点合計の最大値を硬度指標として有効か否かを検討した。

(Pythonコード)

測定データ例

・親指、人差し指、中指で対象物を支え3点測定を行った結果、単体センサの最大値は加重が分散されているため従来方法(対象物を固定し指先に着けたセンサを強く押す)の最大値よりも小さい値を示しました。これは各指に圧力が分散されるため値は小さくなったためであり、対象物へのダメージは小さくすることが期待できます。

・また3個のセンサ値を合計した累積最大値は従来圧力値(200msec間隔で測定)よりも大きい。
これは今回の測定が約10msec間隔で行われたことにより平均化が鈍くなったことによるものと思われます。累積最大値は新たな硬度指標の候補と考えられます。今後センサ数を増やすことにより累積最大値の精度は高くなると思われます。

Arduinoの測定機応用その5
AD9833による正弦波発生実験

ArduinoでのTONE関数によるプログラマブル発信機能は矩形波10KHz程度の発振が限界であることと、音響特性測定時の高調波ノイズ影響を抑えるため、より高周波まで対応し正弦波の発信が可能なICを検討しました。発信機ICのコントロールはArduinoを使用しました。

AD9833のシリアル制御プログラム

Sin波形の確認

Sin波出力の限界周波数は2MHz程度のようです。

ESP32による200KHz矩形波(duty=50%)発振実験

Arduino – ESP32 の PWM ( LEDC )で 40MHzまでの安定した高周波パルスを思い通りに出せたぞ | ページ 2 | mgo-tec電子工作

ArduinoのTONE関数は、ArduinoDUE、ESP8266、ESP32では不対応です。
ArduinoMegaでのTONE関数の最大発振周波数は65KHzでした。
ESP32(ESP8266は対象外)にはLEDCライブラリがありledcWrite関数で同じようにPWM信号の出力が可能です。

出力分解能16bitでは1.22KHzmaxで1Hz単位で設定できますが、分解能8bitに設定すると312.5KHzまで出力できます。

ただし、周波数設定離散的で、
1000000/(3200ns+25nsxN)[KHz]で
200KHzの場合は1000000/(3200+25×72)
で丁度良く設定できます。







ESP32による200KHz発振波形

ArduinoとProcessingその1
超音波距離センサとサーボモータによるArduino-Radarの製作
参考サイト Arduino Radar Project – HowToMechatronics

(Arduinoコード)     “Radar.ino”

(Processing3のDLとセットアップ)    https://processing.org/download/

ProcessingはPythonが苦手な
リアルタイム処理に適したプログラム

Arduinoシリアルデータを取り込み
リアルタイムでグラフ表示することができます。

ArduinoIDEもこの言語で製作されているので
Arduinoとの相性は抜群です。

上記ULRよりProcessingをDLし設定します。(次々頁)

Radarプログラム(processingコード)  “Radar.pde”

解凍して“processing.exe”を実行します。

Radarアプりケーションプログラム 「Radar.pde」の起動

ファイル開くとして “Radar.pde”を開きます。

ツール>フォント作成で”OCRExtended-30”を選びます。

15行目 画面サイズをモニターサイズに合わせます。
size (1366, 768);

17行目 COMポートを確認し指定します。
myPort = new Serial(this,”COM9″, 9600);

COMポートの自動検出(上記myPortを書き換える)
myPort = new Serial(this,Serial.list()[0],9600);

(動作確認)

画面に半円形のレーダースキャン画像とスキャニング方向の情報が逐次表示
されます。同心円の目盛は10cm単位です。40cmまでの近距離情報です。

植木鉢を20cm付近に置いてみました。

中心(90°)付近にある鉢が検出されました。

ArduinoとProcessingその2
Sharp製赤外線距離センサを使用したArduino_Radar

超音波距離センサの替わりに透過性のよい赤外線距離センサを使用してみました。

“SRadar.pde”

Radar評価キット*(ソフトウェア関係) 起動方法など:キット付属CDに収納

*現在キットは配布
 しておりません。

Arduinoへのプログラム書き込みはArduinoIDEを使用します。
  (下記“Radar.ino”は既に書き込んでいます。)
2. Processing3のソースコードはRadar_AUTO.pdeとして収録してあります。
  (Processinng3をインストールした場合はお使いください)
3. 今回は、ArduinoのCOMポートを自動検出するコードを入れて
  コードを実行形式にコンパイルしました。
4. 下記application.windows64をDesktopにコピーしてください。
5. 1.でプログラムを書き込んだArduinoをUSBに接続したら、
  Radar_AUTO.exeをダブルクリックしてください。 

ArduinoとProcessingその3
ArduinoNanoによるサーボモータ制御実験

USBカメラモジュールの2軸制御の検討をしました。

外部のアナログ入力電圧(0-5V)でサーボのPWMを制御するため500KΩのボリュームを使用しました。サーボモータはSG90で回転角180度二軸制御を考えて2個使用しました。

ArduinoNanoにはPWM出力が6PINあり
アナログ入力も6PIN使用可能なので
最大6個のサーボモータを駆動できます。

SG90は4.8V入力でArduinoの5V電源を
使って2個駆動していますが、6個の場合は
電圧降下が懸念されるため外部電源が必要だと思います。

カメラマウント(2軸)ユニットへの実装

(Processingコード)

ArduinoとProcessingその4
カラーセンサを使用したRGB評価装置

(Adafruitライブラリを使用したコード)   Arduinoのコード TSC34725delay.ino

10msのdelayを設定しているがデータを積算しているためか測定速度(0.7秒)が遅い。その分、RGBの出力値は“TSC34725old.ino”と比べて2桁程度大きく感度を上げています。余分な出力を省き、RGB出力をコンマ区切りとしています。またAdafruitライブラリを使用しない場合RGB値がオーバーフローを起こすことがあるため、ライブラリを使用しました。

Processingのコード

ArduinoとProcessingその5
カラーセンサデータのリアルタイム表示

ArduinoとProcessingその6
CSVファイル読み込みとグラフ表示

Processingによるシリアル入力を使って各種センサより得られたデータを表示
する例題を実施してきましたが、今回はcsvファイルからデータを読み込み表示
する機能を試験しました。

(感想)
Processingは動的なグラフ表現には適しているものの
ファイルデータを使った一般的なグラフを作成する場合座標の修正、タイトル・横軸/縦軸の目盛やグリッド表示などが煩雑になります。また、描画速度が非常に遅いです。

補足:pythonとの連携によるリアルタイムデータ表示
睡眠時バイオログ測定プログラムでの活用例

ProcessingはArduinoなどマイコンとUART(シリアル)通信が簡単にできますが、縦軸横軸をきちんと定義したグラフ表示などには適していません。
一方で、最大の魅力は「リアルタイム表示」でありpythonでは難しい領域を簡単に扱えます。
Pythonで定期的に生成したグラフを画像ファイルに落とし、Processingの更新表示機能を使用してバイオロギングに使用しました。PythonのプログラムとProcessingのプログラムを同時起動することで可能となりました。

(実はその後pysimpleGUIを使ってリアルタイム表示が可能であることがわかり
 2022年現在ではこの方法を使用していません。)

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