2018年10月6日土曜日

3Dプリンタ その17(3D Touch Sensor異常の原因と暫定対策)

FirmwareをVer.1.1.4にUpdateしましたが
依然として3D Touch Sensorのピンの動きが異常なのです。
ピンが地に着いているのです。
しかもLED点いているし...
上のは、造形物が小さいので、支障なく最後までプリントできましたが、
これは、プリントしたものに当たったりして大問題なのです。
コアは、かなりの押し込み、飛び出しまで試しましたが、
かなりの確率で症状が出るのです。
仕方ないので
プリント開始のG29が終わった直後にセロテープでピンを固定して
続けていました。
が、毎回これやるのもかったるいし、格好悪すぎだし、
原因がわからないのでオートレベリングの時に
いつガラス板にのめり込むかとドキドキしなければいけないのです。

プリントしていない時の静止状態でのテスト
[M280 P0 S120]では、異常がでたことは、ありません。
Marlin3DprinterToolでのM48テストでは、数回、
ノズルがガラス板にのめり込んでいくという恐ろしい経験をしました。
プリント中は、かなり頻繁に発生するのです。
これは、5V電源がとても怪しいので、プリント中の電圧変動を確認してみます。

テストするのは、この前、問題が起きた、この円盤 Plate.stl
オリジナルの直径48mmを
この前、XY:2.9倍、Z:0.3倍にして大きくしてテストプリントしていたら
この大きさでピンがステージの外に出て戻る時に
ピンが下がったままで、ガラス板にぶち当たり、折れそうになったのです。
冒頭の2番目の写真です。
サイズ、139.2mm です。
スライスしてプリント開始!
あれっ?ノズルヒーターONなのに温度が上がりません
時々あるのです。
プリントと同時にONになる時によく起こります。
プリント開始前にManual ControlでONした場合は発生しません。
これは、Repetier-Hostのバグかな?
RESETして、Manual ControlでヒーターON!
今度は、大丈夫です。
温度が落ち着いた所で[プリント]ボタンをクリックします。
3D Touch Sensorの5Vを確認するため、アナログテスターを接続しています。
プリント動作をしています。
ヒーターがONになってもテスターの針は、微動だにしません。
DC12Vレンジ、4.8Vで低いのが、少々気になりますが...
プリント開始時のG28とG29では、ほぼ異常が起こったことはありません。
今回も正常通過です。
プリントが始まりました!
フィラメント無しでやっています。
ピンは上がったままです。
5V電圧も変化なし、針巾(0.05~0.1V相当)分の変化もありません。
ん~ん?こういう時に限って再現しませんね~
前は、この様にステージからはみ出した時にピンが下がって
ガラス板にぶち当たったが、何とかSensor本体の取付部がしなやかに曲がって
折れずに済んだのです。
今日は、ピンは、上がったままで正常です。
Infillが1層目の半分くらい終わりました。
ピンはあがったままです。
再現しなくなりました~?  中止します。

今度は、3D Touch Sensorの5Vだけ外部電源で供給してみます。
[M280 P0 S120]のセルフテストでピンを上下運動させなが
電圧を下げていくと、4.3VまでセフルテストOKです。
4.2Vでピンが上がらなくなりました。
ということは、電圧のせいでも、中の磁力弱りのせいでもない
と判断してよさそうです。
症状をよーく考えると
・プリント開始時のG28、G29では、滅多に発生しない
・1、2層目で発生し、3層目から正常にピンが上がってた
・ピンがステージ領域からはみ出した時は、ピンが下がって
 ステージに当たる寸前で上がっていたことがある
 ステージ領域を何かが検出しているような動き
・ステージ領域外から戻ってもピンが上がらず、
 ガラス板に当たって折れそうになることあった

どうもピンの上げ下げ信号がおかしいのかも?
ピンの上げ下げ信号は、3D Touch Sensorのオレンジ線信号のハズです。
このオレンジ線:サーボ端子
(赤:5V、茶:GND、白:Z-min検出出力、黒:GND)
ラジコンは持ってませんが、そのサーボ技術を使っているということなので
ラジコンのサーボを調べると
10~22msecの周期でパルス幅 1.5msec±0.5msecで可変して、
モータの角度を制御するというものです。
ここの図がわかりやすかったので拝借しますm(_ _)m
そのオレンジ線:サーボ端子の波形をオシロで見ます。
M280 P0 S10(2msec/DIV)
ピンが下がります。
ピッタリ 20msec周期になっています。
拡大(200μsec/DIV)
パルス幅は、650μsec
M280 P0 S90(2msec/DIV)
ピンが上がります。
拡大(200μsec/DIV)
パルス幅は、1470μsec
M280 P0 S120:セルフテストモード
パルス幅は変化せず一定なのです。
電圧は0.2V程変動しています。
パルス幅が変動してピンが上下していたと思ってたのですが
パルス幅は、約1.8msec。S90⇒S120の比でUPしているだけなのです。
Sensor内部の回路でパルス幅を判定して上下させていたんですね。
M280 P0 S160
セルフテストモードから抜ける
ならば、異常を起こしていた2.9倍のPlate.stlのプリント中を見てみます。
1470μsecでM280 P0 S90の状態と同じなのです。
パルス幅にジッタがあると考えたのですが、キレイなもんです。
ノイズも乗っていません。
なぜか、ピンは上がったままで下がることはなく、
異常が発生しなくなっています(´-﹏-`;)
大抵この手の異常は、調査している時に限って再現しないんですよね~
S値を徐々に上げていくと、M280 P0 S67でピンが上がります。
そこから、S値を下げていくと、M280 P0 S19でピンが下がります。
結構なヒステリシスがあるのです。

M280 P0 S96でセルフテストモードに入りますが、
時々止まる微妙な動き...異常状態の動きにやや似ています。
S97で完全にセルフテストモードに入ります。
S95でセルフモードから抜けます。
S96~S122までは、セルフモードに入ります。
S123以上は、セルモードから抜けます。
こちらは、ヒステリシスはないですね~
これらは、「USB給電のみ」と「主電源あり」で変わりません。
コアを360°時計回りや反時計回りに回しても変わりません。
が、S90とS96ってやけに近い気がします。
ひょっとして、これが原因かも。どうも臭いです。

M280 P0 S90
1.47msec
M280 P0 S96
1.53msec、わずか4.1%UPです。
原因はきっとこれだ!
パルス幅の挙動をよ~く見てみます。
S10:653μsec  ピンは下がった状態。
S67:1.23msec でピンが上がります。
一旦上がると、ヒステリシスがあるので
S20:0.753msec までピンは上がった状態で持ちこたえて。
S19:0.740msec で下がります。
S90:1.47msec ピンは上がります
S95:1.53msec(左上T2:1.5267)まだ、ピンはあがったまま
S96:1.53(左上T2:1.5333)msec
S95からオシロのカーソルで1クリック分(1dot分)のUPです。
ここでセルフテストモードに入りますが、
時々止まる微妙なセルフモードです。
S96~S122までセルフモード、S123以上は、セルモードから抜けます。
これは、ヒステリシスは、ありません。
通常は[M280 P0 S160]がセルフモードから抜けるコマンドです。

もしかして~3D Touch Sensor内に調整VRがついてないか開けてみます。
が、やっぱしないか~(-_-;)
8pinのIC「ATMEL TINY13A」と読めます。
今の時代、パルス幅の判別なんて、普通は、ソフトでやりハズですが...
でも、ディスクリートのトランジスタやダイオードがやけに多いです。
まさか、パルスを整流平滑してADCで判定しているのではないだろうか?
だから閾値にバラツキがでて、今回の症状を起こしている可能性大です。
Hall素子が右上にあるので、その辺のアナログ回路かな?
やっぱ「パルスを整流平滑した電圧をADCで判定」が最有力です。
回路図を探してみましたが、見つかりませんね~
コイルの線が短く、これ以上蓋が開きません。
ピンの手前の立っているパーツがHall素子です。
ピンの後ろは、スミチューブ(熱収縮チューブ)で磁石を固定しています。
ので、下から引っ張るとチューブが外れて磁石も外れてしまいます。
ので、ピンを取る時は、コアを外して上からなのですね。
となると、ソースをイジるしか手がありません。
サーボに関係しそうな「servo.cpp」「servo.h」がありました。
「servo.h」の118~123行目にこのスケッチが!
*****
#define Servo_VERSION           2     // software version of this library

#define MIN_PULSE_WIDTH       544     // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH      2400     // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH  1500     // default pulse width when servo is attached
#define REFRESH_INTERVAL    20000     // minimum time to refresh servos in microseconds
*****

S67とS95の中間は、1.38msecなので
「DEFAULT_PULSE_WIDTH」を1500 ⇒ 1400にしてみます。
*****
#define DEFAULT_PULSE_WIDTH  1400
 // default pulse width when servo is attached
*****
Arduino IDE Ver.1.8.3を起動して書き込みが完了して
3Dプリンタが再起動します。
ん~ん?1.40msecになるはずなのですが、1.47msecで変化なしです(T_T)
レベル測定時のパルス幅かもと確認しましたが、変化ないのです。
今の所、これ以上深くソース読めないし、何が変わるのかわからず終いです。

そうなると、どこか別のソースファイルですね~
きっと設定があるはずです。
根気との戦いであります...1時間程探していると

おっ!? Conditionals_LCD.h の388~393に
「#define BLTOUCH_STOW  90」がとても怪しい
*****
#define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW }

#define BLTOUCH_DEPLOY    10
#define BLTOUCH_STOW      90
#define BLTOUCH_SELFTEST 120
#define BLTOUCH_RESET    160
*****
そこの「90」を「80」に変えます。
*****
#define BLTOUCH_STOW  80
*****
また、Arduino IDE Ver.1.8.3で書き込みます。
お~~っ、成功です!
1.37msecです。
S67とS95の中間は、1.38msecなので、いい感じです。
再び、2.9倍Plate.stlでフィラメント無しでヒーターONでプリントします。
プリント中は、微妙ですが0.01msec程度のジッタがあります。
1.37msec(S80相当)で動いています。
ここで、オシロの積算モード「PERST」を見つけました。
パルス幅のジッタは、少ないです。
電圧ノイズも少ない方だと思います。
プリント開始でG28、G29、を経由するので
S10(650μsec)とS80(1.37msec)のパルスが重なっています。
ピンは、一旦上がれば、S20までは、下がらないので十分マージンあります。
S80の1.37msecの±5%で1.30~1.44msec

ちなみにS90の1.47msecの±5%は、1.40~1.54msecなので
テストモードの閾値 1.53msecに突入するわけです。

しばしS80の1.37msecで様子を見ることにします。

ならば、S95で再現するのではないか?
Conditionals_LCD.h を書き換えてテストしてみます。
*****
#define BLTOUCH_STOW  95
*****

Arduino IDE Ver.1.8.3で書き込んで~
3Dプリンタが再起動しました。
おっ!起動後は、ピンが上がっているはずが、下がったままです。
やっぱし、原因はビンゴのようです。
ガラス板に衝突しそうで、ドキドキしながも[G28]は無事通過。
終わったら、ピンが上がった状態です。
[G29]は、3ポイント目まで順調だったのに
最後の右奥ポイントでSensorが動作せず、ガラス板にノズルが衝突したので
緊急停止しました(´-﹏-`;)

再度、2.9倍のPlate.stlをプリントしてみます。
先にヒートベッドとノズルヒーターをONにしてプリント開始します。
今度は、G29も無事終わりました。
が、1層目のInfillが始まって少ししてピンが下がりました。
急いでRepetier-Hostの緊急停止ボタンを押して停止します。
ピンは下がっているのに、LEDは点いています。
異常が起こって緊急停止した直後のショットです。
どうやらヒートベッドのON/OFFが激しくなった赤枠部辺りで発生しています。
ヒートベッドからの磁気ノイズの影響を受けている可能性大です。
後でわかったのですが、PWM制御ではなく単純なON/OFF制御でした。
ほぼ原因が特定できたので
MT氏の正常な3D Touch Sensorを調べていただきました。
*****
S103まではピンアップ、S105でセルフテストに入ります。
S104が微妙で、
ピンアップ状態からはピンアップのまま、
セルフテスト中だとピン上下をカッチカッチと2回したあとピンアップで止まります。
*****
ということなのです。

これで、確信に変わりました!
やはり、マーティーのは、セルフテストモードに入る「M280 P0 Sxx」のS値が
S96」と、低過ぎたのが原因だったのです。
プリント中は、S90の状態でピンが上がっているので
S96とのマージンが少なく、ノイズで微妙なセルフテストモードに入っていたのです。
ヒートベッドからの磁力線が3D Touch Sensorのコイルに影響して
誤動作していたようです。
だから、ヒートベッドに近い1、2層目の時に発生し、3層目で正常になる。
Sensorのコイルがベッド領域を横切る時に出たり入ったりする症状がある。
全て辻褄が合うのです。
あ~やっとスッキリしました!

状態遷移をまとめておきます。
取り敢えず、プリント中は、S80になるFirmwareで対応していきますが
何か弊害が出るかもしれないので
Geeetechには、代替品をお願いしました。
波形や写真を添付して貧弱な英語で説明するも、
なかなか理解してもらえませんでしたが(´-﹏-`;)
ついに「it seem your 3d touch was broken」のお墨付きをもらい(-_-;)
代替品を発送してくれることになりました。
Geeetechは、論理立てて説明すると、ちゃんと対応してくれる所ですね!
正常品が来るのが楽しみであります。

ちなみに「#define BLTOUCH_STOW  80」と「90」では、
Marlin3DprinterToolの[Measure Z Probe repeatability]テストでの
悪化は、見受けられなかったので大丈夫そうです。

「BLTOUCH_STOW」が出現するソースを検索すると、
・Marlin_main.cpp・・・何箇所かで単にピンを上げているだけのような?
・ultralcd.cpp・・・LCDメニューのStow BLTouch
・残りは、言語用ファイルだけなので無視していい
なので、レベル測定には、影響ないと思うのですが...確信は...(-_-;)

それにしても、今日は、M48再現性テストの結果が妙に悪く、
Standard Deviation(標準偏差):0.05~0.06mmを振らついています。
0.02mmとか比較的良い時もあります。
この3D Touch Sensor、やはり半分壊れていて安定しないのだと思われます。

最後にもうちょっと思いついたので確認!
オシロで電磁誘導ノイズを見ることにします。
1mHのフェライトボビンの開磁型コイルをセンサー代りにします。
コイルの天面をステージのガラス板に当てます。
まずは、3Dプリンタの電源OFF
何もノイズは、ありません。
主電源をONすると
まだ、ヒーターOFFです。
ベッドヒーターONにすると、誘導ノイズが大きくなります。
小さな2.5μsec周期のノイズが16μsec位の周期でウネッています。
ベッドが、定常温度になると赤枠部は、PWM制御だと思っていたら
ヒートベッド後方のLEDが点いている時は、100%ON
消えている時は、OFF、と単純なON/OFF間欠の動作でした。
ノズルヒーターもONにすると、少し増えます。
仮にサーボ端子のパルスを整流平滑してアナログでモード判別しているとすると
S90の1.47msecのパルスを整流すると
 1.47ms ÷ 20ms x 5V = 0.3675V
S96の1.53msecのパルスを整流すると
 1.53ms ÷ 20ms x 5V = 0.3825V
差は、わずか15mV!
検討に使ったコイルとSensorのコイルは、異なるので比較はできませんが
偶然にも、このノイズ波形を整流したら、15mV位になりそうですね~
そして、コイルをヒートベット領域の外に出すと
 途端にヒーターOFF時程度のレベルに下がります。
これは、たぶん、主電源のスイッチングノイズかな?
このメイントランスのコア辺り放射が強いです。
周期とか同じです。
スイッチング周波数:28KHz辺りです。
では、ヒートベッドへの12Vラインの電圧リップルは、どうかな?
リップル少ないです。
いわゆる、スイッチング電源でのリップルそのものです。
代替品もその内来るだろうし、
これ以上は追求しても仕方ないので、この辺にしておきます。
改造の途中でこの横道に反れて、原因と対策がわかったので、次へ進みます。

2 件のコメント:

YY さんのコメント...

興味深く拝見しました。
avrの内部発振回路の精度って切ないくらいに悪くて、328pとかですとクロックが+-10%くらいはやくなったり速くなったり遅くなったりするのですよねー。

それに比べたら平滑化してadcの方がまだマシかもなんて思ったりしました。

この前実験していたラジコン用のブラシレスモーターをgrblで回す実験では、grblとブラシレスモータードライバ(ラジコン業界ではescなんていいます。)の間に一つ小さいarduinoを挟んでいたのですが、スピンドルの信号のパルスの時間を測るのが面倒で、ご多聞に漏れずrcで平滑して1000〜2000usくらいラジコンのpwmのパルスを送っていました(笑)
ちゃんとクリスタルついてるarduinoだったのですけどね。。。

まあ実験なので本当にやるときはちゃんとやりまーす♪

マーティーの工房日誌 さんのコメント...

YYさん、早速見ていただきありがとうございます。
1品毎に調整するのなら平滑化方式でかなり所まで行くんじゃないかと思います。
今回は、パーツのバラツキで+外部ノイズが合わさって5%近くズレたのでした。
コイルを使う時は「外来ノイズからの影響」や逆に「放射ノイズで他への妨害」に注意しないといけないですね~
所でラジコンも面白そうですね~
今やラジコンの中にもArduino(ATTINY13)が乗ってる時代なんですね!