HOME >> 鉄道模型工作室 > モニタ式の操作盤を作ろう Processing を使う
ラズパイのWebIOPi アプリを使って卓上レイアウトを遠隔操作するプロジェクトを進めてきて、なんとか完成させることが出来た。 しかし、先日、ネットを何気なく探索している時、あるサイトのコンテンツに釘付けとなってしまった。 自分が今まで苦労してきたことが、もっと高度に、かつ、簡単にできているではないか!
早速、この先輩の内容を参考にして、もういちど、同じようなテーマに取組むことにした。
■ 参考にしたサイト
それは、自分が Arduino に取り組み始めた頃に閲覧した覚えのあるサイトであった。 その頃は、自分のレベルがあまりにも幼稚であったので、眺めていただけの状態であった。 今回、苦労してきた後で閲覧すると、目から鱗が落ちるような内容であったのである。 進歩してたんだ。
そのサイトは、「鉄道模型」というタイトルであるが、内容は「鉄道模型と電子工作」となっており、拓啓ぽんの鉄道模型アーカイブです。 内容は、過去にブログで紹介した中から、役に立ちそうなコンテンツを選んでまとめましたとのことである。 最終更新日は、2016/1/11 となっており、その後の更新はありません。 また、YouTube にも投稿されていましたが、リンクをたどると、終了したYahoo のブログとなっており、その後、どこに移動されたのか、あるいは中止されたのか分かりません。
しかし、アーカイブとして残しておいて下さったことにより、今回は大いに参考にさせて頂きました。
■ 再度モニタ式の操作盤に取り組もう
当初は、以前にも報告したように、下左のようなイメージで取り組んで来た。 しかし、今回参考にさせていただく操作盤は、下右のような本格的な内容であった。
まず、画面の処理をどうのようにするのかで、選択するソフトが異なってきます。 クリック出来るボタンや、移動させることが出来るレバーをどうやって表示するのか、さらに、操作後の情報処理の方法が最大のポイントでした。
自分の技量で取り組むことが出来たのが、ホームページを作成する時に使用するHTMLファイルの記述方法だったのです。 画像の配置方法や、クリック動作を検知する動的ホームページで活用されているJavaScript による処理の方法を知っていたからです。 その方法が活用できるのがラズパイとスマホの組み合せたっだのです。
*****************************************************************
しかし、上記の拓啓ぽんさんの方法は、パソコン上で Processing というソフトを使って画面を描画し、さらにマウスクリックによってボタンやレバーを操作する事ができ、さらにレバー賀三やメータの針などを動かすことが出来るのです。 さらに、シリアル通信によって、操作結果を Arduino に送信できる機能も有しているので、複数のソフトを介さずに、Arduinoマイコンを制御できるのです。
Arduino に送信できればシメタもので制御機器を動かすことはお手の物です(と思っていますが・・・・・)。 Processing で書かれたサンプルプログラムを見ると、何だか簡単なように見えたので、さっそく取り掛かる事にしました。
■ 手始めに
最初に取り掛かったのは、Arduino 互換マイコンで鉄道模型を遊ぼうの中の「パソコンの画面を運転台にして模型を走らせる」/「1・Processingを使ってみよう」です。
説明に沿ってまず、Processing のホームページよりソフトをダウンロードして、インストールしました。 フォルダを展開してProcessing を起動すると Arduino と同じような画面が立ち上がってきました。 そっくりですね。 そして、サンプルスケッチをコピペして、走らせると、画面に黒い枠が現れ、真中の白丸がマウスのうごきに従って左右に動きました。
10行以下の簡単な記述で、この様な動きが出来るとは驚きでした。 そこで、下左の画面のように、マウスの動きに合わせて、その座標データをArduino に送信して、機器を操作できるのか実験してみました。
その様子を下右の写真に示します。 参考にしたのは次のページである「2・マウスで車両を制御する」です。 互換マイコンには興味がないので、ストック品のUNO No.5号機を使用しました。 パソコンとはUSBを使って接続し、その出力ポートに 1KΩの抵抗とLEDをつなげて、出力状態を確認しようとするものです。
出力ポートのON/OFFはLEDの点灯状態で確認できますが、PWM出力状態を調べるために、オシロを持ち出しました。
// test 51 // 2021.9.9 void setup() { Serial.begin(9600); pinMode(10,OUTPUT); pinMode(11,OUTPUT); //PWMキャリア周波数を 20KHzにする TCCR1A=0b01100011; TCCR1B=0b00011010; OCR1A=99; } int v=0; void loop(){ digitalWrite(11,HIGH); v=Serial.read(); analogWrite(10,v); delay(5); }
Arduino に書き込むスケッチは、サイトのサンプルスケッチを参考にし、制御回路は簡素化た制御回路に合わせて変更しています。 その内容を右に示します。
どうせPWM制御するならば、そのキャリア周波数を可聴域外の 20kHz に設定することにしました。 その方法も経験済みの手法ですね。 D11ポートはON/OFF(実施はONのみでしたが・・・・)とし、D10にPWM信号を出力します。 20kHz に設定しましたので、デューティ地は、0〜99までです。
シリアル通信がら送られてきた値をそのまま、デューティ値としてD10ポートから出力します。
このスケッチを Aruduino に書込み待機させます。
import processing.serial.*; Serial myPort; void setup() { size (400,200); myPort=new Serial(this,"COM7",9600); } void draw(){ background(0); ellipse (mouseX,100,20,20); int mx=mouseX/4; myPort.write(mx); delay(50);
********************
一方、パソコン上の Processing には、左の内容を記述して保管し、その状態でRUN させました。 最初のテストプログラムにシリアル通信関係の記述を追加しております。
シリアルポートの番号は、Arduino を書き込む時にチェックしておきましたので、その値を設定しています。
この画面サイズは、400×200ピクセルの大きさですので、横幅は 400ピクセルです。 従って、マウスの座標値 mouseX は0〜400 になるので、デューティ値に変換するため、4で割っています。 この値をPWMのデューティ値として、シリアル通信によって、Arduinoに送信します。
オシロでD10ポートから出力波形を観察した状態を下に示します。
綺麗なPWM波形が出力されており、キャリア周波数は20.01kHz とピッタリです。 マウスの移動によって、デューティ比が変化しているのも確認できました。
● 参りました!
これには参りました! パソコン側のたったの2行の命令で、
int mx=mouseX/4;
myPort.write(mx);
でマウスの位置を取り込み、その値を計算してデューティ値として送信し、マイコン側も同様に、たったの2行で出力処理をしているのだ。
v=Serial.read();
analogWrite(10,v);
この様に、PWM信号は簡単に処理出来る事が分かりました。
さらに、ボタンなどのON/OFFデータの処理については、シリアル送信データに工夫がありました。 説明やスケッチの内容を見ると、デューティ値で使用する数値から少し離れた固定数値を送信し、マイコン側で判断する仕組みになっていました。 ひとつの送信チャネルで、いろいろな情報を送信する場合の常識的な手法ですね。 これはモールス信号時代からの方法だったのです・・・・・・・・・・・・・・!。 参照:「3・進行方向を切り換える」
****************************************************************
処理の仕方を理解したので、いよいよ運転台コントローラの仕組みについて検討することにしましょう。
2021/9/13 作成