牧夫天文网

 找回密码
 加入牧夫(请注明天文爱好者,否则无法通过审核)

QQ登录

只需一步,快速开始

[自制DIY] 关于SkySafari手机蓝牙控制赤道仪的LX200串口通信协议的解析

  [复制链接]
马铃鼠 发表于 2015-5-14 17:30 | 显示全部楼层 |阅读模式 来自: 河北省秦皇岛市 联通

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?加入牧夫(请注明天文爱好者,否则无法通过审核)

x
本帖最后由 马铃鼠 于 2015-5-14 17:47 编辑

SkySafari这个软件相信很多同好都不陌生,一款强大的手机端电子星图,而且可以控制几乎市面上所有型号的赤道仪。网上有现成的安卓破解版本可以用。

关于用这款软件控制赤道仪的帖子有很多,不过都是针对于成品的,当我开始自制自己的goto手柄时就一直惦记着这款软件,毕竟用手机控制和电脑控制是两个完全不同的感受。

最近goto手柄的软件部分基本完工了,就添加了蓝牙模块尝试了一下这个软件,竟然比想象中的要简单些,不过这个简单的前提是做好了电脑控制的通信协议解析部分(论坛中也有帖子可以参考)。我用的协议都是LX200协议,下面的内容也只针对于这个协议。其他协议因为没怎么接触就一直回避了,感觉LX200协议已经足够使用。

1.
下面是软件的设置部分,为了兼容,用通用的基本LX200模式就好,Stellarium软件的设置大同小异。
170702n5qgqwbsbdldbzzb.png


2.
不过正是因为用了蓝牙的控制模式,所以前提是电脑端有蓝牙模块与之配对。然后在电脑蓝牙设置部分添加一个COM传入口,用于通信指令的接收。
捕获0.JPG


3.(提前声明:下面的指令中的参数都是不固定的,都是我为了实验临时弄的,看下面的内容前,建议先了解一下LX200协议的内容格式
然后就是指令接收部分了,有了上面的工作,只需要串口助手就足够了。
不过要想软件与串口助手进行通信,也就是让串口助手去模拟赤道仪的话,就必须有相应的回复指令,而且是不间断的按格式顺序回复。
通过实验发现,和电脑端的Stellarium软件一样,只需要回复LX200协议中的:GR#:GD#这两条就行,这两条的意思就是当前望远镜所指目标的赤经赤纬,因为软件认为你的望远镜是会移动方位的,所以它会不停的发送这两条指令去询问你的赤道仪,所以充当赤道仪的串口助手就必须按照LX200协议的格式去按顺序不间断回复,这样软件才会认为和赤道仪连接成功,然后才能进行后面的工作。
RA获取LX200.JPG GDLX200.JPG
这是LX200协议集中的相关指令的回复格式,不过多次试验发现,赤纬的格式不对,要想将坐标精确至角秒,应该是
+74:09:20#或+74*09:20#才对!

至于不间断的回复,我选用了STC下载器自带的串口助手:
捕获.JPG

自动循环发送,间隔10ms,过一会就可以连接成功!
至于波特率,我发现无论是Stellarium还是这个,都是9600B才行,查阅过相关资料,貌似是协议本身的规定?
http://www.iceinspace.com.au/forum/showpost.php?p=554948&postcount=18
这点在下位机制作编程中尤其要注意!
LX200波特率.png


4.
下面是监听到的一段协议指令,附带解析(参考LX200协议集)。
$$$                  //貌似是开始指令?每次连接成功都会有这个,协议集中没有看到相关定义,忽略……
:St+39*56#     //发送当前(软件的设置)纬度,回复1,便可接收,这个针对于没有内置GPS或者相关模块的手柄很有用,但对于我那个没什么用,  不回复接收也没事。协议中的格式是:StsDD*MM#,其中的s是符号。
:Sg240*25#    //这个是本地经度,至于这个值的大小,看协议解释说是用的ASCII码。。。我还不知道怎么转换成十进制数,因为怎么算都不对,不知道这里面是直接融合了东经西经的符号还是直接将数据用正负表示了。。。有懂的同好一定要指点我一下。
:SG-08#         //这个是时区,明明设置了东八区,可是发送回来的是-8,表示不解。。。
:SG-08#         //每次都会回传两次,应该是怕没有接收到?但为什么其他的指令没有?
:SL15:27:25# //这个是当前时间了
:SC05/14/15# //这个是日期

5.
接下来是正式的控制指令,上面的那些应该算是初始化的设置指令,没有回复也没事,但赤道仪那里一定要设置同步了,至少误差不要太大,否则就算发送的坐标没问题(因为是赤道坐标),也可能出现其他问题。

:GR#:RS#:Q#:GD#  //这是最初的几句,:GR#:GD#这个不用说,就是询问你的坐标位置,:RS#这句是速度的设置指令,:Q#这个是停止指令,停止一切轴的运动。
:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#:GD#:GR#
:GD#:GR#:GD#:GR#
//这一堆都是在不间断询问你的坐标,成品赤道仪的goto过程,坐标是不断变化且不断反馈给软件的,因为有可能用户中途终端goto动作,如果不实时更新坐标,将导致赤道仪失去当前位置,也就失去了goto的基准坐标,必须要重新归零设置才能继续goto,我的那个手柄取消了goto过程中坐标的实时更新,也就是不支持goto的中断,这是因为goto过程中设计翻转问题,导致坐标变化比较复杂,不再是常规的”两点一线“的运动,而且翻转动作比较复杂,坐标更新的函数应该也比较复杂,还没有仔细想过,只弄过赤经轴的,但是只能保证起点和终点是正确的,中途不对,如果找到这个更新坐标的对应函数,我想单片机也没有那个系统资源去实时计算处理反馈。。。不过手柄还是支持双轴“点动”过程的坐标更新,因为有可能发生goto不准的调节动作,如果此时不跟新坐标,将导致下次goto更不准。。。这里涉及到了赤道仪的校准问题,这个模块也算是我为以后可能添加的多星校准留下的接口。

6.
关于速度设置指令,LX200协议集中给出了明确的定义:
speedLX200.JPG
从上面可以看出,LX200支持4档速度的切换设置,按个人理解,从上至下依次是:RC跟踪速度(第二慢),RG导星速度(最慢),RM点动速度(第二快,也就是方向键控制赤道仪运转的速度),RS goto速度(最快)。
这个理解不知正确与否,还望指教!

下面是监听到的一段手机软件在设置速度时的指令:
:RM#:GD#:GR#:GD#:GR#
:RC#:GD#:GR#
:RG#:GD#:GR#
:RC#:GD#:GR#:RM#:GD#:GR#:GD#:GR#
:RS#:GD#:GR#:Me#:Qe#:GD#:GR#:Me#:Qe#

速度设置就是软件界面的那一条:
170729kovfooo8koz4c33t.png

这个看似是“无极”调速,实际也只有四档。。。就是上面那四档。
因为我的手柄支持类似于商品的数字键0-9设置速度,goto、导星、跟踪都有专门的速度设置方式,所以感觉这个的意义同样不大。。。

7.
关于手机软件的“点动”指令,其实和导星的那个完全一样!
例如:Me#:Qe#这一句,就是向东运转,然后停止向东运转,指令要想完成类似于方向键的点动(松手即停),就必须这样。
具体详见协议集的定义:
moveLX200.JPG quitLX200.JPG


8.
关于goto指令(Stellarium软件同理)
当选定目标按下goto键时,串口接收到的指令如下:
:Sr11:03:43#
这个是发送目标赤经坐标的意思。

在Stellarium软件中,前面还会多一句:
:Q#:Sr11:03:43#
意思是让赤道仪在进行goto动作前,先停下双轴的动作(例如赤经轴的跟踪动作),但感觉实际这个其实没什么必要,只要你的程序考虑到这些任务的优先级,高优先级自然会将那些任务中断,执行完后还会自动返回。

对于这个指令,LX200协议集中明确规定,必须要回复1才会进行接收,如果没有回复,那个此次goto动作无效,后面的指令不发送,就会变成下面这样:
:Sr04:28:12#:GD#:GR#:GD#:GR#:GD#……
也就是继续之前的询问动作。

当赤道仪回馈软件一个“1”,接下来软件会发送下面这句:
:Sd+61*45:06#
同理,这个是目标的赤纬坐标参数,同样也要回复1才能继续,否则同前。

当坐标接收完成,就是最后的动作指令:
:MS#(注意这里是大写的S,不是前面的:Ms#,向南移动指令)
这个指令就是赤道仪goto动作的开关指令,在此之前,赤道仪双轴必须根据基准和目标坐标的差计算出双轴运转的量才行。



好了,上面罗嗦了一堆,希望对于有意向自制goto的同好提供一些帮助,等哪天有时间,可以共享一下之前写的goto的核心代码,但是是最简单的那种。也希望大神对我的疑问予以指点,谢谢。

目前我的goto手柄软件部分基本完工了,新添加了内置星表的脱机goto功能,星表虽有限,但是全部精选,分类方式和商品的不太一样,改天开帖专门介绍。手机控制基本上所有功能都支持了~
整个代码写了不到1万行(对于我这个单片机入门没多久的渣感觉很知足,我竟然能写这么多,还是实打实的一点点的写出来的,熬了N个夜,可参考的内容很多基本没有,凭空捏造……),大小60K,优化了一部分,程序整体结构可能还不是最佳,但是基本功能都实现了,bug还在测试发现中。。。现在的工作是绘制电路板,时间不多了,得尽快完工才行。





目视派
冯中 发表于 2015-5-14 17:58 | 显示全部楼层 来自: 吉林省吉林市 联通
不错,干货!支持!
回复 支持 反对

使用道具 举报

 楼主| 马铃鼠 发表于 2015-5-14 18:33 | 显示全部楼层 来自: 河北省秦皇岛市 联通
冯中 发表于 2015-5-14 17:58
不错,干货!支持!

回复 支持 反对

使用道具 举报

linkage 发表于 2015-5-14 18:41 | 显示全部楼层 来自: 宁夏固原市 电信
有个问题,不是所有的赤道仪都可以兼容LX200协议。

对应不同的赤道仪,需要选择各自厂家提供的协议才行。

当然,自制的完全可以使用LX200兼容协议。

点评

就是自制的,据说ASCOM可以作为协议转换平台,但是还没研究过  发表于 2015-5-14 19:06
回复 支持 反对

使用道具 举报

 楼主| 马铃鼠 发表于 2015-5-15 12:04 | 显示全部楼层 来自: 河北省秦皇岛市 联通
fnzhh 发表于 2015-5-15 09:14
:Sg240*25#    //这个是本地经度,至于这个值的大小,看协议解释说是用的ASCII码。。。我还不知道怎么转换 ...

果然,但为什么?是格式就是这样?负号表示的就是东吗?
回复 支持 反对

使用道具 举报

aiwanzhe 发表于 2015-6-2 11:32 | 显示全部楼层 来自: 湖北省恩施州建始县 新闻中心
1、SkySafari软件里,将望远镜类型设为Celestron NexStar 5/8,使用普通的HC-05型蓝牙模块与手机配对,连接时返回“连接失败 该望远镜没有响应,你已经断开连接。你想重新连接吗?”信息,并闪现了一下蓝色方位标,只要蓝牙响应并回复软件数据,应该可以连接。
2、将望远镜类型设为Starmaster Sky Tracker,使用普通的HC-05型蓝牙模块与手机配对后,完全能成功连接,并出现蓝色方位标。
3、其他类型的都是连接失败。
这只在arduino板接上蓝牙模块通电而无代码情况下测试的,相信arduino烧录必要的代码后,完全可以利用SkySafari强大的天体数据库自制GOTO赤道仪。

点评

那是因为你在试图连接电子星图时,星图软件会询问你的“赤道仪”一些信息,你必须按照协议格式回复,如果不及时回复,它会认为连接失败(赤道仪型号不匹配,也就是通信协议不匹配),这也是为什么需要用到虚拟串口去  详情 回复 发表于 2015-6-2 23:20
回复 支持 反对

使用道具 举报

 楼主| 马铃鼠 发表于 2015-6-2 23:20 | 显示全部楼层 来自: 河北省秦皇岛市 联通
aiwanzhe 发表于 2015-6-2 11:32
1、SkySafari软件里,将望远镜类型设为Celestron NexStar 5/8,使用普通的HC-05型蓝牙模块与手机配对,连接 ...

那是因为你在试图连接电子星图时,星图软件会询问你的“赤道仪”一些信息,你必须按照协议格式回复,如果不及时回复,它会认为连接失败(赤道仪型号不匹配,也就是通信协议不匹配),这也是为什么需要用到虚拟串口去研究,不同厂家的赤道仪通信协议基本都不相同。所以可能有的不需要回复,或者应该是不在连接后直接回复,我选择LX200是因为这个协议集完全公开,之前也接触的最多,方便使用。
回复 支持 反对

使用道具 举报

本版积分规则

快速回复 返回顶部 返回列表