« 2014年4月 | トップページ | 2014年6月 »

2014年5月の2件の記事

2014年5月15日 (木)

Tiny13で制御部を作って自作サーボが動いた

このままでは引き下がれない(5/2/2014)
 サーボモーターをスクラッチから自作しようとして、マイコンでやれば造作のない制御部分を、こだわってロジックICだけで出来ないか模索している。前回までにNE555を使った制御ロジックを完成させたが、モーター出力が不足して、まともに動くところまで行かなかった。

 サーボモーター駆動は、PWMなのだが、duty比を、ロジックICでは1/10~1/20にしかできない。何らかの方法でduty比を上げないと、モーターを快調に動かすことはできない。これは最初からわかっていたことだが、動かしてみて、やっぱり駄目だということがわかった。

 自慢にもならないが、当研究所の所長は負けず嫌いでは人には負けない。かなり諦めの悪い方である。これまでにこの性格で数々の失敗をしてきた。長い目で見れば、平和な日本では我を通す人は大体嫌われる。

 しかし今さらこの年齢で改める気持ちはない(直すならとっくに直している)。意地になって、マイコンを使わないで制御する方策を考えた。まあ、これが電子工作の楽しみの一つでもある。

 アナログでduty比を上げる方法はともかく、デジタルっぽくやるなら、生成されたパルスの幅(最大2ms)でPWM期間(15~20ms)の後半に多数のパルスを生産すれば、duty比は稼げる。

 しかし、数だけ増やすのなら出来そうだが、同じ幅のパルスでというのが難しい。CPLDやFPGAならともかく、単純なロジックICの組み合わせではとても無理な気がする。市販のサーボモーターはどうやっているのだろう。

 アナログで考えられる方法は積分回路である。この回路を通せばパルスがなまって長く伸びる。スイッチングの閾値を低くしたトランジスターを介せば、長いパルスにすることができるのではないか。

 ウェブには残念ながら、こういうことをやっているところは見当たらない。試しに大容量のコンデンサーを並列に入れて、強引に積分回路もどきを作ってオシロで調べてみた。ふむ、パルスがなまって後半まで引きずっている波形が現れた。

 よーし、これならトランジスターの飽和域をうまく使えば、パルス幅を広げられるかもしれない。淡い期待を抱いて、ベース直列抵抗を減らしてみた。

 出てきた波形は、単に、余り広がらない幅のパルスが遅れて出現しただけだった。はい、コンデンサーで幅は広がったが、立ち上がりも遅れる事に気が付きませんでした。お粗末さまでした。

Blg_p4306503  さらにウェブをあれこれ、さ迷う。しかし有力な情報にはぶつからなかった。結局、ハードやロジックICでパルス幅を広げることは諦める。高電圧でパルス制御すれば良いのだろうが、モーターの定格の何倍もの電圧をかけるのは、アナログの素人にとっては、ちょっとハードルが高すぎる。

 あまりこだわるのはやめよう。マイコンなら簡単なプログラムでこの程度のロジックは簡単に組み込める。そっちのほうが断然楽なはずだ。ただ、Tiny13程度の小さい石で実現できるかどうか。これはやってみるしかない。

擬似コーディングは済んだが実装にぐずぐずしている(5/5/2014)
 マイコンで作れば造作がないと豪語していたが、実際にロジックを考え始めて、そう簡単ではないことを思い知らされる。Tiny13は、フラッシュがわずか1Kバイトしかないので余り複雑なロジックは組めない。

 それでも何枚ものメモに擬似コーディングを書き散らしているうち、何となく構造が見えてきた。こういう繰り返し作業は、これまでに同じようなことをやっている。短いタイマーの割り込みの度に、カウンターをアップさせて、FPGAのときと同じように長いステートマシンを作ればよい。

 おおよその考え方はこうだ。サーボモーターのPWMプロトコルは、周期が15~20msで、パルスの有効幅は最大でわずか2.5msである。この期間中に、サーボモーターの軸につけたポテンショメーターの電圧からその位置を特定し、入力パルスの幅との差を計算して、残りのPWM期間の12.5~17.5msの間で増幅したパルス幅をステートマシンで作ってやる。

Pwm 入力パルスの立ち上がりが、この処理の最初のキーになる。チャタリングはないとして、タイマー割り込みのサンプリングで、前後の入力の状況を比較し、立ち上がりを検知する。入力パルスとパルス幅に換算したADコンバーターの値で前後進の判断と量(パルス幅)を決める。これで良いはずだ。

 入力パルスと参照パルスの比較演算は簡単なロジックなのだが、実際にモーターを動かすパルスを出力するところが意外に難しい。タイマーの割り込みによって四六時中、このON/OFFするところは通過するので、確実なロジックを考えておく必要がある。

 電子工作に対する意欲がこのところ減退しているので、工作室につい行きそびれる。居間でTVを見ながら擬似コーディングのメモを書き散らし、構想を練る。数日後、意を決して地下室に降り、PCの前で開発を始めた。

 新しいAVRStudioのプロジェクトをおこし、コーディングにとりかかる。コーディングは一気に作業することにしている。無理をしても一息に書いた方が一番効率が良いことをこれまでに学んでいる。今回の作業時間は、夕食を挟んで数時間と言うところか。ソフトは出来上がった。

オシロを頼りにテストする(5/6/2014)
 UARTはこういうタイミングがクリティカルな(PWMの最初のパルスを見逃すとおしまい)プログラムには、入れにくいので、オープニングメッセージだけにし、オシロを開発当初から入れて、プログラムをテストすることにした。

 ターゲットは迷ったが、とりあえずのTiny13である。ピンの数が一杯一杯だが、この程度の制御にTiny2313あたりを使うのはちょっと抵抗がある。皮肉なことに、せっかく作ったUSIのUARTは、このTiny13では使えない。フラッシュが少ないだけでなく、Tiny13にはUSIが入っていない。

 このあいだの市販サーボをテストするのに使ったTiny861のついたブレッドボードの横に、Tiny13をセットする。結線は、8ピンなので楽勝である。あっという間に終わった。ISPケーブルで動作を確認する。うん、大丈夫だ。フラッシュも1Kバイト以下に納まった(800程度)。

 わくわくしながら、プログラムをロードしテストを開始する。最初は、UARTのオープニングメッセージも、所定のパルスも全く出てこなかった。えー、どうして?どこかで暴走しているのか。まさか。少し調べるがどこも悪くない。プログラムもちゃんと焼かれている。

 こうなるとデバッガーか。この程度の開発でデバッガーなど持ち出すのは抵抗があるなあ。LEDをつけて確認するにしてもTiny13ではピンが足らない。パルスが出ないのはとにかく、UARTが動かないのは気に入らない。オシロを送信ラインにつないでみると、わずかにパルスが出ているのがわかった。

良かった。プログラムは動いているようだ。しかし、なぜ送信信号がこんなわずかなパルスになってしまうのだ。プルアップが必要なのか、ISPが悪さをしているのかと調べるがわからない。あちこち探し回ったあげく、UARTの初期化ステートメントがコメントアウトされているのを発見した。

最初、UARTなしのプログラムのフラッシュ量を調べるためコメントアウトしていたのを忘れている。うーむ、やきがまわったか。これを戻し何とかUARTは動いた。しかし、パルスは全くでてこない。といってUARTを挟むことは出来ない。9600bps(CRクロックなのでこれが上限)では、一文字に1ms近くかかる。有効パルス幅3msのPWM制御にはさんだら目茶目茶になる。

Blg_p5136510  仕方がないので、UARTをループ100回で一回出力するようなロジックで、中の数字を出力させる。時々化けるが変数の中味は表示された。おやあ、数字がでたらめだ。数がこんなに大きくなるはずはない。

相変わらずお馬鹿なコーディングミスを続けている(5/7/2014)
プログラムを調べてすぐ原因がわかった。最初の入力パルス幅とポテンショメーター値の比較数値を符号なし変数にしていたため、引き算したときに0を挟んで最大数になってしまって止まらなくなっていた。書いているとき、どうも引っかかっていたのだが、予感が的中した。

 これを直して、やっと少し動き始めた。出力線にそれらしいパルスが出てくるようになった。しかし、パルスが安定しない。所定のパルスが出てこないときがある。PWMなので、これでも動くだろうが、このままにしておくわけにはいかない。恐らくギクシャクした動きになるだろう。

 オシロを良く見ると、正進ではパルスが失われ、逆進では、パルスが合体している。ここでのロジックのキーファクターは、サーボ制御のPWM入力パルスの立ち上がりである。15~20ms間隔で3ヶ所でこの入力ピンの状態を調べている。

そうかわかったぞ。ピンの状況がこのロジックを実行中に変わったらどうなるだろう。めったにないけれど、結果がおかしくなるのは当然だ。ループの最初で、状態を聞き、その値で、そのループを回すアトミックオペレーションが必要なのだ。

 これを修正して、前後進ともパルスの抜けもなく、増幅された出力パルス(duty比は60%以上)が出てくるようになった。しかし、まだ少しだがパルスが息つくところがある。タイミングがUARTがコンソールにデータを出力するところなので、UARTの疑いが濃厚である。

 やっぱり、最後はUARTが犯人だった。UARTをはずすとTiny13は、見事に位置を補正する前後進パルスを出力する所期の機能を実現した。フラッシュは600バイト、UARTをつけても900バイト。これならTiny13だけでもっと高度な(PID制御?)制御も実現できそうである。

モーターをつける前のテストは終了した(5/8/2014)

 全く参考書なしのサーボ制御ロジックである。ウェブには一般の市販のR/C用のサーボを動かす側のプログラムは沢山あるが、サーボそのものの制御ロジックの詳細が説明されているところはどこにもない。全くの手さぐりである。

Blg_p5146511

 でもオシロで波形を見ている限りでは、もうちゃんと動きそうである。ただ、どうも数値がしっくりこない。タイマーの値が計算通りではない。原因究明はあとにし、とりあえず現物あわせのような形で動きを修正していく。

 それぞれのボリュームを動かして、サーボ動作がうまく動くことをシミユレーションして確かめる。やってはいけないのは、モーター側のポテンショメーターの範囲が、送られてくるパルス幅より狭い時で、両端で無理な力が加わってモーターやギヤを痛めてしまうことだ。

 これだけは十分数値を加減して調整する。指示側のボリュームを最小から最大まで回し、モーター側のポテンショメーターで全てモーターが逆回転して元へ戻ることを確かめる。うん大丈夫なようだ。

 ここまでは、オシロでの波形を見るだけだったが、いよいよモーターをつけて実際に動くかどうか確認する段階に来た。これまでのロジックICで組んだモーター制御基板のブレッドボードを取り出す。

 うーむ、モータードライバーが負論理になっている。今度のプログラムは正論理だ。プログラムを負論理に換えるか、ハードを正論理に戻すか迷う。時間も遅い。ロジックICで作り直すことはもうないだろう。ハードの結線を正論理に戻すことにする。

 配線図は書いていない。このあたりの配線間違いは致命的になる恐れもあるので慎重にピンアサインを確認する。何度か検証して通電する。いかん。MP4212が急速に暖かくなってきた。貫通電流だ。あわてて結線を確かめる。間違いはない。待てよ、負論理のプルアップ抵抗がそのままだ。これは必要なのか。

夜遅くで、頭が良くまわらないが、このままでは入力ラインに何もつながなければ、両方(前後進)が1になって貫通電流のパターンだ。入れてはいけない。そう言えば正論理のときに入れていなかった。

 深夜も2時を回っている。朦朧としてきているのだが、乗り掛かった舟である。止めるわけにはいかなくなってしまった。プルアップした抵抗をブレッドボードから引き抜く。周りはジャンパーで一杯だが、モーターを回すところへ遮二無二突き進む。

ついに自作サーボ動く(5/10/2014)
 深夜、蜘蛛の巣のようになったブレッドボードを通して、自作サーボがやっと動いた。動きは遅いし、静止状態でもモーターがジジジと唸るし、だいたい想定より回りすぎる(一回転以上)けれど、指定側の可変抵抗器の動きに応じて、モーターは所定のところまで回り止る。

 いやあ、えらい時間がかかったけれど、曲がりなりにもサーボ制御だ。嬉しい。達成感で胸がふくらむ。今回もここまで大変だった。わずか1KバイトしかないTiny13にサーボ制御のプログラムを押し込むのに苦労した。何度もソースコードを書き換えた。

最初はタイマーの割り込みで入力をチェックするプログラムの構造にしたが、誤動作を避けて、入力ピンの割り込み駆動に変更した。しかし、割り込みと外部変数を使うとフラッシュが大幅に消費されることがわかり、タイマーの割り込みの方に戻した。

さらに前後進のパルス幅を増幅するステップの変数を減らすなど(ゲートを使って出力パルスを求めていたのを単なる変数の足し算にした。これでパルスが安定)、結局ソースは3回も書き換えた。

ちまちまと、コードを工夫しては、フラッシュの削減を確かめて喜ぶ。下らないとはいえ、この箱庭に小さなジオラマを作るようなコーディングは楽しい。Arduinoのようなものでは味わえない楽しさだ。

Servoctl_tiny13

ソースコードとモータードライバー回路図の公開(5/14/2014)
 ロジックICの回路図の公開は遠慮しておこう。これで組んでもモーターは廻らないからだ。そのかわりと言うのも何だが、MP4212のモータードライバーは正論理、負論理回路ともご紹介することにする。参考にしていただければ幸いである。

Mp4212_h   ただし、アナログに素人の所長考案の回路図である。全く自信はない。そのつもりで見ていただきたい。言うまでもなく完全な無保証である(FETが焼けても知りません)。しかし少なくとも両回路とも、ここでは問題なく快調にモーターが動いている。

 もっとも、このあたりは間違えると、電源をいれただけで貫通電流が流れ、FETを焼いてしまうのでくれぐれもお気を付け願いたい。最初は、ポリスイッチ(大電流で遮断され、熱がさめると導通する)や、内部抵抗の高い電源(へたりかけの乾電池を直列にする)などで防御されることをお勧めする。ソースコードは例によってAVRStudioのフォルダーの形で公開する。Mp4212_h_2

「IServo13.zip」をダウンロード

| | コメント (3) | トラックバック (1)

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だけでサーボを動かすことは、これくらいで止めておこう。日も経っているので、とりあえずここまでの経過をブログに報告することにする。

| | コメント (2) | トラックバック (0)

« 2014年4月 | トップページ | 2014年6月 »