5.2アンプコントロールプログラム
いよいよ実用的なプログラム?? 2チャンネルプロポを使って戦車を旋回させようとすると、左・右のモーターにそれぞれアンプを繋いで、2つのアンプをコントロールするのが理想だけど、左右のスティック1本で2つのアンプをコントロールするのは不可能。
せいぜい、片側のモーターをON・OFFさせて旋回する信地旋回か、複雑なスイッチを自作したとしても、超信地旋回が精一杯....ゆっくり旋回は不可能!

結局リアルに旋回させようとすると、2モーターをコントロールする戦車専用DMDアンプが必要になる。

今回は、そのDMDアンプと同じ動きをPICを使ってやってみよう!

左右スティックの動き 受信機から前進・後進のスティックの動きと、左右旋回スティックの動きの2chをPICに入力して、左右のモーターをコントロールするアンプに出力する。

単に、前進・後進だけなら、前進・後進のスティックの値(位置)をそのまま2つのアンプに渡せばOKだけど、当然左右スティックが倒された時は、左右スティックの値(位置)によって、片側のアンプを減速しなくては行けない。

ついでに、左右スティックがある程度たおされたら信地旋回(片側停止)、いっぱいまで倒された時は超信地旋回(片側逆転)もやりたい!

スティックの値(位置)と動作
左右スティックの値と、戦車(アンプ)の動きを図にしました。
メモリは、前回までのPICの25サイクルを1カウントとした値を使ってます。

受信機の1ch目(左右旋回スティック)の信号が、150カウントが中間で、100に近づくと右旋回・200に近づくと左旋回(左右はプロポのリバース設定で変わります)

どうやって減速値を出すか? 片側のアンプを減速するには、左右スティックの値に合わせて、片側のアンブの信号を停止の150カウントに近づけないといけない。
左右スティックの値が同じでも、前進・後進スピードによって減速値も変わってくるので、前進後進のスピードと左右スティックの値で、片側アンプの減速した値を計算で求めないといけない。

減速の幅は?
左右スティックが中間の150から115(または185)までの35カウントが減速の幅。

左右スティックが1カウント傾いた時の減速値は?
「現在のスピード」÷35カウント=1カウント分の減速値

例えば、
前進スピード(2chの値)が180カウントの時は、
(180−150)÷35=0.857
さらに、左右スティックの傾き(1chの値)が130カウントの時のアンプの減速値は、
(150−130)×0.857=17.14
片側アンプの値は、前進スピードから減速値を引いて、
180−17.14=162.86

プログラミングできない!? 減速の計算方法が出たので、これを使ってプログラミングを......と、思ったら...
アセンブラに割り算が無い!.....と、言う事は、引き算を繰り返して、何回引けたかをカウントしなければ...(^^;;

さらに、小数点以下の数値が計算できない!.....と、言う事は×100して、整数値に直して計算しないと....(^^;;

面倒だぁ.....せっかく、100〜200と言う1バイトで扱える数値にしたのにぃぃ....

...................手抜しよっ(ボソッ)


減速段階を減らしてしまえ!! 上の計算で問題なのは、1カウント当たりの減速幅を計算してる部分で、これだとどうしても小数点以下が出てします。
仮に、×10にして、小数点以下無しで、計算したとしても、今度は左右の値に掛けると値が255を越えてしまって、処理が面倒..(^^ゞ

と言う訳で、考えたのが、手抜(間引き?)5カウント減速処理!!

左右スティック値を5カウント単位に減速すると考えると、中心の150から115(185)までは、7段階になります。
この方法で計算すると、
1段階当たりの減速の幅は?
「現在のスピード」÷6=1段階の減速値

例えば、
前進スピード(2chの値)が180カウントの時は、
(180−150)÷6=5(もちろん小数点以下が出ても無視(笑))
さらに、左右スティックの傾き(1chの値)が130カウントの時のアンプの減速値は、
(150−130)÷5=4(4段階目)
4×5=20
片側アンプの値は、前進スピードから減速値を引いて、
180−20=160


これで、プログラミングできる!(笑)

プログラミング開始!
  1. PICのRA0-1・RB0-1のピンを入力と出力に設定する。
  2. ループ開始
  3. 1ch(左右)の信号と2ch(前後進)の信号を取得し、変数PIN1とPIN2に代入
  4. 左のアンプの値の変数POUT1と右の値POUT2に、前進後進の値PIN2を代入
  5. 左右のPIN1が107より小さい、または197より大きい時は、POUTの片側の値を逆転(超信地旋回)
  6. 左右のPIN1が115より小さい、または185より大きい時は、POUTの片側の値を停止(信地旋回)
  7. 前進左旋回の時の減速値計算(PIN1<150 and PIN2<150)
  8. 後進左旋回の時の減速値計算(PIN1<150 and PIN2>150)
  9. 前進右旋回の時の減速値計算(PIN1>150 and PIN2<150)
  10. 後進右旋回の時の減速値計算(PIN1>150 and PIN2>150)
  11. POUT1とPOUT2の値をアンプに出力
  12. ループへ戻る。
実際に作ったプログラムはこれ→「savo3a.asm
さすがに、プログラムは複雑になるなぁ.....作った本人しかわからないかも(笑)

ヤークトタイガーに搭載!
作ったプログラムをコンパイルして、PICに焼いて、実験基板にセット!
テストに使ったキットは、ドラゴンのヤークトタイガーで、もともと森本さんの自作のDMDアンプを積んでいました。

モーターとアンプは2000円以下の安売りサーボをばらした物を使ってます。

実際に動かしてみると.. ちょっとスティックを曲げたくらいでは、旋回しない...(^^;;

サーボバラシのアンプは中低速のコントロール幅があまり無いのと、片側のモーターのスピードを多少落しても、ギア比のせいで、実際のスピードには変化がほとんど無い...(^^;;

さらに、テストしたヤークトタイガー自体が、キャタの幅が広く接地面積も広いので、旋回し難い.....(^^;;

上のスティックの図で、−3X(3段階目)くらいまでは、ほとんど曲ってない......(^^;;

ヤークトタイガーの補正 と、言う訳で、プログラムをヤークトタイガー用(サーボバラシのアンプ用?)に修正しよう!!
プログラム的に簡単なのは、段階をシフト(ずらす)してしまう....
(左右の値を5で割った後、1を足す...(^^ゞ)

今まで、−3で減速してたものが一段減速幅が増えて−4に、−4は−5に....と、スティックの角度は同じでも、減速幅は1段ずつ増える。

ただ、この方法で、減速幅を増やして行くと、左右スティックが120以下の時と、180以上の時で停止の150よりもさらに減速してしまい、モーターが逆転する....(^^;;;
そのため、計算値が停止値(中心値)の150を以下(後進の時は150以上)の時は、微速値148(後進は152)を直接設定してます。

実際に作ったプログラムはこれ→「savo3b.asm

キットに合わせて、プログラムを変更できるのが、PICの魅力の1つですね!
今回は、左右旋回を5カウント単位でやってみましたが、これを4カウント・3カウント単位にすると、より細かな制御が出来ます。
実際に動かしてみて、どのくらい変わるかもテストしてみると面白いです。


戻る

更新日2000.7.19