test2017-1-13
Dependencies: AT24C1024 DMX-STM32 mbed
Diff: main.cpp
- Revision:
- 4:c3f3fdde7eee
- Parent:
- 3:dd2305e50390
- Child:
- 5:fd097a259856
--- a/main.cpp Thu Mar 02 09:03:40 2017 +0000 +++ b/main.cpp Fri Mar 24 13:00:34 2017 +0000 @@ -3,6 +3,8 @@ #include "AccelStepper.h" #include "DMX.h" +Ticker to; + Timer t; DigitalOut dmxEnable(D8); //基本L(レシーブ)に固定します DMX dmx(PA_9, PA_10); @@ -17,7 +19,7 @@ DigitalOut stepper1Enable(D2); DigitalOut stepper1MS1(D11); DigitalOut stepper1MS2(D12); -DigitalIn stepper1MS3(A4); +DigitalOut stepper1MS3(A4); //モーター2 CN2とCN3を使用 DigitalOut stepper2Enable(D3); @@ -40,8 +42,8 @@ unsigned long dmxInHighBit, dmxInLowBit; unsigned long HighBit, LowBit; -bool manipulateMode1 = true; //0:手動 1:自動 -bool manipulateMode2 = true; //0:手動 1:自動 +bool manipulateMode1 = false; //0:手動 1:自動 +bool manipulateMode2 = false; //0:手動 1:自動 //モーター1のパラメーター DMXチャンネルリスト チャンネル数:12個 @@ -78,6 +80,23 @@ #define DMX_ParmSetMode2_H CH_Origin + 28 #define DMX_ParmSetMode2_L CH_Origin + 29 +//モーターの回転方向 TMCは1 DRVは-1に設定すること +//未実装(実装予定) + +//ステップ数の調整用の係数 +float StepAdj1 = 1; +float StepAdj2 = 1; + +//ステップ数設定 1:DRV full, 2:DRV 1/2, 3:DRV 1/4, 4:DRV 1/8, 5:DRV 1/16, 6:DRV 1/32, 7:TMC StealthChop µ16 +#define StepSize1 3 +#define StepSize2 4 + + +void calc() +{ + stepper1.newSpeed(); +} + //map long map(long x, long in_min, long in_max, long out_min, long out_max) { @@ -109,74 +128,116 @@ } } -void silence() + +//モーター1のみの往復テスト +void testMove1() { - DigitalIn stepper1MS1(D11); - DigitalIn stepper1MS2(D12); - - DigitalIn stepper2MS1(A5); - DigitalIn stepper2MS2(A6); -} + //initなしの場合 + stepper1.setCurrentPosition(0); + stepper1.setMaxSpeed(4000 / StepAdj1); + stepper1.setAcceleration(20000 / StepAdj1); -void run() -{ - DigitalOut stepper1MS1(D11); - DigitalOut stepper1MS2(D12); - stepper1MS1 = 1; - stepper1MS2 = 1; - - DigitalOut stepper2MS1(A5); - DigitalOut stepper2MS2(A6); - stepper2MS1 = 1; - stepper2MS2 = 1; + stepper1.setMaxSpeed(180000); + while(1) { + stepper1.moveTo(3200); + //stepper1.moveTo(800 / StepAdj1); + while(stepper1.distanceToGo() != 0) { + stepper1.run(); + } + wait(0.5); + //stepper1.moveTo(0 / StepAdj1); + stepper1.moveTo(0); + while(stepper1.distanceToGo() != 0) { + stepper1.run(); + } + wait(0.5); + } } +void testMove2() +{ + stepper1.setMaxSpeed(10000 / StepAdj1); + stepper2.setMaxSpeed(10000 / StepAdj2); + + stepper1.setMaxSpeed(180000); + + while(1) { + stepper1.moveTo(20000 / StepAdj1); + stepper2.moveTo(20000 / StepAdj2); + while(stepper1.distanceToGo() != 0) { + stepper1.run(); + // stepper2.run(); + } + //while(stepper2.distanceToGo() != 0) { +// stepper2.run(); +// } + + stepper1.moveTo(500 / StepAdj1); + //stepper2.moveTo(500 / StepAdj2); + while(stepper1.distanceToGo() != 0) { + stepper1.run(); + // stepper2.run(); + } + while(stepper2.distanceToGo() != 0) { + // stepper2.run(); + stepper1.run(); + } + } +} + void init1() { - stepper1.setMaxSpeed(2000); - stepper1.setAcceleration(20000); - stepper1.moveTo(-30000); + stepper1.setCurrentPosition(-1); + stepper1.setMaxSpeed(4000 / StepAdj1); + stepper1.setAcceleration(20000 / StepAdj1); + stepper1.moveTo(-30000 / StepAdj1); while(stepper1.currentPosition() != 0) { stepper1.run(); checkSW(); } - stepper1.moveTo(500); - while(stepper1.distanceToGo() != 0) { - stepper1.run(); - } - - stepper1.setMaxSpeed(4500); - - while(1) { - stepper1.moveTo(20000); - while(stepper1.distanceToGo() != 0) { - stepper1.run(); - - } - stepper1.moveTo(500); - while(stepper1.distanceToGo() != 0) { - stepper1.run(); - } - } - + stepper1.moveTo(500 / StepAdj1); + while(stepper1.distanceToGo() != 0) stepper1.run(); } void init2() { - - stepper2.setMaxSpeed(4000); - stepper2.setAcceleration(20000); - stepper2.moveTo(-20000); + stepper2.setCurrentPosition(-1); + stepper2.setMaxSpeed(4000 / StepAdj2); + stepper2.setAcceleration(20000 / StepAdj2); + stepper2.moveTo(-30000 / StepAdj2); while(stepper2.currentPosition() != 0) { stepper2.run(); checkSW(); } - stepper2.moveTo(500); - while(stepper2.distanceToGo() != 0) { - stepper2.run(); + stepper2.moveTo(500 / StepAdj2); + while(stepper2.distanceToGo() != 0) stepper2.run(); +} + +void initBoth() +{ + stepper1.setCurrentPosition(-1); + stepper1.setMaxSpeed(4000 / StepAdj1); + stepper1.setAcceleration(20000 / StepAdj1); + stepper1.moveTo(-30000 / StepAdj1); + + stepper2.setCurrentPosition(-1); + stepper2.setMaxSpeed(4000 / StepAdj2); + stepper2.setAcceleration(20000 / StepAdj2); + stepper2.moveTo(-30000 / StepAdj2); + + while((stepper1.distanceToGo() != 0)||(stepper2.distanceToGo() != 0)) { + if (stepper1.distanceToGo() != 0) stepper1.run(); + if (stepper2.distanceToGo() != 0) stepper2.run(); + checkSW(); + } + stepper1.moveTo(500 / StepAdj1); + stepper2.moveTo(500 / StepAdj2); + while((stepper1.distanceToGo() != 0)||(stepper2.distanceToGo() != 0)) { + if (stepper1.distanceToGo() != 0) stepper1.run(); + if (stepper2.distanceToGo() != 0) stepper2.run(); } } @@ -381,46 +442,147 @@ } else; } +//モータードライバの設定 +void conf1() +{ + switch (StepSize1) { + case 1: //DRV8825 full steps + stepper1MS1 = 0; + stepper1MS2 = 0; + stepper1MS3 = 0; + StepAdj1 = 16; + break; + + case 2: //DRV8825 1/2 steps + stepper1MS1 = 1; + stepper1MS2 = 0; + stepper1MS3 = 0; + StepAdj1 = 8; + break; + + case 3: //DRV8825 1/4 steps + stepper1MS1 = 0; + stepper1MS2 = 1; + stepper1MS3 = 0; + StepAdj1 = 4; + break; + + case 4: //DRV8825 1/8 steps + stepper1MS1 = 1; + stepper1MS2 = 1; + stepper1MS3 = 0; + StepAdj1 = 2; + break; + + case 5: //DRV8825 1/16 steps + stepper1MS1 = 0; + stepper1MS2 = 0; + stepper1MS3 = 1; + StepAdj1 = 1; + break; + + case 6: //DRV8825 1/32 steps + stepper1MS1 = 1; + stepper1MS2 = 1; + stepper1MS3 = 1; + StepAdj1 = 0.5; + break; + + case 7: //TMC StealthChop µ16 steps + DigitalIn stepper1MS1(D11); + DigitalIn stepper1MS2(D12); + StepAdj1 = 1; + break; + } + stepper1Enable = 0; +} + +void conf2() +{ + switch (StepSize2) { + case 1: //DRV8825 full steps + stepper2MS1 = 0; + stepper2MS2 = 0; + stepper2MS3 = 0; + StepAdj2 = 16; + break; + + case 2: //DRV8825 1/2 steps + stepper2MS1 = 1; + stepper2MS2 = 0; + stepper2MS3 = 0; + StepAdj2 = 8; + break; + + case 3: //DRV8825 1/4 steps + stepper2MS1 = 0; + stepper2MS2 = 1; + stepper2MS3 = 0; + StepAdj2 = 4; + break; + + case 4: //DRV8825 1/8 steps + stepper2MS1 = 1; + stepper2MS2 = 1; + stepper2MS3 = 0; + StepAdj2 = 2; + break; + + case 5: //DRV8825 1/16 steps + stepper2MS1 = 0; + stepper2MS2 = 0; + stepper2MS3 = 1; + StepAdj2 = 1; + break; + + case 6: //DRV8825 1/32 steps + stepper2MS1 = 1; + stepper2MS2 = 1; + stepper2MS3 = 1; + StepAdj2 = 0.5; + break; + + case 7: //TMC StealthChop µ16 steps + DigitalIn stepper2MS1(D11); + DigitalIn stepper2MS2(D12); + StepAdj2 = 1; + break; + } + stepper2Enable = 0; +} + int main() { - //モーター1と2のコンフィギュレーション - stepper1MS1 = 1; - stepper1MS2 = 1; - stepper1Enable = 0; + + dmxEnable = 0; //0:receiver 1:sender - stepper2MS1 = 1; - stepper2MS2 = 1; - stepper2Enable = 0; + conf1(); //motor1 config ドライバの設定 + conf2(); //motor2 config t.start(); - - dmxEnable = 0; //0:receiver 1:sender +// to.attach(&calc, 0.001); stepper1.setCurrentPosition(-1); stepper2.setCurrentPosition(-1); - silence(); - init1(); +//モーターの初期化シーケンス +// init1(); // init2(); - +// initBoth(); - stepper1.setMaxSpeed(25000); - stepper1.setAcceleration(30000); - stepper1.setCurrentPosition(0); - - stepper2.setMaxSpeed(25000); - stepper2.setAcceleration(30000); - stepper2.setCurrentPosition(0); +//往復運動を繰り返すテストシーケンス(無限ループ) + testMove1(); myLED =1; - readROMValue1(); readROMValue2(); + stepper1.setMaxSpeed(10000 / StepAdj1); + stepper2.setMaxSpeed(10000 / StepAdj2); + while(1) { - //操作モード切り替えボタンのチェック checkManipulateButton(); @@ -439,7 +601,6 @@ dmxInHighBit = dmxInHighBit << 8; position2 = (long)(dmxInHighBit + dmxInLowBit); - //手動モードの場合、現在のスライダーの値を取得、パラメーターを設定 if(manipulateMode1 == false) { captureSliderValue(); @@ -449,7 +610,6 @@ //自動モードの場合、EEPROMから値を取得、パラメーターを設定 else { myLED = 1; - } //手動モードの場合、現在のスライダーの値を取得、パラメーターを設定 @@ -474,8 +634,14 @@ stepper1.moveTo(position1); stepper2.moveTo(position2); + checkSafeBreak(); - stepper1.run(); - stepper2.run(); + stepper1.newSpeed(); + +//モーター1の走行 + if(stepper1.distanceToGo() != 0) stepper1.run(); +//モーター2の走行(停止中) +// if(stepper2.distanceToGo() != 0) stepper2.run(); + } } \ No newline at end of file