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

2014年3月の2件の記事

2014年3月31日 (月)

サーボモーターの制御とUSIを使ったソフトUARTの開発

 何でもないことにこだわって本来のプロジェクトが先に進まない。当研究所では良くあることだが、今度もメカトロニクスに再挑戦などと結構なお題目を唱えながら、この一週間、それとは全く別のAVRのソフト開発に没頭していた。

 はまっていたのは、AVRマイコンのTinyシリーズ独特の汎用シリアルインターフェース(Universal Serial Interface USI)を使ったソフトUARTの開発である。TinyシリーズにはUARTやSPI、I2Cなどのハードはついていないが、そのかわりこのインターフェースがついている石が多い。これで色々な通信インターフェースをソフトで作れということらしい。

 5年以上前、このUSIを使って、I2Cマスター/スレーブのライブラリを作って公開した(Atmelのアプリケーションノートを参考にした)。幸いこのライブラリはいくつかのサイトで紹介され、使ってもらっているようだ。

 ただ、USIはウェブなどでは、「使いにくい」「難解」と余り評判は良くない。今度、開発しようと言うのは、GPIO直か打ちのオーバーヘッドのないソフトUARTをUSIで作ろうというものである。なぜこんなことになったのか。そのわけは、これまでの経緯を含めてこれから説明していくことにする。

Tiny861のPWMピン出力問題が解決。お馬鹿な失敗(3/7/2014)
 市販のサーボモーター(MICRO2BBMG 秋月で¥1080)を、AVRマイコンで制御する実験は、可変抵抗器(10KΩ)からの電圧をADコンバーターで数値化し、これでサーボを動かすことには一応成功した。

 ただ、マイコン(Tiny861)のタイマーについているPWMの出力ピンがどうしても動かず、コンペアマッチ割り込みを使って別のピンを操作し何とかPWM波形を出した。動いたとはいえ、せっかくPWMが標準で持っているピンを使わないままにしておくのは気分が悪い。

 Tiny861は以前、グローバルなピンチェンジ割り込みを有効にしないと(GIMSKのPCIEx)、ピン入力そのものが有効にならない現象(バグ?)に悩まされた石で、それ以外にもTiny26からの継承を意識した変則的なピンチェンジ割り込み初期値設定でO-Familyさんがはまっている。

 こういう前歴があるので、今度も色々疑って調べ始めたが手がかりはない。仕方がないので無駄とは思ったが念のため設定レジスターTCCR1Aの中味をUARTに出してみた。ありゃあ、初期化で設定したはずのPWM出力をenableにするビットが0になっている。これでは出力されないわけだ。誰かが設定してからいじっている。

 試しに動かす直前にもう一度設定し直してみたら、何の問題もなくPWM出力ピンのOC1Aに正常なPWM信号が出た。タイマーの初期化のあとにUARTの初期化をしているので、ここでいじったか。いや大丈夫何もしていない。sleepか。まさか、そんなはずはない。少しづつ設定ステートメントを元のタイマー初期化のところに近づけていく。

 何と、TCCR1Cという別のタイマー設定レジスターが悪さをしていることがわかった。こいつがいけない?このレジスターの意味が良くわからなかったので、TCCR1C=0とクリアした。データシートをあわてて読み直す。何い、頭のビットはTCCR1AのPWM設定ビットの「投影ビット」とある。S_p3296456

 「投影」とは設定した値がここに出てくると言う意味だと思ったが、どうも違うようだ。英語の原文をあたる。「投影」ビットとはshadowビットの意味で、shadowと言ってもここをいじると元が換わると書いてあるではないか。邦文の方はこれが省略されている。

 やれやれ、何と言うことだ。データシートは穴があくまで読めというが、原文まで見ないといけないとは困ったものだ。良い加減な理解でえらい目にあってしまった。

自作サーボのモータードライバー、内径6mmのギアを入手(3/12/2013)
 市販サーボはとりあえず動いた。しかし、8ビットのPWMでは、サーボの可動範囲は16段階くらいしかとれず、動きがぎこちない。16ビットPWMにするのは8ビットのTIMER1から16ビットのTIMER0にコードを移す力仕事だけなので、余り気が進まない。それに、この市販サーボの本来の使用目的がもともと決まっていないので、実験していてもどうも張り合いがない。

 というので、市販サーボの実験はとりあえず棚上げし、サーボモーターの完全自作の方を進めることにした。仕事の帰り、秋葉によってサーボのメカパーツを物色する。ツクモと千石で、ポテンショメーターのギアを探した。

 この間買ったポテンショメーターの軸径は6mmで、こんな大きな内径のギアはないものと思って、ツクモで内径6mmのストッパーを買い、これを加工するつもりでいたら、千石には、ちゃんと内径6mmのハブのついた歯車が売っていた。

 ギアが有ったのは良いが結構な値段だ。ひとつ¥300以上する。2つ買ったので¥700。ポテンショメーターがひとつ¥150。モーターギアセットが¥700なので、これだけで¥1500以上もかかっている。適当な市販サーボが十分買えるコストだ。まあ、実験なのでここは目を瞑ろう。

 秋月では、昔、小さなモータードライバーとして評判の良かった、RohmのBD6231を発見しサーボ用に2つ買った。これはSSOP8ピンの小さなICだが、1Aまでのモーターの前後進と速度制御が出来る優れものだ。

 家に帰ってモーター制御用のチップを部品箱から取り出し揃えてみる。MP4401 IR2011 MP4212 それにフォトボルなど。今の小型モーターにこのあたりの石は役不足(もったいない)で、BD6231あたりで十分である。

 早速テストしてみた。手持ちのモーターの定格は1.5~3Vなので、ミニブレッドボードにタクトスイッチを組み込み、少しへたった電池3つで動かしてみる。あれえ、全く動かない。動作電圧が3Vからというのにおかしい。S_p3166447

 データシートを確かめて愕然となる。3Vからというのは制御電圧の下限で、電源電圧は4.5V以下では動かないリミッターがついているではないか。あらあら、今考えているモーターを動かすには、BD6231ではなく、秋月で売っているもうひとつの石BD6211が必要と言うことが判った。

秋葉原の居酒屋「赤津加」で飲む。BD6211を買い直し(3/14/2014)
 古い友人が訪ねてきたので、かれこれ10年ぶりに秋葉原のレトロな居酒屋「赤津加」を訪ね、一献傾けた。「赤津加」は、メイド喫茶の客引きが密集する部品街のメインストリートを一歩入った横丁にある。

 こんなところに、こんな飲み屋があるとは思えないほど隠れ家的な店で、このあたりが青物市場だった頃から綿々と続く昔ながらの飲み屋である。今も時間になると沢山の客で賑わっている。

 友人(モデムの専門家)は、この店は初めてだそうで喜んでくれた。ちょうど良い機会だったので、日頃の疑問をぶつけてみた。市販サーボの制御信号のPWMのしかけである。PWMの周期が10~20msで、制御中点が1.5msというのが良くわからない。

 このままでロジックを組めば、モーターに通電される時間は最大で3ms、15~30%のduty比ではモーターにかけられる電力は限られてしまうはずだ。何もPWMで面倒な変換をやるより、直接デジタルで数値か何か指示した方が良いような気がするのだが、どうしてだろう。

 彼の答えは明確だった。電力は積分で効いて来るのでこれくらいのduty比は、かける電圧なり電流を調整すれば何も問題ないそうだ。昔は、マイコンなどなかったから、数値入力などは全く考えられず、アナログ的なPWM方式が一番都合が良いというのである。これで何となく納得する。

 秋葉原で会ったついでに、例のモータードライバーBD6211を買いなおした。家に帰って、早速ピッチ変換基板にハンダ付けして、これまでのBD6311と取り替える。おー、動いた。快調だ。こいつは具合が良い。発熱も殆どない。これくらいの(FA130程度)小型モーターならこれで十分である。 5年も前のエレキジャックのサイトに詳しく出ていた。

市販サーボの制御を16ビットPWMにする。動作が安定しない(3/19/2014)

  サーボの自作といっても、何に使うか決めていないので部品が揃っても具体的な工作にはなかなか進めない。で、自然に手は、市販サーボモーターの実験にもどる。やり残していたTiny861の16ビットPWMのソフト開発を始めた。力仕事だからと馬鹿にしていたのだが、これが、結構難しく2日近くかかってしまった。

 16ビットタイマーの仕様がなかなか理解できない。データシートの説明が不親切と言えば不親切である。わかってしまえばどうと言うこともないのだが、もうちょっと要領の良い説明が出来ないのかと八つ当たりしている。

 そうは言っても手間取った原因は16ビットタイマーの自分の不慣れにつきる。いい加減なデータシートの読み込みで思わぬ道草を食わされてしまった。それに、8ビットで不安定だったサーボが安定するかと淡い期待を抱いていたのだが、なんのことはない16ビットカウントにすると、かえって変な振動が出てきて止まらない。

 ADコンバーターで値を取り直すたびに僅かながらモーターが動く。電源を独立させても解決しないので、これはADCでの値が細かく変動しているからに違いない。パルスの巾(μs単位)で3以内では、前の値を保持するというヒステリシスロジックを組み込んでみた。しかし殆ど効果がない。

 そういえば、サンプリングの度にUARTでADCの数値をコンソールに出力している。これが悪さをしているのだろうか。まさか、と思いながら、UARTを試しに止めてみた。何と何とこれでピタッと振動は収まったのである。

 何故?UARTが出力PWMに影響を与えているのか?そんな馬鹿な。しかし止まったことは事実である。こうなると今までの振動の原因はUART以外に考えられない。8ビットで起きなかったのは、分解能が低くパルス巾に影響しなかったのだろう。

USI-UART開発に脱線する(3/20/2014)

 暫くして気がついた。サーボがUARTでぶれる症状は、良く考えてみたら自明のことだった。こんなことはもっと早く気が付かねば。気が付かなかった自分に滅入る。

 Tiny861で使っているUARTは、ソフトUARTである。GPIOを直接on/offしてデータを送っている。8ビットの送信の時は、タイミングがずれるのを防ぐため、その間は割り込みを止めている。

 この送信時間中(38.4kbpsで300μs)に、モーターサーボのPWM送信パルスがぶつかれば、当然、決められた時間でパルスを上げることが出来ず、そのときのパルス幅は変わり、サーボは不規則な運動をしてしまうのだ。

 そうか、Tiny861はハードウエアのUARTを持っていないので、PWMなどでモーターを動かしている時にこのUARTは使えない。Tiny2313やMegaシリーズのようにハードのUARTを持っていないとこういうことが起きる。

 しかし、Tniy861で使えないというと、へそ曲がりの性分が久しぶりにむくむくと起き上がった。Tiny861には、USIという汎用シリアルインターフェースというのがある。以前、これでI2Cのライブラリを作った。

 USIそのものは、Tinyシリーズだけの装備で、話題になることもないインターフェースだが、このところソフトの開発は力仕事ばかりで面白いことをやっていない。これを使えば、数μs以下のオーバーヘッドだけでUARTが動き、同時処理にも使える。急にこれを作ってみたくなった。

 サーボモーターのプロジェクトから見れば、完全な脱線だが、こういう脱線は研究所の得意とするところである。久しぶりにTiny861のデータシートを広げて、USI-UARTの制作に取り掛かった。

こいつが手ごわい(3/24/2014)

 これが難儀しているのである。もう4日近くなるが、いまだにまともに動かない。USIはSPIやI2Cなどの通信インターフェースを意識しているらしく、これらには色々な機能が揃っているが、非同期のボーレートだけのタイミングで動くUARTには何のサポートもない。全部、ユーザーで作る必要がある。

 最初は、8ビットのデータ分だけをUSIのシフトレジスターUSIDRにいれ、前後のスタートビットとストップビットを通常のピン操作命令、PORTB |= 1<<PINB;などで出来ると軽く考えていた。

 しかし、オシロを見ると、どうもピンが動いていない。そのうち、USIにピンを指定しまうと、ここでの単純なGPIOのピン操作は全くできないことに気づいた。以前Atmelのアプリケーションノートを参考に、I2Cのライブラリーを作ったとき、1ビット送出をシフトレジスターの操作で出していたのを思い出した。

 そうか、そうやって信号線を上下するのか。あのときは何でこんな面倒なことをやっているのかわからなかったけれど、こういうことだったのだ。あわててスタートビットとストップビットがUSIDRと、USICRの操作で出るようにロジックを加える。

 これで、何とか、スタートビットとストップビットがデータの前後に出るようになった。しかしグリッチがでたり、データの終わりに1ビットの0がでたりしてまともなUARTデータ列になってくれない。勿論、UART端末からは全く無意味な文字列が出るだけである。

 そのうち、UARTがLSBファーストであることに気づいて、ビット順序の逆転ロジックを加えたり、負論理に換えたりしたが、一向にUARTからは、正しい文字列がでてこない。化け化けの記号がでるだけである。完全に暗礁に乗り上げてしまった。

TTLのUARTは正論理が主流なのか(3/27/2014)

 ウェブで調べたが、どうも判然としない。RS232Cでは信号は負論理だが、どうもTTLでは正論理が主流のようだ。少なくとも、CP2101のUSBシリアルアダプターは正論理で、ロジアナのLAP-CのUARTプロトコルでも正論理がdefault(省略値設定)である。

 遂に自力でソフト開発をするのをあきらめ、AtmelのアプリケーションノートAVR307(USIを使った半二重UARTライブラリの開発)のお世話になることにした。ここにソースコード一式があるのは知っていたが、ちょっと意地になって見ないで開発していた。

 背に腹は代えられない。どうも、このUSIのシフトレジスターには癖があって、正攻法ではうまく動かない。説明を読み込む。なになにい、1バイト分を5ビットづつ2回に分けて送信している。なぜだ。さらに読みすすめていって疑問が氷解した。ソースコードを見るまでもない。

 データシートにはDO(送信ライン)とシフトレジスターUSIDRのMSBがトランスペアレントだということをやけに強調しているのだが、これがどういう意味なのか全く理解できていなかった。しかし、このアプリケーションノートの説明ではっきりわかった。

 つまり、シフトレジスターを8ビット読みきると、レジスターの中は空となり、MSBが0になるので出力ラインDOも0になってしまうのだ。8ビット以上のデータを連続して送るためには、シフトレジスターを途中で止め、MSBを保持しながら、次のデータをシフトレジスターにロードしなければならない。

Usi_bit_sequence  こうすると、値は変わらずに次のデータを連続的に送ることが出来る。UARTは頭は0のスタートビット、最後は1のストップビットで1フレームを構成するから、スタート/ストップビットを前後につけた10ビットのデータストリームを5ビットづつ2回にわけて送信すれば良い。

 なるほど、これはすごい。殆ど手品に近い高等テクニックだ。日本語データシート(原文で読めばもう少しましなのだろうが読みにくい日本語だ)からでは、このテクニックを読み取ることはまず不可能だ。

 早速、5ビットづつ2回にわけてデータを送るコードを書き込む。オシロにはグリッチもなく、もう殆ど問題ないUARTらしいデータ列が出てきた。しかし、UARTコンソールは依然としてゴミデータしかでてこない。何故だあ。スタートビットもストップビットも綺麗に出ているのに。

やっとUSIのUART送信はOKになった(3/28/2014)

 データが化けるのは、負論理でデータを送っていたことがわかり、これを正論理に戻して、遂に、UARTコンソールから久しぶりに正しいオープニングメッセージが出た。やれやれ今回は時間がかかった。成功の喜びに浸る。

Usiuart1  しかし喜びも束の間だった。コンソール出力を良く見ていると、ところどころで文字が化けている。ChaNさんの開発された書式付出力関数xprintfで数字を出すところだけがダメである。えー、これはどういうことだ。こちらが使っているxprintfは昔のバージョンでアセンブラーのプログラムだ。アセンブラープログラムで字化けする?まさか。

 こうなるとオシロではそろそろ限界で、ロジアナの登場である。慎重を期して、プログラムのあちこちにプローブ点を設ける。ブレッドボードにジャンパーをてんこ盛りに盛ってプローブ点をロジアナに接続する。

S_p3296452  ロジアナを動かしてみるとxprintfでの状況はすぐわかった。キャラクターを出すところは連続して送信がされているが、バイナリーをキャラクターに換えるときは時間がかかるので少し送信を休んでいる。そのときの状況はどうだ。おお、送信関数が始まった直後に、ボーレートパルスが動いている。

これでは先にデータが送られてしまい、スタートビットが喰われてしまうので、このあとのデータが文字化けになるはずだ。想定より先に割り込みが起きるのは、ペンディングされていた割り込みリクエストが残っているからに違いない。

 解決策は、割り込み開始の前に、リクエストビットをクリアするだけである。プログラムをコンパイルしなおす。オープニングメッセージを出す。良いぞ。今まで化けていた数字は見事に正しく表示された。

 やった、やった。USIを使ったUART(送信部だけだけど)が遂に完成した。文字はどこまでも正しく表示される。いやあ久しぶりの感動だ。解決までの時間がかかればかかるほどこの感激は大きい。

Kuitubushi  気分が落ち着いたところで、いよいよ最後の検証に入る。もともとはサーボモーターの制御がUARTで乱れるので、その解消にUSIを使ったUARTを開発したのだ。今は、モーター制御中のUART送出は止めているが、これを戻しても制御の乱れがないようにならなければ開発した意味がない。

Photo  どきどきしながら、制御中のUART送出コードを復帰させる。コンパイル。さあ、どうだ。おーし、見事サーボは無音になった。ADコンバーターの入力にコンデンサーをかましたので(ウェブで教わった)、サーボ自体の振動もほぼ収まっている。

 ボリュームを左右に回すと、サーボは「ジジッ」という動作音とともに所定の場所へ移動する。その後はピタッと音が止まる。UARTによるモーターの振動は全くない。良いぞ、良いぞ。これで面倒な開発をしたかいがあったというものだ。

 さあ、次は受信部分の開発である。受信は送信ほど面倒ではない。しかし、ブログの更新が遅れているのでとりあえずこのあたりで報告しておこう。ソースコードの公開は、受信部分の改良が出来てからやることにする。

 TinyシリーズだけのUSIだけれど、Tiny45などの8ピンAVRにも使われているし、USIを使ったUARTの割り込み禁止区間は、ボーレートタイマーの割り込みの部分だけで、マイクロセカンドオーダーで済む。同時処理を行うプログラム(PWMを出しながらLCD表示など)では多いに役に立つはずである。

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

2014年3月 6日 (木)

再びメカトロニクスに挑戦。サーボモーターの完全自作

 AquesTalkのマルチメーター読み上げ機が完成してすっかり気が抜けた。例年この時期は雑用が多く電子工作にまとまった時間をかけられない。書くことがないのでブログの更新も20日以上空いてしまった。

 前の記事を書いているときは大騒ぎしていた冬季オリンピックもいつのまにか終わり、TVは今やプロ野球のオープン戦やサッカーJリーグの開幕の紹介に忙しい。

 それにしてもTVや新聞のオリンピック報道で、これでもかこれでもかと繰り返される「感動の押し売り」にはいささかうんざりした。しかも選手に対するメダルへの期待の度が過ぎていて、アナウンサーが金属回収業者のように「メダル、メダル」と連呼する。

 まるで日本全体でよってたかって選手をダメにしているようだと思っていたら案の定、金メダル確実と言われた女子ジャンプとフイギュアは3位にも入れなかった。マスコミの言い分は、「読者がそれを期待しているから」ということなのだろうが、もう少しみんな賢くなって欲しいものだ。オリンピックの終わる度に反省しているはずなのに改まる気配はない。

 それはともかく関東地方の今年の2週続きの大雪には驚いた。日頃、雪などに縁のないところに30センチ近くの積雪である。スキーに行くため何十年ぶりかに愛車に装着したスタッドレスタイヤが雪を呼んだのかもしれない。幸いなことにスキーに行く前に、スタッドレスタイヤの威力を十分テストすることができた。

 雪でテニスもお休みである。電子工作も手につかない。手持ち無沙汰で、BlueToothのヘッドフォンを買ったり、BluetoothのないPCにドングルをつけたりして遊んでいた。BlueToothヘッドフォンの音質が予想以上に良いのに驚く。これまでワイヤレスというとFMでもお粗末な音しか聴けなかった昔を思い出す。

部品を買ってきた(2/18/2014)
 電子工作を始めて以来、何か手を動かしていないと落ち着かない性分になっている。ある意味では究極の貧乏性と言ってよい。工作への意欲が復活するのにたいした時間はかからなかった。気がつくと、工作机で周辺の整理を始めていた。

 次の工作のテーマはやっぱりメカトロニクス方面にしようと思う。ライブカメラでモーター制御はやったが、これは単なるステッピングモーターのON/OFFだけで、あまり技術的に得るところがない。

 このブログに良くコメントを寄せてくれる、ばんとさんが倒立振り子の2号機を作っておられるようだし、こちらもジャイロなどを使った本格的なモーターの自動制御がやってみたくなった。この道の先には、あこがれの2足ロボットの世界が待っている。

 久しぶりに秋葉原に出て、秋月で買い物をする。前から気になっていた完成品のラジコン用のサーボモーター(MICRO2BBMG ¥1080)と、回転摩擦抵抗のないポテンショメーター(TCQ96A02 B103 2ヶ¥300)を入手した。既製品を買ったのは、これでサーボモーターの基本を勉強するためで、これで何かを動かそうと考えているわけではない。

S_p2196403 今回のプロジェクトの難点は実用的な目的がないことだ。しかしサーボはモーター制御の基本中の基本である。まずは勉強することが大切だ。サーボモーターは、ラジコンなどで何度も使っているが自作をしたことはない。アナログサーボと、ディジタルサーボの違いも良くわからない。このあたりを是非マスターしておきたい。

 ポテンショメーターと手持ちのモーターでサーボシステムをスクラッチから完全自作することを当面の目的にする。ロボットでは数十個のサーボを使うというし、究極のもうひとつの野望(CNCマシンの自作)に近づくにはモーターの色々な運転制御は欠かせない技術である。

  秋月では、ついでに予備の少なくなったAVRマイコン Tiny2313(¥150に値上がりしていた)や、不要不急の石、Mega88とか、QFPのMega1284を手に入れた。家に帰って、QFP変換基板に久しぶりにQFPチップをハンダ付けする。実体顕微鏡のありがたさをここでも確認する。

 Mega88は、このあいだのマルチメーター読み上げ機のMega328の換装用だ。このシステムのフラッシュは4Kも使っていないので、Mega88でも余裕である。コストを少し下げられた(¥250から¥170)。

サーボの原理を調べる(2/19/2014)
 サーボの原理をあらためて勉強する。サーボと言えばウェブなどの解説には必ずPWMのパルス波形が出てくるが、この信号にもとづいてどうやって位置制御をするのかということを、わかりやすく説明しているところが意外に少ないのだ。

 いくつかのサイトを渡り歩いて仕組みをやっと理解することができた。要するに、サーボモーターというのはポテンショメーターのような、位置を電気信号値(デジタルでもアナログでもかまわない)に変換する装置が必ず必要で、入力のPWM信号は、単なる指定位置を教える送信コードにすぎないということである。

 これがわかるまで大分時間を要した。最初は、パルスに応じてモーターが前進したり後進したりして位置を決めているのだと思っていた。やれやれ大きな勘違いである。こういう基本的なことはなかなか教えてくれない(AVRのときのPINとPORTの違いもそうだった)。

 理屈はわかった。しかし、それではこのPWM信号の入力からどうやってモーターを実際に動かすのか。これがまた具体的な例が少ないのである。このサイトではロジックICを使って、現在の位置と、指定の位置への差分を出力しているが、ソフトロジックでどうやるのかはわからない。これにPID制御を入れるというのはどういうことなのだろう。

 ChaNさんのサイトにも、モーター制御の詳しいページがある。ChaNさんらしくとてもスマートな解説で、各種の制御がテストできそうである。しかし技術レベルがちょっと高すぎて、どうやってこれを応用するのか、簡単に手が出ない。いやいや難しいものである。、

参考書は役に立たない(2/21/2014)
 S_p3056433_2 実は、モーター制御については、だいぶ前にこんな本も買ってある。しかし、この本は、モーターそのものの基礎的なことばかりで、サーボモーターの部分はわずかしか記述がなく、しかも伝達関数といった高等数学の話に終始し、具体的なことには全く役に立たない。

 ルネッサンス以来、科学技術は進歩を続けて驚くばかりに分化し、それぞれの分野の技術レベルは、素人から見れば、全く手の届かない高みにある。山で言えばヒマラヤ山脈の8000m級の高山みたいなもので簡単に手が出せる世界ではない。電気の世界のような狭い世界でも、ちょっとでも分野が違うと全く知らないことばかりになる。

 こちらが求めているのはヒマラヤトレッキングのような、素人でも楽しめる山歩きなのだけれど、それに役立ちそうな参考書が実に少ない。あるのは超初心者向けの入門書か、プロまたはプロ志願者が教科書に使うような理論書になってしまう。雑誌記事も似たようなものである。

 ガリレオやニュートン、エジソンが活躍した時代との根本的な違いがそこにある。学ぶことが多すぎるのだ。エベレストに登るのではないので高等な登山技術は必要ないのだが、参考書というのは一冊の中に全体をまとめようとするので本当に基礎のところしか出てこない。実用的な応用には殆ど役に立たない。

 まあ悪態をついてみても事態が好転するわけではない。一人黙々とウェブを漁っては必要な情報を探る。こういうときは訳がわからなくてもとにかく浴びるように情報を摂取することだ。わからない情報でも沢山周辺情報を集めていると、ある時突然霧が晴れるように理解が進むことがある。

マイコンによる市販サーボモーターの制御の実験(2/22/2014)
 そうは言っても、簡単にモーター制御がマスターできるわけではない。完全自作に進む前に、まずは買ってきた市販サーボモーターを動かしてみよう。

サイトには色々なコードが溢れているが、なに心配することはない。原理さえ掴んでいれば、コードは簡単に書けるはずだ。ところがこのお手本が見当たらない。参考になるのは、gomisaiさんのサイトのArduinoのスケッチくらいである(ここは、いつもお世話になっている。後閑さんのページと同様実践的なのがありがたい)。

 Arduinoは電子工作のすっかり定番になってしまったようだが、どうもこのスケッチプログラムのC++風というのが馴染みにくい。何もこんなフラッシュもSRAMも極小なところに、大飯くらいの処理系の実装をしなくても良いのにと思うのだが、まあ、これは古い人間の証拠のようなものだろう。あまり大きな声では言いにくい。

 市販のラジコン用サーボの資料をウェブで漁り、いくつかの標準的な仕様があることを知った。意外にパルス巾に自由度がない。サーボの角度にかかわらず、パルス巾は、前後500μsで中間点が1500μsという狭さだ。

 技術の進歩で昔は低速だったPWMの周期を短くできるようになったのだろう。これが短くなればなるほど、同時に制御できるサーボの数を増やすことができるのだろうと納得する。

 とりあえずは、ADコンバーターに可変電圧をボリュームで与えて数値化し、サーボのPWM波形を作ることにする。

ブレッドボード用の可変抵抗ブレークアウト基板を作る(2/26/2014)
 部品箱からストックのTiny861を取り出しブレッドボードにテスト用の回路を組みあげる。最初、安価で手慣れたTiny2313にしようとして途中で、こいつにはADコンバーターがないのに気付いた(コンパレーターはあるが)。このあたりのAtmelの製品ラインアップがちょっと首をかしげるところだ。

 Tiny861は、焦電センサーのときバグらしいものに悩まされたことがあるのだが、ADコンバーターがついているし、UARTはなくても、自前のソフトUART(ISPを使わない)を使えば大丈夫だ。

 まずは、UARTとADコンバーターを動かすことにする。このへんが動けばPWM波形の確認はオシロでできる。制御用の可変抵抗器をブレッドボードに差そうとしてつまずいた。ピンが短かすぎて、うまく刺さらない。ちょうど良い機会なので、可変抵抗器のブレークアウト基板を作ることにする。

S_p3056436  手持ちの可変抵抗器は2連なので2段のピン構成になっている。こういう2段のピン配置の部品をブレッドボードにつけるには、ブレッドボードの中央のICソケット列にのせてピンを振り分けるかピンをシングル配列にする必要があり、結構面倒である。

 しかも、振り分ける形にすると、ボリューム軸がブレッドボードと平行になり操作しにくい。といってシングル配列ではピンの一部が部品の陰になって使いにくい。

 そこで考えたのが、写真のようなブレークアウト基板である。これで両側のピンは自由に使えるし、ボリューム軸も基板の横から操作できて具合が良い。こういう下らない工作が無性に楽しい。一人で悦に入る。

やっとPWM波形が出たがサーボは不安定(3/5/2014)
 久しぶりのスキー行は運動不足で散々だった。このところテニスをさぼっているのが効いた。電子工作が進んでいない。スキーに行く前に、Tiny861のADコンバーターは動いていたのだが、その先のPWM波形を出すところでつまづいている。

Servo861  PWM関係のタイマーのレジスターの設定が厄介である。先ほど調べたサーボモーターの仕様からPWM周期の中の有効なパルス幅が意外に狭いので、余り細かい調整が出来ない。8ビットのPWMでは、使えるステップが精々10段階くらいしか出来ず動きは余りスムーズには出来ないだろう。

 データシートを丹念に調べて、やっと組み上げ、オシロにPWM出力をつないで勇躍テストする。ところが全く波形が出てこないのである。以前、UARTや、ADCを動かすタイマーは動いているので問題は、タイマーのコンペアマッチのあたりがおかしいことは明らかだ。

 何度もデータシートを確認するが、がんとしてPWMの出力ピン(OC1A)からはパルスがでてこない。以前のプログラム(マイクロステッピング制御)のPWMコードと比較するが変わったことはしていない。ピンに出力が出てこないので調べようがないのだ。

 仕方がないのでコンペアマッチの割り込みを有効にして、割り込みルーチンでピンをドライブしてみた。これは問題なく動いた。やれやれどこが悪いのだろう。トラブルシュートはあとにして、とりあえずは先に進む。

S_p3066438  ここまで来るとあと一息だ。ADコンバーターの値をサーボモーターの仕様(最小1ms 最大2ms)に変換するロジックを作って、オシロで確かめる。よし、うまくいった。予想したとおり、制御段階が少なすぎるが、ここまで来たらモーターまで動かしたくなった。

 電源を共通にしているので余り期待はできないが、ものは試しである。5Vアダプターにモーターとマイコンをつないでテストしてみる。完全なバラックだけれど気がせいている。

 おおお、サーボモーターが動いた。うーむ、しかしスムーズではない。オシロを見るとパルスが結構乱れている。そのたびにサーボは、勝手に戻ったり、「ジジジ」と音が出て振動するなどの不規則な動きをして安定しない。

 恐らく電源だろうと思うが、まあ、動いただけでとりあえずは良しとしよう。ここらあたりでブログに報告しておくことにする。

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

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