LX200 Motor Focuser コントローラ ソフト改善

以前に製作した、LX200のMotor Focuser コントローラ のソフト改修を行った。いくつかあるが、主な変更点は、Motor Focuser を動かしてから、一定時間経つと、駆動しているステッピングMOTORの電源OFFにすること。

イメージ 1

MOTOR Focuser はこのように、望遠鏡のピントノブをステッピングモーターで回しているのだが、静止している時間が圧倒的に長いので、その間通電しておくのは、あまり気持ちのいいものではない。モーターやドライバ基板もかなり熱を持つ。なので、SSRでモーター回路、駆動基板の電源をコントロールできるようにした。
例によって、このようなものが必要な人は限られていると思うが、ハード・ソフトを記しておく。

ハードは、下の図のとおりで、マイクロコントローラは、Arduino nano の互換品、モータードライバ基板は、Aitendo で購入したモジュールを使っている。ちなみに、ステッピングモーターは、秋月のギア付のもの。

イメージ 2

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
 
}