本帖最后由 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[20]; //用作接收Stellarium发送的命令
- char txRA[10]; //用作返回RA给Stellarium
- char txDEC[11]; //用作返回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[i++] = Serial.read();
- delay(5);
- while((input[i++] = Serial.read()) != '#'){
- delay(5);
- }
- input[i]='\0';
-
- if(input[1]==':' && input[2]=='G' && input[3]=='R' && input[4]=='#'){ //命令 #:GR# stellarium询问现在望远镜指向的RA值
- transmitRA(); //发送赤道仪AR值给stellarium
- }
- if(input[1]==':' && input[2]=='G' && input[3]=='D' && input[4]=='#'){ //命令 #:GD# stellarium询问现在望远镜指向的DEC值
- transmitDEC(); //发送赤道仪DEC值给stellarium
- }
- //if(input[1]==':' && input[2]=='Q' && input[3]=='#'){ //命令 #:Q# stellarium 要求赤道仪停止运行??????先注释掉不用
- //
- // }
- if(input[0]==':' && input[1]=='S' && input[2]=='r'){ // #:Q#:Sr 04:06:12# stellarium发送目标RA值命令
- getRA(); //取得stellarium发送目标RA值
- }
-
-
- if(input[0]==':' && input[1]=='S' && input[2]=='d'){ //# :Sd +76:24:55# stellarium发送目标DEC值命令
- getDEC(); //取得stellarium发送目标DEC值
- }
-
-
- if(input[0]==':' && input[1]=='M' && input[2]=='S' && input[3]=='#'){ //: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[4] == '-'){ //判断是不是 -
- DECtarget *=(-1); //如果是 把值改为负值
- }
- }
-
-
- //--------------------------------------------------------------------------------------------------------------------------------------------------------
复制代码 当在stellarium 中按下 crtl+1 或者slew 赤道仪会移动到指定目标。效果如下(不懂发视频,上个视频连接吧):
http://v.youku.com/v_show/id_XMTQ5NzMxNDE4MA==.html |