« 2011年11月 | トップページ | 2012年1月 »

2011年12月の2件の記事

2011年12月17日 (土)

Atmel純正プログラマーDragonで書き損じたCPUチップを救う

AVR DRAGON来る(12/10/2011)
 とうとう、この研究所にもAtmelの純正プログラマー(プログラムライター)が来ることになった。ATmel AVR Dragonである。4年近くAVRとつきあっていながら、これまで当研究所のAVRのライターはすべて互換品ばかりで、それもシリアルだけである。

 作ることが目的ではなく、何かの役に立つ「しかけ」を作ることを電子工作の目的(何度もしつこく書くけれど)にしているので前から、プログラムライターは道具と割り切っていて余り興味はない。しかも、ケチなので安価で互換ライターが作れるのに、わざわざ純正品を買う気持ちは全くなかった。

S_pc164453 それが、何故買う気になったのか。フューズビットを書き損なった石が増えてきたこともある。それならパラレルライターを自作すればよい。制作例はいたるところにころがっている。実はブレッドボードで2回ほどリセッターらしいものを作ったが、何故か2回とも動かなかった。これがどうもトラウマになっている。

 めげ易いタイプである。リカバリーのための「手段」に不具合があるのか、対象そのものが不具合なのかの判別ができない状況というのが、どうも不安であった。これ以上追求しようという気力を失った。特にパラレルプログラミングは、12Vの高電圧を使う。ちょっと間違えば、簡単にチップを壊してしまう。このあたりが、パラレルプログラマーは純正を買おうと大分前に心に決めた理由である。

 Dragonはデバッガーとしても使える。こちらはAVRではデバッガーやICEを使うつもりがなかったので、実感がわかないが、ICEとしての価格$49(現地価格)は破格の廉価なのだそうだ。日本で買えば、¥7000以上するが、DigiKeyでは¥4400である(ちょっと前は¥4305だった)。

 ただ、DigiKeyは安いかわり、買い物代金の合計が¥7500以上にならないと送料が¥2500かかる。いつもこれが悩みの種である。今度は、あと¥3100分の電子部品を買わねばならない。無理して買って使われない部品が次々に溜まっていく。これが工作のプレッシャーに拍車をかけることになる。この前書いた「電子工作の無限地獄」である。

それはとにかく、今回の送料のゲタは以下の通りである。

①LM2735(DC-DCコンバーター)
このまえ一つ高圧で失い手持ちがなくなった。9V電池の充電版を作るため、さらに3ヶを注文する(@¥308)

②MAX6675(熱電対インターフェースIC)
このICはすぐれもので、冷温端センサーを内蔵していて出力は何と、SPIのデジタルデータである。熱電対温度測定は、とりあえずオペアンプですべて自作したが、これと、どれだけ差があるか、比較したくて買ってみた。¥1219 1ヶ

③DP83848C(イーサネットのPHY層チップ)Aitendoで買った2インチのTFT液晶を動かす予定のSTM32F107 CPU基板のLANインターフェースのため。この基板はmbedと少しかぶるが、安かったのとCPUチップが余っていたので。¥587 1ヶ。

④ATTiny85(8ピンのAVRチップ)
パラレルプログラマーが揃うので、前から欲しかった8ピンAVRを買ってみた。今のところアプリケーションの予定はないが、¥195と安かったので2ヶ買う。

 これで924+1219+587+390=3120、ゲタはめでたく¥3120となり、合計¥7520と無料合計に到達した。喜び勇んで発注する。

 さて、Dragonである。ウェブには沢山の購入記があるので、予備知識はいくらでも手に入る。何しろCDや説明書は一切なくて基板だけが届くようだ。気持ちのよい割り切り方である。ただ、本体のサイトには情報が少ない(というよりこのサイト、情報の引き出し方がとてもわかりにくい)。

 最近、秋月でも売り出した極小のチップTiny10もサポートしているはずなのだが、直営のショップの情報ではサポートとなっているのに、既存のAVRStudio(4.19)の正規のマニュアルにはない(AVRStudio5は、Dragonはまだフルサポートではない)。

 DigiKeyにしては珍しく、到着に3日以上かかった。クリスマスが近いからかもしれない。日本語マニュアルは、例のavr.jpで発見した。ただ、これもバージョンが古いのでTiny10のサポートは入っていない。

ZIFソケットを買ってきた(12/12/2011)
 Dragonは、ISPピンが実装されているだけで、他のパラレルや、肝心のターゲット基板はパターンだけで何もついていない。ユーザーが何らかのソケットを実装する必要がある。初心者には手ごわいだろう。

 本体が届く前から実装レイアウトを色々検討していた。仕事の帰り久しぶりに秋葉に出て秋月に寄り、ゼロプレッシャーソケットを買ってきた。ずっとAVRチップを使って、基板につけたままプログラムできるISPを愛用してきたので、電子工作では定番のこういうソケットに縁がなかった。小さな汎用基板に取り付けてメスのソケットをつけ、Dragonとのあいだをフラットケーブルのジャンパーでつなぐことにする。

S_pc164452 沢山の人が様々な方法で接続している。Dragonのボードそのものをプロトタイプ部で切り取って、Dragonを小さいケースに入れてしまった人もいる。ターゲットチップごとに、ピン接続を固定したプラグインを用意する方式が一番安全で確実だが、ひとつひとつ準備しなければならず手間がかかる。ジャンパーで接続するのが最も手軽だが、間違う確率は高い。

 こちらがやりたいのは、パラレルプログラミングで、ISPでデバッグをすることは余りないだろう。Dragonの基板にZIFソケットをつけてしまうことも出来るが、ジャンパーを扱うには手狭でやりにくい。ということで別基板に移すことにした。実装は、40ピンのソケットとZIFとの配線がけっこう面倒で時間がかかった。同じことの繰り返しなのであきてしまう。

Dragonの動かし方が難しい(12/14/2011)
 プロトタイプ基板の実装をしながら、Dragonの使い方を学習する。マニュアルはあるが、Dragonは多種多様の書き込み法をサポートしているので、やり方は一本道ではない。これが始めての人をまごつかせる。どうもやりかたが頭に入ってこない。

S_pc164451

 しかも、AVRStudioを動かしているうち、いつのまにか画面からプログラムアイコンが消えて、大騒ぎになった。Dragonが起動できないのである。要するに、AVRStudioは最初、プロジェクトを立ち上げる前に使用するプログラマーを指定しなければプログラムアイコンが出てこない。それをしないで既存のプロジェクトを読み込むと、プログラムアイコンが消える(そのプロジェクトは別のプログラマーを指定していたので、それがないので消える)。

 言われてみれば、そのとおりで、最初から手順通りプロジェクトを立ち上げ、プログラマーを指定して開発をしていれば、問題はないのだろうが、こちらはAVRStudioの変則的な使い方を長年している(コンパイルだけAVRStudioで、ファーム書き込みはChaNさんのシリアルプログラマー、エディターはTeraPadなど)。これに気がつくまでえらい時間がかかった。

 こういうIDE(統合開発環境)というのは、決まった手順を忠実になぞっていかないと、うまく行かないことが多い。8ビットのマイコンの環境だと馬鹿にしているところがあったのだろう、一時は半べそをかくほどあせっていた。

 さらに、とんでもないことが起きた。やっとのことでDragonが動き出して、Tiny2313のリカバリーをしようとしたとき、何故かチップが暖かい。へえー、Dragonの高電圧プログラミングってこんなに電力を消費するのかと思いながらチップを良く見たら、こいつはTiny2313ではなくて、もうひとつの動かないチップ、Tiny861の方だ! 顔が青ざめる。2313と861はピンアサインが全く違う。チップを壊した可能性が高い。

 Dragonを買った目的の大部分は、この動かなくなったCPUチップのリカバリーである。それがリカバリーする前に壊してしまったら、何のために買ったのか意味がなくなる。とにかく慌てて861をはずし、2313に入れ替える。ジャンパーを2313用にしてあるので861が壊れたかどうか確認するのは先の話だ。2313の方をすませてからだ。

 気を落ち着かせ、再度Dragonを立ち上げる。Main画面で、シグネチャーバイトの読み出し。よし、2313と認識した。ジャンパーは間違ってなかったようだ。フューズビットの読み出し、よーしこれもOKだ。うむ、Higherバイトが0xFEと、SPIENが不許可になっているだけでなく、RSTDSBLが0、つまりリセットピンも無効になっている。念の入った壊し方をしたものだ。

 とりあえず、工場出荷時の0xDFにして書き込む。よーし、書けた。念のため、チップをブレッドボードのテスト環境に戻し、シリアルで読んで見る。いつものAVRSPがチップを認めてディバイス情報を返してきた。やったやった、良いぞ。ファームを書き込む。テスト環境のステッピングモーターが静かに廻り始めた。ヒャッホー、動いた、動いた。

 いやあ、Tiny2313は生き返った。¥100の石だけれど、資源は無駄にならなかった。嬉しさがこみ上げる(本当に安い娯楽だ)。しかし、手放しでは喜べない。高電圧で駄目にしたかもしれないTiny861のテストが待っている。

Dragonfuse見事に2つとも生還(12/16/2011)
 861のためにピン接続を替える。あせっているので中々うまく接続できない。ただ、861はこのDragonのプロトタイプ基板のリファレンスチップだったらしく、HVSP/パラレルとのピン接続は順番どおりで2313ほどばらばらでなく助かった。

 さあ、ジャンパーがつながった。861が生きているか、生還寸前で倒れたか、緊張の一瞬である。念のためジャンパーの接続をもう一度確かめる。間違いない。意を決して通電し、シグネチャーバイトを読む。おーし、良いぞ。861のシグネチャーが戻ってきた。861はまだ生きていたようだ。思わず拍手が出る。

 次はフューズビットの読み出しである。これも無事読めた。予想通り、クロックの設定ビットが未定義と出ている。これを直して書き込む。書けた。エラーはない。良かった。861は死んでいなかった。HVPPの高圧(といっても12Vだが)はかかっていなかったのだろう。ファームを書いてみよう。Dragonは勿論ファームを書くことも出来る。

 直近のプロジェクト、熱電対のHexファイルを書き込んでみる。うーむ、途中の作業メッセージは全部OKと出ているが、最後のVerifyで何かエラーが出た。高電圧で何かおかしくなったのだろうか。

 2313と同じように、チップをはずしてシリアルの環境に移す。ここでのテスト。フューズビットの読み出しOK。ファームの書き込み。これも順調に終わった。エラーメッセージはない。ふーむ、こちらは大丈夫だ。しかし、高電圧がどこかにかかってI/Oピンがやられている可能性はある。

 こうなったら、とことん調べないと気がすまなくなってきた。全部のピンを確かめるのは大変だが、このあいだの熱電対システムは、861の殆どのピンを使っている。こいつが動けば、完全復帰をほぼ証明できる。

面倒だけれど、アクリル曲げ器に実装された温度表示・制御部でテストすることにする。こいつは、台板、ケース、さらに基板の3組のネジをはずさないとチップが出てこない。行きがかりでもう止められない。ネジを手近な皿に盛って中味を出す。うわー、だめだ。チップは2階建ての基板の下の段だ。もう一段ネジをはずさねばならない。

 ここでやめたら、今までの作業は全く無駄になる。もう止めるわけにはいかない。2ミリセルフタッピングビスを4つはずす。Tiny861Aを取り出した。ファームをテストベンチで書き込んだ。石をセットする。さあどうだ。電源を入れる。ああー良かった。動いた。7セグLEDが数字を表示してヒーターが加熱されていく。暫く動かしてみる。全く問題なし。

 これで、フューズビットを書き損なって動かなくなったCPUチップがパラレルプログラミングで2つとも生還した。見事に生き返ったのである。AVR Dragon導入の当面の目的は完全に達成した。投資対効果から行けば、¥300/¥4400、6.8%の元はとったことになる。

 まあ、それはとにかく、今までの胸のつかえがいっぺんに降りた。はたから見れば何のことかと言われそうな、ささやかな出来事だが、この上なく爽快な気分である。少し短いけれど、ブログにこの喜びを報告することにしよう。

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

2011年12月 8日 (木)

熱電対によるヒーター制御:まずまずのPID制御。ソースの公開

小学校のクラス会(11/26/2011)
 所長は関西出身で大学卒業まで京都で過ごした。高校や大学時代の友人は東京に結構たくさん出ていて東京での同窓会も多い。最近は共にリタイアした同級生と頻繁に交流して、今や生活の一部となっている。しかし小学校の同窓生は地元に残った人が多いので同窓会は地元で開かれ、滅多に顔を出したことがない。

 高校の同級生で同じ小学校のクラス生から、前から「たまには出なさいよ」と強い要請があり、今回、場所が大津の石山寺と珍しいところだったので、それこそ50年ぶりくらいの感じで出席した。

S_pb264419

 石山寺は、琵琶湖の水が京都・大阪に流れ出す風光明媚なところで、会場はその石山寺の近くの料理屋(昔は川魚料理店だったのだろう)であった。石山寺は紫式部が源氏物語を書いた所ということでも有名である。

 50人のクラスで集まったのが15人。男は4人だけで女が11人。やはり女が元気である。久しぶりの同窓会は、いわば自分探しの場でもある。自分の知らなかった(忘れていた)一面を教えられ、人生観が変わる。今回もいくつかの収穫を得て新幹線の日帰りで京都から帰ってきた。最初は泊まるつもりだったが、京都は紅葉シーズンの最盛期で宿が全くとれなかったのである。

S_pb264433

 帰ってから、熱電対を使ったヒーターの温度制御のためのPID制御をあらためてお勉強する。現在、P(比例)制御まで動いている。対象は自作のアクリル曲げ器である。比例制御だけで一応の制御ができて(前記事参照)、アクリルを曲げるくらいならこれで十分なのだが、「凝り性」の性格で、やりだすと止まらない。それにPID制御は、中断しているライントレーサーなどのロボット制御には必須の技術なので、何とか自分のものにしておきたい。

 温度制御を実際に動かしたあと、前に読んだ全く同じ資料を読み返してみると、不思議なことに何故か新しい発見が増える。面白いものである。視点が変わっているからだろう。見晴らしが良くなって制御技術全体の理解が深まったように思う。

具体的な方法がわからなくて落ち込む(11/27/2011)
 とはいえPID制御の具体的な手順はまだ良くわからない。I制御もD制御も時間成分をどの範囲でどれだけとりいれるのか、その目安を書いている所がないのだ。それにこのところ仕事と行事が重なって電子工作にかけられる時間がなかなかとれない。

 そのうち気の滅入ることが続いて、制作意欲ががた落ちした。まず、エアコンのリモコンの液晶部分が壊れた(尖ったものでぶつけたらしい)ので代替品を買おうとした。ウェブで調べたところ純正品は¥5000以上するが、多種類エアコン対応を謳う互換リモコンの方がはるかに安い(1/3)のでアマゾンで取り寄せてみた。ところが、どのコード(うちの三菱だけでも10種類以上)でも動かず、一気に落ち込む。安物買いの銭失いを絵に描いたような話である(これはこのあと別の部屋のエアコンに使えて無駄にならなかった。やれやれ)。

 続いて、帯状疱疹(ヘルペス)という病気にかかる。顔に水疱のような吹き出物が出来て、最初、うるしにかぶれたのだろうと放置していたら段々広がり、医者に行くと「これは立派な帯状疱疹です」と宣言された。全く痛みはない。帯状疱疹は痛いと聞いていたので最初は半信半疑だったが、薬を飲んだらすぐ良くなったので医者の見立ては正確だったようだ。

Amalia

 結構、怖い病気らしいが痛くないので深刻感がない。しかし、顔が張れているので、気持ちが集中しない。しかも、そのころ知人がスペインで買ってきたという「Amalia Rodrigues」のCDを借りて何気なく聞き出すと、このポルトガルのシャンソンと言われるファド(Fado)の世界がとまらなくなった。暗い情念の溢れ出るCDを聴き続け、余計何もする気がなくなった。ということで、電子工作の進展は完全に止まってしまった。

自己流のPID制御を試みるがいまいち(12/2/2011)
 欝(うつ)には必ず終わりがある。Fadoを聞き続ける事でどん底まで落ち込み、かえって回復が早まったようだ。再び意欲が回復し、気がつけば、PCの前で温度制御のロジックをいじっていた。ハードは殆ど完成しており、やることはもう殆どない。2つのケースをアクリル曲げ器の台板に固定するだけだ。残る作業はもっぱら制御ロジックを作るソフト開発となる。

 1秒ごとのメッセージをUARTに出して、温度制御のプログラムテストを繰り返す。ウェブのPID制御のページを片っ端から拾い上げて参考になりそうなところを探す。殆どのページは基本の話の繰り返しばかりで、肝心の実践的なことが載っているページはほとんどない。後閑さんのPICのページはさすがで、少し参考になる式が載っている。

 微分積分と言っても、どうも多数のポイントをとっているのではなく、前回データの差分を見ているだけのようだ。微分の方がわかりやすいので、まず、こちらからやる。しかし、文献での説明と、自分の感覚がどうもずれているような気がする。

 こちらは急激なオーバーシュートを避けたいので、目標温度に突っ込んでくるような温度上昇を緩和させるのに微分係数を使いたいが、どうも逆の説明である。同じようなことを疑問に思っているページも見つけた。

 それと実際の係数をどう決めるかは何も書いていない。積分制御は比例制御との区別が良くわからない。目標温度との温度差が大きい時に積分制御を適用すると、ヒーターの加熱の効果が、かなりあとから出てくるので、猛烈なオーバーシュートになってしまう。これも適用する範囲を限定しないとおかしくなる。

S_pc084447

いまいちよくわからないが、自己流のPID制御ロジックを次のように決めた。

・まず比例制御帯を目標温度の1/2からとする。全体にすると、目標温度付近の勾配が少なくなりすぎ、効果が遅れて出てハンチング(値の振動)が大きくなるのを避けるためである。

・比例制御帯に入ったら、常に前の温度と比較し(1秒ごと)、一定の温度以上の上昇があるときは、ヒーターの制御定数を1/2にする(当面固定)。これが(d)制御にあたる部分である。

・目標温度の90%以内に現在温度がなったら、(I)制御帯に入り、1秒ごとに目標温度との偏差(オフセット)を積み上げる。制御定数はすぐに反映せず、次の手順でまとめる(温度変化が遅れることを考慮)。

・5秒ごとに、足し上げたオフセットの温度値の平均をとり、そのときの温度に応じた制御定数に一定の倍率をかけて、100段階の制御定数に足し込む(200℃なら1℃あたり2が基礎数)。

・温度が目標温度を上回ったら、途中まで積み上げていたオフセットはすべてクリアする。

・微分制御のもうひとつ、温度が目標温度以上になったあと、下がってきた時は、(d)制御として、そのときの比例で決まったヒーターの制御定数を2倍にして、現在温度が目標より高くてもヒーターを加熱し必要以上の温度低下を事前に食い止める。

 しかし、色々工夫しては見たが結果は比例制御とあまり大差がない。パラメーターを変えてみても(2倍を1.5倍とか)グラフなどで余り顕著な効果は出てこない。オフセットの解消については、(I)制御が非常に効果があったが、相変わらず目標温度を上下するハンチングをとめることはできない。

 ヒーターが点いてから、温度に反映されるまでの時間が長すぎて、PID制御が効かないのである。ウェブ情報にも、遅れ時間の大きい制御はPIDでは難しいという記事がある。

もういちど最初からPID制御(12/4/2011)
 やっぱり我流は先が見えない。それにパラメーターの調整がしにくい。もういちど制御ロジックを最初から作りなおすことにする。パラメーターで制御できるようにするため、変数をunsignedから符号付きのsignedにかえ、マイナスを導入して制御定数を計算しなおすことにする。

 勉強をもういちどやりなおす。伝達関数とPID制御の関係もやっと理解出来てきた。PID制御の伝達関数はちゃんと存在するのだ。PIDが理論以前の実践的手法から始まったことが良くわかった。

 ソースコードを大幅に見直すことにした。本格的なPID制御にするため、各種定数を#defineであらためて定義し、忠実に式をたててプログラムを作り直す。1以下の定数は、10倍(1から10)で定義しあとで10で割る。これで小数点の操作が整数データで出来るようになる。

 これまで符号無し変数とifでやりくりしてきた演算を、マイナスを含んだ符号付き変数にしたので、計算が面倒になったが、楽になったところもある。温度がオーバーシュートしたあと、目標温度の下に突っ込む時のヒーターの加熱指示が計算式だけで出来るようになった。

 あわせて、このあいだの空焚き警告のエラーメッセージが出るようにコードも追加した。汎用性を持たせるため固定数値は持たないようにしようとしたが、これは無理だった。高温の時は、いくらヒーターが連続で加熱されていても温度変化しないのですぐエラーになってしまう。

 結局、「計測温度が35℃以下で、長時間(当面20 秒)ヒーターが点きっ放しになっても温度変化が2℃以内」という固定条件で、ヒーターをただちに止めるロジックになった。解除は、リセットか、ロータリーエンコーダーの回転で戻る。

PID制御はパラメーターの調整がポイント(12/7/2011)
 この3日間、PIDのパラメーターをあれこれいじって、ヒーターの熱制御をスムーズにしようと頑張ったが、結局、目の覚めるような改善は出来なかった。しかし、まあ、こんなものかという程度までは制御が出来るようになった。グラフがその苦労のあとである。

Pid

 比例制御に較べれば、圧倒的にオーバーシュートは少なくなり、このパラメーターで280℃くらいまでオフセットは補正される。思い切って比例制御の比率を減らし、微分と積分制御の成分を大きくしたのが効果があったようだ。アクリル曲げ器は、内部230℃でアルミパイプ表面がアクリルを曲げる最適温度150℃程度になるので、これで十分である。ハンチングは残るが比例制御より心持ち少なくなっている。

 弁解になるが、こういう時間遅れの大きい制御は、本当に難しい。試しに、このあいだ作った調光器(無段階調整可能)で人間の手で所定の温度に止める制御をやってみた。放置しておけばこの前の記事のようにどこかで一定の温度に落ち着くが、決められた温度を手動で一定に保つことは実は極めて難しい。

 温度が下がってきたとき、ボリュームを上げて温度低下を防ごうとする。ところが温度は急には上がらない。暫くしてから徐々に温度は上がりだし、このとき慌ててボリュームを下げても、温度はどんどん上がっていく。

 結果として目標温度を大幅に上回ってしまう。さっきボリュームを下げたので、再び温度は低下しはじめる。しかし低下に気がついてボリュームを上げてももう遅い。少々ボリュームを上げても温度はいつまでも下がって目標温度をあっさり割り込んでしまう。そして、これの繰り返しになる。

 人間の手ではとても一定には出来ない。負け惜しみになるが、このマイコンの制御などうまくやっているほうだと思う。あまり自信はないが、ここまでの成果のソースコードを公開することにする。ハードはこの前と全く換えていないので回路図は前記事を参照していただきたい。

 まだ改善すべきところは多々あると思うが、あまりこればっかりにこだわっているわけにもいかない(面白いけれど)。このプロジェクトもこのあたりで一段落つけることにする。

 以下に例によってAVRStudioのプロジェクトフォルダーの形で、PID制御のソースコードを置きます。 フォルダー名が替っているだけでソースファイル名は同じなので注意してください。修正したコードはコメントの形で残っています。参考になれば幸いです。

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

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

« 2011年11月 | トップページ | 2012年1月 »