HOME >> 鉄道模型実験室 > XBeeを搭載したドクターカー その2 Arduino のタイマーは正確だった

鉄道模型実験室 No.125  XBeeを搭載したドクターカー その2 Arduino のタイマーは正確だった

■ はじめに

         Arduino のタイマーは正確だった !

 無線通信モジュール XBee を使用してモータ端子電圧のデータをパソコンに飛ばし、パソコンにて処理する方法について先回報告した。 この中で、時刻計測におけるタイマーの値に疑問があり、Arduino のタイマー処理を疑っていた。 しかし、その後の検討結果、自分の考察は間違いであり、疑っていたArduino のタイマー処理は正確であったことが判明した。 その結論に至った経緯を説明しよう。

 

■ 無線通信基地局のシールド工作

 作成中であった無線通信基地局のシールドについて、追加工作を実施した。 無線通信の基地局は以前の物をそのまま使用している。 下左の写真。 Arduino UNO の上に Arduino ワイヤレスプロトシールド ARDUINO-A000064 を重ね、さらに、XBee ZB ワイヤアンテナ型 XB24-Z7WIT-004 を重ねている。 さらにその上に手作りのシールドを重ねて基地局と使用する。 完成状態を下右に示す。

 まず、このシステムの回路図を紹介しよう。 下の回路図は、最終的に完成した状態での回路図である。

 走行位置のマーキングのためにATS のセンサーを使用しようとしているので、そのデータを取り込むポートを設定した。 センサーは7ヶ所あるので、それぞれをデジタル入力ポートとして確保し、S1 〜 S7 までのポートとして割り当てる。 しかし、D0 と D1ポートは無線通信用として使用されているので D2 以降のポートを使用しようとするのであるが、一つ足りないのだ。 D8 以降のポートは、その取り付けピッチが半ピッチもズレているのでユニバーサル基板を使用する場合には使えないのだ。 そこで、アナログ側に不足しているポートを回している。

 このセンサー用の配線は、先端にATS配線基板のピンヘッダに接続できるように、ピンソケット(メス)を一本ずつ取り付けている。 そして、使用しないときには GND に接地しているピンヘッダに差し込んでおくようにした。 また、基板にスペースがあったので、手動マーキング用のスイッチを2個配置し、設置位置の関係で S6と S2 のポートとの間に配置した。 このスイッチはスライドスイッチで、+5V側からプルアップにてHIGH信号を入力できるようにしている。

 なお、電源電圧のための測定回路に挿入されている 100μFのコンデンサーは、検討途中で追加したものである。

 今回作成した手作りのシールドの表側と裏側を下に示す。 当初は片面の基板で行けると判断して工作を始めたが、配線に四苦八苦してしまった。 Arduino と接続するピンヘッダの取り付け上、ハンダ面が上になってしまった。 すると、スイッチ類を取り付けるためのハンダも上面から実施しなくてはならず、醜い配線状態も上面になってしまったのだ。 両面基盤を使っておけばもっとスマートに作ることができたと反省している。 最終的には、ボタン等の名称も記入しておきたいため、プラ板などでカバーを作ることにしよう。 また、基盤がL字型になっているのは、測定車用の基板を切り取ったからである。

 センサー線の処理状態を下に示す。 センサーを使用しない場合にはGNDピンに差し込んでいる。

 

■ 電圧測定端子の校正

 シールド工作が完了したので、電圧測定ポートの校正を実施した。 測定車のモータ端子電圧測定部と、基地局シールドの電源電圧測定クリップと、テスターの測定端子をひとまとめにして、安定化電源からの端子と接続した。 

 測定は、電源電圧を変化させながら、シールドのスタートボタンとストップボタンを押し、Arduinoのシリアルモニタに表示された数値を読み取る一方、テスター、測定車モニタでの値も読み取ってEXCELに記入し、下のグラウの様に表示させた。

    

 左のグラフは、電源電圧を横軸にし、それぞれの値を縦軸にして表示させた。 電源電圧とテスターおよびモニタの値は、0.01〜0.02Volt程度の違いの中で一致していたため、3者は同一の表示であると判断した。 モニタは2.5ボルト以上無いと表示出来ないないのも承知のことである。 また、デジタル値は1000以上で頭打ちになるのも当然である。 そして、このデジタルから電圧に換算するために右の様にグラフ化して、換算のための近似式を求めた。

  .

 

■ 走行実験の実施

 先回と同じ走行システムを構成して、新しく追加工作したセンサポートと電圧測定ポートの作動状態のチェックを行う事にした。

 電源電圧測定ポートのチェックのために、電源と線路への給電ラインの中間において、検出できるように、その測定部を右の写真のようにセットした。 以前から使用していたユニットを持ち出し、出力端子のターミナルに検出用クリップを取り付けたものである。

 一方、センサー類は接続先が無いので、GND端子に接続し、マーキングスイッチを利用して作動チェックを実施することにした。

 

● 実験1〜4: 信号の確認

 まず最初に、作動状態を確認すべく、測定回数は短かめの 200 回にセットして走らせてみた。 そして、マーキングスイッチを作動させてみた。 その時のデータを下左のグラフに示す。

 使用したパワーユニットがTOMIXのパルス制御ユニットであったため、そのデータ変動には驚いてしまった。 これ程ひどいとは! このPWM 制御は、0か12ボルトのパルス波形なので、Arduino のA/D 変換が ある瞬間の電圧を取り入れて実施していると想定すれば当然かも知れないのだ。 これは、コンデンサをしかる場所に追加すれば容易に対策出来ると考えているが、問題は、マーキング信号が現れないことである。

 改めて、回路のチェックを実施したが、配線や作動電圧はOKであったし、シリアルモニタで観察しても、1や0を表示さているので問題無いはずなのだが・・・・と考えてもう一度実験を実施した。 実験2: そのグラフを上右に示す。 今回は早めにスイッチを操作したが、今度はOFFが表示されないだ。 作動不良化?

 (実験3): そこで、今度は最初からマーキング信号をON にして想定すると下左のグラフの様に表示されている。

 (実験4): 今度はマーキング信号のためのスイッチを素早くON/OFF させてみたの場合を上右のグラフに示す。 やっと信号のON/OFF機能を確認できたが、何だかもやもやしてよく理解できていない状態であった。

● 実験5/6: マーキング位置を決めた作動させる

 (実験5): 今度は、マーキングスイッチを作動させる位置を決めて実施してみた。 測定回数も、長めの 500 回に設定した。

 最初のマーキングは、手前の給電ポイントで、2回目のマーキングは向こう側の対象的な位置で作動させた。 二つのマーキングは表示されているが、ここでハタと気が付いた。 パソコン画面でのEXCEL表示が遅れているのではないのか?

 そこで、車両が一周する時間をストップウォッチで測定し見ると、12.64秒であった。 二つのマーキング開始時間の差は、 7,620 である。 Arduino が測定しているのは msec であるとするならば合ってくるではないか! そこで、マーキングとストップウォッチでの計測を同時に実施して再度測定することにした。 

 (実験6): マーキングとストップウォッチでの同時計測の結果を次に示す。

 同時計測での時間は、10.01 秒であり、二つのマーキングでの間隔は、9,031 と 19066 、即ちその差は、10.035 である。

       そうです、ぴったりなのです!

 そして、今回はPCが作動していても、ストップボタンを早めに押して測定を終了させてのですが、PCのEXCEL はまだ作動を続けて、せっせとグラフの書き込みを実施していたのである。 

 原因は、Arduino から送信されてきたデータの処理が間に合わず、シリアル通信のバッファに貯め込んでいる状態であったのです。 そしてEXCELは、その貯め込んだデータをそれなりのスピード処理していたのです。 リアルタイム処理だとばかりに誤解していたのだ。

 今まで疑問になっていた点は解消されたのですが、一つだけ残っているのが、処理間隔時間である。

 XBee子機の設定ではサンプリングタイムを 50msec に設定したはずなので、XBee からのデータはこの間隔で送ってきていると考えている。 この間にArduino の処理が間に合っていれば、送信を受ける側には待ち時間があり、問題無く処理されているのでその処理間隔は、50msec となりはずである。

 しかし、その処理時間が間に合わない場合には、処理時間の間隔はくしゃくしゃになるのではないだろうか。 こう考えると、Arduino の処理は充分に間に合っているものと考えられるので、65msec の刻みは何を意味しているのだろうか疑問になる。

 考えられる原因としては、

  1. XBee子機に設定されたサンプルタイムは実際には 65msec であった。
  2. 50msec のサンプルタイムとは、待ち時間のことであり、データ送信後に 50msec 待って次の送信作業を実施する。 即ち、15 + 50 = 65 msec なのだ。

と考えられるが、XBee の設定を確認するにはかなり面倒な準備が必要なので、この疑問は疑問のままにしておくことにする。 ともかくも、Arduino のタイマーは正確だった事が確認できたので良しとしよう。

 

● 実験7: コンデンサを追加

 パワーユニットのPWM制御の影響を緩和させるために、上記で示した回路図のように 100μF のコンデンサを追加して再度実験を行った。 その結果を下に示す。

 効果はてきめんである。 コンデンサ容量は奮発して決めたが、もっと小さくても良かったようであるが、電源電圧はその平均レベルをチェックするためのものであるのでこれで良しとしよう。 しかし、電圧レベルはかなり変動していますね。 マーキングの前のゾーンで電圧が落ち込んでいる、即ち直線部分でレールが汚れている?と判断してレールのクリーニングを実施した。

● 実験8/9: レールのクリーニングを実施

 直線ゾーンのレールを#1500のペーパーで磨いて再実験を行った結果を下に示す。

 マーキング通過前は改善されたが、今度は通過後、即ち曲線部の目立ってきたので、こちらもクリーニングを実施した。

  .

 電圧グラフは非常になだらかとなって、クリーニングの効果があったと判断する。 そして、マーキング信号を入れた給電ポイント付近の電圧が高く、そこから離れるにしたがって電圧が下がっている様子を満足げに眺めていた。 レールの電圧降下だと・・・・・・・・・・・。

 でも、それなら、なんで電源側の電圧も一緒に下がっているの? おかしくないのか? の疑問に気が付いた。

 

● 実験10: 安定化電源を使って走らせてみる

 パワーユニットのパルス制御を疑って、電源を安定化電源に変えて実験を行った。 その様子を右に示す。

 その結果を下に示す。 さすがに安定化電源である、ぴたりと一定電圧を示しているのだ。 そしてモータ端子電圧は少し山形になっており、これがレールの電圧降下分であると判断できる。 ではなぜパルス制御ではあんなに波打つのだろうかと新たな疑問点となるのだが、電気関係は専門外なので分かりません・・・・・・・・・・! との結論にしておこう。

● 実験11: 通信データの取り込み量の限界は?

 もう一つ気になる点として、Arduino から送信されてきたデータをパソコンがどれだけ貯め込むことが出来るのだろうか? モタモタしているとバッファがオーバーフローしてしまうはずである。 その限界を把握して何らかの対策が必要と考えられる。 そこで、EXCELのデータ処理量を 1000 回に設定して実験してみた。

  .

 データの送信をEXCELの処理が終わるまで送信させて、データの取り込み状態をチェックしてみると、657回までは正常に処理をしていたが、それ以降はクシャクシャであった。

 所定の欄に所定の値を書き込んでおらず、欄外に書き込んだり、欄を飛ばしたりしている部分が多く見られた。 それでも時刻欄にはそれらしくデータが書き込まれていたので、このデータを使って、処理回数とその経過時間をグラウ化したものを右に示す。

 横軸は処理回数、即ちEXCELの行の順番を示し、縦軸には、経過時間を表している。 経過時間は、測定時刻をもとに測定開始時刻をゼロとして計算したものである。

 これより、650回を過ぎるまでは順調に処理していることが一目瞭然である。

 それ以降は、時刻データの値も変な値なので、経過時間はバラバラの値を示している。 しかしArduino から送信されてくる時刻データは信用できる値なので、飛び飛びではあるが正確に処理して場合もあるのだ。 しかし、その場合でも測定間隔の刻みは、今までの刻みより遅れており、右のグラフの勾配として表れているのである。

 この勾配を計算してみると、正常時は 65.8msec 処理しているので、EXCEL はArduino からの送信処理に対応できていると判断できる。

 しかし、650回を過ぎると、全体としてみれば、207msec 毎に処理しているように見受けられるので、およそ 3.14 倍の時間が掛かって処理しているようである。 プロット点を拡大して観察すると、数個のデータ処理の間は65msec間隔で処理されているが、すぐにバラバラとなってデータが飛んでいるのが分かる。 このように受信バッファがオーバーフローした場合の処理がどうなるかは理解出来ないのであるが、600回程度までは対応できることを確認できたと判断する。

 

■ 今後の対応

 今回の実験で色々な事が分かったので、いよいよ実際のレイアウト上で測定してみることにしよう。 処理回数の限界については、分割して測定を実施すればよいjことなので、特に問題無いと判断している。

ページトップへ戻る  .


 2016/12/22 作成