SSブログ
English Version

エクストルーダーの交換検討 [3D_printer]

 「デルタ式3Dプリンタ(Kossel Reprap)の購入」の記事で書いた3Dプリンタキットはその後、非常に調子がいいです。
 しかし、エクストルーダーのテフロンチューブ取付用カップラーのインサータ受け部に亀裂が入り瞬間接着剤で補修している状態です。

 また、TPUフィラメントに対応するために写真中央のグレーの部品を付けてフィラメントが横道にそれないように対処しています。

従来のエクストルーダー


 下の写真はTPUフィラメントを装着しているもので上記の対処により、TPUフィラメントでも造形が可能になっています。

TPUフィラメントのエクストルード


 今回はAliExpressでDual GearタイプでTPUも大丈夫そうなエクストルーダーを見つけたので交換する試みについて書いてみます。

Dual Gear Extruder


 届いたパーツが下の写真で固定用のプレートは購入せず、3Dプリンタで作成します。

Dual Gear Extruder Parts


 固定用プレートのCAD設計結果が左図でスライス結果が右図です。

プレートのCAD画面 スライス結果


 プレートをABSフィラメントで出力したものが下の写真です。

固定用プレート出力結果


 また、フィラメントの湿気対策として将来的にはフィラメントをケースで囲いテフロンチューブを通してエクストルーダーまで持ってきたいので挿入口にネジを切り、テフロンチューブ取付け用カップラーを付けられるようにしました。
(常設していたABS樹脂は梅雨の時期であることもありかなり湿気を吸収している状態です^^;;)

フィラメントホールの拡張


 材質はアルミなのでネジ切りは楽です。切削オイルを付けてネジを切ります。

ネジ切り


 3Dプリンタに取付けた状態が下の写真です。

新エクストルーダーの取付状態


 ここまでは特に問題もなく作業が進んだのですが、新エクストルーダーでフィラメントをロードしてみるとホットエンドに到達した以降、定期的に空回りする問題が発生しましたorz

 ドライブギア(フィラメントを送り出すギア)の直径を確認したところ、従来のものは6.50mmで今回購入したものは7.30mmでした。
 見た目は同じような大きさでしたがドライブギアの直径が大きくなったことによりフィラメントの送り出し量が多くなり定期的に詰まっていたのが原因のようです。

 マニュアル操作でフィラメントを100mm送ったところ、新エクストルーダーではフィラメントが112mm送られる状態でした^^;;

 ネットで確認したところ、M92コマンドで現状のパラメータ値を取得し、同コマンドで4つ目のパラメータの数値を変更後、M500コマンドでフラッシュメモリにセーブすればいいようです。
 しかし、marlinのバージョンが古いためか、M92コマンドに応答がありません。^^;

 M503コマンドで現在の設定値を一覧表示可能なようですが、このコマンドにも反応しませんorz

 キット組立時に使用したMarlinのソースが一式あるのでConfiguration.hをざっと見たところ、エクストルーダーの送り量に関係するようなパラメータは見つかりませんでした^^;;;

 下記はConfiguration.hからの抜粋ですがM500番台のコマンドは502までの実装のようです。
 この3Dプリンタを購入したのが2017年1月で約3年半前ですが、3Dプリンタ関連のソフトの進化はかなり速いので今の情報からの対応はできないようです^^;;

Marlin の Configuration.h(抜粋)
// EEPROM // the microcontroller can store settings in the EEPROM, e.g. max velocity... // M500 - stores paramters in EEPROM // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. //define this to enable eeprom support #define EEPROM_SETTINGS //to disable EEPROM Serial responses and decrease program space by ~1700 byte: comment this out: // please keep turned on if you can. //#define EEPROM_CHITCHAT


 Configuration_adv.hの中にエクストルーダーの送り量に関する定義部分を見つけましたが、元々defineされていない部分なので有効化して変更するのはリスクが大きい・・・

Marlin の Configuration_adv.h(抜粋)
// extruder advance constant (s2/mm3) // // advance (steps) = STEPS_PER_CUBIC_MM_E * EXTUDER_ADVANCE_K * cubic mm per second ^ 2 // // hooke's law says: force = k * distance // bernoulli's priniciple says: v ^ 2 / 2 + g . h + pressure / density = constant // so: v ^ 2 is proportional to number of steps we advance the extruder //#define ADVANCE #ifdef ADVANCE #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 #define STEPS_MM_E 836 #define EXTRUTION_AREA (0.25 * D_FILAMENT * D_FILAMENT * 3.14159) #define STEPS_PER_CUBIC_MM_E (axis_steps_per_unit[E_AXIS]/ EXTRUTION_AREA) #endif // ADVANCE


 どこかにこのキットに対応する設定があるはずなのでもう少し調べてみます・・・・
 今のエクストルーダーでも特に問題はないので元に戻すかもw


★2020/07/29 追記 {
 「デルタ式3Dプリンタの静音化」の記事で書いたようにMarlinを V1.1.9.1にVerUpした際、Configraion.h を一通り確認しました。
 エクストルーダーのステップレートは DEFAULT_AXIS_STEPS_PER_UNIT の#define部分の第四パラメータです(現在値は160)
 現在、エクストルーダーを元に戻して運用しています。

Configraion.h 内のエクストルーダー送出量定義部分
/** * Default Axis Steps Per Unit (steps/mm) * Override with M92 * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ // variables to calculate steps 2020/07/20 skyriver not exidts same items in original #define XYZ_FULL_STEPS_PER_ROTATION 200 #define XYZ_MICROSTEPS 16 #define XYZ_BELT_PITCH 2 #define XYZ_PULLEY_TEETH 16 // delta speeds must be the same on xyz #define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) #if 0 // 2020/07/20 skyriver #define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 90 } // default steps per unit for Kossel (GT2, 20 tooth) #else #define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 160 } // default steps per unit for Kossel (GT2, 20 tooth) #endif

}

★2020/07/29 追記2 {
 新エクスローダーに変更しました。
 前回問題だったフィラメント送出量の問題については以下のように対処しました。

 M503 コマンドで表示される M92 のパラメータは上記の追記で書いたようにソースで設定された

  M92 X100.00 Y100.00 Z100.00 E160.00

でした。フィラメントを100mm 注入すると 112mm 入ったので

 160 * 100 / 112 = 142.857

の計算値から

M92 X100.00 Y100.00 Z100.00 E142.86

のコマンドでパラメータを変更し、 M500 コマンドでEEPROMに保存しました。
 再度、フィラメントを100mm挿入し、実際のフィラメント長を計測した結果、100mmでした。
 その後、簡単な造形を行い問題ないことを確認しました。
 Configuration.hの該当部分を変更し、コントローラにダウンロードし、今回のエクストルーダーの交換作業が完了しました。
 アルミ製のデュアルギア方式のエクストルーダーなので今までのものより性能及び外観が良くなった^^
}


★2020/08/05 追記
 「フィラメントの湿気対策(その2)」の記事に本エクストルーダーを使ったフィラメントの湿気対策について記載しました。

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

SuperSimpleController [OriginalCPU]

 標準ロジックICなどを使ってオリジナルCPUを検討してみました。

 FPGAなどで作った方が容易そうですが、限られた環境の中で考えてみるのが楽しそうだったからです。
(結構特殊なロジックICを使ったりするので海外手配の場合、時間がかかって進捗がイマイチです^^;)

 フェッチしたインストラクションの値からROMで実装したルックアップテーブルでコントロール信号を生成する予定で、この部分はCISCプロセッサのマイクロコードに対応します。言い換えれば機械語の処理を実現するために記述するメタ言語的なものになります。

 今後の検討で変更する可能性もありますが下図のような構成を考えています。

オリジナルCPU概要ブロック図


 まずはマイクロコードの実行部分の実験としてjump命令と制御信号出力のみの機能を搭載した簡易版のコントローラを作ってみました。
 今回は制御信号出力でLCDへの表示も行ってみました。最終的には制御信号出力によりCPU内のリソース制御を行うことでオリジナルCPUにする予定です。

 回路は下図のとおりで74AS867、74HC04、W27C512の3チップ構成で非常にシンプルな構成です。

超シンプルなコントローラー


 目視で動きが判るようにクロックを遅く設定していますが、数MHzでの動作も可能なのでこれだけでも何かの固定的な制御に使えそうですね。
 制御信号のMSB(D7)がlowの時にアドレスがD0..D6の値に設定されるようにすることでjump命令を実装しています。

 最初に下記の簡単なパターンをROMに書込み動作確認してみました。
 0008Hアドレスの00Hで先頭にjumpします。

テストデータ


 実際に動かしてみた時の波形が下図です。想定通り00Hでアドレスがクリされて先頭に戻っています。

テストデータ実行時の波形


 次にLCDを接続して文字を表示してみることにします。
 バイナリデータを直書きしてもいいのですが可読性を向上させるためにマクロアセンブラのマクロ機能を利用し、HEXファイルを生成しています。

 LCDの制御に関しては「PIC24FJの出力コンペアモジュールとLCD3V駆動の実験」の記事で書いた処理をマイクロコードに書き換えています。

LCD制御用マイクロコード
;+++++++++++++++++++++++++++++++++++ ; Super Simple Controller ; LCD display ; Ver 0.01 2020/06/01 by skyriver ;+++++++++++++++++++++++++++++++++++ LcdWrCmd macro cmd DB 11000000B or cmd DB 11100000B or cmd DB 11000000B or cmd ENDM LcdWrDat macro dat DB 11010000B or dat DB 11110000B or dat DB 11010000B or dat ENDM LcdWrDat8 macro dat LcdWrDat (dat/16) LcdWrDat (dat)and(0FH) ENDM Jump macro adr DB adr ENDM 0080 JP_bit EQU 80H ; 0:jmp 0020 E_bit EQU 20H ; E 1:enable 0010 RS_bit EQU 10H ; 0000' ASEG ORG 0 0000 CF DB 11001111B ; LcdWrCmd( $03 ); LcdWrCmd 3 0001 C3 + DB 11000000B or 3 0002 E3 + DB 11100000B or 3 0003 C3 + DB 11000000B or 3 ; LcdWait( 82 ); ; LcdWrCmd( $03 ); LcdWrCmd 3 0004 C3 + DB 11000000B or 3 0005 E3 + DB 11100000B or 3 0006 C3 + DB 11000000B or 3 ; LcdWait( 2 ); ; LcdWrCmd( $03 ); LcdWrCmd 3 0007 C3 + DB 11000000B or 3 0008 E3 + DB 11100000B or 3 0009 C3 + DB 11000000B or 3 ; LcdWrCmdWait( $02 ); LcdWrCmd 2 000A C2 + DB 11000000B or 2 000B E2 + DB 11100000B or 2 000C C2 + DB 11000000B or 2 ; LcdWrCmdWait8( $28 ); # set 4bit mode LcdWrCmd 02H 000D C2 + DB 11000000B or 02H 000E E2 + DB 11100000B or 02H 000F C2 + DB 11000000B or 02H LcdWrCmd 08H 0010 C8 + DB 11000000B or 08H 0011 E8 + DB 11100000B or 08H 0012 C8 + DB 11000000B or 08H ; LcdClear(); 0013 CLEAR: LcdWrCmd 00H 0013 C0 + DB 11000000B or 00H 0014 E0 + DB 11100000B or 00H 0015 C0 + DB 11000000B or 00H LcdWrCmd 01H 0016 C1 + DB 11000000B or 01H 0017 E1 + DB 11100000B or 01H 0018 C1 + DB 11000000B or 01H ; LcdWrCmdWait8( $06 ); # set entry mode,inc,non-shift LcdWrCmd 00H 0019 C0 + DB 11000000B or 00H 001A E0 + DB 11100000B or 00H 001B C0 + DB 11000000B or 00H LcdWrCmd 06H 001C C6 + DB 11000000B or 06H 001D E6 + DB 11100000B or 06H 001E C6 + DB 11000000B or 06H ; LcdWrCmdWait8( $0c ); # display on LcdWrCmd 00H 001F C0 + DB 11000000B or 00H 0020 E0 + DB 11100000B or 00H 0021 C0 + DB 11000000B or 00H LcdWrCmd 0CH 0022 CC + DB 11000000B or 0CH 0023 EC + DB 11100000B or 0CH 0024 CC + DB 11000000B or 0CH ; +++ write string +++ LcdWrDat8 'H' 0025 D4 + DB 11010000B or ('H'/16) 0026 F4 + DB 11110000B or ('H'/16) 0027 D4 + DB 11010000B or ('H'/16) 0028 D8 + DB 11010000B or ('H')and(0FH) 0029 F8 + DB 11110000B or ('H')and(0FH) 002A D8 + DB 11010000B or ('H')and(0FH) LcdWrDat8 'e' 002B D6 + DB 11010000B or ('e'/16) 002C F6 + DB 11110000B or ('e'/16) 002D D6 + DB 11010000B or ('e'/16) 002E D5 + DB 11010000B or ('e')and(0FH) 002F F5 + DB 11110000B or ('e')and(0FH) 0030 D5 + DB 11010000B or ('e')and(0FH) LcdWrDat8 'l' 0031 D6 + DB 11010000B or ('l'/16) 0032 F6 + DB 11110000B or ('l'/16) 0033 D6 + DB 11010000B or ('l'/16) 0034 DC + DB 11010000B or ('l')and(0FH) 0035 FC + DB 11110000B or ('l')and(0FH) 0036 DC + DB 11010000B or ('l')and(0FH) LcdWrDat8 'l' 0037 D6 + DB 11010000B or ('l'/16) 0038 F6 + DB 11110000B or ('l'/16) 0039 D6 + DB 11010000B or ('l'/16) 003A DC + DB 11010000B or ('l')and(0FH) 003B FC + DB 11110000B or ('l')and(0FH) 003C DC + DB 11010000B or ('l')and(0FH) LcdWrDat8 'o' 003D D6 + DB 11010000B or ('o'/16) 003E F6 + DB 11110000B or ('o'/16) 003F D6 + DB 11010000B or ('o'/16) 0040 DF + DB 11010000B or ('o')and(0FH) 0041 FF + DB 11110000B or ('o')and(0FH) 0042 DF + DB 11010000B or ('o')and(0FH) LcdWrDat8 '!' 0043 D2 + DB 11010000B or ('!'/16) 0044 F2 + DB 11110000B or ('!'/16) 0045 D2 + DB 11010000B or ('!'/16) 0046 D1 + DB 11010000B or ('!')and(0FH) 0047 F1 + DB 11110000B or ('!')and(0FH) 0048 D1 + DB 11010000B or ('!')and(0FH) ; +++ jmp to clear Jump CLEAR 0049 13 + DB CLEAR END Macros: JUMP LCDWRCMD LCDWRDAT LCDWRDAT8 Symbols: 0013 CLEAR 0020 E_BIT 0080 JP_BIT 0010 RS_BIT No Fatal error(s)


 電源オン直後の波形が下図です。信号名のカッコ内はLCD側の信号名称です。

LCD制御での電源ON直後の波形


 YouTubeに動作サンプルをアップしましたので貼っておきます。
 赤LEDがアドレスで緑LEDがデータです(上記の回路図にはLED部分は含まれていません)


https://www.youtube.com/watch?v=EuEsv856V10


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー