DIY แนวการสร้างระบบหาตำแหน่งดาว GOTO #3




ต้องไปอ่าน DIY แนวการสร้างระบบหาตำแหน่งดาว GOTO #1, #2ก่อนนะครับ
#1
https://ppantip.com/topic/37233072
#2
https://ppantip.com/topic/37235270
#3
https://ppantip.com/topic/37236971
#4
https://ppantip.com/topic/37238646
#5
https://ppantip.com/topic/37238689

*********************************************************************************
กระทู้อื่นเดิมๆที่ใครเผื่อสนใจครับ
การสร้างอุปกรณ์ตามดาวด้วยตัวเอง DIY star tracking #1
http://ppantip.com/topic/35228265
การสร้างอุปกรณ์ตามดาวด้วยตัวเอง DIY star tracking #2
http://ppantip.com/topic/35233329
การสร้างอุปกรณ์ตามดาวด้วยตัวเอง DIY star tracking #3
http://ppantip.com/topic/35237413
การสร้างวงจรขับ motor สำหรับ การถ่ายภาพดาราศาสตร์,high accuracy motor driver for star tracker
http://ppantip.com/topic/35222366
การใช้งานวงจรขับ และอุปกรณ์ตามดาวแบบติดมอเตอร์เบื้องต้น Basic Motor Drive Barn Door Tracker
http://ppantip.com/topic/35244410
การสร้าง และอุปกรณ์ขับมอเตอร์ในสิบนาที
https://ppantip.com/topic/36658223/comment1
DIY เลนส์ ฮีทเตอร์กันฝ้าสำหรับนักถ่ายดาว
https://ppantip.com/topic/35745572
**********************************************************************************
มาต่อกันครับ


การสร้างโปรแกรมการควบคุมจริง
ต่อไปจะเป็นการสร้างโปรแกรมจริง โดยจะเริ่มเป็นแบบฝึกหัดไปทีละอัน

Lesson 1 การรับค่าจาก Stellarium
อนึ่งทุกครั้งจะ Upload โปรแกรม ต้อง Stop Telescope ใน Stellarium ทุกครั้งไม่งั้น จะ Error เพราะแย่งกันใช้ Com port.
(และจากการที่ Stellarium จะสื่อสารโดย Serial Port ดังนั้นเราจึงไม่สามารถใช้ SerialPrint เพื่อแสดงผลได้อีก อาจต่อ LCD แทน เอาไว้ดู แต่จะต่อหรือไม่ต่อก็ได้ ในความจริงไม่จำเป็น)
เมื่อ MCU จะรับค่าจาก Stellarium โดยผ่าน Communication port นั้นจะมีคำสั่ง

GR = Get RA รับ RA จาก MCU หรือกล้องดูดาว
GD = Get DEC รับ DEC จาก MCU หรือกล้องดูดาว
Sr = Send RA จาก Stellarium โดยการสั่ง Slew จากโปรแกรม
Sd = Send DEC จาก Stellarium โดยการสั่ง Slew จากโปรแกรม

รูปแบบ #: GD # และมันจะมีการส่งข้อมูลในรูป  sDD * MM # or sDD * MM'SS # และ s คือเครื่องหมาย"+" or "-"  สามารถหารายละเอียด code LX200 ได้จาก Internet แต่เราไม่ได้ใช้ทุกคำสั่ง ดังนั้นรู้แค่ 4ตัวพอแล้ว
#: GR # จะเป็น HH: MM.T # or HH: MM: SS #

หมายเหตุ: ใน Stellarium ปัจจุบันมี Bug ในการส่งค่า “*”  แทนที่จะเป็นองศา ดังนั้นเราจะใช้ ASCII code 42 แทน ดังนั้นเราจะอ้างอิง Stellaroum version 0.16.0 เป็นหลัก หากมีการเปลี่ยน Version แล้วไม่ทำงานก็เช็คค่าที่ส่งมาว่ามันเปลี่ยนรูปแบบไปอย่างไรครับ

โดยคำสั่งทั้ง 4 ต้องเริ่มจาก GR, GD หากไม่ส่งค่าเริ่มต้นไป ระบบจะไม่ทำงาน ในตัวอย่างเราตั้งค่าเริ่มต้นที่ดาวเหนือ Polaris

ใปรแกรมจะต้องมี library

#include <stdlib.h>


ซึ่งหาได้ง่ายๆ ใน Internetเราจะจำลองว่าเราเล็งกล้องดูดาวไปที่ดาวเหนือ เมื่อ เลือกดาวดวงใหม่และสั่งให้กล้องหมุนตาม โปรแกรมก็จะสั่งหมุนกล้องตามไป  ลอง upload โปรแกรมนี้เข้า MCU




//*******************************************************************************************
//-------------------------Lesson 1 Stellrarium Comunication------------------------------
//This program is for public knowledge only, you can use it freely.
//Programmed by Ruth.Pra, wirthx@gmail.com
//Ver:1.00
//30 Dec 2017
//---------------------------------------------------------------------------------------


#include <stdlib.h>


long  DECtarget;  // DEC Target receive from stellarium in sec of degree.
long  RAtarget; // RA target receive from stellarium in sec of Hr,
char input[20];                     // Incoming data from Stellarium
long raHH, raMM, raSS;              // minor unit for convertor
char SIGNtel;                       // sign of DEC: 43 = +   45 = -
long decDEG, decMM, decSS;          // minor unit for convertor
long TelRA, TelDEC;// Current telescope RA, Current telescope DEC in sec of HR, and degree
char txRA[10];                      // Feed back RA text to Stellarium
char txDEC[11];                     // Feed back DEC text to Stellarium

void setup() {


  Serial.begin(9600);
  TelRA = 9111; //Set to Polaris for Example only
  TelDEC = 321351; //Set to Polaris for Example only
  RAtarget = TelRA;
  DECtarget = TelDEC;
}

void loop() {
  
  
  if (Serial.available() > 0) communication();
  TelRA=RAtarget;
  TelDEC=DECtarget;

}


void communication() //Comunication between Stellarium and MCU
{
  // Read all communication data
  int i = 0;
  input[i++] = Serial.read();
  delay(5);
  while ((input[i++] = Serial.read()) != '#') {
    delay(5);
  }
  input = '\0';

  if (input[1] == ':' && input[2] == 'G' && input[3] == 'R' && input[4] == '#') {   // with the command #: GR # stellarium
                                                                                                                    // requests the sending of the RA coordinate
    TelRA; // receive update TelRA from global variable
    raHH = TelRA / 3600;                                                       // RA in Hour
    raMM = (TelRA  - raHH * 3600) / 60;                                         // RA in Min
    raSS = (TelRA  - raHH * 3600) - raMM * 60;                               // RA in sec
    sprintf(txRA, "d:d:d#", int(raHH), int(raMM), int(raSS));// convert to stellarium format
    Serial.print(txRA);
  }

  if (input[1] == ':' && input[2] == 'G' && input[3] == 'D' && input[4] == '#') {  
                            // with the command #: GD # stellarium asks for the DEC coordinate to be sent
    TelDEC; // receive update TelDEC from global variable
    (TelDEC < 0) ? SIGNtel = 45 : SIGNtel = 43;                                // check sign of DEC
    decDEG = abs(TelDEC) / 3600;
    decMM = (abs(TelDEC) - decDEG * 3600) / 60;
    decSS = (abs(TelDEC) - decDEG * 3600) - decMM * 60;
    sprintf(txDEC, "%cd%cd:d#", SIGNtel, int(decDEG), 223, int(decMM), int(decSS));
    Serial.print(txDEC);// Transfer to Stellarium

  }

  if (input[1] == ':' && input[2] == 'Q' && input[3] == '#') {   // with #: Q # stellarium command prompts engine stops
                                                                                        // Send the stops to the engines
  }

  if (input[0] == ':' && input[1] == 'S' && input[2] == 'r') {      //Get RA data from stellarium
    Serial.print("1");                                                              // send 1 to activate stellarium to send data
    RAtarget = (atol(input + 4)) * 3600 + (atol(input + 7)) * 60 + atol(input + 10); //Get RA convert to second
  }


  if (input[0] == ':' && input[1] == 'S' && input[2] == 'd') {                      // Get DEC data from stellarium
    Serial.print("1");                                                          // send 1 to activate stellarium to send data
    DECtarget = (atol(input + 5)) * 3600 + (atol(input + 8)) * 60 + atol(input + 11); // convert from degree to second
    if (input[4] == '-') {                                                      // check sign
      DECtarget *= (-1);                                                        // if sign = "-" change to negative value
    }                                                                          //

  }

}

//***********************************************************************************************




ในโปรแกรมจะมีตัวแปรสำคัญ 4 ตัวคือ RAtarget, DECtaget ดาวเป้าหมายที่เราจะไปให้ถึงและ TelRA, TelDEC คือตำแหน่งของ กล้องดูดาว เมื่อ upload เสร็จ สั่งให้ Stellarium เชื่อมต่อจะได้


รอซักครู่ 5 วินาที จะเห็นวงกลมเหลืองและชื่อกล้องของเราปรากฏที่ Polaris ดังในรูป
หากไม่ตรง 100% ไม่ต้องตกใจเพราะมันมีเรื่องเวลาเข้ามาเกียวทีหลังครับ
การจะไปที่ดาวอื่นๆก็เพียงแต่ Click ที่ดาวนั้นๆ จะปรากฏวงกลมขาวๆล้อมรอบ กด
ปุ่ม Current Object เพื่อเลือกและให้ค่าเข้ามา (หรือจะพิมพ์เข้าไปเองก็ได้) กด Slew รอสักพักใหญ่


เนื่องจากเรายังไม่ได้  ตามเป้าหมาย มันไปตลอด ระบบจะค่อยๆวิ่งเข้าหาเป้าแต่ไม่แสดงจนกว่าจะถึงจึงนานหน่อย หากไกลๆก็นานมาก 20-50 วินาที หรือนานเป็นนาทีก็ได้ หากจะเปลี่ยนตำแหน่งกลางคันก็ทำได้ แค่เลือกเป้าหมายใหม่และ Click  Slew


ลองหา MCU มาลองครับ แนะนำ Lolin MCU 32 ครับเอาไปต่อยอดทีหลังได้ เดี๋ยวมาต่อกันในกระทู้ถัดไปเรื่องการสร้างละเอียดขึ้นครับ
แก้ไขข้อความเมื่อ
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่