牧夫天文网

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

QQ登录

只需一步,快速开始

[自制DIY] 菜鸟如何自制通过stellarium来控制赤道仪goto--基本功能完成

  [复制链接]
角落里的烟嘴 发表于 2012-12-25 17:07 | 显示全部楼层 |阅读模式 来自: 江苏省苏州市 联通

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

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

x
本帖最后由 角落里的烟嘴 于 2013-2-15 13:25 编辑

挖坟数贴,开始记录
第一步:看看stellarium 出来的goto信号是啥样子的
  1、选择第二个 software or remote

2、记录好IP地址 和端口


3、打开调试工具(挖坟所得),钩上显示十六进制值,最底下那个,建立 一个tcp服务器

4、添加完毕,链接

5、 选择一个目标,然后 “ctrl+1”, S就会发送出控制赤道仪的信号
6、 tcp 服务器收到的一个数据(月亮的)


20位数据的鸟文解释
client->server:
MessageGoto (type =0)
LENGTH (2 bytes,integer): length of the message
TYPE   (2 bytes,integer): 0
TIME   (8 bytes,integer): current time on the client computer in microseconds
                  since 1970.01.01 UT. Currently unused.
RA     (4 bytes,unsigned integer): right ascension of the telescope (J2000)
           a value of 0x100000000 = 0x0 means 24h=0h,
           a value of 0x80000000 means 12h
DEC    (4 bytes,signed integer): declination of the telescope (J2000)
           a value of -0x40000000 means -90degrees,
           a value of 0x0 means 0degrees,
           a value of 0x40000000 means 90degrees
图示



关键数据就是下面这个了,接下去该怎么弄 ?  需要怎么处理,如何处理,才能转给单片机进行工作呢?  各位前辈大神请显现身吧~~

这个是月亮的

13
14
15
16
17
18
19
20
32
71
3A
12
1F
9A
D7
F9
50
113
58
18
31
154
215
249
RA
DEC


这是随便另外找了一个
RA
DEC
1
2
3
4
1
2
3
4
C1
BC
67
20
54
76
E8
2
193
188
103
32
84
118
232
2




lovez3 发表于 2012-12-25 17:37 | 显示全部楼层 来自: 浙江省杭州市 电信
呃,技术贴啊,看不懂,帮顶了。
回复 支持 反对

使用道具 举报

whw5555 发表于 2012-12-25 17:56 | 显示全部楼层 来自: 北京市 联通
烟嘴弄得什么goto呀? 你有数据库吗?
回复 支持 反对

使用道具 举报

三叶观天 发表于 2012-12-25 18:04 | 显示全部楼层 来自: 广东省深圳市 电信
不错,学习了,虽然现在还没有赤道仪。
回复 支持 反对

使用道具 举报

haoxing168 发表于 2012-12-25 18:05 | 显示全部楼层 来自: 浙江省杭州市 阿里云BGP数据中心
牛贴。顶下。
回复 支持 反对

使用道具 举报

夜光蜗牛 发表于 2012-12-25 18:12 | 显示全部楼层 来自: 上海市杨浦区 /虹口区电信
你要通过什么口控制?串口的话,不用转10进制,直接塞进缓冲区,调用系统接口函数creatfile,openport,就能用串口输出了~

点评

菜鸟表示 “不用转10进制,直接塞进缓冲区,调用系统接口函数creatfile,openpor" 这应该是具体的代码如何实现的方式吧? 先mark,我现在还一点概念没有[/backcolor] 挖坟数贴(包括你的..... 0 0# ),大概理解为: 1  详情 回复 发表于 2012-12-25 22:01
回复 支持 反对

使用道具 举报

tnt 发表于 2012-12-25 18:33 | 显示全部楼层 来自: 湖南省长沙市岳麓区 电信
烟嘴快要进化为大神了,就差那么一点点了。

点评

T 总啊 , 200秒 折腾死了人啦, 为啥啊 阿烦的人 我给你回复了好几遍 0 0!  详情 回复 发表于 2012-12-25 23:34
回复 支持 反对

使用道具 举报

xwxwwx 发表于 2012-12-25 18:51 | 显示全部楼层 来自: 湖北省黄石市 电信
虽然我没有完全理解你的思路,但是还是觉得你的思路有问题。

stellarium 发送的信号我没有记错的话应该是串口信号,也就是说不是脉冲,而是数据流,并且是带奇偶校验、流控制的数据流,你试图通过统计的方式找到规律是不可行的。

我的看法是有两种办法实现你的目的:
第一是设置协议把你的单片机作为下位机来接收这个串口数据,通过单片机来解释这个数据,然后驱动步进电机。
第二是根据stellarium 的数据流方式来解析数据,转换成单片机能够执行的单个命令。
但是这两种方法都不好弄呀。

点评

第二是根据stellarium 的数据流方式来解析数据,转换成单片机能够执行的单个命令。 VB来解释 stellarium 的数据流,并转成单片机能够执行的命令, VB 从串口向 单片机发送数据  详情 回复 发表于 2013-1-10 12:55
我觉得 我应该说清楚了, 你不是搞软件的么, 设置一个目标 然后 下命令 开始 goto 大S 就只发出一个 TCP 的数据包啊。 我现在想知道 这个 TCP 协议的数据包, 包含了这些信息 我如何利用起来, 翻译成 单片机  详情 回复 发表于 2012-12-25 22:09
他用tcp/ip方式接受的,不是串口模式~。 另外那个能自己理解的,官网上有协议的~  详情 回复 发表于 2012-12-25 18:55
回复 支持 反对

使用道具 举报

夜光蜗牛 发表于 2012-12-25 18:55 | 显示全部楼层 来自: 上海市杨浦区 /虹口区电信

他用tcp/ip方式接受的,不是串口模式~。
另外那个能自己理解的,官网上有协议的~

点评

你说的对,是tcpip方式接收的,那就不是带奇偶校验和流控制的数据流。是符合tcpip协议的数据流了,这个更不好弄,还不知道是否是加密过的......  详情 回复 发表于 2012-12-25 19:10
回复 支持 反对

使用道具 举报

xwxwwx 发表于 2012-12-25 19:10 | 显示全部楼层 来自: 湖北省黄石市 电信
夜光蜗牛 发表于 2012-12-25 18:55
他用tcp/ip方式接受的,不是串口模式~。
另外那个能自己理解的,官网上有协议的~
...

你说的对,是tcpip方式接收的,那就不是带奇偶校验和流控制的数据流。是符合tcpip协议的数据流了,这个更不好弄,还不知道是否是加密过的......

点评

没有加密的 S 本来就是开源的吧 不会加密,而且实际上 论坛里好几位都做成功了 夜光蜗牛 给出了翻译  详情 回复 发表于 2012-12-26 12:19
回复 支持 反对

使用道具 举报

夜光蜗牛 发表于 2012-12-25 19:30 | 显示全部楼层 来自: 上海市杨浦区 /虹口区电信
这是我以前写的翻译的源码,由于时间有点久....我也不太记得当时怎么写的了.....但能获取数据。
其实更简便的方法是直接从数据库拿数据,只是我不知道哪里有数据库。还请那位头像很牛叉的同学指点一下~~~~
#include<iostream>
#include<stdio.h>
#include<winsock2.h>
#include<stdlib.h>
#include<math.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

int* control(int,char*);

int main()
{
        int i=1;
        char buf[20];
        char *addr_1=buf;

        struct sockaddr_in my_addr;
        WSADATA wsaData;
        WORD wVersionRequested=MAKEWORD(1,1);

        if(WSAStartup(wVersionRequested,&wsaData))
        {
                printf("Winsock Initialization failed.\n");
                exit(1);
        }
       
        SOCKET sk;
        sk=socket(AF_INET,SOCK_STREAM,0);
        if(sk==SOCKET_ERROR)
        {
                printf("socket error");
        }
        my_addr.sin_family=AF_INET;
        my_addr.sin_port=htons(10001);
        my_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
        bind(sk,(struct sockaddr*)&my_addr,sizeof(struct sockaddr));
        listen(sk,20);
        sk=accept(sk,(struct sockaddr*)&my_addr,NULL);
        while(1)
        {
                if(sk<0)
                {
//                        send(sk,addr_1,8,0);
                        closesocket(sk);
                        WSACleanup();
                }
                else
                {
                        control(sk,addr_1);
                        Sleep(1);
                }
        }
        return 0;
}

int* control(int sk,char*addr_1)
        {
                int i=0;
                int data[20];
                unsigned int Ra=0;
                int De=0;
                char status=recv(sk,addr_1,24,0);
                if(status==SOCKET_ERROR)
                {
                                cout<<"error in receiving"<<endl;
                }
                else
                {
                        for(i=1;i<=20;i++)
                        {
                                if(int(*addr_1)<0)
                                {
                                        data[i-1]=int(*addr_1)+256;}
                                else
                                {
                                        data[i-1]=int(*addr_1);}
                                addr_1++;
                        }
                        for(i=1;i<=4;i++)
                        {
                                Ra=Ra+data[i+11]*pow(16,2*(i-1));
                                De=De+data[i+15]*pow(16,2*(i-1));
                        }
                        Ra=Ra/49710;
                        De=De/3314;
                        cout<<Ra<<" "<<De;
                }
return 0;
        }

点评

原来答案早就有了 for(i=1;i  详情 回复 发表于 2012-12-27 14:20
现成的! 谢谢了! mark! 慢慢学习!!!  详情 回复 发表于 2012-12-25 22:15
回复 支持 反对

使用道具 举报

夜光蜗牛 发表于 2012-12-25 19:51 | 显示全部楼层 来自: 上海市杨浦区 /虹口区电信
看了一遍,现在发现当时非常二~,只要定义一个整型指针,指向ra或de的位置,直接读就行了.....
我还是太年轻了....

点评

前辈 现身了, 菜鸟表示 无法实现 “定义一个整型指针,指向ra或de的位置,直接读就行了”[/backcolor] 另外 S给出的 RA DE 的数值 如何利用啊?[/backcolor]  详情 回复 发表于 2012-12-25 21:46
回复 支持 反对

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2012-12-25 21:46 | 显示全部楼层 来自: 江苏省苏州市 电信
夜光蜗牛 发表于 2012-12-25 19:51
看了一遍,现在发现当时非常二~,只要定义一个整型指针,指向ra或de的位置,直接读就行了.....
我还是太年 ...

前辈 现身了, 菜鸟表示  无法实现 “定义一个整型指针,指向ra或de的位置,直接读就行了”
另外  S给出的 RA DE 的数值 如何利用啊?
回复 支持 反对

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2012-12-25 22:01 | 显示全部楼层 来自: 江苏省苏州市 电信
夜光蜗牛 发表于 2012-12-25 18:12
你要通过什么口控制?串口的话,不用转10进制,直接塞进缓冲区,调用系统接口函数creatfile,openport,就能 ...

菜鸟表示 “不用转10进制,直接塞进缓冲区,调用系统接口函数creatfile,openpor" 这应该是具体的代码如何实现的方式吧? 先mark,我现在还一点概念没有
挖坟数贴(包括你的..... 0 0# ),大概理解为:
1、制作一个外挂程序 等于是一个 TCP 服务器
2、大 S 发出 数据
3、外挂程序接收并进行翻译处理
4、外挂程序从串口输出单片机能懂的信号
5、单片机接收信号
6、电机工作
所以应该是串口控制, 单片机是可以直接能接收串口过来的数据的哦 ?


回复 支持 反对

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2012-12-25 22:09 | 显示全部楼层 来自: 江苏省苏州市 电信
xwxwwx 发表于 2012-12-25 18:51
虽然我没有完全理解你的思路,但是还是觉得你的思路有问题。

stellarium 发送的信号我没有记错的话应该是 ...

我觉得 我应该说清楚了, 你不是搞软件的么, 设置一个目标 然后 下命令 开始 goto 大S  就只发出一个 TCP 的数据包啊。    我现在想知道  这个  TCP 协议的数据包, 包含了这些信息 我如何利用起来, 翻译成 单片机能懂的,单片机在去驱动步进电跟。

点评

呵呵,更正一点,我做的是和数据库有关的工作,编程只是爱好,单片机完全不懂,算我没说。  详情 回复 发表于 2012-12-25 22:29
回复 支持 反对

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2012-12-25 22:15 | 显示全部楼层 来自: 江苏省苏州市 电信
夜光蜗牛 发表于 2012-12-25 19:30
这是我以前写的翻译的源码,由于时间有点久....我也不太记得当时怎么写的了.....但能获取数据。
其实更简便 ...

现成的! 谢谢了!   mark! 慢慢学习!!!
回复 支持 反对

使用道具 举报

xwxwwx 发表于 2012-12-25 22:29 | 显示全部楼层 来自: 湖北省黄石市 电信
角落里的烟嘴 发表于 2012-12-25 22:09
我觉得 我应该说清楚了, 你不是搞软件的么, 设置一个目标 然后 下命令 开始 goto 大S  就只发出一个 TC ...

呵呵,更正一点,我做的是和数据库有关的工作,编程只是爱好,单片机完全不懂,算我没说。

点评

我解释一下 我的想法, 1 单片机部分 单片机+驱动板+步进电机 单片机可以通过驱动板控制步进电机的几个参数 1、转动的方向 2、转多少圈 或者说转多少角度 实际上是转多少个步距角 3、转速 所以如果要goto,  详情 回复 发表于 2012-12-26 12:40
回复 支持 反对

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2012-12-25 23:34 | 显示全部楼层 来自: 江苏省苏州市 电信
tnt 发表于 2012-12-25 18:33
烟嘴快要进化为大神了,就差那么一点点了。

         T 总啊 ,  200秒   折腾死了人啦, 为啥啊 阿烦的人   我给你回复了好几遍   0 0!   
回复 支持 反对

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2012-12-26 12:19 | 显示全部楼层 来自: 江苏省苏州市 联通
xwxwwx 发表于 2012-12-25 19:10
你说的对,是tcpip方式接收的,那就不是带奇偶校验和流控制的数据流。是符合tcpip协议的数据流了,这个更 ...

没有加密的 S 本来就是开源的吧 不会加密,而且实际上 论坛里好几位都做成功了  
夜光蜗牛   给出了翻译
回复 支持 反对

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2012-12-26 12:40 | 显示全部楼层 来自: 江苏省苏州市 联通
xwxwwx 发表于 2012-12-25 22:29
呵呵,更正一点,我做的是和数据库有关的工作,编程只是爱好,单片机完全不懂,算我没说。 ...

我解释一下 我的想法,
1 单片机部分
   单片机+驱动板+步进电机
   单片机可以通过驱动板控制步进电机的几个参数 1、转动的方向 2、转多少圈 或者说转多少角度 实际上是转多少个步距角 3、转速
   所以如果要goto,当定好参考点,和目标点,只要告诉单片机 1、方向 2、转多少角度  (这里转多少角度应该是参考点与目标点的相对值)  3、速度  
   所以如果要goto,则需要告诉单片机两组参数 1、 连个转动方向  2、两个相对转动的角度 3、速度

2、 Stellarium部分
    S可以给出一个20为数组  数组中包含了 1、本地时间 2、目标夜光
的 RA、 DEC值
    单片机无法直接使用这些数据,所以需要把这组数据翻译软件成单片机所需要的两组数据,楼上  @夜光蜗牛 前辈给出了翻译的代码(菜鸟表示无法理解啊 没有C语言基础),翻译软件将S的数据翻译好了直接就可以给到单片机,单片机按照翻译出来的 方向、角度、速度(速度应该是直接设定了),驱动步进电机转动就行了。


综上

PS:@夜光蜗牛  
能否指导一下 您的翻译代码 最后翻译成什么数据了啊? 如何利用S出来的20位数据?


回复 支持 反对

使用道具 举报

本版积分规则

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