#include "Motion86.h"
#include "Encoder.h"
#include "SD.h"
// マシンオブジェクトを生成します。マシン0~2まで、それぞれ3軸のマシンを最大3台まで使用できます。。
Machine machine(0);
// ステッピングモーター enable pin。
int EnablePin = 4;
// この gcode ファイルは SD カードに保存されます。
char *filename = "auto.gcode" ;
File gfile;
char buf[256];
int ptr;
bool working;
// プリセット送り速度比を設定する。
volatile double FeedrateRatio = 1.0;
bool enc_triggered = false ;
void encoder_callback( int flag);
void setup() {
while (!Serial);
SD.begin();
// この例では、ハンドホイールが Enc3 に取り付けられています。
Enc3.begin(MODE_AB_PHASE);
Enc3.setRange(1); // 割り込みは毎回トリガーされます
Enc3.attachInterrupt(encoder_callback);
pinMode(EnablePin, OUTPUT);
// 必要に応じて、軸の移動方向を反転できます。
// この例では、x 軸と y 軸の方向を反転する必要があります。
machine.config_ReverseDirection(AXIS_X);
machine.config_ReverseDirection(AXIS_Y);
// PPU (単位あたりのパルス) は、さまざまなニーズに応じた仮想的な長さの単位です。
// この例では、x 軸の単位長さは 80 パルスに設定されており、これは実際のアプリケーションでは 1 mm に相当します。
machine.config_PPU(AXIS_X, 80.0);
machine.config_PPU(AXIS_Y, 80.0);
machine.config_PPU(AXIS_Z, 1600.0);
// 機械の動きに対するソフトウェア制限を設定します。
machine.config_PosLimit(AXIS_X, 0, 300);
machine.config_PosLimit(AXIS_Y, 0, 200);
machine.config_PosLimit(AXIS_Z, 0, 300);
// リミットスイッチがホームポイントを設定するために使用するピンを設定します。
machine.config_HomePins(2, 7, 8);
// 制御する前に、マシンを起動する必要があります。
machine.machineOn();
// ソフトウェア制限を有効にします。
machine.enableSoftLimit();
// ホームポイントへの送り速度を設定します。
machine.setHomeSpeed(1000, 1000, 200);
// SDカード内のGコードファイルを開く
if (SD.exists(filename)) {
gfile = SD.open(filename);
working = true ;
} else {
Serial.print( "File not exists: " );
Serial.println(filename);
while (1);
}
// ステッピングモーターを起動します。
digitalWrite(EnablePin, LOW);
// リミットスイッチによって定義されたホームポイントに戻ります。
machine.home();
}
void loop() {
// gcode ファイルを読み取って解析します。
if (working && !machine.isCmdBufferFull()) {
ptr = 0;
while (gfile.available()) {
buf[ptr] = gfile.read();
if (buf[ptr] == '\n' ) {
buf[ptr + 1] = '\0' ;
machine.gcode(buf);
break ;
} else {
ptr ++;
}
}
if (!gfile.available())
{
Serial.println( "GCODE FINISH" );
gfile.close();
working = false ;
}
}
// 割り込みが発生したときに送り速度をオーバーライドします。
if (enc_triggered) {
if (FeedrateRatio > 2.0) FeedrateRatio = 2.0;
if (FeedrateRatio < 0.1) FeedrateRatio = 0.1;
machine.feedrateOverride(FeedrateRatio);
enc_triggered = false ;
Serial.print( "FeedrateRatio = " );
Serial.println(machine.getFeedrateOverride());
}
}
void encoder_callback( int flag) {
// 送り速度比は 0 より大きくなければなりません。
if (flag == INTR_OVERFLOW && FeedrateRatio < 2.0)
FeedrateRatio += 0.01;
else if (flag == INTR_UNDERFLOW && FeedrateRatio > 0.0)
FeedrateRatio -= 0.01;
enc_triggered = true ;
}
|