以前に製作した、LX200のMotor Focuser コントローラ のソフト改修を行った。いくつかあるが、主な変更点は、Motor Focuser を動かしてから、一定時間経つと、駆動しているステッピングMOTORの電源OFFにすること。
MOTOR Focuser はこのように、望遠鏡のピントノブをステッピングモーターで回しているのだが、静止している時間が圧倒的に長いので、その間通電しておくのは、あまり気持ちのいいものではない。モーターやドライバ基板もかなり熱を持つ。なので、SSRでモーター回路、駆動基板の電源をコントロールできるようにした。
例によって、このようなものが必要な人は限られていると思うが、ハード・ソフトを記しておく。
ハードは、下の図のとおりで、マイクロコントローラは、Arduino nano の互換品、モータードライバ基板は、Aitendo で購入したモジュールを使っている。ちなみに、ステッピングモーターは、秋月のギア付のもの。
Ardyuino のスケッチ(プログラム)は以下のとおり。
簡単に解説すると、
・void setup()
IOポートなどの割付、初期設定を行い、モーターポジションをEEPROMから読込む
・void MotorForward()
ステッピングモーターの順方向パルスを発生させ、ポジションを更新する。
・void MotorReverse()
ステッピングモーターの逆方向パルスを発生させ、ポジションを更新する。
・void MotorON()
モーター電源をONにする。
・void SetFocusPosition()
モーターポジションをEEPROMに書き込み、シリアルポート(PC)に出力する。
現在時刻(モーターが最後にONとなった時刻となる)を読み込む。
・void loop()
メインプログラム本体。
シリアルポートを読んで、PCからのコマンドを解析して、モーターを動かす。
現在時刻を読んで、一定時間(5分)以上経過したら、モーター電源をOFFにする。
millis() は、Arduino が起動してからの経過時間(msec)を与える関数である。
********************************
// モータFOCUSER ドライバー
// 2015.09.01 Ver.1.0
// For Arduino NANO + PC
#include<EEPROM.h>
// I/Oポート定義
#define LED 13 // D13 基板上LED
#define SSR 2 // D2 Output Motor Power
#define SLEEP 21 // A7(D21) Output
#define MS1 20 // A6(D20) Output
#define MS2 16 // A2(D16) Output
#define Step 15 // A1(D15) Output
#define Direction 14 // A0(D14) Output
#define Rate 10 // Step Motor Pulse Rate( msec )
//変数の定義
byte ReadCMD;
unsigned char FocusPositionH,FocusPositionL;
unsigned int FocusPosition;
long TimeNow,PrevMotorON;
// 初期設定
void setup()
{ // IO Port Setting
pinMode(LED, OUTPUT);
pinMode(SSR,OUTPUT);
pinMode(SLEEP,OUTPUT);
pinMode(MS1,OUTPUT);
pinMode(MS2,OUTPUT);
pinMode(Step,OUTPUT);
pinMode(Direction,OUTPUT);
// Serial Port Setting
Serial.begin(9600);
// Microstep Driver Setting
digitalWrite(MS1, LOW); // Full Step Mode
digitalWrite(MS2, LOW);
digitalWrite(SLEEP, HIGH); // Sleep OFF
digitalWrite(Step, LOW); // Step OFF
// Set Motor Power OFF
digitalWrite(SSR, HIGH); // Motor Power ON
// Read Focus Position from EEPROM
FocusPosition = EEPROM.read(30);
FocusPositionL = EEPROM.read(31);
FocusPosition = FocusPosition << 8;
FocusPosition = FocusPosition + FocusPositionL;
PrevMotorON = millis(); // Motor Timer Reset
}
void MotorForward()
{ // Rotate Motor 1 Step Forward
digitalWrite(Direction,HIGH);
digitalWrite(Step, HIGH);
delay(Rate);
digitalWrite(Step, LOW);
delay(Rate);
++FocusPosition; // Up Position Counter
}
void MotorReverse()
{ // Rotate Motor 1 Step Reverse
digitalWrite(Direction,LOW);
digitalWrite(Step, HIGH);
delay(Rate);
digitalWrite(Step, LOW);
delay(Rate);
--FocusPosition; // Down Position Counter
}
void MotorON()
{ // Motor Power ON
digitalWrite(SSR, HIGH);
delay(50); // Wait 50msec
}
void SetFocusPosition()
{ // Write Focus Position to EEPROM
FocusPositionH = highByte(FocusPosition);
FocusPositionL = lowByte(FocusPosition);
EEPROM.write(30,FocusPositionH);
EEPROM.write(31,FocusPositionL);
Serial.println( FocusPosition,DEC);
PrevMotorON = millis(); // Read Time
}
void loop()
{
ReadCMD = Serial.read(); // Read Command from PC
// PCからのコマンド解析
switch ( ReadCMD ){
case 0x31: // "1" Forward One Step
MotorON();
MotorForward();
SetFocusPosition();
break;
case 0x32: // "2" Forward 10 Step
MotorON();
for ( int i=1; i<=10 ;i++ ) MotorForward();
SetFocusPosition();
break;
case 0x33: // "3" Forward 100 Step
MotorON();
for ( int i=1; i<=100 ;i++ ) MotorForward();
SetFocusPosition();
break;
case 0x34: // "4" Reverse One Step
MotorON();
MotorReverse();
SetFocusPosition();
break;
case 0x35: // "5" Reverse 10 Step
MotorON();
for ( int i=1; i<=10 ;i++ ) MotorReverse();
SetFocusPosition();
break;
case 0x36: // "6" Reverse 100 Step
MotorON();
for ( int i=1; i<=100 ;i++ ) MotorReverse();
SetFocusPosition();
break;
case 0x30: // "0" Focus Position Send
Serial.println( FocusPosition,DEC);
break;
case 0x2A: // "*" Focus Position Reset
FocusPosition = 30000;
SetFocusPosition();
break;
default: // No Command Recieved
Serial.flush(); // Flush serial RX Buffer
}
// 最後の Motor ON から一定時間経過したら Motor OFF にする
TimeNow = millis(); // Read Time
if ( ( TimeNow - PrevMotorON ) > 300000 ) digitalWrite(SSR, LOW); // Motor OFF
}