« USIを使ったバッファー付きUARTライブラリーの公開 | トップページ | Tiny13で制御部を作って自作サーボが動いた »

2014年5月 1日 (木)

サーボモーター自作。ロジックICだけでは動かない

 サーボモーターの自作の途中で思わぬ脱線をしていた。AVRマイコン、Tinyシリーズについている汎用シリアルインターフェースUSIを使ったUARTライブラリ開発である。前回の記事で、ソースコードの公開までしてしまった。

 だいたい、サーボモーターとUARTとは何の関係もない。単に、デバッグのためUARTを使ってPCコンソールに値を出しながらモーター制御のテストをしようとして、UARTのせいでサーボが不安定になったのが縁である。

 これまで愛用していたソフトUARTはGPIO(汎用入出力ピン)でデータを送受信しているので、通信中は割り込みを禁止している。このため割り込みを多用するPWMを使ったモーター制御などではタイミングが不安定になってしまうのだ。

 ハードのUARTを持ったTiny2313などに換えれば良いところを意地になって、Tiny861で、USIを使ったソフトUARTを動かした。ソフトUARTでは1バイトの送受信で短くても数百μsの間(38400bpsで208μs)、割り込みを止めなければならないが、USIを使えば、1ビットあたり数μsのオーバーヘッドですむ。Blg_p4306506

 脱線はアマチュアの特権で、悪戦苦闘(まあ、これが楽しいのだが)の結果、何とかPWMに影響しないUART送受信が出来るようになった。これで元のモーター制御のテーマに戻ることが出来る。プロジェクトの本来の目的、小型モーターを使った自作サーボの工作である。

Blg_p4306505_2

 しかしこのテーマには問題が残っている。それはこの自作サーボの具体的な用途が決まっていないことだ。こういう目的のない製品の開発が一番厄介(え、まあ、趣味なのでおかしいのですが)で、案の定、プロジェクトは迷走を続けている。前回から20日近く経ったが、まだまともに動かない。

定番のタイマーIC、NE555を取り出す(4/19/2014)
 サーボのメカの部分は、バラックだけれどUSIのUART開発以前におおよそ出来ていた。モータードライバーもBD6211でテスト済みだ。残っているのはサーボ制御のロジックである。モーター軸に接続したポテンショメーターから位置に応じた電圧を出し、そのパルス幅と指示された幅に応じて、モーターを前後進させる信号を作る。

 最初はマイコンを使わず、普通のロジックICだけで動かしてみることにした。PWM駆動でduty比はわずか1/10~1/20なので、ちゃんと回るか心配だが、パルスジェネレーターと、ロジックICだけで出来ると言うのが魅力である。Blg_p4206498

 かねて考えていた通り、パルス発生は定番のNE555を使う。ウェブなどでは、74HC123などのワンショットパルスICを使ってサーボの受け側パルスを作っているが、パルス幅を可変にして、パルスのスタートを任意に決められるパルスの発生ならこのタイマーICでもできるはずだ。

 NE555は超有名な長寿のタイマーICで、こういうパルス発生には今でも良く使われる。このあいだのガイガーカウンターのパルス発生部予備としてのストックもあるし、昔々PCの電源を電話の着信で入り切りしようと電子キットを買ってきたときにもついていたのが残っている(TA7555)。

 NE555を部品箱から取り出し、ミニブレッドボードに組み込む。発生パルスの1~2msの範囲に半固定の10KΩで調整できるよう、CRを計算し(連立一次方程式、いや久しぶりに楽しかった)、手持ちのCR(1.33μFと固定3KΩ)をつけて、出力波形と、入力パルス信号をオシロで調べる。

 ところが最初、指示通りにしても全く目標のパルスが出てこず、頭を抱えた。どれだけ短くトリガーを与えても、トリガー部分の長さにしかならないのである。どうしたことか、ウェブにも情報はない。回路図も間違っていない。Blg_p4206494

 暫くして、原因がわかった。なんのことはない、ケーブルを手で接触させるだけでは、パルスが長すぎて出力パルスに隠れてしまうことがわかった。人間の手によるパルス幅は、どんなに早くても10ms以上で、今度作ろうと思っているパルス幅は最大でも2msである。おばかな話である。

 Tiny861の出力パルスを利用することにする。ミニブレッドボードに組んだNE555をTiny861の隣に持ち込み、Tiny861が発生した短いパルスが入力となるようケーブルをつなぐ。おや、NE555のトリガーは負論理だ。このままでは動かない。

 あわてて、トランジスター2SC1815を横に挿して、論理反転回路を追加する。出力の確認はオシロである。よーし、大丈夫だ反転している。NE555の出力もオシロに出してテストを続ける。

 出た(当たり前か)。NE555の半固定抵抗をドライバーで上下させると、Tiny861の出力パルスと独立してNE555出力パルス幅がオシロ上で細くなったり長くなったりする。 極く当たり前のことで、ただそれだけの話だが、なぜか無性に面白い。暫く遊ぶ。

 これでパルス幅の部分のアナログ回路は出来た。何か昔の真空管でテレビを自作しているような気分で、なぜかウキウキする。あとは、ロジック回路(NANDの74LS00か)と、このあいだのモータードライバーBD6211をつなげばアナログのサーボモーターは完成だ。ちょっと楽しみである。

モータードライバーBD6211がおかしい。こわれたか(4/23/2014)
 BD6211のモータードライバーは、別のミニブレッドボードに組んであるので、それをTiny861のブレッドボードに持ち込む。しかし、心配なことがある。この小型モーター用に準備したモータードライバーBD6211が繰り返し動かしているうち、前後進の片側の動きが渋くなってきたのである。

 BD6211は1.5Aまで流せると言うし、シャント抵抗をつけてオシロで電流を測っても、定常では、この小型モーター(FA130クラスでギアセットについていた)には平均で0.3Aくらいしか流れていない。モーター静止電流は2A近いと言うが、モーターを止めた覚えはない。動かすといってもギアを回すだけで無負荷運転に近い。

 それなのに片側だけモーターの勢いが、回す度(といっても、せいぜいトータル5分もないだろう)に悪くなってきて、遂にはまわらなくなった。そのうち正常だったもう一方の動きも悪くなり、チップが熱を持つようになった。

 チップ以外に異常は考えられない。熱を持つと言っても触れないほど熱くなるわけでもない。仕方がないので、予備のBD6211をチップ変換基板に実装して取り替えてみた。モーターは完全に元に戻って快調に回る。

 やっぱりチップがおかしかったのか。ただ、これまでの石も全く動かなくなったわけではなく、片側だけはまだ渋いなりに動いている。 しかし、何度か通電するうち、正常な2個目も片側の回転がおかしくなり始めた。最初は景気良くモーターが回るのだが段々渋くなる。S_p3166447

 こんなに簡単にモータードライバーというのはこわれるものなのだろうか。 うーむ、こんな小さなモーターなのに納得できない。しかし、今回のテーマは、モータードライバーのテストではなく、サーボを自作することである。あまりこれにこだわっているわけにはいかない。調査は後ですることにして、別のモータードライバーで先に進むことにした。

MP4212の準備とサーボ制御の論理回路設計(4/25/2014)
  どうも良くわからないが、安全のため別のモータードライバーを用意した。MP4212である。この石は、モータードライバーというより、Hブリッジを想定したコンプリメンタリー(NchとPchのFETがふたつづづ内蔵)なFETアレイで、制御部分はあとづけしないといけない。Blg_p5016507

 既に生産停止になっているが、ウェブ上では人気が高く、あちこちでヒットする。ちょっと前まで千石にあったが(¥320)、今はもう売っていないようだ(サトー電気にはまだある)。4A以上の電流を流せるので、こんな小型モーターには勿体ないのだが、そうも言っていられない。

 このFETアレイは、ステッピングモーターのFETアレイと違って、ハイサイドの石(プラス側にある石)がP-chのFETなので、簡単にはドライブ出来ない。反転した入力をHブリッジのたすきがけのFETに送ってスイッチさせないといけない。 沢山のウェブでの制作例がある。ありがたく読ませてもらう。このあたりがとても詳しくて参考になる。

 駆動回路は、インバーターICを使うのもおおげさなので、ここもまたトランジスターで反転回路を組み込む。こういうチマチマした工作も好きである。ただし、下手をすると貫通電流が流れて、FETを燃やすことになるので、慎重にロジックを確認する。よし、大丈夫だ。

 ついでに、NE555の参照パルスと入力パルスの差で前後進を指示する出力を出す論理回路も、NAND回路で考える。久しぶりに論理回路の真理値表を持ち出して回路を考える。 メモに何ページも回路図を描いて楽しむ。パズルのようなものだ。ソフト開発とは、また少し違うところの頭を使う。マイコンソフトを代数とすれば、ロジックICの回路設計は幾何だ。楽しい。

 この結果、インバーター6つと、NANDが2つあれば、パルス幅に応じた、前後進の指示パルスを出すことが出来そうだ。パルス幅のロジックは出来上がってみたら単純なExclusiveOR(排他OR)回路だった。やれやれ。

あっさりMP4212は動く P-ch-FETはゲート電圧に注意(4/26/2014)
 NANDを使った論理回路なので、負論理で組むと2つインバーターが節約できることがわかった。Hブリッジの入力を負論理で組む。静止時は1で、駆動時にどちらか片側を0にする。

何度も配線を点検し、ロジックを確認したつもりだったが、通電しても動かない。何か予感がしたのですぐ電源を切ってMP4212を触る。おっといけない、火傷しそうなほどアッチッチになっている。いわゆる貫通電流だ。

 いやあ、やってしまったか。へたりかけの電池なので、煙がでるほどまでは行かなかった。良かった。壊れてはいないだろう。しかし、おかしい。負論理で組む前に、ちゃんと正常に動くことは確かめてあるのになぜだろう。

 そうか、PchのFETはゲートを浮かしているだけでは、0とみなされて導通してしまうのだ。静止時の1のため、明示的にプルアップが必要なのだ。

 しかも、10KΩでは駄目で1KΩでVccに釣らないと電流が流れてしまった。貫通電流は負荷をはずしていても流れるので精神衛生上良くない。何度もMP4212を触りながら通電しテストする。よーし、必要なプルアップ用の抵抗器が増えたけれど正常に動作しているようだ。

 パルス幅のロジックを組む前に、モーターをつないで前後進が、それぞれの入力の0(グランド)で動くかどうか何度も確かめる。景気良く動く。さすがはMP4212だ。こんなモーターくらいでは全く熱を持たない。モーターを手で止めて数A流してみるが、これも大丈夫(怖いので数秒しか止めなかったが)。

 勢いで、ロジックIC、74LS00(NAND)を取り出し、ExclusiveORを組む。ジャンパーで簡単に出来た。入力が絶対に同時に0にならない(貫通電流が流れる!)ことをMP4212をつなぐ前に何度も確かめる。 Blg_p5016508

  よーし、問題ない。MP4212とモーターをつないでパルス幅のサーボロジックを動かすことにする。オシロで、パルス幅を確かめながら動かそうとして重大なバグを発見した。Tiny861からのサーボ指示パルス(入力パルス)を長くしていくと、NE555のパルス(モーターの位置で動く参照パルス)がこれにつれて長くなってしまう。

 ありゃあ、これでは制御できない。入力パルスより短い参照パルスをNE555が作れないのでは制御にならない。つまり、トリガーパルスが立ち下がりではなく、レベル0(正)で起きているのだ。最初は、トリガーをレベルではなく立ち下がりでとれる別の回路図があるのかと気楽にウェブを探したのだが、段々顔が青ざめる。

 ウェブには、スペックに、「NE555は、トリガーパルスより短いパルスは作れない」とあるような記事が見つかり、同じようなことに悩んでいる人の質問がわんさと出てきたのである。

NE555は、トリガーパルスより短いパルスは作れない(4/28/2014)
 困った。解決策はないのか。どうもNE555だけでは何ともならないようだ。付加回路をつけて立ち下がりのときだけパルスが出るようにしなければならない。すぐ思いついたのは微分回路である。ウェブをさらに調べる。

 良かった、ウェブにも同じような解決法が書かれている。早速、トリガーにつけた論理反転回路のトランジスターに微分回路を挟む。うーむ、少しパルスが斜めになるけれど短くはならないなあ。部品箱から、次々にコンデンサーを持ち出してテストするが、思ったような短いパルスにはならない。

 気がついたら午前2時を越えている。目もショボショボしてきた。就寝することにする。風呂に入りながら考える。方法は間違っていない。諸元の問題だろう。最近は朝起きても、ぐずぐずして工作室に行かないことが多いのだが、翌日の朝は食事もそこそこに、すぐに実験再開である。

 前日は1μF前後でテストしていたが、思い切って、数百pFクラスに換える。見事に立下りに鋭いパルスが出た。念のためモータードライバーの部分ははずし、サーボ制御までの回路だけでテストする。パルス幅は、μsオーダーになっている。自由に両側(入力と参照)のパルスをボリュームで動かしオシロで楽しむ。

 ここまで動いたら、実際にパルス幅の差分のところで出力パルスが規定どおり出ているかを確かめる段階である。今のオシロは2現象しか見られないので、もどかしいが、まずは片側の出力と入力をオシロの画面に出してみる。画面には縦カーソルをだして参照パルスの幅を残しておく。Blg_p4296502

 やった、パルス幅の差のところで、きっちり出力パルスが出ている。パルスを逆転させると、別の出力側がONする。考えたとおりパルスが出ていることは間違いない。見事、見事である。いやあ、嬉しい。

 しかしNE555のトリガーパルスのところは、立ち上がりの部分でマイナス側の鋭いパルスが出ている(当たり前だ)。瞬時だし、トランジスターのデータシートには逆電圧の制限はないとはいえ、気持ちが悪い。

 こういうときの定番はダイオードだ。微分回路のあとに小電力ダイオードを並列に入れる。オシロで確かめる。うん、完全ではないが、殆ど気にならないマイナスパルス(0.5V以下)になった。こういう工夫も楽しい。NE555ではなくて74HC123あたりを使えば良いのだろうが、これで十分だ。

やっぱりロジックICだけではモーター駆動は無理なようだ(4/30/2104)
 さて、これで要素はすべて揃った。残るは、この出来たPWMパルスで実際にモーターが回るかどうかである。今までのテストではすべてオシロの画面上だけで、実際のモーターを回すところまでいっていない。

 わくわくしながら、モーターをつなぐ。電源は、これまでの電池ではなくACアダプターの5Vをつなぐ。Tiny861やNE555などと電源は共通になるが、まあ実験だ。とりあえず動かしてみよう。

 まず、入力パルス(Tiny861)と参照パルス(NE555)の幅を同じにしてモーターが回らないところから実験開始である。モーターは動いていない。MP4212や、NE555、2SC1815をかわるがわる触って発熱を調べる。うむ、問題ない。次にパルス幅をボリュームでずらす。

 うーむ、モーターがジジジと唸り始めたが、回らない。オシロの波形はモーターの電流で歪む。さらに差を大きくする。しかし、音が大きくなるだけで回るところまでいかない。 電源を別にしてみた。ロジックは5Vアダプターで、モーター側を電池にする。 

 今度はオシロの波形が安定してもう少しで回りそうである。手でモーター軸を回してみた。おお、パルス最大幅でモーターは少しづつ回り始めた。しかし少しパルス幅を狭めるともう動かなくなる。

 入力パルスと参照パルスの長さを逆にして、モーターが逆回転するか調べる。こちらも最大幅でモーターが逆回転することを確認した。

 懸念したとおり、duty比が10%程度では、この程度の電源でモーターを回すのは無理なようだ。電圧を上げてやれば良いのだろうが、今度は小型モーターが壊れる心配がある。今でも、定格3Vのところを4V以上かけている。

 力を添えてやればモーターは回り始めるので、回路的におかしいわけではないだろう。ロジックICだけでサーボを動かすことは、これくらいで止めておこう。日も経っているので、とりあえずここまでの経過をブログに報告することにする。

|

« USIを使ったバッファー付きUARTライブラリーの公開 | トップページ | Tiny13で制御部を作って自作サーボが動いた »

電子工作」カテゴリの記事

コメント

くまパパさん、コメントありがとうございます。
ご指摘のように、サーボのPWMは制御方向を示すだけで
このパルス幅のままモーターを駆動させることは無理なようです。
あれから、マイコン(Tiny13)で、制御回路を作り直し、
何とかサーボは動くようになりました(近日公開します)。
市販のサーボはマイコンなど使っているはずはなく、
どうしているのでしょうね。見つけたら教えてください。

投稿: がた老 | 2014年5月14日 (水) 22時40分

 RCサーボモータを自作しようとして、貴方のページにたどり着きました。私もメカは素人なのですが、ちょっとひっかかった点があるので、コメントします。
 RCサーボのPWM制御は位置制御のみで、モータ自体への電力供給とは無関係だと思います。よって、20ms周期でたった1~2msしかパルス幅がなくても、モータへの電力供給量とは無関係です。どちらかというと、移動距離が長くなる時には大きな電力で駆動するように制御しているRCサーボが多いです。鉄道模型の動力車を低速コントロールするためのPWM制御とRCサーボのPWMによる位置制御は本質的に異なります。
 私もRCサーボの内部のコントロール回路の回路図がどこかに落ちていたら、見てみたいと思って探しているのですが、まだ見つかりません。

投稿: くまパパ | 2014年5月14日 (水) 13時40分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: サーボモーター自作。ロジックICだけでは動かない:

« USIを使ったバッファー付きUARTライブラリーの公開 | トップページ | Tiny13で制御部を作って自作サーボが動いた »