open 发表于 2016-3-12 11:58

从零开始打造一个GOTO系统(2)

本帖最后由 open 于 2016-3-12 12:00 编辑

   前言:学习进度很慢哦。所以学到哪写到哪了。前面一篇写了如果在stellarium在模拟赤道仪所在位置。接下来是让stellarium控制赤道仪指向目标了。   首先要理解stellarium接下来所发送的命令。这里同样复制论坛中的资料。
    当在stellarium 中按下 crtl+1 或者slew , 则向下位机发送
    #:Q#:Sr 04:06:12#                发送目标RA值
   回复1,则再发送                     回复1 ,表示ok
   # :Sd +76:24:55#                  发送目标DEC值
      回复1,则在发送                     回复1 ,表示ok
      MS#                                           MS# 命令发送就是告诉下位机,你可以move了 ,应该这是叫 move scope   接下来就是要处理stellarium所发送的命令了。代码如下。延续上一篇的的代码略为修改。
#include <stdlib.h>
char input;                     //用作接收Stellarium发送的命令
char txRA;                      //用作返回RA给Stellarium
char txDEC;                     //用作返回DEC给Stellarium
long RAtel, DECtel;               //用作记录赤道仪RA DEC
long RAtarget, DECtarget;         //有作接收Stellarium发送来的 RA DEC 值
long raHH, raMM, raSS;            //RA
char SIGNtel;                     // DEC: 43 = +   45 = -
long decDEG, decMM, decSS;          // DEC




void setup() {
Serial.begin(9600);               //端口波特比
RAtarget = RAtel = 9110;             //初始化赤道仪RA值在Stellarium上标识 以秒计算 北极星RA 02:31:50#   2*3600+31*60+50
DECtarget = DECtel = 321351;         //初始化赤道仪DEC值在Stellarium上标识 以秒计算 北极星DEC +89*15:51#   89*3600+15*60+51
}


void loop() {
if(Serial.available()>0){
    RecvCommand(); //接收Stellarium命令
}
}


//--------------------------------------------------------------------------------------------------------------------------------------------------------   

void RecvCommand(){

int i=0;
input = Serial.read();
delay(5);
while((input = Serial.read()) != '#'){
    delay(5);
}
input='\0';

if(input==':' && input=='G' && input=='R' && input=='#'){             //命令 #:GR# stellarium询问现在望远镜指向的RA值
    transmitRA();                                                                   //发送赤道仪AR值给stellarium
}


if(input==':' && input=='G' && input=='D' && input=='#'){             //命令#:GD# stellarium询问现在望远镜指向的DEC值
    transmitDEC();                                                                  //发送赤道仪DEC值给stellarium
}


//if(input==':' && input=='Q' && input=='#'){                              //命令 #:Q# stellarium 要求赤道仪停止运行??????先注释掉不用
//
// }


if(input==':' && input=='S' && input=='r'){                              //#:Q#:Sr 04:06:12#stellarium发送目标RA值命令
    getRA();                                                                        //取得stellarium发送目标RA值
}

   
if(input==':' && input=='S' && input=='d'){                              //# :Sd +76:24:55# stellarium发送目标DEC值命令
    getDEC();                                                                     //取得stellarium发送目标DEC值
}


if(input==':' && input=='M' && input=='S' && input=='#'){         //:MS# 当 stellarium 发送完 目标 RA DEC 后 告诉赤道仪可以移动了.
      Serial.print("0");                                                         //回复stellarium 0 表示结束
      RAtel = RAtarget;                                                         //更新赤道仪的RA值为目标RA值
      DECtel = DECtarget;                                                         //更新赤道仪的DEC值为目标DEC值
}
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------   

void transmitRA(){                                                            // 发送赤道仪AR值给stellarium   
   raHH = RAtel/3600;
   raMM = (RAtel-raHH*3600)/60;
   raSS = (RAtel-raHH*3600)-raMM*60;
   sprintf(txRA, "%02d:%02d:%02d#", int(raHH), int(raMM), int(raSS));
   Serial.print(txRA);   
    }
   
//--------------------------------------------------------------------------------------------------------------------------------------------------------   

void transmitDEC(){                                                             // 发送赤道仪DEC值给stellarium   
   
   (DECtel < 0) ? SIGNtel = 45: SIGNtel = 43;                                 // DEC值 有 正 负 之分在ansi码中 43是 +45是 - 如 +76:24:55#-76:24:55#
   decDEG = abs(DECtel)/3600;
   decMM = (abs(DECtel) - decDEG*3600)/60;
   decSS = (abs(DECtel) - decDEG*3600) - decMM*60;
   sprintf(txDEC, "%c%02d%c%02d:%02d#", SIGNtel, int(decDEG), 42, int(decMM), int(decSS));
   Serial.print(txDEC);

    }
   
//--------------------------------------------------------------------------------------------------------------------------------------------------------   
      
void getRA(){                                                                   //取得stellarium发送过来的RA值 格式是 :Sr HH:MM:SS#
   Serial.print("1");                                                      //回复stellarium 1 表示OK 让stellarium 继续发送DEC
   RAtarget = (atol(input+4))*3600 + (atol(input+7))*60 + atol(input+10);   //保存
    }


//--------------------------------------------------------------------------------------------------------------------------------------------------------   
   
void getDEC(){                                                                  //取得stellarium发送过来的DEC值 格式是 :Sd +DD*MM:SS#   
    Serial.print("1");                                                         //回复stellarium 1 表示OK 让stellarium 继续
    DECtarget = (atol(input+5))*3600 + (atol(input+8))*60 + atol(input+11);
    if (input == '-'){                                                       //判断是不是 -
      DECtarget *=(-1);                                                         //如果是 把值改为负值
    }
   }


//--------------------------------------------------------------------------------------------------------------------------------------------------------   当在stellarium 中按下 crtl+1 或者slew 赤道仪会移动到指定目标。效果如下(不懂发视频,上个视频连接吧):
http://v.youku.com/v_show/id_XMTQ5NzMxNDE4MA==.html

hhbb 发表于 2016-3-12 12:28

楼主厉害!

火星蒙面侠 发表于 2016-3-12 16:59

厉害,到现在我连个步进电机都没搞定{:5_302:}

open 发表于 2016-3-14 11:37

火星蒙面侠 发表于 2016-3-12 16:59
厉害,到现在我连个步进电机都没搞定

至今我也不懂怎么整步进电机。我还没有买步进电机

天籁 发表于 2016-4-3 17:20

open 发表于 2016-3-14 11:37
至今我也不懂怎么整步进电机。我还没有买步进电机

我做过一个脱离电脑的GOTO,你可以搜索我的帖子。。硬件我会,有空可以多交流哈。。至于这个操作这个stellarium软件,结合起来应该是非常简单的。。。

guoifei 发表于 2016-4-3 19:29

这个不错

xiaoguilink 发表于 2016-4-3 20:24

天籁 发表于 2016-4-3 17:20
我做过一个脱离电脑的GOTO,你可以搜索我的帖子。。硬件我会,有空可以多交流哈。。至于这个操作这个stel ...

请教老兄,你做的星图是用什么投影系的?点击拾取是怎么逆变换的?我现在做的星图是正投影,点击拾取老出问题,准确率很低。

天籁 发表于 2016-4-20 12:35

xiaoguilink 发表于 2016-4-3 20:24
请教老兄,你做的星图是用什么投影系的?点击拾取是怎么逆变换的?我现在做的星图是正投影,点击拾取老出 ...

极射赤平投影,stellarium就是用这个投影。点击拾取是搜索显示坐标中靠触点最近的那个星。

xiaoguilink 发表于 2016-4-20 12:46

天籁 发表于 2016-4-20 12:35
极射赤平投影,stellarium就是用这个投影。点击拾取是搜索显示坐标中靠触点最近的那个星。
...

能否告知具体算法,该投影的变换矩阵一直查不到,自己也不会算,拾取的逆变换也是方便的话留个QQ,有偿。
页: [1]
查看完整版本: 从零开始打造一个GOTO系统(2)