Wake on Lan ができなかった

以前にWoLできていたPCを初期化後,BIOS,ネットワークカードのドライバ設定をしてもWoLできなくなった.
一度コンセントから抜いてまた刺すとできるようになった.
友人によるとCMOSリセットも効果がある場合があるとのこと.

追記 今朝やったらできなくなってた
もうわからんスリープ勢になります

GT2560 MOSFET故障

3Dプリンタで印刷していると,PWMファンをオフにしてもファンが回り続けるようになってしまった.
50%から100%の間は速度調整が効くがデューティーをそれ以下にしてもファンの回転が変化しない.

GT2560のN MOSFET (Q5) を調べてみると,V_{GS} が1.5V程度低下し R_{DS(ON)} が5Ωになっていた.
FETを交換したら正常動作するようになった.

昨日から新しい強力なDCファンを使い始めたのでそのスパイク電圧にやられたのではないかと思う. ルネサス パワーMOS FET パワーMOS FET の使用上の注意

代わりのファンを用意するか対策をしなければ.
FET交換するときにパターンを剥がしかけたので次はないように気をつけたい.

モータードライバ電流調整

あるモデルを印刷中に積層ずれが頻発したのでモータードライバ A4988 の電流を大きくすることにしました.
A4988のデータシートによるとモータに流れる最大電流 I_{Motor}{ \displaystyle
I_{Motor}=V_{REF}/(8 \times R_s)
} で表されます. この時 R_s は電流検出抵抗で自分の持っているドライバボードでは200mΩ が使われていました.

使用しているステッパモーター 42SHD003420 の定格電流は1.28A だそうなので,この7割の電流を流すことにするとV_{REF} は1.4V になります.
各ボードの初期のV_{REF}は0.8Vでした.

結局,X軸が1.0V,Y,Z軸が1.4V,Eが0.8Vで様子を見ることにしました.

実際に動かしてみるとV_{REF}=1.4V のY軸モーターは以前に比べかなり発熱します.(最高温度52℃) でもこのモーターは絶縁クラスBですしなんてことないでしょう.
また,各ドライバはもっと熱いので対策しなければいけないと思います.

プローブの精度比較

先日の容量式近接センサ(LJC18A3-B-Z/BX)プローブと比較するため 拾い物のスイッチ V-162-1A5 を使って接触式のプローブも作ってみた.

M48 コマンドでの繰り返し精度テストの結果(確率分布)

近接センサf:id:yotta0xFF:20160825202640p:plain

リミットスイッチf:id:yotta0xFF:20160825202638p:plain
縦軸:確率 横軸:ベッドまでの距離
条件:ガラスベッド+マスキングテープ, 繰り返し10回

標準偏差の値は間違って消してしまいましたが,リミットスイッチの方が1桁小さかった.
現状近接センサでも一応印刷できていますが,0.1mmは3Dプリンタにとって大きな誤差なので本当はスイッチプローブを使ったほうがいいですね.

グラフ作成に以下のサイトを使用
正規分布(グラフ) - 高精度計算サイト

容量式近接センサでオートレベルを試す

容量式近接センサ LJC18A3-B-Z/BXを買ったのでGeeetech Prusa i3 proB の GT2560 でオートレベルを試します.
ファームウェアはMarlin-1.1.0-RC6です.

センサの電源 12Vなのでダイオードで信号電圧を5V以下に制限します. f:id:yotta0xFF:20160824155825p:plain

pins_ULTIMAKER.h

GT2560のピンアサインはpins_ULTIMAKER.hで設定されます.自分は一応保険としてもともとのZ_MINエンドストップも使いたかったので以下のコードを追記してZ_MAX_PINをプローブ用にします.
(後からためしてみるとZ_MINエンドストップはいらないかも)

// 55行目付近
// Define a pin to use as the signal pin on Arduino for the Z_PROBE endstop.
#undef Z_MAX_PIN
#define Z_MAX_PIN -1
#define Z_MIN_PROBE_PIN  32

Configuration.h

プルアップ

エンドストップにはプルアップ抵抗が必要ですが,プローブには不要なので ENDSTOPPULLUPS(全てのプルアップを有効) を無効にして各々必要なプルアップを指定します.

// 370行目
// coarse Endstop Settings
//#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors

#if DISABLED(ENDSTOPPULLUPS)
  // fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS is defined
  //#define ENDSTOPPULLUP_XMAX
  //#define ENDSTOPPULLUP_YMAX
  //#define ENDSTOPPULLUP_ZMAX
  #define ENDSTOPPULLUP_XMIN
  #define ENDSTOPPULLUP_YMIN
  #define ENDSTOPPULLUP_ZMIN
  //#define ENDSTOPPULLUP_ZMIN_PROBE
#endif

スイッチトリガ反転

必要応じてプローブのトリガ極性を反転します.各スイッチの状態確認はM119が便利です.

// 384行目
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.

プローブピン設定

393行目付近のZプローブ設定で Z_MINエンドストップとZプローブのピンを共通にしないようにします.

#define Z_MIN_PROBE_ENDSTOP

//#define DISABLE_Z_MIN_PROBE_ENDSTOP

トラベルリミット設定

オートレベリングの際に必要となるのでワークサイズを入力します.

// 492行目
// Travel limits after homing (units are in mm)
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS 185
#define Y_MAX_POS 179
#define Z_MAX_POS 190

オートレベリング設定

#define AUTO_BED_LEVELING_FEATURE (546行目)コメントアウトしてオートレベリングを有効化.

・センサで走査する位置を指定します.

// 565行目
#define LEFT_PROBE_BED_POSITION 15
#define RIGHT_PROBE_BED_POSITION 140
#define FRONT_PROBE_BED_POSITION 20
#define BACK_PROBE_BED_POSITION 120

・エクストルーダー先端とセンサの間の距離を指定します.

// 606行目
//X and Y offsets must be integers.
#define X_PROBE_OFFSET_FROM_EXTRUDER -40  // X offset: -left  +right  [of the nozzle] 
#define Y_PROBE_OFFSET_FROM_EXTRUDER -52  // Y offset: -front +behind [the nozzle] 
#define Z_PROBE_OFFSET_FROM_EXTRUDER -5.4   // Z offset: -below +above  [the nozzle]
Z方向のオフセットの計測方法
  1. 近接センサがベッド中心付近に来るようにしてZ軸のホーミング
  2. ノズルの下に紙を敷いてZ軸を少しずつ下げてノズルを密着させる
  3. ホーミング時のZ高さとノズルが紙に密着するときの高さの差をとってZオフセットとする

センサの感度を調整して高さを調整する事もできますが大雑把な感度調整が終わったらZオフセットでやるのがいいと思います.

・センサの種類を指定します. 今回は非接触の近接センサであるので#define FIX_MOUNTED_PROBE (625行目)コメントアウトします.

セーフホーミング

ここでホーミング時,エンドストップでもプローブでも反応する上,プローブでベッドを検出してもエンドストップで止めてもZオフセットは適用されてしまうことが判明しました.
従って,Zエンドストップはかえって邪魔になる場合があります.
こうなると最初からプローブでホーミングした方がいいかもしれません. ホームポジションでプローブがベッドの外に出てしまう場合 #define Z_SAFE_HOMING (668行目) を有効化します.

使用方法

G28でホーミングした後にG29でベッドの傾きを検出します.
その後普通に印刷を開始すると傾きを考慮して印刷が行われます.

結果

めでたくベッド全体に渡る大きなものも造形できるようになりました.しかし,場所によって第一層がソフトクリームマシン状態になる部分と押し付け気味になる部分があるので改善の余地がありそう.
ちなみにリミットスイッチプローブでも同様になったのでどうすればいいのやら.(結局いつかは手動でベッド調整をすることになるんだろうか)
とりあえず,第一層の張り付きは心配しなくていいレベルになったのでよほど精度が要求されないかぎり(そんなものを組み立てプリンタに要求するほうが間違ってるけど)これで十分だと思います.

Win10でQTTabBarのタブバーが消える

なぜだかたまに消えて困る.
悩むの二回目なので書いておく.
"オプション" の文字をクリックしないと出てこないのがわかりにくい.

f:id:yotta0xFF:20160817204804p:plain

SG90サーボモータ-モドキを制御する

ebayサーボモーターが安かったので一つ買ってみました.
SG90を自称していますが検品シールなどないのでニセモノです.というかセラーのサイトによると3V駆動もできるらしいです(マジか
いつもはチェックなどせずに工作箱に投げ込む自分ですが流石に今回はテストする気になりました.

今回使うのはmbed LPC1114 と 適当なN MOSFET, 外部5V電源です.
SG90のデータシートによると電源もPWM信号も5Vである必要があるので,mbedのPWM端子をN MOSに繋いでPWM信号の電圧を5Vにします.

以下のプログラムではシリアル通信で'+'を送るとパルス幅を増加,'-'を送ると減少します.
サーボのパルス幅制限を無視して上げ続けると多分ストッパーか何かが壊れます.(サーボ一つしか持ってないので未検証)

#include "mbed.h"

/*
パルス幅制限注意
SG90モドキ 0.5~1.45~2.4 [ms]
MOSFET駆動で論理反転するためパルス幅は周期から目標幅を引いてある
mbedに直結しないこと!
*/

PwmOut servo(dp24);
Serial pc(USBTX, USBRX); // tx, rx

char op;
float pulsew = 0.00145;
float unit = 0.0001;
float period = 0.020;

int main() {
    servo.period(period);
    servo.pulsewidth(period-pulsew);
    
    pc.printf("hello\n");
    pc.printf("%f\n", pulsew*1000);
    while(1) {
        if(pc.readable() ){
            op = pc.getc();
            pc.putc(op);
            
            if(op == '+'){
                pulsew += unit;
            }
            else if(op == '-'){
                pulsew -= unit;
            }
            pc.printf("%f\n", pulsew*1000);
            servo.pulsewidth(period-pulsew);
        }
        
        wait(0.01);
    }
}

やっとSG90モドキの動作検証ですが,バッチリ180度動いてくれました.3.3V駆動の検証もしましたがこちらはダメでした.一応動くには動くんですがかなり遅れたり,トルク不足感がありますこれは実用できないと思います.
しかし,今回は安いサーボが欲しかっただけなので必要十分です. また,mbedはLチカ以来でしたがこういう機能が簡単に使えるのは便利ですね.
最初はmbedのSG90ライブラリーを使わせてもらおうと思ったのですがC++がわからず断念.自分で書くことになりました.最初のプログラムとしては良い題材だったと思います.
C++わかるとすごく便利っぽいのでいつかやらないとと思いつつ... いつやろうかな...