Trinketで模型用モータを動かす(4)
前々回(Trinketで模型用モータを回す(2))と前回の記事(Trinketで模型用モータを回す(3))で、Trinketにサーボモータをつないで動かすことができるようになりました。ここまではあまり深くソースコードの意味を理解せずにきましたので、今回から新しい事を試しながら、少しずつソースコードの意味を考えていきます。
今回は、「2つのサーボモータをTrinketで動かす」ということに挑戦してみたいと思います。
使うサーボモータは今まで通り、フタバのS3003です。これを2つ使います。今までは、少し乱暴にTrinketのUSB+(DC5V)をモータ駆動用にそのまま使っていましたが、さすがにサーボモータ2つだと電力的にちょっと不安になってくるので、今回は、サーボモータへは外部の直流安定化電源でDC5Vを供給するようにしましょう。
1つ目のサーボモータのPWM信号入力線は、前回と同様にTrinketの#0ピンに接続します。2つ目のサーボモータのPWM信号入力線は、Trinketの#1ピンに接続しましょう。
この2つを1つのポテンショメータ(可変抵抗)に応じて動くようにします。
回路図は以下の通りです。
回路図では漏れていますが、Trinketの電源も外部安定化電源からとりました。
さて、次はプログラムですが、前回のプログラムを改造して以下のようにしてみました。改造したのは、2つ目のサーボモータを追加したところだけです。
これをTrinketに書き込んで、動作させたのがこんな感じ。
この時、Trinketの#0ピンと#1ピンの出力信号は以下のように出ていました。
プログラムを見れば当たり前と言えば当たり前なんですが、ポテンショメータからの入力値をPWMの出力値に変換して、それをサーボ1とサーボ2の両方に出力してます。このため、オシロで診た波形はサーボ1とサーボ2で同じ形をしています。ただ、診てわかる通り、サーボ2の出力はサーボ1の出力が終わってから出力されているようです。この辺、少し改善できるといいかもしれませんね。
ところで、オシロの波形からわかる通り、PWM周期は10msecになっています。プログラムの中では、SIGNAL(TIMER0_COMPA_vect)関数で出力を更新しているようで、実際、
if (counter >= 10) { counter = 0; myServo1.refresh(); myServo2.refresh(); } |
というところで、カウンタ値を10と比較していますが、これを例えば20にすると、PWMのサイクルが20msecになるようです。
このSIGNAL()関数はLoop()関数の中のどこからも呼ばれていないので、おそらく一定時間間隔で呼ばれるイベントハンドラのような物だと推定しています。カウンタ値のカウントアップが2毎なので、おそらくは2msec周期で呼ばれているのでしょう。なので、カウンタ値がそのままmsec単位の時間を表すことができて、if文で時間になったらサーボをリフレッシュすることで、出力が繰り返されていると思われます。
今回、サーボモータを2軸動かすことができるようになりました。ここまでくると、実際に何か形になる物を動かしてみたくなりますね。今後、具体的な何かを動かす事を考えてみたいと思います。
今日はここまで。