test2017-1-13
Dependencies: AT24C1024 DMX-STM32 mbed
main.cpp
- Committer:
- tomo370
- Date:
- 2017-02-15
- Revision:
- 2:198becff12f4
- Parent:
- 1:cf2f5992241c
- Child:
- 3:dd2305e50390
File content as of revision 2:198becff12f4:
#include "mbed.h" #include "AT24C1024.h" #include "AccelStepper.h" #include "DMX.h" Timer t; DigitalOut dmxEnable(D8); //基本L(レシーブ)に固定します DMX dmx(PA_9, PA_10); I2C i2c(D4, D5); // SDA, SCL AT24C1024 at24c1024(i2c); // Atmel 1Mbit EE-PROM AccelStepper stepper1(1, D9, D6); // step, direction AccelStepper stepper2(1, D10, D7); // step, direction //モーター1 CN0とCN1を使用 DigitalOut stepper1Enable(D2); DigitalOut stepper1MS1(D11); DigitalOut stepper1MS2(D12); DigitalIn stepper1MS3(A4); //モーター2 CN2とCN3を使用 DigitalOut stepper2Enable(D3); DigitalOut stepper2MS1(A5); DigitalOut stepper2MS2(A6); DigitalOut stepper2MS3(A7); DigitalIn EndSW1(A0); //CN4 //3端子エンドスイッチ1 予備 DigitalIn EndSW2(A1); //CN5 //3端子エンドスイッチ2 予備 DigitalIn EndSW3(A2); //CN6 //2端子エンドスイッチ1 モーター1用にする DigitalIn EndSW4(A3); //CN7 //2端子エンドスイッチ2 モーター2用にする DigitalOut myLED(LED3); //動作確認用LED unsigned long position1, position2; //モーター1の設定位置 unsigned long max1, max2; unsigned long speed1, speed2; unsigned long Acceleration1, Acceleration2; unsigned long param1, param2; unsigned long dmxInHighBit, dmxInLowBit; unsigned long HighBit, LowBit; bool manipulateMode1 = true; //0:手動 1:自動 bool manipulateMode2 = true; //0:手動 1:自動 //モーター1のパラメーター DMXチャンネルリスト チャンネル数:12個 #define CH_Origin 0 #define DMX_Position1_H CH_Origin //モーター1制御用のDMX信号の始まりの値 #define DMX_Position1_L CH_Origin + 1 #define DMX_Speed1_H CH_Origin + 2 #define DMX_Speed1_L CH_Origin + 3 #define DMX_Acceleration1_H CH_Origin + 4 #define DMX_Acceleration1_L CH_Origin + 5 #define DMX_Max1_H CH_Origin + 6 #define DMX_Max1_L CH_Origin + 7 #define DMX_Offset1_H CH_Origin + 8 #define DMX_Offset1_L CH_Origin + 9 #define DMX_SaveValue1_H CH_Origin + 10 #define DMX_SaveValue1_L CH_Origin + 11 #define DMX_ParmSetMode1_H CH_Origin + 12 #define DMX_ParmSetMode1_L CH_Origin + 13 //モーター2のパラメーター DMXチャンネルリスト チャンネル数:12個 #define DMX_Position2_H CH_Origin + 16 #define DMX_Position2_L CH_Origin + 17 #define DMX_Speed2_H CH_Origin + 18 #define DMX_Speed2_L CH_Origin + 19 #define DMX_Acceleration2_H CH_Origin + 20 #define DMX_Acceleration2_L CH_Origin + 21 #define DMX_Max2_H CH_Origin + 22 #define DMX_Max2_L CH_Origin + 23 #define DMX_Offset2_H CH_Origin + 24 #define DMX_Offset2_L CH_Origin + 25 #define DMX_SaveValue2_H CH_Origin + 26 #define DMX_SaveValue2_L CH_Origin + 27 #define DMX_ParmSetMode2_H CH_Origin + 28 #define DMX_ParmSetMode2_L CH_Origin + 29 //map long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } void blink() { for(int i=0; i<5; i++) { myLED=0; wait_ms(60); myLED=1; wait_ms(60); } } void checkSW() { //モーター1用エンドスイッチのチェック if(EndSW3.read() == 1) { stepper1.stop(); stepper1.setCurrentPosition(0); } //モーター2用エンドスイッチのチェック if(EndSW4.read() == 1) { stepper2.stop(); stepper2.setCurrentPosition(0); } } void silence() { DigitalIn stepper1MS1(D11); DigitalIn stepper1MS2(D12); DigitalIn stepper2MS1(A5); DigitalIn stepper2MS2(A6); } void run() { DigitalOut stepper1MS1(D11); DigitalOut stepper1MS2(D12); stepper1MS1 = 1; stepper1MS2 = 1; DigitalOut stepper2MS1(A5); DigitalOut stepper2MS2(A6); stepper2MS1 = 1; stepper2MS2 = 1; } void init() { stepper1.setMaxSpeed(4000); stepper1.setAcceleration(20000); stepper1.moveTo(-20000); while(stepper1.currentPosition() != 0) { stepper1.run(); checkSW(); } stepper1.moveTo(500); while(stepper1.distanceToGo() != 0) { stepper1.run(); } stepper2.setMaxSpeed(4000); stepper2.setAcceleration(20000); stepper2.moveTo(-20000); while(stepper2.currentPosition() != 0) { stepper2.run(); checkSW(); } stepper2.moveTo(500); while(stepper2.distanceToGo() != 0) { stepper2.run(); } silence(); } void checkSafeBreak() { if(EndSW3.read() == 1) { stepper1.stop(); while(1) { blink(); } } //モーター2用エンドスイッチのチェック if(EndSW4.read() == 1) { stepper2.stop(); while(1) { blink(); } } } //モーター1のパラメータ保存 void paramStore1() { //速度 uint8_t dt = dmx.get(DMX_Speed1_H); at24c1024.write(DMX_Speed1_H, dt); wait_ms(2); dt = dmx.get(DMX_Speed1_L); at24c1024.write(DMX_Speed1_L, dt); wait_ms(2); //加速度 dt = dmx.get(DMX_Acceleration1_H); at24c1024.write(DMX_Acceleration1_H, dt); wait_ms(2); dt = dmx.get(DMX_Acceleration1_L); at24c1024.write(DMX_Acceleration1_L, dt); wait_ms(2); //最大値 dt = dmx.get(DMX_Max1_H); at24c1024.write(DMX_Max1_H, dt); wait_ms(2); dt = dmx.get(DMX_Max1_L); at24c1024.write(DMX_Max1_L, dt); wait_ms(5); } //モーター2のパラメータ保存 void paramStore2() { //速度 uint8_t dt = dmx.get(DMX_Speed2_H); at24c1024.write(DMX_Speed2_H, dt); wait_ms(2); dt = dmx.get(DMX_Speed2_L); at24c1024.write(DMX_Speed2_L, dt); wait_ms(2); //加速度 dt = dmx.get(DMX_Acceleration2_H); at24c1024.write(DMX_Acceleration2_H, dt); wait_ms(2); dt = dmx.get(DMX_Acceleration2_L); at24c1024.write(DMX_Acceleration2_L, dt); wait_ms(2); //最大値 dt = dmx.get(DMX_Max2_H); at24c1024.write(DMX_Max2_H, dt); wait_ms(2); dt = dmx.get(DMX_Max2_L); at24c1024.write(DMX_Max2_L, dt); wait_ms(2); } //速度・加速度・最大値・オフセットの値をスライダーから取得 void captureSliderValue() { dmxInHighBit = dmx.get(DMX_Speed1_H); dmxInLowBit = dmx.get(DMX_Speed1_L); dmxInHighBit = dmxInHighBit << 8; speed1 = (long)(dmxInHighBit + dmxInLowBit); dmxInHighBit = dmx.get(DMX_Speed2_H); dmxInLowBit = dmx.get(DMX_Speed2_L); dmxInHighBit = dmxInHighBit << 8; speed2 = (long)(dmxInHighBit + dmxInLowBit); dmxInHighBit = dmx.get(DMX_Acceleration1_H); dmxInLowBit = dmx.get(DMX_Acceleration1_L); dmxInHighBit = dmxInHighBit << 8; Acceleration1 = (long)(dmxInHighBit + dmxInLowBit); dmxInHighBit = dmx.get(DMX_Acceleration2_H); dmxInLowBit = dmx.get(DMX_Acceleration2_L); dmxInHighBit = dmxInHighBit << 8; Acceleration2 = (long)(dmxInHighBit + dmxInLowBit); dmxInHighBit = dmx.get(DMX_Max1_H); dmxInLowBit = dmx.get(DMX_Max1_L); dmxInHighBit = dmxInHighBit << 8; max1 = (long)(dmxInHighBit + dmxInLowBit); dmxInHighBit = dmx.get(DMX_Max2_H); dmxInLowBit = dmx.get(DMX_Max2_L); dmxInHighBit = dmxInHighBit << 8; max2 = (long)(dmxInHighBit + dmxInLowBit); } //モーター1の 速度・加速度・オフセットの値をEEPROMから取得 void readROMValue1() { //速度 HighBit = at24c1024.read(DMX_Speed1_H); LowBit = at24c1024.read(DMX_Speed1_L); HighBit = HighBit << 8; speed1 = (long)(HighBit + LowBit); //加速度 HighBit = at24c1024.read(DMX_Acceleration1_H); LowBit = at24c1024.read(DMX_Acceleration1_L); HighBit = HighBit << 8; Acceleration1 = (long)(HighBit + LowBit); //最大値 HighBit = at24c1024.read(DMX_Max1_H); LowBit = at24c1024.read(DMX_Max1_L); HighBit = HighBit << 8; max1 = (long)(HighBit + LowBit); } //モーター2の 速度・加速度・オフセットの値をEEPROMから取得 void readROMValue2() { //速度 HighBit = at24c1024.read(DMX_Speed2_H); LowBit = at24c1024.read(DMX_Speed2_L); HighBit = HighBit << 8; speed2 = (long)(HighBit + LowBit); //加速度 HighBit = at24c1024.read(DMX_Acceleration2_H); LowBit = at24c1024.read(DMX_Acceleration2_L); HighBit = HighBit << 8; Acceleration2 = (long)(HighBit + LowBit); //最大値 HighBit = at24c1024.read(DMX_Max2_H); LowBit = at24c1024.read(DMX_Max2_L); HighBit = HighBit << 8; max2 = (long)(HighBit + LowBit); } //操作モード切り替えボタンのチェック void checkManipulateButton() { dmxInHighBit = dmx.get(DMX_ParmSetMode1_H); dmxInLowBit = dmx.get(DMX_ParmSetMode1_L); if(dmxInHighBit == 102 && dmxInLowBit == 255) { manipulateMode1 = !manipulateMode1; blink(); } dmxInHighBit = dmx.get(DMX_ParmSetMode2_H); dmxInLowBit = dmx.get(DMX_ParmSetMode2_L); if(dmxInHighBit == 102 && dmxInLowBit == 255) { manipulateMode2 = !manipulateMode2; blink(); } } //書き込みボタンのチェック void checkWriteButton() { dmxInHighBit = dmx.get(DMX_SaveValue1_H); dmxInLowBit = dmx.get(DMX_SaveValue1_L); dmxInHighBit = dmxInHighBit << 8; param1 = (long)(dmxInHighBit + dmxInLowBit); dmxInHighBit = dmx.get(DMX_SaveValue2_H); dmxInLowBit = dmx.get(DMX_SaveValue2_L); dmxInHighBit = dmxInHighBit << 8; param2 = (long)(dmxInHighBit + dmxInLowBit); if(param1 == 24932) { paramStore1(); blink(); } else; if(param2 == 24932) { paramStore2(); blink(); } else; } int main() { //モーター1と2のコンフィギュレーション stepper1MS1 = 1; stepper1MS2 = 1; stepper1Enable = 0; stepper2MS1 = 1; stepper2MS2 = 1; stepper2Enable = 0; t.start(); dmxEnable = 0; //0:receiver 1:sender stepper1.setCurrentPosition(-1); stepper2.setCurrentPosition(-1); init(); stepper1.setMaxSpeed(25000); stepper1.setAcceleration(30000); stepper1.setCurrentPosition(0); stepper2.setMaxSpeed(25000); stepper2.setAcceleration(30000); stepper2.setCurrentPosition(0); myLED =1; readROMValue1(); readROMValue2(); while(1) { //操作モード切り替えボタンのチェック checkManipulateButton(); //書き込みボタンチェック checkWriteButton(); //モーター1の目標位置をスライダーから取得 dmxInHighBit = dmx.get(DMX_Position1_H); dmxInLowBit = dmx.get(DMX_Position1_L); dmxInHighBit = dmxInHighBit << 8; position1 = (long)(dmxInHighBit + dmxInLowBit); //モーター1の目標位置をスライダーから取得 dmxInHighBit = dmx.get(DMX_Position2_H); dmxInLowBit = dmx.get(DMX_Position2_L); dmxInHighBit = dmxInHighBit << 8; position2 = (long)(dmxInHighBit + dmxInLowBit); //手動モードの場合、現在のスライダーの値を取得、パラメーターを設定 if(manipulateMode1 == false) { captureSliderValue(); myLED = 0; } //自動モードの場合、EEPROMから値を取得、パラメーターを設定 else { myLED = 1; } //手動モードの場合、現在のスライダーの値を取得、パラメーターを設定 if(manipulateMode2 == false) { captureSliderValue(); myLED = 0; } //自動モードの場合、EEPROMから値を取得、パラメータを設定 else { myLED = 1; } position1 = map(position1, 0, 0xFFFF, 0, max1); stepper1.setMaxSpeed(speed1); stepper1.setAcceleration(Acceleration1); position2 = map(position2, 0, 0xFFFF, 0, max2); stepper2.setMaxSpeed(speed2); stepper2.setAcceleration(Acceleration2); stepper1.moveTo(position1); stepper2.moveTo(position2); checkSafeBreak(); stepper1.run(); stepper2.run(); } }