HOME >> 鉄道模型工学 測定装置の製作 測定の自動化 システムの組立て
■ 測定台への組付け
各測定ユニットが完成したので、測定台にそれぞれを組付け、機能テストを兼ねて模型車両を走らせた。 測定台は床に置き、データ処理のためのデスクトップパソコンとはUSB ケーブルで接続している。
************* 動力特性の測定 ***************** #define SLIT1_PIN 13 #define SLIT2_PIN 12 #define SLIT3_PIN 11 #define SLIT4_PIN 10 #define LEDG_PIN 9 #define LEDY_PIN 8 #define LEDR_PIN 7 #define BASE_PIN 6 void setup() { pinMode(SLIT1_PIN,INPUT); pinMode(SLIT2_PIN,INPUT); pinMode(SLIT3_PIN,INPUT); pinMode(SLIT4_PIN,INPUT); pinMode(LEDG_PIN,OUTPUT); pinMode(LEDY_PIN,OUTPUT); pinMode(LEDR_PIN,OUTPUT); pinMode(BASE_PIN,INPUT); Serial.begin(9600); } void loop() { int voltage; int current; int angle; unsigned long vol; unsigned long cur; int angle_pin = 0; int vol_pin = 1; int cur_pin = 2; int n; unsigned long t1; unsigned long t2; unsigned long tt; int slit1; int slit2; int slit3; int slit4; int cancel; //ユニット1 slit1 = digitalRead(SLIT1_PIN) ; slit2 = digitalRead(SLIT2_PIN) ; if (slit1 == HIGH & slit2 == HIGH){ //準備OK vol = 0; cur = 0; n = 0; digitalWrite(LEDG_PIN, HIGH); //入口スリット while (slit1 == HIGH) { slit1 = digitalRead(SLIT1_PIN) ; digitalWrite(LEDG_PIN, HIGH); } t1 = millis(); digitalWrite(LEDY_PIN, HIGH); //出口スリット while (slit2 == HIGH) { voltage = analogRead(vol_pin); current = analogRead(cur_pin); vol = vol + voltage; cur = cur + current; n = n + 1; slit2 = digitalRead(SLIT2_PIN); } t2 = millis(); angle = analogRead(angle_pin); cancel = digitalRead(BASE_PIN) ; if (cancel == LOW){ angle = 999; } //出力処理 tt = t2 - t1; String buf = String(vol) + "," + String(cur) + "," + String(n) + "," + String(tt)+ "," + String(angle) + ",D" + ",E"; Serial.println(buf); digitalWrite(LEDY_PIN, LOW); delay(500); } else { digitalWrite(LEDR_PIN, HIGH); delay(500); digitalWrite(LEDR_PIN, LOW); } //ユニット2 slit3 = digitalRead(SLIT3_PIN) ; slit4 = digitalRead(SLIT4_PIN) ; if (slit3 == HIGH & slit4 == HIGH){ //準備OK vol = 0; cur = 0; n = 0; digitalWrite(LEDG_PIN, HIGH); //入口スリット while (slit3 == HIGH) { slit3 = digitalRead(SLIT3_PIN) ; digitalWrite(LEDG_PIN, HIGH); } t1 = millis(); digitalWrite(LEDY_PIN, HIGH); //出口スリット while (slit4 == HIGH) { voltage = analogRead(vol_pin); current = analogRead(cur_pin); vol = vol + voltage; cur = cur + current; n = n + 1; slit4 = digitalRead(SLIT4_PIN) ; } t2 = millis(); angle = analogRead(angle_pin); cancel = digitalRead(BASE_PIN) ; if (cancel == LOW){ angle = 999; } //出力処理 tt = t2 - t1; String buf = String(vol) + "," + String(cur) + "," + String(n) + "," + String(tt)+ "," + String(angle) + ",U" + ",E"; Serial.println(buf); digitalWrite(LEDY_PIN, LOW); delay(500); } else { digitalWrite(LEDR_PIN, HIGH); delay(500); digitalWrite(LEDR_PIN, LOW); } }
Arduino を搭載したセンターユニットは、パソコンに近いように測定台の左の方に設置し、測定台に開けた穴を使って、USB ケーブルや電源ケーブルを通している。
電圧・電流測定ユニットは、測定台中央の配線途中に固定している。 また、測定途中において、電圧設定の状態をチェックする目的でデジタル電圧計を奥の方に設置した。 この電圧計の電源は独立したACアダプターを使用している。
車速測定ユニットは、二ヶ所ある直線部の終端に設置している。 台の下から木ねじで固定している。 模型車両を走行させるコントローラは、TOMIX のN-401 を使用し、センターユニットや電圧計の電源であるACアダプターもテーブルタップにつないでいる。
■ スケッチの修正
ハードが揃ってきたので本格的な自動測定のプログラムに向けてレベルアップを行う。 まず、マイコン本体のArduino のスケッチを記述する。
主な作業はスリットを通過中に、電圧と電流を計測する事と、通過時間を計測する事である。 その他に、スリットが準備状態であるかもチェックし、計測中にはLEDを点灯させることも実施させる。 この計算フローは、
この作業をユニット1とユニット2で交互に実施し、ユニット1では、"D" の文字を、ユニット2では "U" の文字を付加して送信するようにした。 これは、台を傾斜させた場合に、下り坂になる事と、登り坂になる事を示し、牽引力計算の時には、これを判定し、駆動力と制動力に分けて計算させるためである。
また、光センサが不調な場合、赤色LED を点灯して、注意を喚起することとした。 このチェックは0.5秒毎に実施させる。 作成したスケッチを右に示す。
■ EXCELによるデータ処理
Arduino から送信されてきたデータをパソコンに取り込み、測定データを計算して求められた 電流、スケールスピード、牽引力 のデータを記録数と共に、グラフにリアルタイムに表示する処理を EXCEL のマクロを使って設定する。
処理プログラムは、「お手軽マイコン・ボード Arduinoとセンサで計測&解析」 大川善邦著、CQ出版社 の第5章 VBAでのアプリケーション開発に示された処理プログラムを活用した。 まず付属のCDよりサンプルプログラム Arduino1.xlsm をEXCELで開く。 マクロをを使用するのでマクロを有効にしておく。 そして、計算式が異なるし、表示させるグラフも異なるので速度特性測定用と牽引力特性測定用の二つのフォルダを作成する。
速度特性測定用のシートでは、下記の様な計算シートを作成する。 実際に使用した後の画面を示しているが、Arduino から送信されてくるデータの表示欄、その結果をもとに計算して求める測定値を表示する欄を設け、測定開始行や測定回数を表示する欄も設けておく。 測定開始行はデータ上書を防止するため細工で、ここに示された行数はデータの最終行を示しているので、この下の行から入力させるようにする。 測定回数の表示はいま何回目の測定を実施しているか表示するもので、25回目以降は欄を橙色に変更し、測定終了後は赤色で示し、記録作業は完了していることを示す。 続けて測定を実施する場合は、開始ボタンを押せば再開する。
そして、一行ごとにデータを記録していくので、その計算結果をグラフに表示するように設定しておくと、測定結果はリアルタイムにグラフ表示される。 次に牽引力特性も同様に設定する。
牽引力特性の測定には、測定対象の車両の重量、重り車両の重量と摩擦係数、水平位置での傾斜角度と共に、電圧設定値も設定しておく。 電圧設定値はパラメータ値としてグラフに示される。
測定された指示値から傾斜角に換算する場合、ゼロ点に履かせたゲタを考慮し、その値を測定前に入力するようにしている。 もし、ゼロ点がドリフトした場合の対策である。 また、登坂と降坂の判別は、送信された6番目の文字の U か D を判断し、
= IF(G6="D",-1,1)
の関数を使用して、D であれば降坂と判断して、-1とし、それ以外なら +1 として牽引力計算にかけ合わせるようにした。 牽引力は、動力車自身の重さと、重り車両の重さにsinθを掛けて、重り車両の走行抵抗分を加えたものとして計算する。
次に、マクロの記述を作成する。
Arduino から送信されてくるデータは、速度特性でも牽引力特性でも同じであるが、表示させるシートが異なるので同じものを二つ作りシートごとの表示位置を設定させておく必要アある。 また、受信開始のボタンによって作動させるマクロの設定もそれぞれ設定しておく。
計測の繰り返し回収は、一気に測定してしまう意図で、30 回と設定している。 30回測定後はマクロを終了し待機状態としているが、この間にデータのチェックや表示の修正などを実施できるようにした。 特に、グラフのスケールは、この30回のデータを見ながら修正することが出来る。
最終行の記述は画面をリフレッシュさせる命令で、これによって計算されたデータがグラフに表示される。 また、その後、データの保存処理を実施する命令、
ActiveWorkbook.Save
の一行を追加している。
なお、Excel のVBA を実行する際は、Arduino のシリアルモニタとは両立しないので、モニタを閉じておく必要があります。 また、Excel ファイルはテンプレートファイルを設定しておき、データ整理がしやすい様に、車両のモデル毎にコピーを作成している。