/* 100円ショップのアナログ時計を正転/逆転させる Pin8:モードスイッチ Pin9,10:時計ステッピングモータコイルへ220Ωを経由して接続 2013.11.9 ラジオペンチ http://radiopench.blog96.fc2.com/ */ boolean flag=true; // 駆動極性フラグ unsigned int cwPulse = 17; // 順回転パルス幅 標準は17mS unsigned int ccwPulse1 = 3500; // 逆回転パルス幅1 unsigned int ccwPulse2 = 12000; // 逆回転パルス幅2(値の上限は16383) void setup() { pinMode(13, OUTPUT); // 動作表示LED pinMode(9, OUTPUT); // conect coil thrugh 220Ω pinMode(10, OUTPUT); // coil return pinMode(8, INPUT); // 動作モード設定スイッチ digitalWrite(8, HIGH); // weak pull up pin 8 while(digitalRead(8)==LOW){ // 8ピンがHIGHになるまで cwP(); // 順回転させて秒針の位置あわせ delay(500); } } void loop() { while(digitalRead(8)==HIGH){ // 8ピンがLOWになるまで待つ } for(int p=5; p<=15; p+=5){ // 適当にデモ運転 cw(p); delay(300); ccw(p); delay(500); ccw(p); delay(300); cw(p); delay(500); } cw(60); delay(500); ccw(60); delay(1000); } void cw(int n){ // 指定パルスだけ順回転 if(n !=0){ for(int x = 1; x <=n; x++){ cwP(); delay(25); // 順回転速度設定 } } } void ccw(int n){ // 指定パルスだけ逆回転 if(n !=0){ for(int x = 1; x <=n; x++){ ccwP(); delay(50); // 逆回転速度設定 } } } void cwP(){ // 順回転パルス発生 digitalWrite(13,HIGH); // LED flash flag = ! flag; if (flag == true) { digitalWrite(9, HIGH); // coil drive foward delay(cwPulse); // wait digitalWrite(9, LOW); // coil drive end } else { digitalWrite(10, HIGH); // coil drive revers delay(cwPulse); // wait digitalWrite(10, LOW); // coil drive end } digitalWrite(13,LOW); // LED flash end } void ccwP(){ // 逆回転パルス発生 digitalWrite(13,HIGH); // LED flash flag = ! flag; if (flag == true) { digitalWrite(9, HIGH); // coil drive foward delayMicroseconds(ccwPulse1); // wait digitalWrite(9, LOW); // coil drive end digitalWrite(10, HIGH); // coil drive revers delayMicroseconds(ccwPulse2); // wait digitalWrite(10, LOW); // coil drive end } else { digitalWrite(10, HIGH); // coil drive revers delayMicroseconds(ccwPulse1); // wait digitalWrite(10, LOW); // coil drive end digitalWrite(9, HIGH); // coil drive foward delayMicroseconds(ccwPulse2); // wait digitalWrite(9, LOW); // coil drive end } digitalWrite(13,LOW); // LED flash end }