google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

ペルチェ温度コントローラーの製作(機能・ソフト解説)

◆まえがき
少し間が空いてしまいましたが、ペルチェ温度コントローラー作りの話の続きです。前回は基板とケース作りでしたが、今回は機能説明とソフトの解説です。

・ペルチェ温度制御装置の外観
ペルチェ温度コントローラー

◆機能説明
・操作パネル
操作パネル
下段には電源スイッチとOK表示(stabilized 表示)LEDを付けました。このLEDは実際の温度が設定値の±0.2℃以内に入った時に点灯します。上の段は操作スイッチでリセットとスタートボタン、項目選択つまみです。

電源を入れて、実行したい項目を選び、その後にスタートスイッチを押すことで実際に温度制御が開始されるようになっています。こうしておくと、電源を入れただけで加熱(冷却)運転が始まることは無いので安全です。なお、電源スイッチがあるのでリセットボタンは無くても良いのですが、あれば便利かもしれないので付けておきました。

◆表示パネル
・機能選択画面
現在の機能は下記の5種類です。最後に選んだ機能はEEPROMに記録しているので、次回の起動時は最初からその機能が選択されています。機能を追加・変更したい時はコード書いて再コンパイルです。
1. マニュアル :セレクトつまみで温度を設定します。設定値は運転中に任意に変更可能
2. プログラム1:10℃→60℃→10℃を10℃ステップ、各ステップ5分間ホールドの繰り返し。1サイクル50分
3. プログラム2:10℃→60℃→10℃を2℃/分の速度で昇温/降温、上下端で5分ホールドの繰り返し。1サイクル60分
4. プログラム3:10℃/60℃を最高速度で繰り返す。各温度で1.5分ホールド。1サイクル3分
5. プログラム4:20℃/50℃を最高速度で繰り返す。各温度60秒ホールド。1サイクル2分

・機能選択画面
マニュアル

プログラム-1 20191222IMG_0651.jpg 以下同様

・運転中の画面表示
プログラム-2
128x32画素のOLEDに出来るだけ多くの情報を詰め込みました。
・運転時間はスタートからの累積時間を秒で表示します。なおマニュアルでも表示。
・ペルチェのパワーは±100%の数値で示すと共に、一番下にバーグラフでグラフィックに表示しています。左に振れると冷却、右に振れると加熱ですが、直感的に判り易いです。

◆プログラム
こちら → ペルチェコントローター制御プログラム 20191221peltierTempCon (shift-JIS です)

機能が多いので長めのプログラムになっています。全体のポイントは以下の通りです。
・タイミングはMsTimer2で5ms周期の割り込みで制御
・ペルチェのパワーはフルブリッジを使ったPWM制御 (Arduino の analogWrite )
・温度はPID制御

◆PID制御
Arduino のライブラリもあったのですが、使い方が判り難かったのと、制御出力が正負に対応していない感じがしたので、自前の関数を作りました。そうはいっても、計算は離散値PID制御で標準的に使われている式でやっています。なお、PIDのパラメーターはプログラム先頭付近の #define の Kp, Ki, Kd の値で定義しています。

一般的な計算式を使ったといっても少しカストマイズしているので、自分用のメモを兼ねて中の仕組みを解説しておきます。

PID制御の出力はfloat pid( ) 関数の戻り値となっています。この関数が制御のキモなのでコードを見ながら説明します。
float pid(float sv, float pv) {       // 制御量を計算(pid制御)飽和対策
float x;
float e, dP, dI, dD;
static float e1 = 0.0;
static float e2 = 0.0;
static float lastMv = 0.0;
float dMv; // 操作修正量

if ((sv - lastSv) > 2.0) { // 1回の変化量の上限超えていたら
sv = lastSv + 2.0; // 微分成分の飽和防止のために変化量を制限する(2℃/0.2秒)
}
if ((sv - lastSv) < -2.0) {
sv = lastSv - 2.0;
}
lastSv = sv; // 次回監視用に値を保存

// 離散値に対するPID制御の式で制御量を決定
e = sv - pv; // 現在の誤差量
dP = Kp * (e - e1); // 比例部
dI = Ki * e; // 積分部
dD = Kd * ((e - e1) - (e1 - e2)); // 微分部
dMv = dP + dI + dD; // 補正量計算

Serial.print(F(", ")); Serial.print(TTC * 0.2, 1); // 時間
Serial.print(F(", ")); Serial.print(dP); // ΔKp
Serial.print(F(", ")); Serial.print(dI); // ΔKi
Serial.print(F(", ")); Serial.print(dD); // ΔKd
Serial.print(F(", "));

x = lastMv + dMv; // 制御量を決定
e2 = e1;
e1 = e;

if (x > 100.0) { // 調節範囲の上限越していたら
x = 100.0; // 100%でクランプ
}
if (x < -100.0) { // 下限以下なら
x = -100.0; // -100%でクランプ
}
lastMv = x; // 次回の計算用に保存(制約付きで保存)
return x; // 実際の制御量を返す
}

1) PIDの制御量計算
この関数では毎回制御量を計算し、30行の x = lastMv + dMv; で実際のペルチェの出力を決定しています。この式は過去の計算結果が累積されるので積分型になっています。こういう方式にしておくことで過去のデーターを大量に保存しなくて済み、プログラムが簡単になるのだと思います。

積分した結果でPIDの各要素の効果を発揮させるということは、それぞれの要素はあらかじめ1回微分した値を用意しないといけません。つまり、P(比例)は誤差の微分で、I(積分)は誤差そのままで、D(微分)は誤差を2回微分した値で準備します。dP, dI, dD の各要素はそういう意図で計算されているのですが、最初はこういう理屈が判らなくて悩みました。

2) アンチワインディング
例えば設定を70℃とした場合、実際に到達可能な温度の上限は約65℃なので誤差はゼロになりません。こういう状態が続くと積分項の効果はどんどん蓄積されるので制御量は非常に大きな値になってしまいます。そういう状態から例えば設定値を50℃に下げたとします。当然制御量を減らして追従しようとしますが、すでに非常に大きな値が入っているのでなかなか制御量が減りません。その結果反応時間が遅れてしまいます。これをワインドアップ現象と言います。
そういう問題を無くす方法はいろいろあるようですが、34から39行の処理で制御量の上限を制限しました。

3) 設定値変化速度の制限
以上のような方法でアンチワインドアップ対策を行うと計算結果の情報の一部が失われることになります。一番影響が出るのが微分項です。最初の変化は無視されてしまって、後半の変化量だけの情報が反映されるようなことが起きてしまいます。その結果、極端な場合は操作方向が逆になってしまうようなことまで起きてしまいます。そういう場合でも、時間が経てば誤差ゼロの状態に収束しますが、応答時間が長くなって好ましくありません。

対策はいろいろ考えられそうですが、手っ取り早い処置として、操作の変化速度の上限を制限することにしました。具体的には9~15行までの処理で、ここで1回、つまり0.2秒あたりの変化量を最大で2℃に制限しました。

◆まとめ
・PID制御のプログラムはもっと美しい実装がありそうですが、とりあえず動いているのでまあこれで良いかと思っています。PID制御を本格的に勉強しようとしている学生には非常に良い教材なので、もっと性能の良い実装を考えてもらうと良いと思います。

ダイソーの3.4AのUSB充電器を何かうまいことに使えないだろうか?というかなり不純な動機で始めたペルチェ温度コントローラーですが、やってみるとなかなか面白かったです。これ作らなかったらPID制御なんてやらなかったので良い経験をさせてもらいました。

・表示に小型のOLEDを使いましたが、表現力が高く、グラフィックな表示も出来るのでなかなか使い易いです。ただ1倍角の文字は小さすぎて読みづらいので、縦だけ2倍角の文字、つまり幅6画素で高さ16画素の文字が表示できるともっと表現の幅が広がると思います。誰かそういうライブラリを作ってくれないですかね。ひょっとしたら Adafruit_SSD1306 で出来るのかも知れないのですが。

LOLサプライズ! インタラクティブ ライブ ペット (L.O.L Interactive live pet) の修理

今回(12月)のおもちゃ病院で修理を担当したものの紹介の最後の記事になります。

今回は LOL インターラクティブ ライブ ペット (L.O.L Interactive Live Pet )というおもちゃです。なお、LOLとはLittle Outrageous Little の略だそうです。詳しくはタカラトミーのLOLのページをご覧ください。ところで、Arduino や電子工作の世界で LOL と言えば Lot of LED のことで、こっちなら持っているんですけどね。

記事のタイトルは修理となっていますが、内容としては機能の紹介に留まっていて、修理までやったわけでありません。あと、おもちゃの名前が長いので、以下の記事では単に LOL と呼ぶことにします。

このおもちゃは amazon だと販売ページはたぶんここ → L.O.L.サプライズ!インタラクティブ・ライブ・サプライズ おもちゃ おしゃべりペット [並行輸入品]

◆LOLの外観
LOL インターラクティブ ライブ ペット
動いてしゃべるおもちゃです。動きは目、耳、首、しっぽで、両側のほっぺがほんわりと調光された赤色LEDで光ります。センサーはマイクと頭の近接センサー、口の中のスイッチ、他にもあるかもしれません。

オリジナルの LOL の人形を動いてしゃべるように機能強化したバージョンという位置付けのようです。人気商品のプレミアムモデルということでしょうか、値段も高くて 4000円以上になっているようです。

今回おもちゃ病院に持ち込まれたわけですが、その症状は、「同じ音しか出なくなった」というもの。

まずは各部を見ていきます。

▼背面
電池はLR44を3個
背面にはネジ留め式の蓋があって、中にはボタン電池のLR44が3個入っています。

▼ボディ内部
ボディ側の内部
マイクが載った基板と、下の方にはしっぽを左右に動かす電磁アクチェーターが入っていました。

▼頭の内部
ヘッド側
右側の部品が頭の後ろ側で、ここにスピーカーが付いています。

頭の前側に制御基板をはじめとする主要なパーツが組み込まれています。目と耳と首を動かすのはモーターで行っているようです。頭のタッチセンサーや口のセンサーもここに入っています。

▼制御基板
LOL インタラクティブ ライブ ペット の基板
基板の端ギリギリまで部品やパターンが入っていて、かなりの高密度実装になっています。左上の8ピンのパッケージ(U3)はモーターのドライバ、あるいはEEPROMだと思うのですが、マーキングからは判断できませんでした。

◆動かない原因の調査
ボタン電池3個直列なのに、電源電圧が4V程度と低めでした。ということで試しに新しい電池を入れてみると、ちゃんと動くではありませんか。なんだ、電池がへたっていただけだったのかと思ったのですが、消費電流が気になったので測定してみました。

0.1Ωのシャント抵抗を入れて電源電流波形を見てみると、

▼消費電流
LOL interactive live pet の消費電流波形
シャント抵抗が0.1Ωなので、5mVが50mAに相当します。つまり縦軸は50mA/Div. です。

電流は大きく変動していますが、ピークで130mAくらい流れています。大きな電流が流れるのはモーターを動かした時だと思います。電源はボタン電池のLR44ですが、そこからこんな大きな電流を取るのはダメです。

おもちゃをそのまま放置しておくと、だんだん動きが少なくなるのに連れて消費電流も減っていきます。動きが無い場合の消費電流は約9mAで、これが0.8mA、0.1mA以下と段階的に減って行きます。このあたりの動作はマイコンを使った機器の電源制御のセオリー通りで、出来るだけ電池寿命が延びるようにプログラムされているようです。

ここまでが現品の調査結果です。以上の内容からこのおもちゃの問題点を整理すると、

◆問題点の整理
1) 電池寿命が極端に短い
電池の容量に対して非常に大きな電流を取り出しているので、電池寿命が30分程度しかありません。

ボタン電池のLR44の容量は約120mAHですが、これは1mA以下の負荷電流で使った時の値です。(確か負荷抵抗4.7kΩで測定)。130mAもの電流を流すと利用可能な容量はずっと少なくなります。そんなことで、30分くらいしか動かないのは当然、というかこんな電流で使うのは非常識です。

2) 電池容量不足で無限ループに陥る
電源が入って起動する時に、ワンワンと鳴いた後でモーターが動いて首を振ろうとします。この時、電池の容量が少ないと、モーターが動くことで電源電圧が急低下してしまい、CPUにリセットがかかって最初の状態に戻るようです。再度ワンワンと鳴いて、モーターを動かそうとしますが、そこでまたリセット、、ということを永遠に繰り返すようです。

3) 一度無限ループに入れると回復不能
電池の残り容量が十分あれば、最初の動作の後でスタンバイに入り、その状態では消費電流も減るのでインタラクティブに遊べる状態になります。そういう状態では平均的な消費電流も少なくなるので電池も多少は回復し、遊べる時間も少しは増えそうです。

しかし、一度でも無限ループ状態に入れてしまうと、急速に電池が消耗してしまい、正常に起動処理を行うことが出来ないレベルになってしまうのだと思います。そうなると、最初のワンワン鳴くところだけしか実行できなくなって、スイッチを切るまで鳴き続けるという面白くない状態に陥るようです。

◆おもちゃの処置
以上のような状況から、このおもちゃをこれ以上修理することは出来そうにはありません。ということで、「不具合は見つかりませんでした」、「電池を大量に消費するおもちゃのようです」というコメントを付けてそのままお返しすることにしました。

ちなみに、電池にパラに4700μF程度の電解コンデンサを付けて、電圧の急低下を防止すればいくらか問題は起きにくくなるのかも知れません。でも余計なことをしてメーカーの保証が受けられなくなるとまずいので、そこまではやりませんでした。もし自分のおもちゃだったら、たぶんそうやってます。

▼この個体の表示
おしりの型番表示
あれこれごちゃごちゃ書いたので、この個体の番号が判る写真を掲載しておきます。
2018 MGA 555377 MADE IN CHINA 35618MNGE と表示されています。

◆まとめ
何ともいい加減な設計をしたものだと、あきれてしまう物でした。メーカーのMGAはアメリカの大手おもちゃメーカーのようですが、こんなにひどい設計の物を本当に作ったのでしょうか。ひょっとしたら、中華なパチ物なのかも知れません。

これで遊び続けるためには、30分でボタン電池を3個使うくらいのコストがかかることになります。そうは言っても調べたのはこの一個だけなので、他の物が全部同じであるかまでは判りません。

amazonのこのおもちゃのカスタマーレビューを見ると、同じ状況になって使い物にならないとの書き込みがたくさんあります。このレビューの数は6件で平均点は2.4点

一方で、こちらにも同じおもちゃと思われる物が出品されていますが、こちらのカスタマレビューの評価の数は801件もあって平均点は4点くらいとさほど悪い評価になってはいません。これ、どうなっているんでしょうね。

あと、アメリカの amazon のページで、「電池寿命が異常に短いものがあることが判明したので、該当者は購入後30日以内に連絡して欲しい」という注意書きが、Product description の項に書かれていました。L.O.L. Surprise! Interactive Live Surprise Pet with Realistic Sounds こちらのページのユーザー評価もさほど悪くありません。(438レビューで平均点は4.1)

◆情報求む
あれこれ書いてきましが、このおもちゃについて何か情報をお持ちの方がいらっしゃったらコメントで教えていただけると幸いです。情報交換すれば、お互いの認識の精度が上がるはずです。

鍛冶屋さんが教えてくれたMGAのページにあった、このおもちゃの取説(PDF)
カレンダー
11 | 2019/12 | 01
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード