GPS周数翻转Week Rollover

今天听说GPS的周数翻转问题“GPS Week Number Rollover”。原理么很简单,发射的信号里周数用10位二进制表示,只能表示0-1023周。数完了就要从头开始。

需要注意的是时间,我看到一些民航发的文件写的都是2019年4月6日翻转,这很容易让人误解为4月6日零时翻转。其实应该是在4月7日的国际时0点,从1023变为0的一瞬间。我用UNIX时间戳计算了一下:

GPS的起始日期是1980-01-06 00:00:00UTC 。UNIX时间戳是315964800。

第一次翻转发生在1024周后,就是315964800 + 1024 × 604800 = 935280000。代表1999-08-22 00:00:00UTC。

第二次翻转发生在935280000 + 1024 × 604800 = 1554595200。代表2019-04-07 00:00:00UTC。换在北京时间就是2019-04-07 08:00:00

我猜想对于定位应该没什么影响(我猜要有影响也是在翻转瞬间),毕竟飞机上的位置更新,GPS只是数据源之一,无线电定位和惯导都还能发挥作用。

可能还有影响的是导航数据库版有效期,我看FCOM上写,如果导航数据库的有效日期与始终输入的日期不一致,就会跳出NAV DATA OUT OF DATE告警。

另一个需要小心的是数据链,如果飞机的时间真的变成了1999年甚至1980年,上行和下行的数据链是否能正常工作呢?(我猜现代的飞机应该不会这么破)

MEMORANDUM FOR U.S. OWNERS AND OPERATORS USING GPS TO OBTAIN UTC TIME》可供参考。

A New Keyboard

1283634634

这个键盘已经伴随我很多年了,从win98的年代用到现在。键盘背面是金属的,很重,极其耐用,不过为了继续使用这个键盘,我不得不购买带有PS/2口的主板。

前几天我买了一个新的Keyboard乐器。目前还是初学阶段  O(∩_∩)O

1891262504

自制ADS-B,便捷又不贵,家用S模式应答机接收器

很早就听说国外有卖ADS-B接收器了,本来以为那是一种复杂昂贵的设备。就算是自制设备的价格不贵,说不定国内也很难能买到。

没想到,经过一番google之后,一个国外网站上说,在中国能买到一种数字电视棒,在LINUX中可以直接拿来接收ADS-B的信号。经过一番简单的安装后,果然成功。下面我就来介绍一下主要步骤:

第一步,电视棒的芯片型号是:RTL2832U+R820T,淘宝上一搜一个准。量多又便宜(价格小于50元)。

217048972

 

第二步,你需要下载并安装一个叫“rtl-sdr”的软件,网址位于:“http://sdr.osmocom.org/trac/wiki/rtl-sdr”。它是一个RTL2832U芯片的控制软件,负责控制电视棒频率(还有很多无线电方面的参数我不是很懂)。

第三步,就是安装应用软件,我只安装了一个最简单的,名字叫“dump1090”,网址位于:“https://github.com/antirez/dump1090”。他是一个把无线电中的数字信号提取出来并解码的软件。就是解码S模式应答机的内容。你可以运行命令:“dump1090 –interactive”。启动一个实时的列表,察看接收到的飞行信号。

最终效果如图:

0c8d

 

图中可以看到飞机的航班号、高度、速度、经纬度和航迹,大约每秒更新一次。如果你想把飞机绘制在地图上,可以自己动手编一个软件,或者找一个现成的。

有人可能会担心信号问题。图中的结果是我在市区的家中接收到的,距离虹桥机场7公里,周围嘈杂而且高楼林立,所以只接收到1万英尺以上的飞机。我想如果我能带一台笔记本电脑去机场周边没有障碍物的地方信号会好很多。

以上这些内容中,最难的部分可能就是从源代码编译软件了。其实我在编译的过程中没遇到什么困难,只需要一些LINUX基础和编程基础就行。

我一直觉得在签派工作中,公司可以出资搭建这种简易的ADS-B接收器,分部在机场周围。在大面积延误或雷雨大雾时,可以精确地了解终端区里飞机的位置。

玩玩单片机

在淘宝上买了块天祥电子的51单片机玩玩,折腾了好久,终于在linux上搭建好了开发平台。我发现网上介绍linux中编写51单片机的流程很凌乱,所以下面做一下汇总。

image

我用的是ubuntu,首先用apt-get下载sdcc,这是一个编译器,安装很顺利。下面写一段简单的代码。如下,抱歉排版原因没有缩进:

#include <mcs51/8051.h>
void delay02s(void){
unsigned char i,j,k;
for(i=20;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}

void main(void){
while(1){
P1_0=0;
delay02s();
P1_0=1;
delay02s();
}
}

注意这里的#include <mcs51/8051.h>。和Keil不同。接着编译命令很简单:

sdcc light.c

编译成功后会生成”light.ihx”。然后,找到一个叫”hex2bin”的软件,地址在。注意不是“hextobin”,那是另一个很搓的软件。让我走了很多弯路。

“hex2bin”要从源代码编译安装,还算简单。安装完后运行:

hex2bin light.ihx

它会生成light.bin。到这一步编译都完成了,就差把bin文件刷入单片机了。

找到一个叫“gSTCISP”的软件。这个软件编译安装的时候比较麻烦。需要手工改Makefile。

把单片机的电源关掉,把串口接上电脑,然后以管理员身份运行gSTCISP,如图:

a32e

 

选择好bin文件。然后点击DownLoad,然后打开单片机电源。bin文件就会自动刷到单片机里去,并开始运行。

给usb控制开关写了python的控制代码

前几天在淘宝上买的一个usb控制继电器,可以用电脑控制小功率设备的开关了。其实它就是一个usb模拟的串口,我用python写了一个向串口读写的Class,方便以后继续扩展。最终目标是用网页方式控制电路开关。代码->pyXunDaCtl.py

东西做工不错,不过似乎是三无产品,设备上没有任何标称数据或生产厂家,我拆开后看了继电器上写了可以用到270V,但是我怕出问题,用来开关12V的直流电算了。