//必要ライブラリ
#include <A4988.h>
//ステップモーター定義
const int MOTOR_STEPS = 200;
const int DIR = 8;
const int STEP = 9;
float rpm = 10;
int microsteps = 10;
A4988 stepper(MOTOR_STEPS, DIR, STEP);
//ピン定義
#define L_LED 4
#define L_SW 0
#define M_LED 5
#define M_SW 2
#define H_LED 6
#define H_SW 3
#define SRCLK 11
#define RCLK 12
#define SER 13
//サス減衰ポジション定義
#define R_Position 0
#define H_Position 5
#define M_Position 10
#define L_Position 15
//ステップモーター回転量定義(1目盛り/度)
#define RotationConst 18
//グローバル変数設定
int NowPosition; //現在のポジション
int StandardPosition; //基準のポジション
int ChengePosition; //変更するポジション
int Rotate; //回転する目盛り量(e12ダイヤル)
int StepRotation; //ポジションチェンジに必要なモーター回転数
int LED_PIN; //点灯対象LEDのPIN_No.
int Mode = 0; //0:Reset 1:H 2:M 3:L ※将来はEEPROM より保存したモードを取得
//7セグ 表示設定
byte Seg[] = {
0b11111101, // 0:Reset (Chenge Now)
0b10010001, // 1:H_Mode
0b00010011, // 2:M_Mode
0b11100011, // 3:L_Mode
};
void setup() {
Serial.begin(9600);
stepper.begin(rpm, microsteps);
pinMode(L_LED, OUTPUT);
pinMode(L_SW, INPUT);
pinMode(M_LED, OUTPUT);
pinMode(M_SW, INPUT);
pinMode(H_LED, OUTPUT);
pinMode(H_SW, INPUT);
pinMode(SRCLK, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(SER, OUTPUT);
StandardPosition = R_Position;
NowPosition = L_Position;
ChengePosition = L_Position;
LED_PIN = L_LED;
Rotate = (RotationConst*(StandardPosition - NowPosition));
Serial.println(Rotate);
stepper.rotate(Rotate);
digitalWrite(L_LED,HIGH);
Mode = 3;
}
void loop() {
//ポジションチェンジ割り込みにてモーター回転
if(NowPosition != ChengePosition){
//外部割り込み一時停止
detachInterrupt(1);
detachInterrupt(0);
Mode = 0;
switch(ChengePosition){
int i;
int I;
case H_Position:
//LED_Off(LOW,LOW,LOW);
Rotate = NowPosition - H_Position;
if (Rotate >= 0){ //時計回り(HARD側へ)
StepRotation = RotationConst;
}
if (Rotate <= 0){ //反時計回り(SOFT側へ)
StepRotation = RotationConst * -1;
}
Seg_ON();
I = abs(Rotate) ;
for (i=1; i<=I; i++){
stepper.rotate(StepRotation);
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
delay(200);
Serial.print(i);
}
Mode = 1;
break;
case M_Position:
//LED_Off(LOW,LOW,LOW);
Rotate = NowPosition - M_Position;
if (Rotate >= 0){ //時計回り(HARD側へ)
StepRotation = RotationConst;
}
if (Rotate <= 0){ //反時計回り(SOFT側へ)
StepRotation = RotationConst * -1;
}
Seg_ON();
I = abs(Rotate);
for (i=1; i<=I; i++){
stepper.rotate(StepRotation);
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
delay(200);
}
Mode = 2;
break;
}
}
LED_Off(LOW,LOW,LOW);
NowPosition = ChengePosition;
//現状ポジションのLED、7セグ表示
Serial.print("Now Position: ");
Serial.println(NowPosition);
Serial.print("Now Mode: ");
Serial.println(Mode);
digitalWrite(LED_PIN,HIGH);
Seg_ON();
//外部割り込み再開
attachInterrupt(1,Mode_H,RISING);
attachInterrupt(0,Mode_M,RISING);
delay(1000);
}
//割り込み関数定義
void Mode_H() {
ChengePosition = H_Position;
LED_PIN = H_LED;
Serial.print("Chenge Position: ");
Serial.println(ChengePosition);
Serial.print("Chenge LED: ");
Serial.println(LED_PIN);
}
void Mode_M() {
ChengePosition = M_Position;
LED_PIN = M_LED;
Serial.print("Chenge Position: ");
Serial.println(ChengePosition);
Serial.print("Chenge LED: ");
Serial.println(LED_PIN);
}
//LED全消灯関数定義
void LED_Off(int L_State,int M_State,int H_State){
digitalWrite(L_LED,L_State);
digitalWrite(M_LED,M_State);
digitalWrite(H_LED,H_State);
}
//7セグ表示関数定義
void Seg_ON(){
digitalWrite(RCLK,LOW);
shiftOut(SRCLK,SER,LSBFIRST,Seg[Mode]);
digitalWrite(RCLK, HIGH);
}