论坛风格切换切换到宽版
  • 756阅读
  • 22回复

从零开始用Python写一个控制电台自动多普勒程序 [复制链接]

上一主题 下一主题
离线叶浩轩
 
发帖
27
只看楼主 倒序阅读 0楼 发表于: 02-18
从零开始用Python写一个控制电台自动多普勒程序

前言:
1.本文约9000个字符(包括汉字),3000个汉字,攥写耗时75分钟。
2.本文仅表述我主观意见,并未涉及到辱骂 诋毁他人,若您的观点与本文的观点不同,敬请谅解
3.本人编程技术不精,若有错误欢迎指出,本人洗耳恭听

特别鸣谢:
BG6LQV老师在我编写程序过程中给予的指导与建议
接下来进入主题
为什么决定自己写控制软件?
你或许正在用着像HRD,Omni-Rig,Hamlib这种电台CAT控制程序。他们简洁好用,特别是自动多普勒功能,能帮助我们在打FM卫星时省下很多精力。我在2023年下半年时收购了一台BG8KVC老师手中的一台八重洲FT-847,这是我人生中第一台UV全模式电台。但是上手好几天,我发现他居然不能连接HRD?!一查才知道,我手中这台FT847是早期版本,CAT有缺陷,不能反馈电台数据,导致HRD不能读取到频率数据,连接失败。我也尝试了很多其他软件,例如PST-Rotator,Omni-Rig,WispDDE等,这些软件虽然能连接成功,但是不稳定,一会能控制到,一会又像丢包一样不控制了。这导致每次我收听卫星时只能手动波动旋钮调整频率,格外麻烦。今年新春闲在家,一怒之下决定自己写一个好使的。
写软件前的准备工作
首先你需要一些Python基础,这并不难,几天的学习+实操便足以。可以去Bilibili.com随便找一个热门的教学视频学下去,学到if,while,try except,import就差不多了。
其次,你需要一个趁手的编程软件。我目前在用JetBrains的PyChram,不仅好用界面简洁,还可以接入Github Copilot,AI就能帮你写一些简单的代码,事半功倍。下载链接:Download PyCharm: Python IDE for Professional Developers by JetBrains
然后,你需要一份含有CAT指令的你的型号的电台说明书。例如FT847的说明书就在92-93页详细列举了CAT控制要用的CAT命令。
最后,你需要一份串口调试工具,我用的是有人物联网(USR)官网里下载的一个串口调试软件,感觉挺好用。下载链接:https://ucloud-web-sh.oss-cn-shanghai.aliyuncs.com/shangweiji/%E7%BD%91%E7%BB%9C_%E4%B8%B2%E5%8F%A3%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7.exe

离线叶浩轩
发帖
27
只看该作者 1楼 发表于: 02-18
由于帖子过大,只能分开发送
[ 此帖被叶浩轩在2024-02-18 22:13重新编辑 ]
离线叶浩轩
发帖
27
只看该作者 2楼 发表于: 02-18


正式开始写软件!
这块内容就按照我写软件的过程来叙述吧!
第一步,使用串口调试工具连接电台。首先,你需要将你的电台与电脑连接,打开设备管理器,查询发现电台的串口是COM3,电台中设置的波特率是9600(这里的串口和波特率因人而异,请自己查看你自己的,我的在你那不一定能用)。然后打开串口调试软件,左上角设置好前面查到的串口和波特率,再点击打开(如图),此时电脑与电台的连接就建立一半了!



离线叶浩轩
发帖
27
只看该作者 3楼 发表于: 02-18
然后再通过查阅说明书发现,我们要发送的数据是5位16进制数据,应采用HEX制式发送,所以在串口工具的左下角“发射区设置”将ASCII“改为“HEX”。(如图)
[ 此帖被叶浩轩在2024-02-18 22:32重新编辑 ]
离线叶浩轩
发帖
27
只看该作者 4楼 发表于: 02-18

离线叶浩轩
发帖
27
只看该作者 5楼 发表于: 02-18

下一步就是查阅说明书,找到开启电台CAT功能的指令,发送即可!例如我的FT847开启CAT的指令就是00 00 00 00 00也就是10个0。(如图)
离线叶浩轩
发帖
27
只看该作者 6楼 发表于: 02-18

那我们就在串口调试软件中左边那个大输入框输入10个0,点击发送。不出意外,此时你电台的屏幕将亮起CAT指示标(如图),这时电脑与电台的连接正式建立了!

离线叶浩轩
发帖
27
只看该作者 7楼 发表于: 02-18
第二步,打开Python编辑器开始编写程序! 这里以PyCharm为例。我们打开Pycharm,先跟着我设置一下。按下Ctrl+Alt+S打开设置,找到侧边栏从上往下第四个(也就是插件),点进去,在搜索框中搜索“中文简体”,点击第一个插件安装,安装完后重启软件,PyCharm便被汉化了。再打开设置,找到“Python解释器”进入(如图),再点击“+”号
离线叶浩轩
发帖
27
只看该作者 8楼 发表于: 02-18

离线叶浩轩
发帖
27
只看该作者 9楼 发表于: 02-18
在打开的页面中输入“Serial”并安装(如图)
离线叶浩轩
发帖
27
只看该作者 10楼 发表于: 02-18

离线叶浩轩
发帖
27
只看该作者 11楼 发表于: 02-18

安装好后再输入"win32ui"并按照相同方式安装。这样,必要的库就装好了。
想使用这些库,我们必须在代码中导入他们。回到主界面,在代码框中输入:
import serial
import win32ui
import dde
这样就可以使用这些库了。
接下来我们要打开电台串口,就像调试工具那样。使用的代码是:
ser = serial.Serial("这里填串口号,如COM3", 这里填波特率, timeout=0.5)
这就打开了串口。
离线叶浩轩
发帖
27
只看该作者 12楼 发表于: 02-18

接下来再向串口发送CAT开启指令,串口发送指令的命令如下:
ser.write(bytes.fromhex(str("这里填要发送的指令")))
FT847为例,我要发送10个0,就像下面这样:
ser.write(bytes.fromhex(str("0000000000")))
接下来修改频率啊啥的按照说明书上写的发送指令就行,这里不多赘述。
离线叶浩轩
发帖
27
只看该作者 13楼 发表于: 02-18

第三步,用Python读取Orbitron计算的多普勒数据!这里我用的是DDE连接的方式。通俗来说就是你只要与Orbitron对上暗号,他就会给你你选中的卫星的各项信息,包括多普勒后的频率。
这里读取他的代码我就不详细解释了,你们可以照搬,如果想研究的看看注释也能看懂:)
# 创建一个DDE客户端
dde_client = dde.CreateServer()

# 开始DDE会话
dde_client.Create("MyDDEClient")

# 连接到DDE服务
conversation = dde.CreateConversation(dde_client)

# 连接到特定的服务和主题
while True:
    try:
        conversation.ConnectTo("Orbitron", "Tracking")
    else:
由于论坛字数限制,省略部分代码,请至PyDDE-Orbitron/DDE.py at main · GAQPanda/PyDDE-Orbitron (github.com)查看!
由于论坛字数限制,省略部分代码,请至PyDDE-Orbitron/DDE.py at main · GAQPanda/PyDDE-Orbitron (github.com)查看!
由于论坛字数限制,省略部分代码,请至PyDDE-Orbitron/DDE.py at main · GAQPanda/PyDDE-Orbitron (github.com)查看!
        # 等待1
        time.sleep(1)
离线叶浩轩
发帖
27
只看该作者 14楼 发表于: 02-18

Orbitron里我们也要打开DDE服务,在主界面找到电台/旋转器选项,并打开DDE会话。具体步骤如下图:
离线叶浩轩
发帖
27
只看该作者 15楼 发表于: 02-18
接下来我们就要对获取到的多普勒频率进行处理。我们从Orbitron那边获取到的频率是9位数字,比如437812988,我们要将他变为8位数字,才符合CAT控制命令的规范。再翻阅说明书(如图),可知改变卫星模式下频率的命令是 八位频率+11或21,其中11是改变RX频率,21是改变TX频率。


那就好办了,我们只要将变为8位的频率后加上11或21再发送给电台就行了!将9位频率变为8位并在末尾加上11或21的代码如下:
DN = str(lst[3].lstrip("DN"))
UP = str(lst[4].lstrip("UP"))
DNC = str(DN[:-1] + "11")
UPC = str(UP[:-1] + "21")
然后把处理完的数据发送给电台!代码如下:
ser.write(bytes.fromhex(DNC))
ser.write(bytes.fromhex(UPC))
这样,当机器处于卫星模式,就能读取到我们给他发送的多普勒信息,实现自动控制多普勒频率!
离线叶浩轩
发帖
27
只看该作者 16楼 发表于: 02-18
结语
这个程序是我花了三四天摸索出来的,其实也不难,相信自己可以,就能成功!目前DDE的样例和FT847控制程序已经在Github开源,每个人都能下载并使用它们。我的编程水平并不高,欢迎各位大佬指出问题进行批评!
Github开源链接如下
PyDDE:GAQPanda/PyDDE-Orbitron: A Orbitron DDE Program Example (github.com)
FT-847-Satellite_Controller:GAQPanda/FT-847-Satellite-controller: The best Satellite Contoler For Yaesu FT-847 (github.com)
在此再次鸣谢BG6LQV老师以及一路上提供各种帮助的大佬们!感谢!

美好的73来自PM00/PL08送给全国HAM!新春快乐!新的一年事事顺心,QSO到更多友台!
[ 此帖被叶浩轩在2024-02-18 22:30重新编辑 ]
离线BG5TOX
发帖
798
只看该作者 17楼 发表于: 02-19
太牛了~~~
Callsign:BG5TOX
QQ:327586364
在线bd3af
发帖
7733
只看该作者 18楼 发表于: 02-19
崇拜!
离线BG2QAX
发帖
6587
只看该作者 19楼 发表于: 02-19
膜!!!!