はじめに
歩行系のロボットを作る場合はRCサーボが良い(インターネットなどで情報が手に入り、比較的簡単に制御できるので)のですが、車輪系のロボや、どうしても自分でサーボをつくってPID制御したい(巷では”オレサーボ”と言われている)という方がいるかと思います。(PID制御をしようとする方は浅草ギ研のホームページは見ないと思いますが...)
このような場合は通常は 「小型DC(直流)モータ」 を使います。
DCモータの制御は、マイコンなどと違って大きな電流を扱いますのでモータを駆動するドライブ回路が必用になります。DCモータのドライブで一般的なのはトランジスタを使用したHブリッジ回路で正転、逆転させるという方法があります。また、Hブリッジ回路が1つのICに入ったものなども販売されておりいくつかは秋葉原でも購入できます。(ツクモロボット王国や千石電商のホームページなどでも購入できます。)
Hブリッジ回路で1つのモータを正転/逆転させるには、マイコンのIOを2つ使用します。モータが2つならIOは4つ必用になります。今回使用しているPIC12F675は8ピンしかなく、IOは6個しかないのでモータを2つ使用する場合はIOが2つしか残りません。
浅草ギ研では、シリアル通信でデータを送ることにより、2つまでのDCモータの正転/逆転およびスピードを調整できるモータコントローラを販売しています。ここではこのコントローラとPICとの接続について説明します。この場合、使用するIOは1つで済みます。
超小型DCモータコントローラ
超小型DCモータコントローラの商品説明はこちらのページ
以下概要です。

<概要>
超小型2chDCモータコントローラはシリアル通信で簡単な命令を送ることにより2つのDCモータの回転方向と速度を制御するコントローラです。
9ピンSIPタイプなので市販のブレッドボードやユニバーサル基板などにさすことができます。
シリアル通信の通信速度はコントローラ側で自動検出しますので設定の必要がありません。 |
<仕様>
|
コントローラ
電源電圧
|
+3〜5.5V DC |
|
モータ
電源電圧
|
+1.8〜9V DC |
|
駆動モータ数
|
最大2個 |
|
最大電流
|
1A/モータ |
|
速度調整
|
正転127段階、逆転127段階 |
|
通信速度
|
1200〜19200bps(自動検出) |
|
通信方式
|
TTLレベル、8ビット、ノンパリティ、ストップビット0、フロー制御無し |
|
PWM周波数
|
600Hz |
|
サイズ
|
23.0mmx11.5mm |
|
<ピン配列>

|
|
ピン番号
|
説明 |
|
1
|
モータ用電源(1.8〜9V)
|
|
2
|
グランド(0V) |
|
3
|
コントローラ用電源(3〜5.5V) |
|
4
|
シリアル入力 |
|
5
|
リセット |
|
6
|
モータ1 + |
|
7
|
モータ1 − |
|
8
|
モータ0 − |
|
9
|
モータ0 + |
|
こちらはSC−01とは違い、マイコンなどと接続されるように設計されてますので 論理1−>5V、論理0−>0V で通信します。よって前回のようなインバータは不要です。
これも電源は基板用に5Vとモータ用の2つの電源が必用です。基板用電源は3〜5.5Vを入れればよいのでPICボードの5Vから取ることにします。PICボードについては「PICを使ってみる」を参照願います。モータ用の電源はモータに合った電源を使います。今回はタミヤの工作キットのモータを動かしますがこれは1.5Vぐらいから動きますので乾電池でよいでしょう。しかし、DCモータコントローラのモータ電源電圧の最小値が1.8Vなので乾電池2個直列の3Vで駆動することにします。
前回のRCサーボを動かすところで、「電流が取り出せないので市販の乾電池は不可」、と言いましたがこれはRCサーボを複数動かす場合であり、普通の小型DCモータは電子回路がついてないので電圧が低くてもリセットがかかったりしないので問題ありません。電圧が低いと動きが遅くなるだけです。
通信は1200〜19200bpsの通信速度で行います。このコントローラの場合は通信速度自動検出なので、設定(あとでプログラム中で設定する)はこの範囲であれば問題ありません。
PWMによるモータの速度制御
上記仕様を見ると速度が127段階で調整できます。DCモータの速度を調整するには通常、PWMという方式を使います。
DCモータの動作は単純で、電源が入っているとその電圧値に応じたパワーが出ます。無負荷(モータになにも付けない状態。)の場合だとパワーが上がれば回転スピードも上がります。実際に電圧を上げたり下げたりするという方法もありますが、マイコンなどから制御する場合はパワーをON/OFFを繰り返して制御します。

これをPWM(PulsWideModuration)制御と言います。パルス周期を一定にした場合、パルスのON(High)の時間が長いほどスピード(パワー)が出るというものです。
小型DCモータは電圧を上げると(そのモータにより定格電圧(最大に入れて良い電圧)は決まってますが、)スピードが速くなるだけですので、マイコンの5Vを直接モータに入れればよいのでは?と考えるかもしれませんが、マイコンのIOは「流れ出す、もしくは流し込む電流の最大値」が決まっており、大抵のマイコンは数十mA程度です。今回使用するPIC12F675はどのぐらいの電流が流せるでしょうか?これはデータシートの ElectricalSpecifications(電気的特性)
のところに書いてあります。
ここの AbsoluteMximumRatings(最大定格) の部分を見ると
Maximum output current sunk by any I/O pin(各IOピンに流し込む最大電流)・・・25mA
Maximum output current source by any I/O pin(各IOピンから流れ出る最大電流)・・・25mA
となっています。
また、
Maximum current sunk/sourced all GPIO・・・125mA
となってますので、全GPIOが出し入れする電流の合計が125mAを超えても壊れる可能性があります。
マブチモータなどの普通に模型屋などで買える小型DCモータ(今回使用するモータ)は、回転するときに数百mA〜約1Aぐらいの電流が流れます。よって、PICなどのマイコンのIOを直接DCモータにつないでIOのオン/オフでスピード調整をしようとするとマイコンのIOポートが(間違いなく)壊れます。
これを解決するには、IOにトランジスタをつないで電流を増幅してモータに加えてやればよいことになります。また、このトランジスタの組み合わせでIOの2ピンを使って1つのモータを正転/逆転させることができます。この辺りの詳細はBASICスタンプとトランジスタでモータを回転させる実験をやっているページがありますのでそちらを参照願います。また、このページでは秋葉で購入したモータドライバICを使ってみたりもしてます。
今回使用する超小型DCモータコントローラでもこのようなドライバ回路を経由してスピード調整していますが、これらのPWMパルスはドライバに積んであるマイコン側で生成しますのでPIC側ではそれらを意識しなくても良いのです。
H8などのマイコンで、PWMパルスを簡単に作れる機能のあるものもあります。PWMパルスをつくるときはタイマでパルス長を調整するのでPWMとタイマの説明がセットで(データシートなどに)書かれていることが多いです。
回路図
以前、PCから直接このモータドライバを接続して制御する実験をやりまして、今回はその時に使用したモータのセットを使います。PCで直接、の方に興味のある方はこちらのページを参照願います。(でも、PCからDCモータを動かすメリットってあるのかなぁ?このページ、やってみたけどまったく反応が無い。)
タミヤの工作シリーズのねずみの形で走り回るヤツの電池を3V(乾電池2個直列)に変更して、DCモータドライバをくっつけてます。

接続は次の通り、

GND同士は全て接続します(というかPICボードのGNDに挿してます)。今回も前回同様GP0からシリアルデータを送ることにしました。

実際の配線はこんな感じです。ネズミの方は前回PCとの接続の時に、ケーブルを2550コネクタで接続してましたのでPICボードに挿すだけで簡単に終わりました。
PICボードについては「PICを使ってみる」を参照願います。
プログラム
超小型DCモータコントローラの仕様を見ると、4バイトのデータでモータのスピードと方向を制御するようです。
■1バイト目:常に 0x80 (10進数だと128)
■2バイト目:常に 0x00 (これは10進数でも0です。)
■3バイト目:5=0番正転、4=0番逆転、7=1番正転、6=1番逆転
■4バイト目:スピード (0:停止〜127:最速)
よって、speedを速度変数とすると
0番正転 0x80,0x00,0x05,speed
0番逆転 0x80,0x00,0x04,speed
1番正転 0x80,0x00,0x07,speed
1番逆転 0x80,0x00,0x06,speed
となります。
これで作ったプログラムが下の通り。
尚、各関数や設定についてはサーボコントローラを動かしたところを参照願います。
for文でスピードをどんどん上げていくというプログラムです。
テキストデータはこちら PIC-DCM.txt
(右クリックで保存)
これも注意点は前のページと同じ。printf( )文などで文字データを送らないように。数値データを送ることで制御しますので。
結果、上のプログラムで動作確認できましたが、あまりおもしろくないので結果のコーナーは割愛します。
(ちょっと疲れた。)
これで(超小型DCモータコントローラを買えば)PICで簡単に2つのDCモータの方向と速度を制御できるようになりました。
2005年8月18日 |
| |
|