フィラメント自動供給装置を、Flashforge Dreamerのデュアルヘッドに合わせて、
2つのフィラメントを供給できるように設計変更しました。
同時に、湿気を吸わないように密閉構造(完全ではないですが)にしてみました。
(また散在しまくりです(笑))
まずは設計
https://grabcad.com/library/3d-printer-filament-feeder-for-dual-head-1
arduinoで上手に2つのステッピングモーターを同時制御する知識が無かったので、
左右のスプールは別々のコントローラーで制御しています。
また、シングルの時に1回だけあった、(何故か)モーター?センサー?の暴走によるフィラメントの
過剰供給(絡まってました)を防止するため、一定時間供給ONが連続すると
自動的にシステムがダウンするように、arduino pro-miniとは別にAttiny85を追加して、
センサー情報のモニタリングするようにしました。
(リレーでモーターOFF)これで不在時のプリントで、モーターが暴走して(無いとは思いますが)
最悪ケースで火事が起きることはないと思っています。(保証無し)
(回路図と基板については準備でき次第アップロードします)
arduino pro-mini(5V)のスケッチ
/**
* spool feeder with TMC2130 SPI
* PIN 4 = limit switch or other sensor input
*/
#define EN_PIN 7 // Enable
#define DIR_PIN 5 // Direction
#define STEP_PIN 6 // Step
#define CS_PIN 10 // Chip select
#define SW_MOSI 11 // Software Master Out Slave In (MOSI)
#define SW_MISO 12 // Software Master In Slave Out (MISO)
#define SW_SCK 13 // Software Slave Clock (SCK)
int val = 0;
int cc = 0;
constexpr uint32_t steps_per_mm = 80;
#include <TMC2130Stepper.h>
TMC2130Stepper driver = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN);
#include <AccelStepper.h>
AccelStepper stepper = AccelStepper(stepper.DRIVER, STEP_PIN, DIR_PIN);
void setup() {
SPI.begin();
Serial.begin(9600);
while(!Serial);
Serial.println("Start...");
pinMode(CS_PIN, OUTPUT);
digitalWrite(CS_PIN, HIGH);
pinMode(4, INPUT);
driver.begin(); // Initiate pins and registeries
driver.rms_current(600); // Set stepper current to 600mA. The command is the same as command TMC2130.setCurrent(600, 0.11, 0.5);
driver.stealthChop(1); // Enable extremely quiet stepping
driver.stealth_autoscale(1);
driver.microsteps(16);
stepper.setMaxSpeed(4000);
stepper.setAcceleration(2000);
stepper.setEnablePin(EN_PIN);
stepper.setPinsInverted(true, false, true);
stepper.enableOutputs();
}
void loop() {
val = digitalRead(4);
if (val == HIGH){
stepper.move(50*steps_per_mm); // Move 50mm
stepper.enableOutputs();
}
stepper.run();
}
attiny85のスケッチ(arduino化)
//for attiny85
unsigned int timeCount = 0;
int inPin = 1;
int outPin = 3;
void timerFire() {
if(digitalRead(inPin)==LOW){
//timer reset
timeCount = 0;
}else {
//timer count up
timeCount++;
}
}
void setup() {
digitalWrite(outPin, HIGH);
Serial.begin(9600);
pinMode(inPin, INPUT);
pinMode(outPin, OUTPUT);
}
void loop() {
if (digitalRead(inPin) == HIGH){
delay(10);
timerFire();
//timer start
}
Serial.print(timeCount);
Serial.println("");
if (timeCount >3000) { //stop signal after continue 3000count
digitalWrite(outPin, LOW);
while(1);
}
}
(WDTをうまく使えばattiny85は要らないかも・・・)