PIC AVR 工作室別館 arduinoの館->TopPage->接続くん->DCモーターの接続

DCモーターの接続

arduinoにDCモーターを接続して、正逆転させたり回転数に緩急をつけたりしてみます。 可変抵抗1個で回転速度、及び回転方向が簡単に制御できます。

DCモーターについて

DCモーターっていうと代表例はマブチの130モーターでしょうか。赤い線と青い線をそれぞれ乾電池に繋ぐと勢い良く回ります。

DCモーターのDCは「直流」です。直流の電源に繋いであげると回るモーターがDCモーターです。 DCモーターといえば一般にはブラシモーターです。軸の回転に合わせてブラシが付いたりはなれたりすることで順々に電極を切り替え、 それによってクルクル回転し続けます。

DCモーターにはブラシレスというタイプもあります。これはブラシに相当する機能を電子的に実現しているモーターです。 ブラシと言う物理的な電気接点が無くなることによって、電気接点の磨耗という心配がなくなるので長寿命になります。 ただ、付属の電子回路などが必要になり、ちょっと高価になります。

今回は普通の「ブラシモーター」を対象にします。マブチの130モーターあたりと考えてください。ちなみに写真は260モーターです。

DCモーターの回し方

DCモーターには+側端子と-側端子があります。この端子にそれぞれプラスとマイナスの電源を繋ぐとモーターは回ります。(アタリマエ)

一方、プラスとマイナスのつなぎ方を逆にすると反対に回ります。(これもアタリマエ)

さらに、掛ける電圧を高くすると速く回り、低くすると遅く回ります。(さらにアタリマエ)

さて、今回はこのように回転方向や回転速度を自由自在にarduinoで制御しちまおうという作戦です。

といっても、arduinoの出力端子自体は電力を取り出せるほどの力がないので、何らかの増幅回路が必要になります。

H-ブリッヂ回路で正逆回転制御

一番簡簡単な増幅器といえばバイポーラやFETのパワートランジスタってことになるんですが、 こういうディスクリート部品を使って組み立てると色々メンドウなので、DCモーター制御用に特化したICを使ってしまうのがラクチンです。 それらのICには一般にH-ブリッヂ回路というモノが組み込まれているんですが、 そのH-ブリッヂ回路が増幅機能とモーターの正逆転制御を司ります。

今回は秋月で買い置いておいたTA7267BPというICを使います。TA7267BPにもH-ブリッヂ回路が内蔵されていて、 1個のICにつきモーター1個を正逆転の制御をすることができます。 マイコンからの制御信号に従って正回転、逆回転、ストップ、ブレーキという4つのモードを選ぶことが可能で、 arduinoから2ビットの制御信号を出力するだけでこの4つのモードを操ることができます。

実際にはこの図のような機械的スイッチではなく、半導体(トランジスタ)を使ったスイッチがICに内蔵されており、電力の増幅も同時に行います。 ICにはこの半導体スイッチ機能と、スイッチのオン/オフを制御するための制御回路機能が内蔵されており、 マイコンからは4つのうちどのモードを使うのかの情報を渡すだけで扱うことが出来、とても簡単です。

H-ブリッヂ回路のことは後閑さんの本に詳しく書いてある ので、ご興味のある方はそちらをご覧ください。

PWMで速度制御

モーターに供給する電圧が「オン」と「オフ」の2通りしかないと、モーターは「回る」「止まる」の2通りにしか制御できません。 中間の状態(中間の回転数)を作り出したくなります。そこで、モーターの速度制御にPWMを持ち込んでみます。

LEDなどの場合、高速にPWMで点灯と消灯を繰り返すと人間の目では点滅を認識出来ず、もはや薄暗く点灯しているように見えるようになります。 arduinoの場合、アナログ出力機能を使えばLEDは点灯と消灯の中間の明るさが簡単に作り出せます。

モーターの場合もこの手のアナログ制御にはPWMを使うんですが、モーターの中身は「コイル」なので、動作上少し意味合いが変わってきます。 DCモーターの場合は先ほどのH-ブリッヂ回路で制御する訳ですが、 2対のスイッチを(たとえば正回転時は左上と右下のスイッチを同時に)高速にオン/オフさせることで制御します。

その際の注意点。モーターはコイルなのでインダクタンスを持っています。スイッチオンで急激に電圧が上がっても電流は少し遅れてゆっくり流量が増え、 逆にスイッチオフで急激に電圧が下がっても電流は暫く流れつづけるという働きをもっています。 モーターに供給する電圧をPWMで高速にオン/オフを繰り返した場合流れる電流は多少脈を打つ程度で、 結果的にオンとオフの中間的な電流が流れつづけます。

この様に、PWMを使ってモーターの速度に緩急つけるにはモーターに流れる平均電流量の制御という形で行います。 PWMのデューティー比を変化させることによって、この平均電流…図の赤い点線を上げたり下げたり出来るわけです。 (この考え方自体はDCモーターに限らず、 ステッピングモーターのマイクロステップでも応用が利きました

おいおい待てよと。左上と右下のスイッチを同時にオフにしたら、モーターの両端子の間は絶縁状態だから電流が流れる経路が無いジャン!

…実は、スイッチがオフの間にもコイルに溜まっていたエネルギーを電流として放出しつづけるための「フライバックダイオード」 と言う仕組みがICに内蔵されていて、上手く機能するようになっています。仕組みの説明は端折りますが、ちゃんと動くので大丈夫。

(細かい事いうとTA7267BPに内蔵されているフライバックダイオードは容量が小さいらしく、 大きいモーターを大きい電力で回す際には外付けのフライバックダイオードをつけたほうが安全なようです)

TA7267BPとPWM周波数

なお、TA7267BPというICは元々正逆転制御だけのために作られたモノのようで、 そもそもPWMで制御するようには設計されたものではないようです。

でも、あまり極端な高周波でなければPWMでも制御が可能なようです。 この手のPWMを前提としないICであっても、私が調べた範囲では一般的に数百Hz~1kHz程度で使う分には問題ないみたいです。

arduinoのアナログ出力(=PWM出力)は約490Hzと比較的遅い周波数を用いているんですが、 この様にモーター制御には「必要十分」な周波数のようで、 しかもLEDの明るさ制御に用いても点滅がヒトの目で認識できない程度の「ちょうどいい周波数」ということのようです。 arduino、よく出来てます。こういう何気ない配慮がarduinoの使いやすさに繋がってるんだろうな…

回路図

というわけで、回路図です。

使い方

基本的にはTA7267BPのデータシートにしたがって、in1とin2をarduinoの入力信号に、 out1とout2をDCモーターに繋いでおいて、あとは電源とGNDを繋いだだけの図です。 あと、アナログ入力端子には可変抵抗で分圧した電圧を入力させておいて、その電圧値で正逆転や速度の調整に使ってます。 arduinoからの出力は、PWMが使えるようにデジタル5と6ピンを選んでます。

幾つかコンデンサを挟んでますが、こんな感じで適当にコンデンサを挟んで使ってください。 今回は、1点はモーターの両端に0.1uF程度のコンデンサを。もう1点はTA7267BPの電源周りに33uFと0.1uFをパラで使いました。

回路図ではout1にモーターのマイナス側、out2にプラス側を繋いでますが、逆に繋げば逆回転になるだけです。

電源周りについて

電源は、arduinoお得意のUSB給電だと電流が足りません。プログラムをダウンロードしたらUSBから外し、 外部電源で動作させる必要があります。物凄く小さいモーターならUSBからの給電でも回るかもしれませんが、 130モーターですらUSBの500mAでは回せません。ご注意を。今回は秋月の5Vスイッチングアダプタを使いました。

冒頭の写真で、ブレッドボードにLEDや抵抗が刺さっているのは、 実はTA7267BPに繋ぐ前にUSB接続のままLEDを使ってスケッチの動作を確認するためのものでした。 LEDならUSBからの給電でも足りますからね…

もっと言うと、TA7267BPの制御回路の電源(Vcc)は本当は6V以上必要なんですが、 arduinoは定格上5.5V以下じゃないとダメなので、むりやりarduino用の5Vで動かしているというわけ。 (パワー供給用のVsは6Vより低くても大丈夫です…詳しくはデータシートご参照)

以前3.3Vで実験してみたことがあったんですが、この電圧ではモノの見事に動きませんでした。 もちろん5Vでも動作の保証はないので、厳密に動かすにはTA7267BPに6V以上の電源を給電しておきつつ、 arduinoの出力ピンを一旦オープンコレクタで受けてから、コレクタ側を6Vにプルアップすれば安定して動かせると思います。

TA7267BPの利点

利点と言うと、まずは単純に1個のICだけでモーター制御のモロモロを扱えてしまうってことなんですが、 それ以外にも利点があります。

H-ブリッヂ回路のイメージ図を眺めていただくと解ると思いますが、4つあるスイッチ部分のうち上下に並んだ2つのスイッチがいっぺんに「オン」 になっちゃうと電源とGNDがモロにショートしてしまう(貫通電流が流れる)ことになります。

ディスクリートでモーター制御回路を組む場合、この辺りのことを考慮しながらハード・ソフトの設計を行わないといけませんが、 ICを使うならこの「短絡」状態を避けられる様に設計されているので、基本的には心配しなくてもOKです。 上下のスイッチ部分が同時にオンにならないようになっていて…その代りに「ブレーキ」機能に割り当てられているという訳です。 利便性と動作安定性。それがICを使うメリットということでしょうね。

スケッチ

サンプルスケッチ

スケッチです。例によって不等号は全角に置き換えてあるので、半角に戻して使ってください。

int motor1 = 5;   // output for motor1 on 5pin(pwm)
int motor2 = 6;   // output for motor2 on 6pin(pwm)
int analogpin0 = 0;  // select the pin for analog0 input
int a_input = 0;  // input data from ADC

int i;


void setup() {
  pinMode(motor1, OUTPUT);  // declare the motor1 as an OUTPUT
  pinMode(motor2, OUTPUT);  // declare the motor1 as an OUTPUT
  
  /*** make motor stop  ***/
  analogWrite(motor1, 0);
  analogWrite(motor2, 0);
  
  Serial.begin(9600);

  Serial.println("start");

}

void loop() {

  a_input = analogRead(analogpin0);  //read data from analog0 pin

  if (a_input > 512) {

    /*** cw ***/
    analogWrite(motor1, (a_input - 512)/2 );
    analogWrite(motor2, 0);
    Serial.print("plus");
    Serial.println((a_input - 512)/2);
    
  } else if (a_input < 512) {
    /*** ccw ***/
    analogWrite(motor1, 0);
    analogWrite(motor2, 255 - (a_input /2) );
    Serial.print("minus");
    Serial.println(255 - (a_input /2));
   
  } else {
    /*** stop ***/
    analogWrite(motor1, 0);
    analogWrite(motor2, 0);
    Serial.println("center");
  }

  delay(10);

}

サンプルスケッチの意味

このサンプルスケッチを動かすと、可変抵抗の回転角によってモーターの速度や回転方向を好きなように制御できます。

可変抵抗で5Vを分圧し、それをアナログ0番端子から入力します。入力値が512~1023は時計回り、0~512は反時計回り。 どちらも512から離れるに従って回転速度が上がります。

アナログ出力には、デジタル5番と6番のPWM出力端子を割り当てています。 時計回りの時にはデジタル5番ピン側がオン/オフすることで速度を変化させています。この間デジタル6番は常にオフです。

反時計回りの時はその逆で、デジタル5番は常時オフ。デジタル6番がオン/オフすることで速度を変化させています。

どちらも、デジタル5と6番が両方オフになる瞬間が生じますが、これは「ストップ」と同じなので「惰性で回っている状態」です。 PWMによって通電-惰性-通電-惰性……と繰り返すことによって、オンとオフの中間状態を作り出しているという感じです。

今回は両方ともオンの状態(=ブレーキ)は使ってません。使いたい方はその用途に従って組み込んでください。 (両方のアナログ出力に255を出力すればブレーキになります)

なお、スケッチ中のSerial.printやdelayは基本的に不要なので、そのあたりの行はザックリと取り除いて下さい。

注意点

TA7267BPのデータシートを読むと書いてありますが、正転と逆転の切り替えを行う間には100us程度の時間を置く必要があるようです。 今回のスケッチではあまり気にせず書いてしまったのでそこまで盛り込まれていません。

これは、先ほど出てきた上下のトランジスタ(スイッチ)が同時にオンになって「貫通電流が流れる」という事象を引き起こすためです。

ロジックで愚直に実現していくとしたら、正転・逆転が切り替わることを検知したら、100usの間両方のアナログ出力端子に 「0」を出力するという手が打てるかと思います。

まぁ、PWM5番と6番(共にタイマー0を使ったPWM)は同じタイマーモジュールによるPWMのペアなので周期が一緒だし、 アナログ出力値(=タイマーのTOP値)がタイマーモジュールに取り込まれるタイミングは基本的にタイマーの値が0に戻る時なので、 arduinoのPWM周期を加味すれば100us以上の間隔が当然開くであろうという読みがあってのスケッチです。(ただ、厳密な裏取りはしてません)

arduinoのデフォルトモードでアナログ出力を使うならこの程度で多分okですが、 タイマーモジュールを直接制御してPWMの周期をもっと速くしちゃうとか、タイマーの動作モードを弄りなおすとか言う場合にはその限りではありません。 ご注意を。

用途など

簡単なスケッチでモーターを回すことができたので、とりあえず世は満足じゃ。…じゃなくて、何に使うかというお話。

入力回路の「可変抵抗」の変わりに「温度センサー」などを使って、PC内部のクーリングファンの制御などには使えそうです。

それ以外では…やっぱりラジコンカーのタイヤ回転速度の制御とかでしょうかね。

まぁ、モーターの回転速度をアナログ的に制御したい場合に色々使えるんじゃないでしょうか。

というわけで、とりあえず今回の実験を締めくくります。