HOME >> 鉄道模型工作室 >  小型のターンテーブル式実験装置を作ろう 動力特性測定のトライ

小型のターンテーブル式実験装置を作ろう 動力特性測定のトライ

 小型のターンテーブル式実験装置を工作しています。いよいよこのプロジェクトの最終段階まできました。装置のハードとソフトの準備が出来たので、目的とする動力特性の測定について、トライを実施しました。

 

//****************************
// TurnTable-Measure-1
//   2023/10/1
//****************************
// HX711.DOUT-PIN D17
// HX711.PD_SCK-PIN D16

#include <HX711.h>

#define PATTERN 18
#define START 5
#define VOL_PIN 1
#define CUR_PIN 0
const int LOADCELL_DOUT_PIN = 17;
const int LOADCELL_SCK_PIN = 16;
HX711 scale;

void setup(){
  pinMode(PATTERN,INPUT);
  pinMode(START,INPUT);
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  Serial.begin(9600);
}

void loop(){
  int start;
  int voltage;
  int current;
  int pattern;
  unsigned long t1;
  unsigned long t2;
  unsigned long tt;
  unsigned long vol;
  unsigned long cur;
  long force1;
  long force2;
  long force3;
  long force4;
  long force5;
  int n;
  
  vol = 0;
  cur = 0;
  n = 0; 

// 測定開始ボタンを待つ
  start = digitalRead(START);
  while (start == LOW) {
    start = digitalRead(START);
  } 

// 測定開始
  pattern = digitalRead(PATTERN);
  while (pattern == HIGH) {
    pattern = digitalRead(PATTERN);
  }
  t1 = millis();
  while (pattern == LOW) {
    pattern = digitalRead(PATTERN);
  }
  
// 測定中
  while (pattern == HIGH) {
    voltage = analogRead(VOL_PIN);
    delay(1);
    current = analogRead(CUR_PIN);
    delay(1);
    vol = vol + voltage;
    cur = cur + current;
    n = n + 1;
    pattern = digitalRead(PATTERN);
  }
  t2 = millis();  

//ロードセルを読む
   force1 = scale.read();
   delay(20);
   force2 = scale.read();
   delay(20);
   force3 = scale.read();
   delay(20);
   force4 = scale.read();
   delay(20);
   force5 = scale.read();
   delay(20);
      
//出力処理
   tt = t2 - t1;
   String buf = String(vol) + "," + String(cur) + "," + String(n) + "," 
   + String(tt)+ ","+String(force1)+","+String(force2)+","
   +String(force3)+","+String(force4)+","+String(force5);
   Serial.println(buf);
   delay(500);
}

■ スケッチの記述

 まず最初に、制御マイコンである Arduino のスケッチを記述しました。過去の実施例をもとにして記述しています。その内容を下記にまとめました。

  1. 想定する測定項目は、速度特性と牽引力特性とする。
  2. 速度特性は、動力車が単機走行状態、即ち牽引力がほぼゼロの状態で、スケールスピード、供給電圧、消費電流を測定する。
  3. 牽引力特性は、供給電圧が一定の状態で、動力車の牽引力がプラスの場合(駆動状態)とマイナスの場合(制動状態)に於ける、牽引力、スケールスピード、消費電流を測定する。
  4. 速度特性と牽引力特性の測定は、測定条件が異なるのみで、同じ項目を計測するため、同じスケッチを用いて測定する。。
  5. 測定されたデータは、USBケーブルによるシリアル通信にてパソコン側に送信し、送信データをExcel にて整理して特性グラフとしてまとめる。
  6. 測定実施中は、そのグラフを見ながら測定条件を変えて実施する。
  7. このため、関係するデータが送信されると、Excel の所定のセルに記入後、グラフ表示を実施するので、測定中はリアルタイムで処理する必要がある。
  8. この処理は、Excel のマクロ処理の代わりに、Python によって処理を実施する。
  9. 測定条件の変更操作は手動とし、動力車の状態が安定した状態を確認して測定開始ボタンを押す。
  10. この測定スタート信号により測定を開始し、関連する計測が終わると次の開始ボタン操作まで待機する。
  11. 開始ボタンが押されると、テーブルのエンコードパターンのパルスが HIGH → LOW に変化したタイミングをスタート時刻とし、次の LOW → HIGH の時点から電圧と電流の測定を開始する。
  12. 電圧と電流は繰り返し測定し、その累計値と回数をカウントする。電圧と電流については値が常に小さく変動しているので平均値を求めるために累積方法を採用している。
  13. エンコードパターンのパルスが次に HIGH → LOW に変化したタイミングを終了時刻とし、電圧と電流の測定を終了する。
  14. その後、牽引力を5回測定する。
  15. そして、パルス間隔の時間を開始時刻と終了時刻から計算する。
  16. 累積電圧値、累積電流値、累積回数、パルス間隔の時間、牽引力(5個分)をコンマ区切りの文字列とし、シリアル通信にて送信する。
  17. 各測定処理は、アナログ処理のための処理時間を考慮して、それぞれ delay 処理を挿入する。
  18. ロードセルのHX711による処理は、充分な時間が必要なので、パルス時間の計測ループ外とする。

 この内容をスケッチに記述したプログラムを右に示します。なお、モータの回転数計測はまだ組み込んでいません。

 

■ リアルタイム処理のためのPythonプログラム

 測定実施は、1回毎のデータをグラフ上で確認しながら次の条件設定をセットして行きますのでの送信されたデータを目で確認出来るようにしています。このため、リアルタイムでグラフ表示する必要があります。この処理のために、今まではExcel のマクロ処理をしてきましたが、何故だかその処理が機能しなくなりました。「EXCELのマクロが機能しない」(2022/6/13)参照。

 その後、四苦八苦しながら Python による処理方法にたどり着き、以前と同様に、リアルタイム処理が実施できるようになりました。今回もそれに習って、次のように記述しました。

 

 *******   turntable-1.py  ***************************

 #-*- coding:utf-8 -*-
 
 import win32com.client
 import time
 import serial
 
 ser = serial.Serial('COM8',9600)     #
 ser.readline()
 xl_app = win32com.client.GetObject(Class='Excel.Application')
 
 while True:
    val_arduino = ser.readline()
    buf = val_arduino.strip().decode('UTF-8')
    a = buf.split(',')    
    rn = xl_app.Cells(4,2).value
    xl_app.Cells(rn,2).value = a[0]
    xl_app.Cells(rn,3).value = a[1]
    xl_app.Cells(rn,4).value = a[2]
    xl_app.Cells(rn,5).value = a[3]
    xl_app.Cells(rn,6).value = a[4]
    xl_app.Cells(rn,7).value = a[5]
    xl_app.Cells(rn,8).value = a[6]
    xl_app.Cells(rn,9).value = a[7]
    xl_app.Cells(rn,10).value = a[8]
    xl_app.Cells(4,2).value = rn + 1
    time.sleep(1)
 ser.close
 
 exit()

 ***************************************************

 使用したライブラリーは、Excelのセルにデータを書込むためのpywin32 ライブラリー、シリアル通信のための PySerial ライブラリーです。このライブラリーをインストールしておく必要があります。

  1. 使用しているシリアルポート番号を設定しておきます。パソコンの状態によっては変わる恐れがあるので、事前に確認する必要があります。
  2. 受信したシリアルデータ val_arduino sprit()関数にて改行文字や空白などを取り除き、decode('UTF-8')によって文字列に変換します。
  3. この処理をした後、コンマ区切りの連続したデータを split(',') にて個別のデータ列に分解します。
  4. Excelのセル(4,2)、即ち新しい行番号を読み取り、その行に、上記の個別データは各セルに書き込んでいきます。
  5. 最後に、次の行番をセル(4,2)書き込んで、次のシリアル通信の入力を待ちます。

 測定終了後、このプログラムを中止させる方法が、未だに見つかりません。そjこで、USBケーブルを強制的に抜き取ると、通信が切れましたと言って自動的にPython を完了してくれますので、この方法を使っています。

 

■ データ整理用のExcelファイル

 従来のシートに習って、新しく整理しました。測定途中のデータですが、このようにデータが入力されていきます。

 セル(4,2)が書込むべき新しい行番号を示しています。真ん中から右が計算用の蘭となっています。速度計測と牽引力計測では、同じようなシートですが、表示するグラフが異なっていますので別シートになっています。また、このExcelファイルの保管場所は、Python の作業用フォルダに保管します。即ち、上記の例では turntable-1.pyと同じフォルダ内に保管しておくことが必要です。

 

■ 速度特性の第1回目の計測トライ

 準備が整ったので、いよいよ計測を始めました。測定手順は、

  1. 装置側をスタンバイ状態にする。ArduinoはON、給電スイッチはOFFの状態で、USBは接続させておきます。
  2. パソコン上でArduino を起動させ、シリアルポートの番号を確認します。Pythonプログラムの設定どうりかどうかを確認しておきます。問題なければArduinoを終了させます。
  3. パソコン上で、Excel の該当するシートを開いておく。
  4. PoweShell を起動し、Python の作業用フォルダに移動して上記のプログラムを作動させます。
  5. 測定を開始する。

 プログラムミスが何ヶ所がありましたが、やっとデータを取り込むことが出来ました。円盤はフリーの状態にして動力車の駆動力だけで回転させました。

 そして、得られたデータを下に示します。

 速度−電圧グラフと電流−電圧グラフは綺麗に取れています。牽引力−電圧のグラフはバラツキはあるものの、円盤を空回りさせるために、6〜7グラムの力が必要である事を示しており、意外でした。事前の調査では、1グラムの力で回転できるものと思っていたのに、少しがっかりです。

 なお、古い年代の人間ですので、力の単位はニュートンではなくて、いまだにグラムを使用していますので、悪しからず・・・・・・。ニュートンがピンとこない人間ですのでよろしく。

 でも、一応この状態で、N増し測定を実施しておきました。

 円盤の回転が少しスムースになって、負荷抵抗が少なくなったようですが、単機走行、即ち、無負荷走行とは言えませんな。

 

■ 速度特性の第2回目の計測トライ

 でも、諦めることは無いのだ。このような事態も想定の範囲内なのである。ターンテーブルを動力車の牽引力だけで回転させるのでは無くて、駆動用のモータを使って強制的に回転させる手段もあるのだ。試しに円盤駆動用のモータを動かして測定してみました。

 確かに牽引力はゼロやマイナス側に振れるようになりました。でも、どうやってこのような条件に設定できるのかが問題となってきました。そこで、いろいろ試した結果、カプラーで連結している拡大レバーを見ていると判断できることが分かりました。

 牽引力がゼロの状態を挟んで、プラス側とマイナス側はピン部のガタによって、動くことが観察できます。そこで、このガタを積極的に大きくして、その動きを観察しておれば判断できるのです。多少のバラツキはOKとすればよいのです。

 ちなみに、ゼロ近辺にデータだけを抜き出し、第1回目の計測結果を比較してみました。

 やはり、その差は明確であり、この第2の方法で測定することとしましょう。

 

■ 牽引力特性の測定トライ

 次に、牽引力特性についても測定を実施しました。ターンテーブルを駆動装置で回転させることは勿論ですが、負荷の調整としてブレーキ装置に掛かる荷重も変えていく必要があります。測定状態を下に示します。

 ブレーキ装置に重りを乗せた状態を下に示します。

  .

 テーブルが回転している状態で、いろいろな重りを乗せたり、乗せる位置をずらしたりして負荷を変えていきます。

 重りとして使用したのは右の写真のように手で持って重いと感じる物を集めましたが、乗せるスペースが狭いために10gf の負荷までが限界でした。何か工夫改良が必要です。

 制動領域では、テーブルの回転速度を上げて、動力車の走行速度よりも早くするようにてし、坂道を転げ落ちている状態にします。

   ************************************

 試しに測定したデータを下に示します。綺麗な測定データに見慣れているので、少しがっかりですが、意図するデータは得られると判断できます。制動側もスリップ領域まで測定できていますし、遷移点もバッチリと判断できます。

 駆動側と制動側のスリップ領域の測定は、動力車の力なのかブレーキ装置の限界値なのかの疑問が残っていますので、改善の余地があります。

    

 

  ************************************************************

 今回の測定トライによって、目的とするデータが取得できることが分かりました。まだ、工夫改良の余地があるので、詰めていきたいと考えています。

 

ページトップへ戻る  .


2023/10/4