GPS Walker:使用 Arduino 获取 GPS 数据
构建这个电路,了解如何轻松获取 GPS 数据并将其存储在 SD 卡上。在您家附近走动,然后将数据上传到地图。
引言:卫星故事
早在 1977 年,我就得到了我的第一台望远镜,开始观测夜空。我将望远镜对准月球,长时间盯着月球,试图理解我所看到的一切。接下来,我尝试将望远镜对准我看到的各种*星星*,但望远镜太弱了,我也不知道自己在看什么。我终于弄到了一张星图,并努力辨认我在看什么。土星在哪里?如果我能看一眼土星那壮丽的光环,我会惊叹不已。
在一个非常晴朗的夜晚,当我躺在地上仰望星空时,我看到了什么东西在移动。它非常非常小,只是一个光点,比我能看到的许多*星星*都要小。它以惊人的速度划过天空。我想离开去告诉别人并给他们看,但我知道它会消失,所以我只能盯着看,好奇着。
1977 年没有(对平民开放的)互联网
回到 77 年,你无法查找这样的东西。作为一个 10 岁的孩子,我不知道我看到了什么,但那太奇妙了。幸运的是,我告诉了我妈妈的一位朋友,他是一名工程师,他告诉我:“你看到的是一颗绕地球运行的卫星。”
构成该系统的*24 颗 GPS 卫星*直到 1989 年才投入使用**,所以我看到的是另一颗卫星。我当时一定也很幸运,因为那时的卫星数量少得多。
*我以为 GPS 卫星是地球静止的,但它们不是,它们有 12 小时的轨道。*
**编辑 - 我发现了这个,其中提到 Navstar^ 第一颗 GPS 卫星于 1978 年部署。**
GPS 组件与卫星通信
如果那时有人告诉我,有一天我能建造自己的设备,它由电池供电,装在我的手里,还能与卫星通信,我肯定会认为他们疯了。
这就是为什么这个小小的实验让我如此兴奋。你可以构建这个便宜的小电路,由 4 节 AA 电池供电,连接到 GPS 卫星并将数据存储在 SD 卡上。
电路首次亮相
我把所有东西(Atmega328p-pu、GPS 组件、SD 卡读写器)都放在了一个小面包板上。由于我的长电线,它有点丑,但我昨天(2018 年 8 月 5 日)仅花了几个小时就构建了这个电路。
你可以看到我把裸露的 Atmega328p-pu 芯片放在了面包板上。使用我的 Arduino Uno 板对芯片进行编程后,我取下了芯片,以便创建更小的外形。我需要这样做,因为我想带着设备四处走动,而带着 Arduino Uno 板一起走,这根本不合理。
没有 16MHz 晶振将无法运行
正如我在另一篇文章(Arduino Uno:将您的 ATMega328p-u 用作独立设备[^])中详细介绍的那样,此电路无法在 Atmega328 独立运行时正常工作,除非添加 16MHz 晶振,您可以在板子中间,Atmega 芯片下方看到它。
由于图片中的电线看起来有点混乱,我将为您提供一个漂亮的原理图,以便您可以轻松构建电路。
首先,我将列出您需要的所有东西。
项目零件清单
- 1 - **16MHz 晶振** - 10 个 5.04 美元(https://amzn.to/2MmYPru)这个项目只需要 1 个,但它们非常便宜,您以后很可能会在其他项目中使用更多。
- 2 - **22pF 陶瓷电容器**(无极性)- 用于晶振。50 个 5.69 美元(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)一包三块 8.20 美元。
- AA 电池座 - 我使用这些两节电池的电池座,并将它们串联。12 个 7.99 美元(https://amzn.to/2vkjPJ4)
现在,看看原理图。您可以在不到一个小时的时间内构建电路。
电路详情
引脚标签
我结合了几种不同的方法来标记 Atmega 芯片的引脚。每条引脚上的第一个数字(从左到右)是 Atmega 芯片上的物理引脚编号。物理引脚编号从芯片的左上角开始,向下递增到底部,然后继续向上到芯片的右侧。我跳过了一些引脚以节省空间。
我还用它们的数字引脚编号(Arduino 使用的)和引脚组编号(PBx、PDx 等,在查看 Atmega 数据手册时会用到)标记了引脚。我这样做是为了确保您能分辨出您正在连接哪个引脚。
这是一个非常好的引脚映射图,可以帮助您弄清楚(由官方 Arduino 网站提供,在此处^)。
构建好电路后,您可以上传代码,将 micro SD 卡插入读写器并运行它。
Arduino 草图概述
我已经将 Arduino 草图添加到了这篇文章中,供您下载。
如果您尝试构建草图,您首先会注意到的事情是它会失败,因为您(可能)没有它依赖的 TinGPS 库。
什么是 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,",");
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 公里外的卫星通信的设备。
获得数据后,您可以将其上传到 Google Maps,并使用其 API 从数据创建路线。
历史
2018-08-06:首次发布