動いている列車を眺めるなら、スイッチ1つで運転ができるパワーパックが欲しい。ということでとあるサイトで見かけたロータリースイッチ1つで運転できるPWMコントローラを作って制御盤に組み込んだ。
ポイントマシン・・・作り直しじゃ~ (その8)
最近YouTubeでNゲージのスローアクションのポイントマシンを見ていると、ポイントを転換する部分の機構が極シンプルなものが見られるようになった。
どれくらいシンプルかというと、ステッピングモーターの軸に簡単なパーツでピアノ線を付けたり、サーボモーターのホーンにピアノ線を取り付けたり。
そのピアノ線をポイントマシンのスロウバーの穴に入れて直接動かすというもの。
私が作っているものと違い、ゴチャゴチャとしたスイッチ類の部品やら機械的な構造部品はない。
私がスローアクションのポイントマシンを作ろうと準備を始めたのが2015年の4月ごろ。
もう7年も前のこと。
今やっとレイアウトに組み込もうとしているのだが、YouTubeで見かけるような簡単な機構の物が保守の面でも良いに決まっている。
今なら引き返せるぞ・・・ウン?引き返すのか?
じゃ、なんで今の仕組みにしたのかもう一度整理してみよう。
ステッピングモーターに停止スイッチをつけた理由
どうせマイコンで制御するのだから、物理的なスイッチで停止位置を決めるのではなく、モーターを回転させる角度を判定して停止させれば良いと思ったのだが。
ステッピングモーターで困るのが、現在の位置(すなわち角度)がわからないこと。
わかるモーターもあるみたいだけど、安価なものじゃなかったハズ。
定位の位置から反位の位置に転換しようとしてモーターが回転している途中に電源が落ちたりすると、次に電源を入れた時に今のモーターの位置、つまりポイントが定位/反位にあるのか、転換の途中の位置で止まっているのかがわからない。
もちろん、キチッと定位/反位に転換が終わってても、次に電源を入れた時は今定位にあるのか反位にあるのかわからない。
皆さん、どうしてます?
回答はいりませんが・・(^^;
結局は電源投入時にポイントの位置が定位or反位になるようにステッピングモーターをチョコ、チョコ、チョコと動かすスイッチをつけて、ちゃんとポイントが定位or反位になっていることを確認する作業が必要になる。
他にも良い案があるのかもしれないが・・思いつかん。
レイアウトには17個のポイントを設置する予定。
1個ずつ確認してすべてを定位にする。
この作業を怠ると、ポイントは既に切り替わっているのに、モーターはさらに回転しようとして・・ポイントを壊すか、スロウバーを動かすピアノ線が外れるでしょうなぁ。
ピアノ線が外れた時の復旧用に容易にレイアウト下にアクセスするためのスペースも考慮しておかなくちゃ。
それに、レイアウトの電源を入れるたびに17個のポイントの位置を確認するなんて・・面倒だし、非現実的。
これに対して、サーボモーターの場合(360°回転タイプでなければ)、通電時に右に回しきる/左に回しきるといったことが可能なので、レイアウトに通電したときに定位になる方向にすべてのサーボを回しきれば良いことになる。
サーボモーターを却下した理由
PCA9685 16チャンネルのように1つのPWMドライバで16個もサーボモーターが制御できるものを知らなかった。
つまり、1個のポイントに制御用のPICマイコンが1つ必要と思っていた。
また、サーボモーターも現在の300~400円で買えるものがあまり見当たらなかった。
要はコスト的に高価なものになるなぁ、という感じだった。
で、ステッピングモーターに停止スイッチをつけた
電源投入時に定位/反位の停止スイッチが押されていれば、ポイントはそこにある。
どちらのスイッチも押されていなければ、ひとまず定位側に移動する動作を行い、定位の停止のスイッチが押されるのを待つ。
今なら引き返せるぞ・・・ウン!引き返えそう!
で、ゴチャゴチャと前置き?が長くなったが・・
サーボモーターの価格が安くなった以上、やっぱサーボモーターを使った簡単なものに作り変えじゃ~。
複数のサーボモーターを効率よく制御するために「PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー」を使うことにした。
そのためには・・
制御方式も見直しじゃ~
ポイントの転換などこのレイアウトを制御する頭脳はRaspberryPi。
現在はメイン台枠の側面に移設してある。
これがI2Cのマスターとなって関連するマイコンを制御する。
ポイントの制御は線路配置図の上に設置したテコ。
これは現在バラして、レイアウト側面に移設しつつある。
web化したので、実質的には制御盤上のテコは不要といえば不要になった。
が、ポイントの転換部分なども、先ごろもう、何がしたいのやら。
(^^;
周辺の制御周りの物を作り替え、作り替えしていて、なかなか線路が敷けない。
思い立ってから7年も経てば色々勉強してあっちのが良さそう、こっちのが良さそうと気も変わりますわな。
ちょこっと簡単に運転したいというときに制御用のRaspberryPiを起動したり、終了時にシャットダウンさせたりするのも不便。
というときに備えて、電源ONで簡単に運転できるように3つのレイアウト台枠にそれぞれ補助の制御盤もを作ってきた。
この写真はメイン台枠用の補助の制御盤。
制御盤の下部には制御盤上の信号、レイアウト上の信号の点灯制御を行うマイコンなどを収納している。
基盤は二階建てで、二階部分はポイントの制御を行うマイコン「PIC16F887」とRaspberryPiからの制御の中継を行う「PIC32MX120F032B」がある。
ここの「PIC16F887」は補助の制御盤上部の押しボタンが押されたことを判断し、ポイントマシンの制御マイコンにポイントの転換を指示したり、ポイントマシンの制御マイコンから各ポイントが定位/反位のどちらに開通しているのかの状態を取得し、「PIC32MX120F032B」に通知するもの。
また、「PIC32MX120F032B」はRaspberryPi(主コントローラ)からの制御の中継を行うが、RaspberryPiが接続されていない場合とか、この補助制御盤のスイッチでポイントを転換したときはローカルで制御するものとしてメイン台枠上の各マイコンをこのPIC32(副コントローラ)で制御するようにしてある。
改修前の制御構造
今回の改修前の制御の構造は・・
RaspberryPiがI2CのマスターとなってPIC32を制御する
PIC32は実際には3分割された台枠それぞれに設置してあり、それぞれの台枠が単体でも運転できるようにしてある。
PIC32はI2Cを2ch持っており、1chはRaspberryPiのスレーブ側として使用している。
で、残りの1chを使ってこのPIC32がマスターとなってこの配下のマイコンを制御する仕組み。
要は、RaspberryPiがあるときはそのコマンドやレスポンスを中継し、RaspberryPiがないときは、このPIC32が制御する。
改修後の制御構造
改修後の制御の構造は・・
一番の変更点は・・
ポイントマシンとして使うサーボモーターを制御する「PCA9685 PWM Servo モーター ドライバー」と、それを制御する「Arduino Nano互換ボード」を導入したこと。
PCA9685はI2Cのスレーブとして動作するので、これを制御するI2Cのマスターが必要となる。
改修前はPIC32がI2Cのマスターの機能をもっていた。
が、ここにPCA9685の制御の機能を持たせると、ポイント転換中にRaspberryPiからの新たなポイント転換コマンドの割り込みが入るともうプログラムはひっちゃかめっちゃか。
というより、PCA9685の制御用のライブラリはArduino Nano用のものはネット上にあったが、PICマイコン用のものは見つけられなかった。
PCA9685のPICマイコン用のライブラリを作るより、Arduino Nanoを導入するのが簡単。
で、Arduino Nanoを導入して、これがI2CのマスターとなってPCA9685を制御することにした。
となると、次に問題となるのがPIC32のスレーブ側からどうやってI2CのマスターとなるArduino Nanoを制御するか。
できれば、すでに作ってある基盤の作り替えはなるべく簡単にしたい。
ということで、ポイント転換スイッチの制御を行うPIC16F887のUSARTでポイント転換コマンドをArduino Nanoに送ることにした。
奥の「緑」「黄」「橙」「赤」の配線はPCA9685に送るI2Cと電源の配線。
手前の「青」「白」の配線はPIC16F887とのシリアル通信用の配線。
シリアル用の配線の横にあるピンヘッダは・・
PIC16F887がある補助制御盤とポイントの転換制御を行うArduino Nano互換ボードを設置するレイアウトの台枠は1m程度の配線で結ぶことにした。
プログラムを作って手元でテストしていた時には問題なく動いたが、実際の環境に取り付けてみると・・ウ~ム、動かない。
配線の見直し、プログラムのチェックを行ったが、原因が全然わからない。
ということで、Arduino Nanoからのシリアルの出力はPCのターミナルに表示し、PIC16F887からのデータをソフトウェアシリアルで受信してみることにした。
それが、このピンヘッダの名残り。
ちなみに、 ソフトウェアシリアルは、pin2(INT0), pin3(INT1)等のピンに割り振られた割り込みをすべて使用している。
そのため、利用者は割り込みによって受信処理を行うことはできない
–> 割り込み処理を書くとコンパイル時点でエラーとなるみたい。
このことから運用時のシリアル通信はハードウェアシリアルを使うこととし、PIC16F887との通信のデバッグ時のみソフトウェアシリアルを使用することにした。
色々とデバッグしたところ、実環境では文字化けが発生していた。
PIC16F887とArduino Nano互換ボードのシリアル通信を1m程度のケーブルで結んだことが原因のようだ。
そこで、シリアル通信のケーブルをプルアップすることにした。
これで、問題なく動作するようになった。
しかし、補助制御盤は今後ももう少し機能を追加する必要があるので、何かの拍子で文字化けが起こるようになるかもしれない。
少しでも予防措置を取っておきたい。
現在、ポイント転換のコマンドは1バイトで、ポイントの番号と定位/反位を指定して送信している。
現在のステータスを戻すレスポンスも1バイト。
ソフトウェアでの予防措置として同じコマンド/レスポンスを続けて2バイト受信した時は正常なコマンド/レスポンスとして処理し、そうでないときは電文を破棄することにした。
ちなみに、ポイント転換のコマンドがない場合、PIC16F887側は現在のポイントの状態の通知を要求するコマンドを数十ミリ秒毎に送り続けている。
Arduino Nano互換ボード側はそのコマンドのレスポンスとして現在のポイントの状態をその都度送り返している。
これでPIC16F887側は指定したポイントが指定した方向に転換されたことを把握することになる。
1個で16個のサーボモーターを制御できる。
メインのレイアウトでは駅の左側に8個、駅の右側に4個のポイントが集中している。
ポイント群の間隔は150cmくらい。
サーボモーターの配線を延長しても良いのだが、シリアル通信の時の文字化けもあるので、左右のポイントマシン群を別々のドライバーで制御することにした。
左側用は8個のサーボモーターを制御。
右側用は4個のサーボモーターを制御。
2つのPCA9685間を結ぶのはLANケーブル。
細い心線ではなく、おそらく一番太いであろうもの。
このサーボ・・
何度かに分けて買ったのだが、いろいろと問題も。
最初、6個買ってみた。
プログラム作成当初、何度やってもうまく動かなかった。
サーボを交換しても動かない。
この時は、サーボモーター一つで試していた。
こりゃ、ダメかも、と思ったのだが念のため、6個すべてを接続してみたところ・・2個は動かなかったが、他の4個は動いた。
ウ~ム、不良率33%。ひどすぎる。
しかし、テストの時に6個のうちから不良品2個を引き当てたのもすごいが。
動かなかったやつ、試しに手でひねってみたら・・なんと動いた・・
ただし、2~3回動いたら、また動かなくなった。
次に2個入りのを買ってみた。
届いたのはサーボモーターの側面に貼ってあるはずの型名を示すシールがなかった。
しかも、剥がした後の粘着物が多量に残っていた。
せめて、きれいに剥がせよ(--メ
なんとか動きはしたが。
さらに、追加で全ポイントの数分揃うように買ってみた。
グリス?がべったりついていた。
明らかにギギギ~という音を立てて回るものもあった。
ハッキリ言って、品質チェックではじかれたりしたようなもののラベルをはがしたり、とりあえず動きさえずばそのままラベルさえ剥がさずに出荷しているのではなかろうか。
全てアマゾンで買ったのだが、高ければ安心、安ければいわくつきということでもなさそう。
・・運です、運。
いや、バクチと思って買わないと腹が立ちます。
勝負!!
このPCA9685ボードのI2Cアドレスはデフォルトでは0x40。
赤い円内のジャンパーがオープンのままだとデフォルト。
レイアウト右側のポイントマシンを制御するPCA9685ボード。
こちらはA0のジャンパーを半田でショートさせてI2Cアドレスは0x41。
・・今まで作ってきたステッピングモーターのポイントマシンは・・!?
さて、どうなるんでしょう?