本帖最后由 角落里的烟嘴 于 2013-5-31 21:05 编辑
还是挖坟无数贴,参考学习前辈们的经验,当然论坛里是已有DDR大神制作完成的goto,还有单独的导星,此贴立下,希望能给想自己动手制作但是没有基础的同好们一个参考,这里记录的东西都会经过我自己的理解加以解释,因为我自己也是摸石头过河的,当然抄袭是必须的,但是我会根据我的理解加以解释,方便你我理解。
写在前面,LX200串口协议是上位机通过串口向下位机发送 字符串 格式的命令,下位机只要按照协议正确回复上位机的命令就可以。LX200串口协议是大多数软件所支持的,只要按照LX200协议制作好下位机,适用的的上位机软件就非常之多了,基本所有的星图软件、导星软件、都支持,直接串口相连就能用起来了。 成功案例很多的,本坛里一艘就出来。
PS:之前做的VB外挂基于TCP协议的,不是直接通过星图软件从COM控跟下位机通信,而且VB外挂程序从TCP协议接收到数据处理,之后再从com口控制下位机。 所以通用性是不高的。所以才会想着看看LX200是咋回事。
第一步、虚拟环境准备
1、星图软件 软件 stellarium
2、虚拟串口软件 Virtual Serial Ports Emulator
3、串口监控软件 “串口监控器”
4、 LX200串口协议 谷歌文库
http://wenku.baidu.com/view/3e8dda3231126edb6f1a1080.html
第二部、 建立虚拟串口通道
1、 虚拟串口软件 Virtual Serial Ports Emulator
2、 新建一个虚拟串口通道 类型选择为 Pair ,这样会生成两个相互已建立好的com 口。
3、 配置星图软件stellarium 使用 comA
4、 配置 串口监控器 使用comB
comA comB 是已建立好相互通信的,在A发B就收到,在B发A就自动能收到
第三步、抓取通信过程中的命令
1、 stellarium 在没有任何操作的时候会不停的发送
#:GR# (询问现在望远镜指向的RA值)
2、 当正确回复 stellarium时,会发送
#:GD# (询问现在望远镜指向的DEC值)
3、 当正确回复 GD时,stellarium中会出现一个黄色圆圈
4、 当没有正确回复 GD时, stellarium 重复发送 GR# 来询问
以上 1-4 是 不停止的, 回复 GR GD 是需要按照一定格式进行回复的,参看LX200串口协议
1-4的功能,我的理解是stellarium问下位机,你现在的位置是什么,你告诉我,我好在星图中给你显示出来(黄色圆圈),如果你不告诉我的话,我是不会显示的哦。。。亲。。。如果你一直在动,我会一直给你更新的哦。。。随便你怎么动哦。。。亲。。。。比如你手动控制你的望远镜指向,我就能在星图上帮你显示,你现在在看什么哦。。。亲,好人性化哦。。。。。。。。@@%……&%……& 我瞎扯的
5、当在stellarium 中按下 crtl+1 或者slew , 则向下位机发送
##:Sr 04:06:12# 发送目标RA值
回复1,则再发送 回复1 ,表示ok
# :Sd +76:24:55# 发送目标DEC值
回复1,则在发送 回复1 ,表示ok
MS# MS# 命令发送就是告诉下位机,你可以move了 ,应该这是叫 move scope
6、在 move scope 的时候, stellarium还是不辞幸劳的 重复 “1、2、3、4、” ,实时更新星图里的黄色圈圈
抓一个stellarium的运行log上来给大家参考一下 ,另外回复stellarium的时候 不能带“\n”,就是回车或者叫换行发送,就是"#" 不能带 回车,但是能带“0” 的, 就是不能换行。
询问 RA DEC 的日志
15765, 09:27:09.609375Z: Connection::performWriting: writeNonblocking(5) returned 5; #:GR#
15765, 09:27:10.171875Z: Connection::performReading: readNonblocking returned 9; 02:31:45#
15765, 09:27:10.171875Z: Lx200CommandGetRa::readAnswerFromBuffer: RA = 02:31:45
15765, 09:27:10.171875Z: Lx200Connection::writeFrontCommandToBuffer(Lx200CommandGetDec): queued
15765, 09:27:10.234375Z: Connection::performWriting: writeNonblocking(5) returned 5; #:GD#
15765, 09:27:10.984375Z: Connection::performReading: readNonblocking returned 7; +89*15#
15765, 09:27:10.984375Z: Lx200CommandGetDec::readAnswerFromBuffer: error: degree sign expected
15765, 09:27:10.984375Z: Lx200CommandGetDec::readAnswerFromBuffer: Dec = +89:15:00
slew goto 的时候好像有问题。。。。。。。日志如下 红色部分 不明所以
15765, 09:28:29.687500Z: Connection::performWriting: writeNonblocking(5) returned 5; #:GR#
15765, 09:28:29.718750Z: Lx200Connection::sendCommand(Lx200CommandStopSlew)
15765, 09:28:29.718750Z: Lx200Connection::sendCommand(Lx200CommandSetSelectedRa(4:6:12))
15765, 09:28:29.718750Z: Lx200Connection::sendCommand(Lx200CommandSetSelectedDec(+76:24:55))
15765, 09:28:29.718750Z: Lx200Connection::sendCommand(Lx200CommandGotoSelected)
15765, 09:28:31.406250Z: Connection::performReading: readNonblocking returned 9; 02:31:45#
15765, 09:28:31.406250Z: Lx200CommandGetRa::readAnswerFromBuffer: RA = 02:31:45
15765, 09:28:31.406250Z: Lx200Connection::writeFrontCommandToBuffer(Lx200CommandGetDec): queued
15765, 09:28:31.500000Z: Connection::performWriting: writeNonblocking(5) returned 5; #:GD#
15765, 09:28:32.015625Z: Connection::performReading: readNonblocking returned 7; +89*15#
15765, 09:28:32.015625Z: Lx200CommandGetDec::readAnswerFromBuffer: error: degree sign expected
15765, 09:28:32.015625Z: Lx200CommandGetDec::readAnswerFromBuffer: Dec = +89:15:00
15765, 09:28:32.015625Z: Lx200Connection::writeFrontCommandToBuffer(Lx200CommandStopSlew): queued
15765, 09:28:32.015625Z: Lx200Connection::writeFrontCommandToBuffer(Lx200CommandSetSelectedRa(4:6:12)): queued
15765, 09:28:32.031250Z: Lx200Connection::sendCommand(Lx200CommandGetRa)
15765, 09:28:32.031250Z: Lx200Connection::sendCommand(Lx200CommandGetDec)
15765, 09:28:32.109375Z: Connection::performWriting: writeNonblocking(17) returned 17; ##:Sr 04:06:12#
15765, 09:28:36.234375Z: Connection::performReading: readNonblocking returned 1; 1
15765, 09:28:36.234375Z: Lx200CommandSetSelectedRa::readAnswerFromBuffer:ra valid
15765, 09:28:36.234375Z: Lx200Connection::writeFrontCommandToBuffer(Lx200CommandSetSelectedDec(+76:24:55)): queued
15765, 09:28:36.328125Z: Connection::performWriting: writeNonblocking(14) returned 14; :Sd +76?24:55#
15765, 09:28:38.109375Z: Connection::performReading: readNonblocking returned 1; 1
15765, 09:28:38.109375Z: Lx200CommandSetSelectedDec::readAnswerFromBuffer:dec valid
15765, 09:28:38.109375Z: Lx200Connection::writeFrontCommandToBuffer(Lx200CommandGotoSelected): queued
15765, 09:28:38.171875Z: Connection::performWriting: writeNonblocking(4) returned 4; :MS#
刚才测试了一下 按下面格式正确回复 GR GD stellarium里的黄色圈圈就工作正常了,昨天好像 DEC的格式没弄对
回复 GR GD 的格式
RA 02:08:45# in hour
DEC +80*19# in degree |
第四步, 下位机的设计
1、能识别上位机发送过来的 命令是啥 比如 GR# GD# MS# ,所以前提是我的下位机他知道他现在自己的指向的目标的RA DEC是多少,所以需要一星校准、三星校准。这样就行了吧?
2、得到上位机的 目标星参数 ,控制步进电机相应运动
3、返回当前 指向的RA DEC
|
|