HOME >> 鉄道模型工作室 > モニタ式の操作盤を作ろう Processing の内容を読み解く
先回紹介したProcessing を使った運転台コントローラの例について、その本命であるProcessing の内容を覗いて、Processing の記述方法を学ぶと共に、自分用に新しい操作盤を作るためのお手本とすることにする。
■ お手本としたサイト
参考にしたサイトは、「4・E231風の運転台コントローラー」と「5・運転台の操作方法」です。 無料サイトのうるさい広告部分は邪魔になるので×をクリックして消しておきます。 内容を一通り理解した後、必要なファイルをダウンロードさせてもらいました。
そのファイルの中の e231.pdeファイルをProcessing に取り込んで走らせると、説明されているような操作が可能でした。 ただし、操作音は鳴りませんでした。 音のデータはダミーファイルとのことですが、著作権の問題を避けるためと理解しました。
■ プログラムの内容を理解するために
本体の e231.pdeファイルはテキスト形式で書かれているので、メモ帳を使って印刷し、ペーパーの上で読み解いていく事にしました。 分かったことを鉛筆で書き込んで行くためです。
また、最初のトライのとき、minim のファイルが無いと言われたので、MINIMライブラリーもネットから探して追加しました。 さらに、記述されている命令文には見慣れない用が見受けられたので、Processing 専用用語と考え、用語集として「Processingチートシー」のページを探して印刷しておきました。 図形関係の新しいコマンドがいっぱい有りますね。
■ サンプルプログラムを読み解く
サンプルプログラムの e231.pdeファイルはmかなり長文のプログラムです。 しかもコメントがひとつも記入されていません。 しかしスラッシュ記号によって命令文が区切られていたのでコマンドの塊を判断することが可能でした。
一番の問題は、ボタン、レバー、計器と変数の関係を知る事であった。 これを知らなければプログラム内容を読み解けないと判断し、マウス位置情報を図形の位置データから関係付けることにした。 このために、運転台の背景画である 001.png ファイル(下左の図)より各要素の座標を読み取るために、愛用している Macromedia Fireworks MX 2004 を使って読み取ることにした(下右の図)。 表示したグリッドは 20ピクセル毎の升目である。
こうして、運転台のボタンやレバーの操作情報を取り込んで、次の処理に進めていました。 その時に扱う変数や配列も関係付けることが出来ました。
■ 出口はどこか?
上記の解析により入力側の処理方法を理解する事が出来ましたが、今度は出口側を事前に把握することにしました。 処理結果は画面への表示とUSBケーブルを使ったシリアポートへの出力です。 効果音をならす事もありますね。
まず、初期設定部分で記述されている myPort = new Serial ( this, "COM3" , 9600) ; によってCOM3ポートを 9600ボーで通信する設定コマンドがあります。 従って出力はここに数値をほり込んで、myPort.Write()とやっているに違いないと考え、その場所を探しました。
最初に見つけたのは、
myPort.Write(201+ vol1[4] );
です。 vol1[4]は方向切替スイッチの値で、0が前進、1が中立、2が後退を示す数値ですから、この値に201を加算した値をシリアル通信として伝送しているのです。 さらに、この前には、
if ( vol1[4] != vol2[4] ) {
の if 文がありました。 即ち、vol1[4] と vol2[4] が同じでなかったカッコ内を実施せよとのことです。 さらにカッコを閉じる直前に vol2[4] = vol1[4] を実施して vol2[4] の値を更新しています。 これは、vol2[4]には操作ひとつ前のデータが記録されており、今クリックされた時の値である vol1[4] と比較して変化しているかどうかを判断し、もし違っていたら、出力するコマンド群であることが分りました。
このコマンド群の中には、スイッチの操作音を鳴らすコマンドも含まれています。 しかし、この中の rev[ ] の配列がなにやらゴソゴソと値を回しているのですが、その内容と目的が理解できませんでした。 停止調整同期ボタンと関係しているようですが分かりません。
次に、最終部分に次のふたつのコマンドを見つけました。 これが本命の出力と考えます。
最初のコマンドには何やら条件がありましたが、これもよく理解できません。 下のコマンドが最終値 v6 を出力するコマンドと判断し、この値を計算する過程を追っていけば、このアプリの計算ロジックが解明できると考えました。
■ 制御ロジックの追跡
入口と出口が分かったので、その間の処理内容を追跡して行けば、このプログラムを作成した人のロジックを推測する事が出来るはずです。 こう考えて、データの処理を追っていったのですが・・・・・・・・・・・・・・・。
途中で止めました。
調整レバーの値や関係する変数が多く、コマンドを追って行っても、その処理内容を理解するのが大変でした。 もう80歳になろうとする老いぼれにはその気力がありませんでした。
このプログラムの void draw() ルーチンはどのくらいの時間で一回りするのだろうか? プログラムの最後に delay(50) とあるので 50msec 以上は掛っている筈ですが
、おそらく 100msec 以下で回っていると推定します。 すると、出力のためのデューティ値の計算もこのサイクルで計算されると考えます。 そして、このサイクルに合わせて加速具合や減速具合も計算されるのですが、その具合は実際にこのプログラムを走らせて観察する方が確かですね。
また、途中の計算アルゴリズムは、「マイコン式の運転操作台を作ろう 構想」(2021/4/13)で始めたプロジェクトで構築した自分のロジックがあるので、このロジックを踏襲すれば良いと判断しました。 調整レバー類もダイヤルで設定していた項目を応用すれ場良いのです。 そして、最後に移動するレバー類の表示方法を確認して、サンプルプログラムの解読を終了する事にしました。
.
****************************************************************
今回の解析作業は、初めて触れる Processing のプログラムでしたが、その記述方法は処理技法を学習することが出来ました。 また、図形表示やそのアニメーションが得意なジャンルのアプリであるらしいのですが、このジャンルは難しそうなので足を踏み込まないようにしましょう。
■ 実際に走らせて見る
このサンプルプログラム内容の追跡は半分理解した状態で諦めましたが、このプログラムを実際に走らせて様子を見ることにしました。 右の写真。
ハード回路は先回使用した回路に後退を示すLED回路を追加しています。 そしてArduino のスケッチにも処理コマンドをついかしました。
即ち、出力ポートは方向指定出力が2個と、デューティ値出力を1個使用しますが、これはモータドライバとしてTB6612 を使用する予定だからです。
実施した状態を下に示します。
各レバーやボタンの操作に合わせて、反応しているのが確認できました。 モニタ式運転操作台が、何だか簡単に実現出来ていますね。 時計もある、ブレーキの圧力計もある、電車の各車両毎のドアの開閉状態や駆動・制動の状態も表示されている、となかなか楽しい運転台です。
でも音声データがダミーですので音がしないのがやっぱり寂しいですね。 何か代わりになる効果音を探して対応する事にします。 次回は卓上レイアウトにて実際に電車を動かしてみましょう。
2021/9/14 作成