« 気圧計のバグつぶしと、ステッピングモーターの静音化 | トップページ | マルチメーターP-10にUSBシリアルをつけたデータロガー完成 »

2012年6月11日 (月)

マイクロステッピング制御の自動巻き機完成。ソースの公開

逆転は簡単だったが、高周波音が気になる(5/29/2012)
 前の記事で、ステッピングモーターのマイクロステップ制御の逆転は面倒だと書いたが、余り難しく考えず、制御ループをそっくり1セット増やし、そこに逆転のシーケンスを作って切り替えれば良いということに気づいた。

 フラッシュサイズは増えるけれど、ロジックは簡単だ。処理時間の増えるところはループの最初に正転か逆転かの判断ロジックが入るだけだ。位相基準PWMにしたので、PWMのサイクルは1msを越える。ここでの少々の遅れは全く問題にならない。

 ソースコードの追加は、ものの10分もかからなかった。X、Y、*X、*Y(*は逆相)の励起の順を、X、*Y、*X、Yに変えるだけである。UARTモニターに回転方向を替えるコマンドを追加してテストする。おおう、モーターはあっけなく逆転を開始した。

 勢いに乗って、運転制御のロジックも入れてしまうことにする。市販の自動巻き機のロジックは、10分程度を単位に、正転逆転を繰り返し、同じ程度休んで、また繰り返すというタイプのようだ。結構休んでいる時間が多い。

 こちらの運転制御もだいたいこのやりかたを真似して様子を見ることにする。p(pause休止)、r(right 右)、l(left 左)といった文字を運転モードの定義に使い、この文字列を替えるだけで運転モードが定義できるようにする(例えば、rlpとすれば、右、左、休止を繰り返す)。

 問題は、タイマーが足らないことである。2313はタイマーを2つ持っているが、すべてPWMに使うので、こうした運転制御のための専用のタイマーを使うことが出来ない。PWMのタイマーで、PWMを動かしながら、これを実現しなければならない。

 これは、PWMのオーバーフローの度に加算されるカウンターを新設して、それを数えれば簡単に長時間測れる。それより、これでモーターの回転速度を可変にすることは出来なくなってしまうのが痛い。PWMの周波数を可変にしようとすると、時間が正確でなくなる。タイマーのオーバーフロー値が変ってしまうからだ。

S_p6095007 まあ、今変えなければならないということではないので先へ進む。フレームに固定された本番機でのテストが済んでいない。これまでのテストは、もうひとつ買ってあった予備のモーターで行っている。シャフトに時計を入れる容器をつけた本番機が、実際にどんな動きや音になるかはやってみないとわからない。

 うーむ、懸念していた通り、導電シートに置いた裸の時は全く無音だったのだが、本番機の方はフレームと容器が共振して、置いてある机にも音が伝わり、PWM周波数(キャリアー)の1Khzの音がかなり大きくなり気になる。ちょうど裸の時、じかに机の上に置いた時のような音である。

 キュルルルルという音だ。振動も少しある。共振だけでなく、容器をつけて、少し負荷がかかっているのも音が大きくなった要因かもしれない。

静音対策を色々考える(5/30/2012)
 昔、ハンズで買った2ミリ厚のゴムパッドがあったので、これをモーターの固定面の形に切ってクッションを作り、これを介してフレームに固定してみる。気持ち、音は小さくなったようだが、目の醒めるような効果はない。一方、机に伝わる音は、フレームの底に、薄いゴム足を4つつけると、かなり小さくなった。

 それでも、裸の時のように耳を近づけなければ音がしないというような静かさではない。PCのファンの音より明らかに大きい。デジタル制御のときの、何か重いものを無理に動かしているような重苦しい音ではないので、それほど不快感はないが、音が高いので、こっちの方が気になるという人もいるだろう。

 高周波音の軽減は、どうしたら良いのだろう。機械的な対策は限りがある。電気的には、PWMのパルスをならすLPF(ローパスフィルター)が効果があるとは思うが、裸の時、コンデンサーをはずすと振動が少なくなり、音が静かになった経緯がある。どうもこのあたりが良くわからない。

 一方、運転制御の方は、順調に動いた。正転、逆転、休止の20秒ほどの1分サイクルを、数十回(30分)程度、動かせば、ほぼ1日分のネジを巻いたことになるはずである。ただ、フラッシュサイズがそろそろ一杯になってきた。

 Tiny2313は便利な石なのだが、フラッシュサイズが小さい(2KB)のが難点だ(フラッシュサイズが2倍の4313というのが出たが、こいつは¥100では買えない)。ChaNさんの軽くて便利な書式付出力関数xprintfを使うのを止めたり(軽いといっても300バイトは消費)、テスト用のコードをはずしたりしてサイズを広げる。

 UARTから、パラメーターを各種いじれるようにしたかったが、フラッシュサイズが足らない。何とか、総運転時間の変更だけはUARTから出来るようにしたが、運転モードの変更までは無理なようだ。まあ、これはソースコードを公開するので、コンパイルしなおしてもらえば良い。

 運転制御が曲りなりに出来たことで巻き機は、実用に近づいた。運転が終わったあとはSleepで待つ。今までUARTのコマンドでやっていた自動巻き時計のネジの巻上げを、PCの横で電源を入れっぱなしにしてテストが出来る。楽だ。

 止まった後は、アイドルスリープだが、モーターを含めた電源はACアダプターのつもりなので、消費電力については心配していない(電池は使わない)。でも運転中と停止とではLEDの色を変えると良いかもしれない。

 残るは、ブレッドボードの回路から、実際の巻き機への基板実装である。部品棚から、基板や、コネクターをとりだした。あれこれレイアウトを考える。久しぶりのハード工作だ。なぜか心がはやる。少しスランプから脱したのかもしれない。

実装版をソフトパワースイッチにする(5/31/2012)
 ハードの部品の準備でスイッチを選んでいて、もう少しソフトに手を入れることにした。単なる電源スイッチで、運転の再開にスイッチを入れ直すのは芸が無い。運転制御をスマートにするため、普通のスイッチではなく、タクトスイッチの長押しで電源がはいり、運転時間が終わると、自動的にパワーダウンモードになる、いわゆるソフトパワースイッチを取り入れることにする。

 LPFを実装するかどうかは最後まで悩んだ。LPFは、モーターの高周波音(1khz)を落とす有力な手段ではあるが、これで、完全に音は消えるかどうかの保証はない。このあたりはアナログの世界である。そう簡単ではない。

 FETは、どこかの閾値を境にスイッチングするはずで、ゲートの電圧に完全に比例してドレーンの電流が流れるわけではない。しかもモーターのコイルは逆起電力で負荷が大きく変化し(誘導負荷)、モーターが入力した電圧どおりの動きをするかは保証の限りではない。

 とりあえずは、簡易なLPFが入るようなレイアウトを考えて基板の大きさを決めていき、実際にどうするかは、LPFの定数を徹底的に洗ってから実装することにする。

 問題は、ソフトパワースイッチである。CHANEYのガイガーカウンターのときの実装も苦労したが、今度は、さらに難しい。タイマーは2つともPWMに使われており、ガイガーのときのように、専用のタイマーを用意し、スイッチ割り込みでタイマーをスタートさせて時間を測るなどというような悠長なことはやっておられない。

 スタートの時はPWMがまだ動いていないのでタイマーは使い放題だが、止める時はモーターをまわしつつ、運転時間の処理とスイッチの時間測定を同時にしなければならない。ちょっと考えただけで頭が痛くなる。

 しかし、難しい、出来ないとなると、余計やりたくなるというのが性分である。何とかならないかあれこれ考える。実は、これが電子工作の一番の楽しみになっているのかもしれない。車で、道が渋滞すると、何とか抜け道を通って先に進めないか常に考え、家族から馬鹿にされている。カーナビの普及で面白さは半減したけれど、車に乗っている時の楽しみの一つだった。

 Whileループで時間が経つのを待つわけにはいかない。モーターが止まってしまう。タイマーを動かしながら、スイッチが押された時からの時間を把握するロジックをあれこれ考える。

 今度も、風呂の中で良いアイデアが浮かんだ。2バイトの変数を常時タイマーでカウントアップさせておきスイッチ割り込みで、そのスナップショットをとって、その差を時間とするアイデアである。これならタイマーは動かしっぱなしでも時間差がとれる。

 変数が不幸にしてオーバーフローするときは、最大数から引き算する。変数はms単位なので、2バイトの変数だったら、こういう機会は30秒に1回である。おーし、これはうまくいきそうだ。早速やってみよう。

最後の最後でソフトパワースイッチが動かない(6/1/2012)

 コーディングは順調に済んだ。まず、タイマーを動かしたまま、スイッチ長押しの時間が測れるか、UARTを使ってテストする。スナップショットの時間がうまく効いているか。モーターが廻りながら、スイッチを押す。良いぞ。UARTから押しただけの時間が表示された。

 もしかしたら、極く当たり前の定番のやりかたなのかも知れない。しかし少なくとも自分で考えた独自の方法である。こうしてうまく行ったときの爽快感がたまらない。電子工作の醍醐味である(まあ、殆ど自己満足の世界だが)。

 念のため、30秒に一回しか起きないはずの繰り上がりのときのテストもする。何回かやるうちに、繰り上がりの時のみ表示される数字がコンソールに出た。時間も問題なく正しい。よーし想定どおりだ。絶好調。

 いよいよ、最終的な、スイッチ長押しでの電源ON/OFF、所定の運転時間でパワーOFFになるコードの開発である。コーディングは、前のソフトパワースイッチのモデルがあるので簡単だった。鼻歌交じりでコーディングを終える。気楽にテストに入った。

 ところがこれが動かない。全く同じ方式なのに動かない。UARTも当然動いていない。やれやれ、LEDか何かでどこまで動いているか調べていくか。ソースコードにLEDのON/OFFのステートメントを挿入していくのがこういうときの常道だが、何故かあまり気が進まない。

 ちょうどそのとき、AVR Dragonのデバッガーを思い出した。Dragonは正月にZIFソケットに付けた裸の石で1Wiredebugをテストしたまま何もやっていない。今のように全く動かない時こそ、デバッガーが役に立つときである。どこで止まっているか、どこでループしているかぐらいは必ずわかる。実機に応用する絶好のチャンスだ。ISP端子にDragonをつないでやればデバッグが出来る。

S_p6024993Dragonが見事解決(6/2/2012)
 棚にしまってあったDragonをいそいそと持ち込んで準備に入る。ケーブルはISPなので簡単だ。うーむ、ターゲットの電源はどうするのだろう。今度のターゲットはモーターを制御する。USB(Dragon側)からのVccには重い負荷だ。

 ターゲットの電源を本体から出すのなら、DragonのISPでのVccラインをはずせば良いはずだ。ただ、心配なので念のため、とりあえずターゲットの電源を切ったままDragonとつなぐ。おやあ、ケーブルをはずしてあるのにターゲットの電源LEDが点いてしまうぞ。ふーむ、おかしい。

 何か、気持ちが悪いので、ターゲットの電源を使わずにDragon側から供給することにする。万が一にでもPCやDragonを壊してしまっては大ごとだ。モータードライバーの方の電源は、あらかじめ切っておいた。ブレッドボードなので簡単に出来る。

 何回かの試行錯誤の上、AVRStudioからDragonによるプログラムロードに成功した。AVRStudioの画面はデバッグ画面になった。動かしてみる。今度のソフトは時間要素がないので素直に動いていく。おお、最初の初期化は順調に終わった。スイッチを押す。良いぞ。スイッチの外部割込みルーチンに制御が移った。

 しかし、タイマーのところで、わけがわからなくなる。本来のプログラムは2秒、スイッチが押しっぱなしであることを判断してメインの処理へ行くはずだが、デバッガーは延々とスイッチ割り込みとの間を往復する。

Dragondbg ふーむ、何故スイッチ割り込みに戻るのだ。わかった! レベル割り込みがかかったままになっているからだ(レベル割り込みでスイッチが押されるのを待ち、スイッチが押されたら、すぐ割り込みモードを立下りに切り替え、多重割り込みを防ぐことになっている)。

 ソースコードをもういちど丹念に調べ直す。すると、割り込みモードを変えるところが、sleepが終わった直後でなく、1ステップ遅れていることがわかった。これだこれだ。ここはsleepの直後にモードを変えないと、再び割り込みが起きて、ループ状態になる。おーし、Dragonが役に立ちそうだぞ。この仮定が正しければ、Dragonの初手柄だ。

 プログラムを修正する。割り込みモードを変えるステートメントを1行ずらしただけである。テストする。見事プログラムはスイッチを2秒押しっぱなしにすると電源が入りモーターが廻り始めた。

 いやあ、気分が良い。Dragonのデバッガーがヒントになって問題が解決した。ただ、Dragonは結構、気難しい。一旦止めて、もう一度、動かそうと思ったら、ちゃんとISPモードに戻したにもかかわらず、2回目のデバッグはターゲットを認めない。Dragonの電源を入れ直すと、元へ戻ったけれど。まあ、役に立ったのだから、とりあえずはこれで良い。

PWMキャリヤーの音を静かにする(6/5/2012)
 運用テストを続けている。30分も廻せば、自動巻き腕時計は、全く腕に巻かなくても動作を続けてくれるようだ。ただ、動かしていると、やっぱりPWMの高周波音(位相基準PWMにしたので1/2の1khz)が気になる。

S_p6074994 意を決して、LPFを入れることにする。といっても、CR一段の簡単なフィルターである。何種類かの抵抗とコンデンサーを用意して、実際に本番機(時計ケースが鳴る)を動かし、オシロで波形を見る。ひとつひとつブレッドボードで確かめる。

 オシロの波形の綺麗なものがやはり音が静かになるようだ。 ただ、振動は必ずしも音と一致しない。振動が大きくてもケースの共振周波数域より低い時は音が小さくなる。ただLPFで確かにキュルキュル音は殆どなくなった。

 しかし振動は大きくなる。色々なコンデンサーや抵抗を取り替えた結果、0.47μFと10KΩの組み合わせが、この回路では一番静かになった。これを採用することにし、ブレッドボードから基板への工作を開始した。

実装版が遂に完成(6/7/2012)
 フレームにつける基板の実装が完成した。久しぶりに、半田ごてを握って丸々1日かかった。最近メガネを換えたのだが、やっぱり工作を始めた5年前に較べると視力が落ちている。半田付けが思うように行かない。今度はモーターの配線で撚り線を使うのでなおさらだ。

S_p6095000 短いところの撚り線は特に難しい。それに耐熱のチューブを持っていないので、半田付けの熱でカーブのところのチューブが切れてしまう。撚り線コードを手で押さえて半田付けを終わると、爪の形で被覆が切れている。うまくいかないものだ。

 ただ、アートワークを念入りにやったおかげで配線間違いはひとつもなく一発で動いた。暫く試運転。うーむ、モーターが熱を持つ。明らかに前より発熱が多い。なぜだろう。モーターの振動は確かに、前の裸で回していたとき(LPFなし、ダンプ抵抗4.7Kのみ)より大きくはなっている。

S_p6095005BSch3Vで回路図を描く(6/10/2012)
 回路図をBSch3Vで作成した。ソースコードは、UARTがChaNさんのISP-UARTなので、ちょっと迷ったが、マイクロステッピング制御の参考になるかと思うので、あえて公開することにする。回路図は、例によってあまり自信はない。まあ、これで動いているからということで厳密なところはご勘弁いただきたい。

2313winder_2

 特記するとすれば、CPUの電源にLCフィルターをつけたこと(ブレッドボード上で、モーターの回転中にたまにCPUがリセットするのをこれで防止できた)ぐらいで他は何もない。

 主な部品仕様と機能仕様をまとめておく。部品の値段を集計したら、既製品と余り変わらなくなった。ま、自作なんてこんなもんである。

自動巻き時計の巻き器の部品仕様

モーター: ユニポーラステッピングモーター(ST-42BYG0506H) 秋月電子 ¥1000

モータードライバー: MP4401                    秋月電子   ¥200

制御プロセッサー;  Atmel ATTiny2313                      秋月電子   ¥100

フレーム:3ミリアクリル板70×190ミリ(¥525の1/4換算)      ハンズ   ¥131

時計収容容器: 径70×深さ65のアクリル円筒          ハンズ   ¥180

固定ジョイント: シャフトと容器固定(内径6ミリ、外6ミリネジ)  千石3号館  ¥550

基板: 片面汎用基板ガラエポ 47×72ミリCタイプ        秋月電子      ¥60

電源: DC 5V  スイッチングACアダプター 2A          秋月電子             ¥600

その他部品は、回路図参照のこと。

機能仕様:

(1)タクトスイッチの長押しで、時計を入れる円筒が左右に回転し、自動巻き時計の
  ネジを巻く。回転速度は、37rpm(毎分)。

(2)デフォルトでは、30秒正転、30秒逆転、10秒休止のサイクルを30分継続し、その
  後電源が切れる(パワーダウンモードに入る。消費電流0.6μA)。

(3)ISP-USRT(ISPケーブルを使ったUART)を経由した、UARTモニターで、「nX」(X
  は、1から9までの数字)で、X0分の運転時間設定可能。

(4)運転途中でもタクトスイッチの長押しで、電源を切れる。

参考: CPUクロック 4Mhz(クリスタル)
      タイマー0、1のプリスケール 8
      PWM   8ビット位相基準  キャリアー周波数 977hz
                              1/(256×2×(8×1/4000000))

以下に、ソースコードをAVRStudioのプロジェクトフォルダーの形で固めたものを置きます。
中には、回路図ファイルと、サインカーブを作るのに使ったEXCELファイルも入っています。

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


|

« 気圧計のバグつぶしと、ステッピングモーターの静音化 | トップページ | マルチメーターP-10にUSBシリアルをつけたデータロガー完成 »

AVR」カテゴリの記事

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

コメント

ばんとさん、こんにちわ。
買ったものが役に立つって言うのは、理屈抜きに嬉しいものですね。何故だろう。
骨董屋が、品物を見て「良い仕事してますねえ」と惚れ惚れするのに似ているような。

投稿: がた老 | 2012年6月13日 (水) 11時40分

がた老さん、毎度です。

AVRでプログラムを組むときは、机上デバッグとシリアル端末のデバッグ
ぐらいしか方法がなかったのですが、Dragonでデバックいいですね。
当方はSTM32をかじり始めてます。デバッグ環境が充実してるので、この
環境に慣れてしまうと、AVRに戻ったときにDragonが欲しくなるかも知れ
ません。

ところで"棚にしまってあったDragonをいそいそと"と表現されてますが、
当方もがた老さんに購入時に相談にのってもらったロジアナを"いそいそと
取り出して"デバックで活躍して貰ったとこです。ロジアナの初のお仕事で
した。( ^ω^ )

投稿: ばんと | 2012年6月13日 (水) 07時09分

コメントを書く



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


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



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1089557/45606382

この記事へのトラックバック一覧です: マイクロステッピング制御の自動巻き機完成。ソースの公開:

« 気圧計のバグつぶしと、ステッピングモーターの静音化 | トップページ | マルチメーターP-10にUSBシリアルをつけたデータロガー完成 »