書籍も多く、入門用のマイコンとしてよく使用される秋月のH8/3052において、多足歩行ロボット用のサーボーモーターを24軸(最大40軸)まで制御するためのプログラムについて、説明します。 ハードウェアではなくソフトウェアに依存した手法です。 C言語なんで、そこそこジッターもあって微妙ですが、利点としては「とにかく簡単!」それだけが取り柄です!
H8/3052(3,600円) 秋月電子通商 GCC Developer Lite(コンパイラダウンロード) |
|||||||
オススメのH8の入門書
|
C言語ソースのダウンロード |
ソースのダウンロード
Ver.1.51 - 2007/06/21公開
Ver.1.50 - 2007/06/12公開
Ver.1.10 - 2006/08/03公開
Ver.1.00 - 2005/12/28公開
|
24軸制御のしくみ |
一般的なPWMを利用したサーボモーターは20msに一度600μ〜2300μsの信号で制御されます。 ということは、余裕を持ってひとつのサーボの制御信号が2500μsとしても、20msで8回、8個分のサーボの信号を作り出すことが出来ます。 というわけで、ここではコンペアマッチ割り込みを利用したソフトウェア制御のPWM発生方法について考えます。 24軸ということで、使用するタイマの数は24÷8=3で、3つです。 ギザギザのイメージはカウンタを時間軸に合わせてカウントアップしているところを表します。
さて、ビットの操作に関しては、図にある通り、カウンタスターコンペアマッチ割り込み(GRBとTCNTレジスタが一致したとき)全てのビットを倒し
(1→0)、カウンタクリア(TCNTカウンタを0に戻す)で
、次のビットを上げ(0→1)、コンペアマッチでまた倒す。 どのビットを上げるか、またどのサーボの値をGRBに代入するかの判断は、カウンタ変数をインクリメント(1増やすこと)して数えましょう。8個のサーボに信号を送ったら次は1番目のサーボに戻ります。 μs(マイクロ秒 = 1/1,000,000秒)という単位を聞くとものすごく早い気がして、「本当に扱えるの?」という気分になりますが、マイコンにしてみると、人間が「いーち、にー、さーん・・・」と数えるようなもんなので、理論を順番に考えていけば、絶対に理解できますので、あきらめずにとにかくソースを読んでみてください。 |
マイコンとサーボモータの接続 |
Port1のBit0〜Bit7 Port2のBit0〜Bit7 Port3のBit0〜Bit7 にサーボの信号線を接続するだけです。 ポートとサーボの間に100Ωくらいの抵抗を入れるといいかもしれません。
補足ですが、割り込みを使用して汎用ポートから信号を出していますが、PortAからは8個の信号を合成した信号が出力されています。
● 応用で40軸まで対応させる 現在、ITU(インテグレーティッドタイマユニット)を0〜2まで使用していますが、残りの3,4を使用することで、最大8×5=40個のサーボを制御することが出来ます。
ただし当然ですが、この場合ジャイロやロータリーエンコーダーなど、入力系に使えるITUがなくなります。
|
基本的な使い方 |
メイン関数のなかでinitPWM関数を呼び、startPWM関数を呼べばサーボに信号が流れます。 サーボに対応するグローバル変数、pulse1[x] pulse2[x] pulse3[x]を書き換えることで、サーボの角度が変化します。 基本のソースを載せますと・・・。
int main(void){ int pos; unsigned int i; //wait用のループ変数 initPWM(); //PWM発生装置の初期化 startPWM(); //PWMの発生スタート for(;;){ //無限ループ for(pos = 2188 ; pos < 7187 ; pos++){ //行ったり pulse1[0] = pos; for(i = 0;i < 1000 ; i++); //ウェイト } for(pos = 7187 ; pos > 2189 ; pos--){ //来たり pulse1[0] = pos; for(i = 0;i < 1000 ; i++); //ウェイト } } return 0; } これを実行するとPort1のBit0に接続したサーボが動きます。 具体的な数字はサーボに合わせて調整してみてください。 強調している13,14,15行目の部分を自由にプログラミングすることで、サーボの制御が自由自在に行えます。 また、脱力したいときにon_off_pwm(0)、再びトルクオンしたいときにon_off_pwm(1)を実行することで、遠隔操作による緊急時の脱力等に対応します。
割り込みを使用してシビアな時間管理をしていますので、この他に割り込み(シリアル受信割り込み・AD変換割り込みetc)を使うとジッター(ゆらぎ)が発生しサーボがプルプルしてしまいますが、これは仕様です。 ただ、ロボットを制御することは、PWM波を出すことが目的ではないので、その部分で悩むようなら、シリアル制御のサーボに移行することをオススメします。
|
ユーザー関数一覧 |
void initPWM(void);
void startPWM(void);
void onPWM(void);
void offPWM(void);
|
参考サイト |
|
Copyright ©2004-2006 HM(みっちー) All Rights Reserved.