Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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