3Dプリンタ やっとちゃんと動くようになりました

3Dプリンタの組み立てがほぼ完了し、フィラメントの出力テストも
特に問題がなかったので、残すは造形物の生成確認のみでした。
フィラメントも出てるし、問題も発生しないだろうと思っていました
が、、
実際、造形物を出力してみると以下のとおり
最初はフィラメントが出力されるのですが、2,3分すると
フィラメントが出力されなくなりました。

f:id:mondayboy:20150808153442j:plain

しかもノズルも詰まってしまい、ノズルに詰まったフィラメントを
除去しなければならない羽目に、最悪でした。

原因はヒータの熱がノズル上部まで徐々に伝わり、ノズル内で
フィラメントが溶けて固まり、詰まってしまうようです。

f:id:mondayboy:20150808161258p:plain

Webで調べてみると、最近のノズルは断熱効果のある
テフロンチューブを内蔵しているものが一般的のようです。
私が使用しているものがダメなんですね。

別に批判するわけではないですが、Koolertron(香港)のエクストルーダは
配線不良もあり、あまりよくない印象でした。

www.amazon.co.jp


そこでテフロンチューブを内蔵したホットエンドに交換しました。
ついでに、サーミスタ、ヒータも併せて交換しました。

shop.smartdiys.com


ホットエンドを交換し、調整等をおこない造形物を出力すると
ようやくうまくいきました。
なかなか綺麗にできていたので、良かったです。

f:id:mondayboy:20150808154002j:plain


3Dプリンタ作るのにすごく時間がかかってしまいましたが、
ド素人の私が個々の部品を取り寄せ、パーツは既存の3dプリンタで作成して
オリジナルプリンタを作成できることができました。

arduino bug avrdude: stk500v2_ReceiveMessage(): timeout

arduinoをいじっていて、デバッグ文に"!!!"を使用したところ、アップロード時に以下のエラーが発生するようになりました。ググってみるとarduinoのバグのようです。
原因究明に時間を費やしてしまった。。。。

avrdude: stk500v2_ReceiveMessage(): timeout

github.com

reprap エクストルーダモータ

ようやくX,Y,Z軸のモータとエンドストップが動くようになったんですが、なぜかエクストルーダのモータはうんともすんともしない。なぜだろう??
ちなみにエクストルーダは以下のものを使用しています。

Koolertron 3Dプリンタ用0.4ミリメートルK型熱電対ノズル押出プリントヘッド0.4mm K-Type Thermocouple Nozzle Extruder Print Head


2,3日悩みました~~。
で初歩的なことが原因でした。ステッピングモータの4本あるうちの1本のケーブルが断線してました。
やられたー。

ケーブルを結線しなおしたところ、ようやく動くようになりました。
まだぎこちない動きですが、エクストルーダから溶けた樹脂が出てくるのをみて感動しました!!
f:id:mondayboy:20150518233609j:plain

モータの動きが逆向きなので、以下の設定を変更しました。

$vi Configuration.h
#define INVERT_E0_DIR true  // 2015.05.19 changed false->true

あと気になるのは、フィラメントを出すとエクストルーダの温度計が急激に降下するのはなぜか。


まだまだいろいろ調整が必要です。

reprap heated bedの温度エラーが発生する

私の環境の3Dプリンタは自作のため、エクストルーダの温度計は熱電対、ヒートベッドはサーミスタを使用しています。ですが、なぜかこの組み合わせだと、Printrun起動時にエラーが発生します。

Error:Heated bed switched off. MAXTEMP triggered !!

最初は半田不良等が原因かと思いましたが、テスタで確認しても
問題なさそうだし、???
ググってると、同じような方がいました。
Marlinでは熱電対、サーミスタを組み合わせて使えないみたいです。なんでやねん。

https://ultimaker.com/en/community/view/11056-thermistor-and-thermocouple-wont-work-together

ということで手探り状態ですが、出力されるエラーメッセージから
Marlin firmwareのソースをgrepしてみました。

$ grep "MAXTEMP triggered" *
language.h:#define MSG_SWITCHED_OFF_MAX                " switched off. MAXTEMP triggered !!"

それで

$ grep MSG_SWITCHED_OFF_MAX *
language.h:#define MSG_SWITCHED_OFF_MAX                " switched off. MAXTEMP triggered !!"
language.h:#define MSG_MAXTEMP_EXTRUDER_OFF            ": Extruder" MSG_SWITCHED_OFF_MAX
language.h:#define MSG_MAXTEMP_BED_OFF                 "Heated bed" MSG_SWITCHED_OFF_MAX

さらに

$ grep -R MSG_MAXTEMP_BED_OFF *
language.h:#define MSG_MAXTEMP_BED_OFF                 "Heated bed" MSG_SWITCHED_OFF_MAX
temperature.cpp:    SERIAL_ERRORLNPGM(MSG_MAXTEMP_BED_OFF);

で、temperature.cppを眺めるとbed_max_temp_error関数で呼ばれていました。
さらにbed_max_temp_error関数はISR関数の以下の箇所でした。

1604     /* No bed MINTEMP error? */   
1605     #if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0)   
1606       if (current_temperature_bed_raw MAXTEST bed_maxttemp_raw) {   
1607           target_temperature_bed = 0;   
1608           bed_max_temp_error();   
1609         }   
1610     #endif   
1611   } // temp_count >= OVERSAMPLENR

SERIAL_ECHOマクロを埋め込み、変数の値を確認したところ、以下のとおりでした。

current_temperature_bed_raw = 15665
bed_maxttemp_raw = 0

なぜか、maxttempが0になっています。これが原因と判明しましたがなぜそうなるのか、私には分かりません。とりあえず、上記箇所をコメントアウトしたところ、エラーは出なくなりました。

またPrintrunで温度計、およびヒータを確認したところ、正常に動作するようになりました。

f:id:mondayboy:20150515011018p:plain

こんな適当でいいのかと思いながら、目を閉じました。
あとはエクストルーダのステッピングモータが動かないのを調べないと。。。
自作3Dプリンタ完成まで、まだ時間がかかりそうです。

C言語 ##演算子について

defineで##演算子を使ったことがなかったので、忘れないためにメモしておきます。

トークン連結演算子といって、左辺##右辺のように指定すると左辺と右辺を結合してくれます。
以下の例だと、マクロMBで指定したRAMPS_13_EEBは連結されてBOARD_RAMPS_13_EFBとなりMOTHERBOARDと==で比較されます。

#define MOTHERBOARD BOARD_RAMPS_13_EFB
#define BOARD_RAMPS_13_EFB      33   // RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Bed)
#define MB(board) (MOTHERBOARD==BOARD_##board)
hoge(){
    if(MB(RAMPS_13_EEB)){
        printf("true¥n");
    }
}

Marlin Configration.h設定 その1

実際にテストしてみて、まだ正常に動作しないのでMarlinの設定を見直しました。

単位あたりのステップ数

私が使っているモータ、ドライバ、およびベルトより、計算に必要な項目は以下のとおりです。

(1)X,Y軸
・モータのステップ角=1.8°
・ドライバマイクロステッピング=1/16
・ベルトピッチ=2mm(GT2)
・プーリ歯数=20枚

(2)Z軸
・モータのステップ角=1.8°
・ドライバマイクロステッピング=1/16
・リードスクリューピッチ=1.25(M8)
・ギア比=1:1

(3)エクストルーダ
「Koolertron 3Dプリンタ用0.4ミリメートルK型熱電対ノズル押出プリントヘッド0.4mm K-Type Thermocouple Nozzle Extruder Print Head」を使用していますが、詳細が不明だったので、実際に動かしてみて、問題があれば修正することにしました。

計算自体は以下のサイトがあるので、利用させて頂きました。*1
RepRap Calculator - Prusa Printers

vi Configuration.h
#define DEFAULT_AXIS_STEPS_PER_UNIT   {80,80,4000,500}  // default steps per unit for Ultimaker

エンドストップ設定

私の環境の場合、エンドストップはスイッチ式ではなく、フォトトランジスタを使用しているタイプなので、以下の行をコメントアウトしました。

vi Configuration.h
//#define ENDSTOPPULLUP_XMAX
//#define ENDSTOPPULLUP_YMAX
//#define ENDSTOPPULLUP_ZMAX
//#define ENDSTOPPULLUP_XMIN
//#define ENDSTOPPULLUP_YMIN
//#define ENDSTOPPULLUP_ZMIN

また実際に動かしてみてY,Z軸のモータの動きが逆になっていたため、以下の箇所を変更しました。あとY軸のホームポジションはMAXの位置になるので、併せて変更しました。

vi Configuration.h
#define INVERT_X_DIR false
#define INVERT_Y_DIR true   // 2015.05.11 changed false->true
#define INVERT_Z_DIR true   // 2015.05.11 changed false->true
#define X_HOME_DIR -1
#define Y_HOME_DIR 1    // 2015.05.11 changed -1 -> 1
#define Z_HOME_DIR -1

これでX/Y/Zがようやく意図したとおりに動くようになりました。

温度計設定

次に温度計の設定ですが、私の環境ではエクストルーダは熱電対+AD595を使用しています。
熱電対+AD595を使用する場合は、以下のように使用するPINが異なります。

f:id:mondayboy:20150512100411p:plain

変更箇所は以下のとおりです。

vi Configuration.h
#define TEMP_SENSOR_0 -1      // 2015.05.12 changed 0 -> -1

vi pins_RAMPS_13.h
#define TEMP_0_PIN         3   // ANALOG NUMBERING     2015.05.12 changed 13 -> 3

ベッドはサーミスタを使っているので、以下の箇所を修正しました。

*1:デフォルト値から変更なしでした

arduino IDE crash on ubuntu 15.04 (64bit)

arduino IDEを起動してファイルを開こうとすると、なぜかarduino IDEがcore dumpする。
libmawt.soのところでSIGSEGVで落ちてるけど、全然分かりません。

う~ん、
いろいろググってると、どうもJAVA_TOOL_OPTIONSが悪さをしているらしいとのこと。
JAVA_TOOL_OPTIONS変数をアンセットすると、正常に動作することを確認。

先日ubuntuを15.04にアップデートしたのですが、15.04のバグらしいですね。askubuntu.com

Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fcdf0deaa3e, pid=8339, tid=140520984590080
#
# JRE version: Java(TM) SE Runtime Environment (7.0_80-b15) (build 1.7.0_80-b15)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libmawt.so+0x3fa3e]  filenameFilterCallback+0x2e
#
# Core dump written. Default location: /home/hoge/arduino/arduino-1.6.3/core or core.8339
#
# An error report file with more information is saved as:
# /home/hoge/arduino/arduino-1.6.3/hs_err_pid8339.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#
./arduino.bug: 29 行:  8339 中止                  (コアダンプ) java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel $SPLASH processing.app.Base --curdir $CURDIR "$@"