(一)项目描述
1、引言
现在,二狗子已经成为我生活中不可或缺的一部分。然而,它经常乱跑。当它走失时,我通常会感到十分焦虑和担忧。为了解决这个问题,我决定利用手里的单片机和模块设计一个二狗子GNNS定位器。该项目旨在设计和开发一种能够追踪二狗子位置的系统,以帮助我快速找到丢失的二狗子。
2、目标
本项目的目标是实现一个具有以下功能的二狗子GNNS定位器:
- 实时追踪宠物的位置:通过使用GNNS技术,能够准确地追踪二狗子的位置。
- 安全围栏报警:通过设定安全区域边界,当二狗子跑到越过边界,蜂鸣器发报警声提醒二狗子。
3、技术实现
(1)硬件介绍
为了实现二狗子定位器,本项目主要选用了以下硬件:
① Raspberry Pi Pico W
Raspberry Pi Pico W是一款树莓派官方设计低成本但灵活的RP2040开发平台,其是Raspberry Pi Pico的无线升级版,具有Pico所有特性外还具有2.4GHz无线接口。
产品特性:
- 采用了 Raspberry Pi 官方自主设计的 RP2040 微控制器芯片
- 搭载了双核 ARM Cortex M0 + 处理器,运行频率高达 133MHz 灵活时钟
- 内置了 264KB 的 SRAM 和 2MB 的片上 Flash
- 板载2.4GHz无线接口芯片(802.11n或Wifi4)。
- 邮票孔设计,可直接焊接集成到用户自主设计的底板上
- USB1.1 主机和设备支持
- 支持低功耗睡眠和休眠模式
- 可通过 USB 识别为大容量存储器进行拖放式下载程序
- 多达 26 个多功能的 GPIO 引脚
- 2 个 SPI,2 个 I2C,2 个 UART,3 个 12 位 ADC,16 个可控 PWM 通道
- 精确的片上时钟和定时器
- 温度传感器
- 片上加速浮点库
- 8 个可编程 I/O (PIO) 状态机,用于自定义外设支持
引脚分布:
② GNNS(全球导航卫星系统)模块Grove - GPS (Air530)
GNNS模块采用的是矽递科技的Grove - GPS (Air530)。Air530模块是一款高性能、高集成度的多模卫星定位导航模块,同时支持北斗、GPS、格洛纳斯等卫星导航系统。
技术参数:
Parameter |
Value |
Supply voltage |
3.3V/5V |
Working current |
up to 60mA |
Time of warm start |
4s |
Time of cold boot |
30s |
Wiki文档:
https://wiki.seeedstudio.com/Grove-GPS-Air530/
③ 无源蜂鸣器模块Grove - Buzzer
无源蜂鸣器模块采用的是矽递科技的Grove - Buzzer模块。
技术参数:
Items |
Specification |
Operating Voltage |
3.3V/5V |
Sound Output |
≥85dB |
Resonant Frequency |
2300±300Hz |
Wiki文档:
https://wiki.seeedstudio.com/Grove-Buzzer/
④ 显示模块Grove OLED Display 0.96" (SSD1315)
OLED模块采用的是矽递科技的Grove 0.96英寸OLED模块,采用SSD1315驱动芯片,128x64分辨率,I2C接口。
技术参数:
Parameter |
Value |
Input voltage |
3.3V / 5V |
Output voltage |
0 ~ 2.3V |
Pixels |
128 x 64 |
Temperature Range |
-40℃ ~ +85 ℃ |
wiki文档:
https://wiki.seeedstudio.com/Grove-OLED-Display-0.96-SSD1315/
(2)设计思路
① 主控:Raspberry Pi Pico W,负责从GNNS模块获取定位信息数据,并控制OLED模块显示,控制蜂鸣器模块发出报警声。
② 传感器:GNNS模块Grove - GPS (Air530),负责与北斗导航卫星、GPS卫星通信,获取位置信息,并将其转化为经度和纬度坐标。
③ 输出模块:无源蜂鸣器模块Grove - Buzzer,负责发出报警声。
④ 显示模块:Grove OLED Display 0.96" (SSD1315),负责显定位的经纬度值、卫星数、时间。
当系统上电后,Raspberry Pi Pico W对GNNS模块、蜂鸣器模块、OLED模块进行初始化。
初始化完成后,GNNS模块与导航卫星进行通信,获取经纬度值、卫星数量、时间数据,并发给Raspberry Pi Pico W。
Raspberry Pi Pico W将收到的这些信息,输出到OLED模块上显示。
(二)各功能对应的主要代码片段及说明
#blink
#导入库
import machine
import time
#初始化引脚
LED = 25
led = machine.Pin(LED, machine.Pin.OUT)
while(True):
#点亮LED
led.on()
#延时1秒
time.sleep(1)
#熄灭LED
led.off()
#延时1秒
time.sleep(1)
(1)驱动OLED
#【得捷电子Follow me第1期】任务2:驱动外设(1)OLED
#导入库
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time
#初始化I2C
i2c = I2C(0,sda=Pin(8), scl=Pin(9))
#实例化SSD1306_I2C
oled = SSD1306_I2C(128, 64, i2c)
#OLED清屏
oled.fill(0)
oled.show()
#OLED显示信息
oled.text("GPS:",0,0)
oled.text("Sate:",0,36)
oled.text("Time:",0,50)
oled.show()
(2)驱动蜂鸣器发出警报声
#【得捷电子Follow me第1期】任务2:驱动外设(2)无源蜂鸣器警笛
#导入库
from machine import Pin, I2C, PWM
import time
#初始化引脚
buzzer = PWM(machine.Pin(20))
while True:
#设置频率freq
for freq in range(500,1000,5):
#蜂鸣器发声
buzzer.freq(freq)
#延时
time.sleep(0.002)
#设置频率freq
for freq in range(1000,500,-5):
#蜂鸣器发声
buzzer.freq(freq)
#延时
time.sleep(0.002)
3、任务3:同步网络时间
任务3:同步网络时间
#导入库
from machine import RTC
import time
import network
import ntptime
#初始化网络
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('xiaogui', '88888888')
#同步NT时间函数
def RTCdate(flag, timezone=8):
#print("开始同步网络时间")
try:
rtc = RTC()
now = time.time()
now += timezone * 3600
dt = time.localtime(now)
date_str = "{}年{}月{}日".format(dt[0], dt[1], dt[2])
time_str = "{}:{}:{}".format(zero_str(dt[3]), zero_str(dt[4]), zero_str(dt[5]))
if flag == 0:
return date_str
else:
return time_str
except Exception as e:
print("同步NTP时间错误",repr(e))
# 补零函数
def zero_str(str_num):
num=int(str_num)
num_str=None
if num>9:
num_str=str_num
else:
num_str="0"+str(str_num)
return num_str
#主程序,NTP校时
ntptime.host = 'ntp1.aliyun.com'
ntptime.settime()
print(RTCdate(0),RTCdate(1))
#任务4:实现定位功能
#导入库
from machine import UART, Pin, PWM, I2C
from ssd1306 import SSD1306_I2C
from micropyGPS import MicropyGPS
import time
WIDTH = 128
HEIGHT = 64
#初始化OLED
i2c = I2C(0,sda=Pin(8), scl=Pin(9))
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
#初始化串口uart0
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
time.sleep(0.1)
rxData = bytes()
my_gps = MicropyGPS(8)
my_gps.local_offset
def get_GPS_values():
#定义两个全局变量
global gps_values,rtc
time.sleep(2)
cc = uart0.readline()
for x in cc:
my_gps.update(chr(x))
#获取经度、维度
gps_values = str(my_gps.latitude[0] + (my_gps.latitude[1] / 60)) + ',' + str(my_gps.longitude[0] + (my_gps.longitude[1] / 60))
#获取日期、时间
date = my_gps.date
timestamp = my_gps.timestamp
hour = timestamp[0]
rtc = str(int(timestamp[0]))+":"+str(int(timestamp[1]))+":"+str(int(timestamp[2]))
#返回经度、纬度值、RTC
return gps_values,rtc
while True:
time.sleep_ms(20)
get_GPS_values()
#OLED显示
oled.fill(0)
oled.show()
oled.text("GPS:",0,0)
oled.text(gps_values,0,16)
oled.text("Sate:",0,36)
oled.text(str(my_gps.satellites_in_use),64,36)
oled.text("Time:",0,50)
oled.text(rtc,64,50 )
oled.show()
#串口打印输出
print('Location:', gps_values)
print('State:', my_gps.satellites_in_use)
print('RTC:', rtc)
(三)功能展示及说明
1、Blink功能展示
如上图所示,板载LED灯1秒闪烁一次。
2、获取NTP网络时间功能演示
如上图所示,程序运行后,串口打印出通过NTP获得的日期与时间。
3、驱动外设及GNNS定位功能演示
如上图所示,程序运行后,OLED显示GNNS经维度坐标、卫星数、时间。
(四)对本活动的心得体会
1、改进目标
- 手机APP:开发一个APP,随时随地监控二狗子的位置、设置安全区域和接收警报通知。
- 物联网平台:物联网平台实时查看二狗子的位置。
- 警报通知:一旦二狗子离开安全区域,系统将立即发送警报通知我,以便我能够立即采取行动。
- 历史轨迹:系统能够存储和显示二狗子的历史轨迹记录,让我可以了解二狗子的活动范围和习惯。
三、可编译下载的代码