角落里的烟嘴 发表于 2012-12-25 17:07

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

本帖最后由 角落里的烟嘴 于 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
图示



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

这个是月亮的


1314151617181920
32713A121F9AD7F9
50113581831154215249
RADEC


这是随便另外找了一个

RADEC
12341234

C1BC67205476E82
19318810332841182322




lovez3 发表于 2012-12-25 17:37

呃,技术贴啊,看不懂,帮顶了。

whw5555 发表于 2012-12-25 17:56

烟嘴弄得什么goto呀? 你有数据库吗?

三叶观天 发表于 2012-12-25 18:04

不错,学习了,虽然现在还没有赤道仪。

haoxing168 发表于 2012-12-25 18:05

牛贴。顶下。

夜光蜗牛 发表于 2012-12-25 18:12

你要通过什么口控制?串口的话,不用转10进制,直接塞进缓冲区,调用系统接口函数creatfile,openport,就能用串口输出了~

tnt 发表于 2012-12-25 18:33

烟嘴快要进化为大神了,就差那么一点点了。

xwxwwx 发表于 2012-12-25 18:51

虽然我没有完全理解你的思路,但是还是觉得你的思路有问题。

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

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

夜光蜗牛 发表于 2012-12-25 18:55

xwxwwx 发表于 2012-12-25 18:51 static/image/common/back.gif
虽然我没有完全理解你的思路,但是还是觉得你的思路有问题。

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

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

xwxwwx 发表于 2012-12-25 19:10

夜光蜗牛 发表于 2012-12-25 18:55 static/image/common/back.gif
他用tcp/ip方式接受的,不是串口模式~。
另外那个能自己理解的,官网上有协议的~
...

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

夜光蜗牛 发表于 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;
        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;
                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=int(*addr_1)+256;}
                                else
                                {
                                        data=int(*addr_1);}
                                addr_1++;
                        }
                        for(i=1;i<=4;i++)
                        {
                                Ra=Ra+data*pow(16,2*(i-1));
                                De=De+data*pow(16,2*(i-1));
                        }
                        Ra=Ra/49710;
                        De=De/3314;
                        cout<<Ra<<" "<<De;
                }
return 0;
        }

夜光蜗牛 发表于 2012-12-25 19:51

看了一遍,现在发现当时非常二~,只要定义一个整型指针,指向ra或de的位置,直接读就行了.....
我还是太年轻了....

角落里的烟嘴 发表于 2012-12-25 21:46

夜光蜗牛 发表于 2012-12-25 19:51 static/image/common/back.gif
看了一遍,现在发现当时非常二~,只要定义一个整型指针,指向ra或de的位置,直接读就行了.....
我还是太年 ...

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

角落里的烟嘴 发表于 2012-12-25 22:01

夜光蜗牛 发表于 2012-12-25 18:12 static/image/common/back.gif
你要通过什么口控制?串口的话,不用转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 static/image/common/back.gif
虽然我没有完全理解你的思路,但是还是觉得你的思路有问题。

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

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

角落里的烟嘴 发表于 2012-12-25 22:15

夜光蜗牛 发表于 2012-12-25 19:30 static/image/common/back.gif
这是我以前写的翻译的源码,由于时间有点久....我也不太记得当时怎么写的了.....但能获取数据。
其实更简便 ...

现成的! 谢谢了!   mark! 慢慢学习!!!

xwxwwx 发表于 2012-12-25 22:29

角落里的烟嘴 发表于 2012-12-25 22:09 static/image/common/back.gif
我觉得 我应该说清楚了, 你不是搞软件的么, 设置一个目标 然后 下命令 开始 goto 大S就只发出一个 TC ...

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

角落里的烟嘴 发表于 2012-12-25 23:34

tnt 发表于 2012-12-25 18:33 static/image/common/back.gif
烟嘴快要进化为大神了,就差那么一点点了。

::070821_19.jpg::         T 总啊 ,200秒   折腾死了人啦, 为啥啊 阿烦的人   我给你回复了好几遍   0 0!   

角落里的烟嘴 发表于 2012-12-26 12:19

xwxwwx 发表于 2012-12-25 19:10 static/image/common/back.gif
你说的对,是tcpip方式接收的,那就不是带奇偶校验和流控制的数据流。是符合tcpip协议的数据流了,这个更 ...

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

角落里的烟嘴 发表于 2012-12-26 12:40

xwxwwx 发表于 2012-12-25 22:29 static/image/common/back.gif
呵呵,更正一点,我做的是和数据库有关的工作,编程只是爱好,单片机完全不懂,算我没说。 ...

我解释一下 我的想法,
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位数据?


页: [1] 2 3 4 5
查看完整版本: 菜鸟如何自制通过stellarium来控制赤道仪goto--基本功能完成