HOME >> 鉄道模型工作室 > モニタ式の操作盤を作ろう キャリヤ周波数をアップする事はできたが
ラズパイのWebIOPi アプリを使って卓上レイアウトを遠隔操作するプロジェクトを進めてきた。 今回は、PWM制御用のキャリヤ周波数アップに取り組みはじめたが・・・・・。今回もその四苦八苦の様子を紹介しよう。
■ プログラムの改善
今まで実施してきたテスト33 のフォルダをそっくりコピー/ペーストして、新しくテスト41 を作った。 フォルダごとコピー/ペーストするのは、関係するするファイルが複数あるので、その関係を維持したまま移動させるためである。
今回の変更は、コマンド連携関係の図(先回の報告参照)にて示すように、PWM制御のコマンド関係だけである。 テスト33 では、JavaScript からダイレクトにWebioPi のコマンド
var ratio = (x - 82)/168;
webiopi().pulseRatio(18, ratio);
を実施していた。 x はポイントの座標位置であるので、この値よりデューティ比を計算して、PWM制御のコマンドを記述した。 必要なコマンドは、たったこの一行で水んでいたのである。
テスト41では、ダイレクトに指定できない(?)ので、Python で記述した script.py のマクロ関数を通して、WiringPi へPWM指令を伝送するようにした。 この様な方法は、教則本の「9.7章 サーボモーターの制御」のサンプルプログラム 07 を参考しています。 スライダ部の表示部分など関係しないと思われる記述は削除し、実行している内容を読み取って、記述しなおしました。
● WebioPi も WiringPi も起動しない
script.py の記述のどこかにエラーがあるので、まずsのエラー探しから始まった。 記述ミスを修正するもPWM制御系が動か動かないのである。 オシロでチャックするも波形は確認できず、ターミナルから起動状態を確認すると wiringpi が起動していないことが分かった。 そこで、もう一度教則本に戻って wiringpi の設定をやり直した。 どうやら WiringPi-Python を Python 3 用にインストールしなければならなかったのである。
そして、Thonny にてscript.py をチェックするとエラー無くはしることが確認できた。 そして、オシロでポート18の出力を確認すると、 確かにPWM波形が出力されていたが、でも、周波数が変である。 数百kHz ? 出力されている事が分かったので、落ち着いて考える事にした。
● 周波数の設定とデューティ比のチェック
周波数の設定は、
wiringpi.pwmSetClock(1) # 18750/18.75kHz=1
で実施している。 プリスケーラの倍率が1では機能しないようである。 そこで、Clock(1) を Clock(2) に変更して走らせると、見事 18,750/2 ≒ 9.4kHz のPWM信号が確認できた。
原因は理解出来ないが、兎に角も高周波のPWM波形が出力されていることが確認できたので、今度はデューティ比の制御具合をチェックすることにした。
すると、波形は全然変化しないのである・・・・・・・・・・・・・・?
デューティ比の初期値は6%に設定しているので、その状態を出力するも、タブレットから指令を出しても変化してくれないのである。 コマンドの連携が出来ていないのでないかと考えて、デューティ比を直接設定して走らせると下記のように、綺麗に出力されていた。
即ち、デューティ比に関するコマンドの連携が通っていないと判断して、 JavaScript と Python 側の記述をいろいろ変えてみたが成功しなかった。 変数の扱い方がおかしいのではと疑ってネットで調べると、両者の違いを始めて知った。 プログラムの基礎の基礎が分かっていないのであった。 変数の使い方、コロンやセミコロンの必要性など、使用する言語によって微妙に違っているいるのにウロウロしてしまいます。
さらに、何故マクロが必要なのかも理解していません。 思いつく方法でいろいろトライするも、やはり問題は解決しませんでした。 やはりプログラムの基礎の部分が分かっていないと判断し、サンプルプログラムに沿った記述にするように方針を変更しました。
このため、この失敗プログラムを放棄しましたので、その内容の紹介を止めときます。
■ サンプルプログラムからの変更を最小限にしよう
自分独自のアルゴリズムに自信が持てなくなったたので、サンプルプログラムからの変更を、必要最小限にしてトライする事にした。 フォルダは新しくテスト42 を設定した。 その結果は上々で、PWMのデューティ制御が反応するようになりました。 この時のオシロ画像を下に示します。
.
実際に使用する時は、それぞれの拡張子に変更する必要があります。 この他に、js/require.js が必要ですが(実は何故必要なのかも理解していません) 、サンプルと全く同じものをそっくり使用します。
テスト41との違いは、デューティ比の計算処理です。 javascript.js 側ではポイントの位置からデューティ比( 0.0 〜 1.0 )の値として計算し、値を引き継いだ script.py では、この値をデューティ値( 0 〜 1024 の整数)に変更して wiringpi に引き渡します。
こうしてこのプログラムが機能するようになった原因は、計算方式の違いなのか、計算場所なのか、あるいは変数の記述方法なのかは不明のままです。 テスト41のどこが悪かったのかの追及は、今後のための勉強になるはずですが、原因を追及する気力がもうありませんでした。 兎に角も、機能するようになったので、めでたし、めでたしなのです。
■ まとめ
これで完成だと思って、実際の卓上レイアウトでテストしてみました。 でも・・・・・・・・・・・・・?
何故だかうまく機能しないのです。 次回報告とします。
2021/9/5 作成