// rotate(0-63) // sequence 1 2 3 4 5 6 7 8 // 5:Red G G G G G G G G // // 4:Orange H H - - - - - H // 3:Yellow - H H H - - - - // 2:Pink - - - H H H - - // 1:Blue - - - - - H H H //#define DEBUG #define UP_BUTTON 2 #define DOWN_BUTTON 3 #define IN1_PIN 8 //IN1-OUT1-4 Orange #define IN2_PIN 7 //IN2-OUT2-3 Yellow #define IN3_PIN 6 //IN3-OUT3-2 Pink #define IN4_PIN 5 //IN4-OUT4-1 Blue #define RSW_PIN A5 //A5 28pin #define MIN_DEGREE 0 #define MAX_DEGREE 63 #define MO_DELAY 2 //5ms #define MO_TIMEOUT 10000 #define BT_TIMEOUT 1000 static int degree = 0; //0-63 void setup() { #ifdef DEBUG Serial.begin(9600); #endif pinMode(UP_BUTTON, INPUT_PULLUP); pinMode(DOWN_BUTTON, INPUT_PULLUP); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); pinMode(IN3_PIN, OUTPUT); pinMode(IN4_PIN, OUTPUT); motorOff(); analogReference(DEFAULT); } void loop() { unsigned long time; if(digitalRead(UP_BUTTON) == LOW) { time = millis(); while(digitalRead(UP_BUTTON) != HIGH && millis() < time + BT_TIMEOUT); rotateRight(); #ifdef DEBUG Serial.println("Up"); #endif } if(digitalRead(DOWN_BUTTON) == LOW) { time = millis(); while(digitalRead(DOWN_BUTTON) != HIGH && millis() < time + BT_TIMEOUT); rotateLeft(); #ifdef DEBUG Serial.println("Down"); #endif } delay(100); } // 0: SW Off, 1-6: SW No. int getRswNo() { int val = analogRead(RSW_PIN); val = map(val, 0, 1023, 0, 50); #ifdef DEBUG Serial.print("analog: "); Serial.println(val); #endif if(val < 5) return(0); if(val < 10) return(6); if(val < 15) return(5); if(val < 25) return(4); if(val < 30) return(3); if(val < 35) return(2); if(val < 45) return(1); return(0); } //右へスイッチ1つ回転 void rotateRight() { int val; // if((val = getRswNo()) == 0 || val == 6) return; if((val = getRswNo()) == 6) return; unsigned long time = millis(); while(getRswNo() != val + 1 && millis() < time + MO_TIMEOUT) { if(++degree > MAX_DEGREE) degree = MIN_DEGREE; motorOutput(degree); } motorOff(); } //左へスイッチ1つ回転 void rotateLeft() { int val; // if((val = getRswNo()) == 0 || val == 1) return; if((val = getRswNo()) == 1) return; unsigned long time = millis(); while(getRswNo() != val - 1 && millis() < time + MO_TIMEOUT) { if(--degree < MIN_DEGREE) degree = MAX_DEGREE; motorOutput(degree); } motorOff(); } //モーターへの電力停止 void motorOff() { digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, LOW); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, LOW); } void motorOutput(int angle) { switch(angle%8) { case 0: digitalWrite(IN1_PIN, HIGH); digitalWrite(IN2_PIN, LOW); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, LOW); break; case 1: digitalWrite(IN1_PIN, HIGH); digitalWrite(IN2_PIN, HIGH); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, LOW); break; case 2: digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, HIGH); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, LOW); break; case 3: digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, HIGH); digitalWrite(IN3_PIN, HIGH); digitalWrite(IN4_PIN, LOW); break; case 4: digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, LOW); digitalWrite(IN3_PIN, HIGH); digitalWrite(IN4_PIN, LOW); break; case 5: digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, LOW); digitalWrite(IN3_PIN, HIGH); digitalWrite(IN4_PIN, HIGH); break; case 6: digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, LOW); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, HIGH); break; case 7: digitalWrite(IN1_PIN, HIGH); digitalWrite(IN2_PIN, LOW); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, HIGH); break; } delay(MO_DELAY); }