12478浏览
查看: 12478|回复: 5

[项目] 树莓派&全球定位系统

[复制链接]

amp.png

一、项目背景

全球定位系统(Global Positioning System,GPS)是一种以人造地球卫星为基础的高精度无线电导航定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、精确及其他的信息。它是由空间卫星、地面监控和用户接收等三大部分组成。在太空中有24颗卫星组成一个分布网络,分别分布在6条离地面2万公里、倾斜角为55°的地球准同步轨道上,每条轨道上有4颗卫星。GPS卫星每隔12小时绕地球一周,使地球上任一地点能够同时接收7~9颗卫星的信号。地面共有1个主控站和5个监控站负责对卫星的监视、遥测、跟踪和控制。它们负责对每颗卫星进行观测,并向主控站提供观测数据。主控站收到数据后,计算出每颗卫星在每一时刻的精确位置,并通过3个注入站将它传送到卫星上去,卫星再将这些数据通过无线电波向地面发射至用户接收端设备。


本次案例模仿GPS系统,具体功能为1.GPS卫星定位,2.生成位置地图,3.谷歌浏览器自动打开地图。


二、硬件和软件

硬件:

1.树莓派4B2G版 *1

https://www.dfrobot.com.cn/goods-1976.html

2.GPS+BDS北斗双模卫星导航模块 *1 (需手工焊接针排,稍有难度,希望以后能给直接焊接好)

https://www.dfrobot.com.cn/goods-2844.html

3.USB to Serial 转串口模块 *1集成了CP2103芯片,树莓派免驱动,即插即用

https://www.dfrobot.com.cn/goods-242.html

FriDecember-202012112717..png


软件:

树莓派brust系统,Thonny编辑器或python3


三、知识准备


1.UART:一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。


2.serial串口:本次只用树莓派4B miniUSB串口UART测试。树莓派有两个串口可以使用,一个是硬件串口(/dev/ttyAMA0),另一个是mini串口(/dev/ttyS0)。硬件串口有单独的波特率时钟源,性能好,稳定性强;mini串口功能简单,稳定性较差,波特率由CPU内核时钟提供,受内核时钟影响。

3.pip 用来安装来自PyPI的python所有的依赖包,并且可以选择安装任何在PyPI上已上传的先前版本的依赖包;

apt-get 用来安装软件、更新源、也可以用来更新自Ubuntu的典型依赖包,树莓派系统也可以使用该命令;典型安装即意味着它只是安装(最新发布或最近一个的)单一版本,并且我们不能决定我们要安装的依赖包的版本或选择它之前的版本。


4.注意:serial库和pyserial库不一样

卸载serial库(不删除后续会报错),安装pyserial库(python调用serial的API接口库)

0-0.jpg



pyserial库python调用串口的API接口,可用pip3 list 命令查看,没有可以运行pip3 install pyserial安装

FriDecember-202012118584..png



FriDecember-202012116710..png

四、技术实现:


1.GPS模块修改串口+树莓派+python读取数据方案:


树莓派(3/4代)板载蓝牙模块,默认的硬件串口是分配给蓝牙模块使用的,我的树莓派声音输出是蓝牙音箱,正好冲突;而且该操作较为复杂,容易破坏树莓派,不适合初学者使用,所以果断放弃该方案。


2.GPS模块USB转串口+树莓派+python读取数据方案:

不需要复杂的调整,GPS模块直接和转接模块连接,防止插错GPIO口烧毁板子,数据交换简单高效。


硬件连接参考:

GPS模块VCC连接USB转接模块的5V

GPS模块GND连接USB转接模块的GND

GPS模块TX连接USB转接模块的RX

GPS模块RX连接USB转接模块的TX

USB转接模块USB连接树莓派USB口

FriDecember-202012116053..png





五、软件实现

1.运行lsusb命令看是否检测出来

FriDecember-202012116541..png


2.安装串口工具   运行 sudo apt-get install minicom

运行串口工具    运行 minicom -b 9600 -o -D /dev/ttyUSB0

屏幕中可以收到大量信息

FriDecember-202012114351..png

具体可参考模块的说明

https://www.dfrobot.com.cn/images/upload/File/20200807111306dx8497.pdf

FriDecember-202012112642..png

注意1:模块首次启动定位时间:32 秒(也有可能是几分钟,要看具体环境而定),定位完成后模块的红色提示灯会一直闪动。

FriDecember-202012116494..png

注意2.模块天线一定要放在窗外,做好在空地中做测试,可以减少卫星的遮挡,提高实验效率。

键盘CTRL+A,可以调出菜单;键盘X退出串口工具

FriDecember-202012113969..png

FriDecember-202012116268..png



com.gif

3.代码解析

导入串口库,导入folium地图库,导入webbrowser库(调用浏览器打开生成地图网页)

  1. import serial
  2. import folium
  3. import webbrowser
复制代码

打开串口,flag为标志为0时生成地图,1时不再重复生成

  1. ser = serial.Serial("/dev/ttyUSB0",9600)
  2. flag=0
复制代码

读取地理坐标

  1. try:
  2.         line = str(str(ser.readline())[2:]) #返回值是bytes,头两位是b',所以数据需要在第二位开始截取
  3.         if line.startswith('$GNGGA'): #GNGGA解析数据
  4.             line = str(line).split(',')  # 字符分隔
  5.             data_jng = float(line[4][:3]) + float(line[4][3:])/60
  6.             # 按照说明解析经度,除60将分转化为度
  7.             data_wei = float(line[2][:2]) + float(line[2][2:])/60
  8. #维度同理可求
  9.             print("经度:",data_jng)
  10.             print("维度:",data_wei)
复制代码

生成并打开地图

  1. city_map = folium.Map(location=[data_wei, data_jng], zoom_start=14)
  2. city_map.save('city_Map.html')
  3. if flag==0:
  4. webbrowser.open('city_Map.html')
  5. flag=1
复制代码

完整代码

  1. import serial
  2. import folium
  3. import webbrowser
  4. ser = serial.Serial("/dev/ttyUSB0",9600)
  5. flag=0
  6. try:
  7.     while True:
  8.         line = str(str(ser.readline())[2:])
  9.         if line.startswith('$GNGGA'):
  10.             line = str(line).split(',')
  11.             data_jng = float(line[4][:3]) + float(line[4][3:])/60
  12.             data_wei = float(line[2][:2]) + float(line[2][2:])/60
  13.             print("经度:",data_jng)
  14.             print("维度:",data_wei)
  15.             city_map = folium.Map(location=[data_wei, data_jng], zoom_start=14)
  16.             city_map.save('city_Map.html')
  17.             if flag==0:
  18.                 webbrowser.open('city_Map.html')
  19.                 flag=1
  20. except KeyboardInterrupt:
  21.     ser.close()
复制代码

六、整体测试代码


1.如果卫星信号不好,无法获取信息,程序会报错
2.地图文件生成和打开较慢,请耐心等待

map.gif

pATAq  版主

发表于 2021-1-3 17:06:13

葛老师的帖子很好,我也想用上手头的GPS模块,再配一个震动模块,装在小电动上,看看道路平坦程度。
另外这个GPS模块搜星速度和信号强度咋样
回复

使用道具 举报

gray6666  初级技神
 楼主|

发表于 2021-1-4 08:49:44

文档建议在开阔地测试,我是在窗户缝把天线伸出去搜索的,效果还可以;需要注意首次冷启动加电需要32秒后才有信号。
回复

使用道具 举报

奥本  学徒

发表于 2022-5-18 22:25:01

你好,为啥保存好的HTML文件用浏览器打开,一直在转圈圈,显示不出来
回复

使用道具 举报

奥本  学徒

发表于 2022-5-18 22:26:48

pATAq 发表于 2021-1-3 17:06
葛老师的帖子很好,我也想用上手头的GPS模块,再配一个震动模块,装在小电动上,看看道路平坦程度。
另外这 ...


你好,为啥保存好的HTML文件用浏览器打开,一直在转圈圈,显示不出来
回复

使用道具 举报

gray6666  初级技神
 楼主|

发表于 2022-5-19 08:13:09

奥本 发表于 2022-5-18 22:26
你好,为啥保存好的HTML文件用浏览器打开,一直在转圈圈,显示不出来

不知道,我这里没遇到过呐
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail