1977年,得到了第一个望远镜,开始了对夜空的观察。将望远镜对准了月球,长时间地凝视着,试图理解所看到的。接着,尝试将望远镜指向能看到的各种星星,但望远镜的功率太小,不知道在看什么。终于得到了一张星图,努力辨认在看什么。土星在哪里?如果能看到土星周围那些壮丽的环,会非常惊讶。
在一个非常晴朗的夜晚,当躺在地上凝视天空时,看到了一些东西在移动。它非常小,只是一点点光,比许多能看到的星星还要小。它以惊人的速度划过天空。想离开去告诉别人并展示给他们看,但知道它会消失,所以只是凝视并思考。
1977年,民用互联网并不存在。作为一个10岁的孩子,不知道看到了什么,但它是奇妙的。幸运的是,向妈妈的一个朋友提到了这件事,他是一位工程师,他告诉,“看到的是一个绕地球轨道运行的卫星。”
构成系统的24个GPS卫星直到1989年才投入使用,所以看到的是其他卫星。一定很幸运,因为那时卫星的数量要少得多。
如果在那时告诉,有一天能建造一个自己的设备,它靠电池运行,可以放在手里,并且能与卫星通信,会认为疯了。这就是为什么这个小实验对来说如此令人兴奋。可以建造这个便宜的小电路,用4节AA电池供电,连接到GPS卫星,并将数据存储在SD卡上。
首先看看电路。把一切都(Atmega328p-pu,GPS组件,SD卡读写器)放在一个小面包板上。由于长线,它有点难看,但在昨天(2018年8月5日)只用了几个小时就建造了这个电路。
可以看到把裸Atmega328p-pu芯片放在了面包板上。编程芯片后,使用Arduino Uno板,取下了芯片,以便创建一个更小的足迹。需要这样做,因为想带着设备四处走动,带着Arduino Uno板四处走动是没有意义的。
没有16MHz晶体,它不会运行。正如在另一篇文章中详细说明的(Arduino Uno: Using Your ATMega328p-u As Stand-alone),这个电路不会在Atmega328独立运行时正常工作,除非添加16MHz晶体,可以在板子中间,Atmega芯片下面看到。
由于图片中的线看起来有点混乱,将为提供一个清晰的电路图,这样就可以轻松地建造电路了。
首先,会列出需要的一切。
1 - 16MHz晶体振荡器 - 10个5.04美元(https://amzn.to/2MmYPru)。只需要这个项目的1个,但这些非常便宜,以后可能会在项目中用到更多。
2 - 22pF陶瓷电容器(非极性)- 用于晶体。可以用5.69美元买到50个(https://amzn.to/2AM3KRz)。
1 - GPS模块 - 对这个不到20美元的东西感到惊讶 - 只有15.66美元(https://amzn.to/2KvA2zP)。制作精良,工作效果比设置为高粒度的iPhone更好(更精确)。惊人!
1 - SD卡读写器。可以用8.98美元买到5个这样的包(https://amzn.to/2vmi51C)。
1 - Arduino Uno。将使用Uno来编程Atmega328芯片。这个仿制板很便宜,工作效果很好,并且带有Atmeg328安装和USB电缆,总共不到12美元(https://amzn.to/2KySU0J)。这是使用的。
1 - 面包板(https://amzn.to/2vtlCLZ)3包8.20美元。
AA电池座 - 使用这些可以容纳两个电池的电池座,并将它们串联起来。12个7.99美元(https://amzn.to/2vkjPJ4)。
现在,看看电路图。可以在不到一个小时内建造这个电路。
通过结合几种不同的方法对Atmega328的引脚进行了标记。每个引脚上的第一个数字(从左到右阅读)是Atmega芯片上的物理引脚号。物理引脚号从芯片的左上角开始,向下递增到底部,然后继续向上到芯片的右侧。跳过了一些引脚以节省空间。
还用Arduino使用的数字引脚号标记了引脚。还添加了它们在Atmega数据表中引用的引脚组号(PBx,PDx等)。这样做是为了确保能告诉连接的是哪个引脚。
这是一个非常好的引脚映射图,可以帮助弄清楚(由官方Arduino网站提供)。
一旦建造了那个电路,可以上传代码,插入一个SD micro卡到读写器中,然后运行它。
已经在这个文章中添加了Arduino草图,可以下载它。
如果尝试构建草图,可能首先会注意到它失败了,因为(可能)没有它依赖的TinyGPS库。
TinyGPS是一个帮助库,它将来自GPS组件的原始数据格式化成更易读的东西。
在例子中,用它来获取数据中的经度和纬度值,但还可以获得更多的数据。可以在GitHub上获得库。
只需要两个源文件(TinyGPS.cpp,TinyGPS.h)。它们需要放在一个名为TinyGPS的文件夹中,将把它放在Arduino IDE库文件夹下。
由于代码是开源的,已经把它们放在TinyGPS文件夹中,压缩了它们,并将它们包含在这篇文章中作为一个下载。这意味着可以下载zip文件,解压它,然后把TinyGPS文件夹放到Arduino IDE库文件夹中(可能安装在\Program Files x86\)。
这个代码是基于找到的一个草图,作者在那里测试GPS组件。那是一篇信息性的文章,非常有趣,因为他发现GPS组件比iPhone的GPS更精确。然而,那个作者只把数据写到蓝牙模块上,想把数据写到SD卡上以便以后分析,所以对代码进行了相当大的修改。
它的基本功能可以用以下几行代码总结:
if (latitude <= 90 and latitude >= -90 and longitude >= -180 and longitude <= 180) {
dtostrf(latitude, 1, 4, latitude_str);
strcat(out_data, latitude_str);
strcat(out_data, ",\n");
writeToSD(out_data);
}
如果从GPS单元读取的值在有效范围内,那么获取纬度并将其写入SD卡。
接下来的代码块做同样的事情,经度值。它每秒写一次数据,所以如果在移动,它会捕捉到变化的值。它将数据以浮点值(四舍五入到小数点后四位)写入,并用逗号分隔。数据保存在一个名为gps.txt的文件中,看起来像这样:
39.7624,-84.0624
39.7624,-84.0600
这种数据格式是Google Maps可以接受的,可以复制这些坐标并粘贴进去,它们会显示位置。稍后,可以从SD卡捕获多个点并上传,创建显示GPS Walker走过的路径。
现在,可以用4节AA电池给它供电,然后去散步。当然,也可以把它扔进车里,或者放在自行车上。
这就是它在电池电源下运行的样子。
第一次运行时,应该在外面,以便从GPS卫星获得良好的信号。这个模块似乎工作得很好,甚至在家里面也能捕捉到卫星。
绿色LED会告诉它已经与卫星连接。试试看。认为会发现它很有趣,很惊讶可以建造这个与20,000公里外的卫星通信的东西。