test2017-1-13

Dependencies:   AT24C1024 DMX-STM32 mbed

main.cpp

Committer:
tomo370
Date:
2017-03-02
Revision:
3:dd2305e50390
Parent:
2:198becff12f4
Child:
4:c3f3fdde7eee

File content as of revision 3:dd2305e50390:

#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 init1()
{
    stepper1.setMaxSpeed(2000);
    stepper1.setAcceleration(20000);
    stepper1.moveTo(-30000);

    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();
        }
    }

}

void init2()
{

    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();
    }
}


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);

    silence();
    init1();
//    init2();


    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();
    }
}