3Dプリンタ やっとちゃんと動くようになりました
3Dプリンタの組み立てがほぼ完了し、フィラメントの出力テストも
特に問題がなかったので、残すは造形物の生成確認のみでした。
フィラメントも出てるし、問題も発生しないだろうと思っていました
が、、
実際、造形物を出力してみると以下のとおり
最初はフィラメントが出力されるのですが、2,3分すると
フィラメントが出力されなくなりました。
しかもノズルも詰まってしまい、ノズルに詰まったフィラメントを
除去しなければならない羽目に、最悪でした。
原因はヒータの熱がノズル上部まで徐々に伝わり、ノズル内で
フィラメントが溶けて固まり、詰まってしまうようです。
Webで調べてみると、最近のノズルは断熱効果のある
テフロンチューブを内蔵しているものが一般的のようです。
私が使用しているものがダメなんですね。
別に批判するわけではないですが、Koolertron(香港)のエクストルーダは
配線不良もあり、あまりよくない印象でした。
そこでテフロンチューブを内蔵したホットエンドに交換しました。
ついでに、サーミスタ、ヒータも併せて交換しました。
ホットエンドを交換し、調整等をおこない造形物を出力すると
ようやくうまくいきました。
なかなか綺麗にできていたので、良かったです。
3Dプリンタ作るのにすごく時間がかかってしまいましたが、
ド素人の私が個々の部品を取り寄せ、パーツは既存の3dプリンタで作成して
オリジナルプリンタを作成できることができました。
arduino bug avrdude: stk500v2_ReceiveMessage(): timeout
reprap エクストルーダモータ
ようやくX,Y,Z軸のモータとエンドストップが動くようになったんですが、なぜかエクストルーダのモータはうんともすんともしない。なぜだろう??
ちなみにエクストルーダは以下のものを使用しています。
Koolertron 3Dプリンタ用0.4ミリメートルK型熱電対ノズル押出プリントヘッド0.4mm K-Type Thermocouple Nozzle Extruder Print Head
2,3日悩みました~~。
で初歩的なことが原因でした。ステッピングモータの4本あるうちの1本のケーブルが断線してました。
やられたー。
ケーブルを結線しなおしたところ、ようやく動くようになりました。
まだぎこちない動きですが、エクストルーダから溶けた樹脂が出てくるのをみて感動しました!!
モータの動きが逆向きなので、以下の設定を変更しました。
$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で温度計、およびヒータを確認したところ、正常に動作するようになりました。
こんな適当でいいのかと思いながら、目を閉じました。
あとはエクストルーダのステッピングモータが動かないのを調べないと。。。
自作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が異なります。
変更箇所は以下のとおりです。
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 "$@"