这次想要用行空板、sci数据采集模块,再加上北斗定位模块制作一个小游戏——城市寻宝。
材料清单
- 行空板 X
- SCI数据采集模块 X
- 北斗定位模块 X
- Arduino主控板 X
- AD按键面板 X
- 蓝牙音箱 X
- 电磁锁 X
- 云雀气象仪 X
- 小盒子 X
- 继电器 X
步骤1 Arduino部分(宝箱)
这里使用一个小盒子+电磁锁,用AD按键面板来触发解锁。
好玩之处在于AD按键面板有10个按键,需要根据行空板的提示找到对应的“钥匙”才可以打开宝箱。(后续设置自毁程序)
首先测试AD面板对应按键输出的模拟数值,然后根据需要,设置对应的“密码”(后续添加多位密码)
然后安装电磁锁、继电器、AD面板,这里我选用的是5v电磁锁,直接使用Arduino主控板的电,用充电宝供电。
程序很简单,如图所示
实物如图(时间紧迫,制作简陋……)
步骤2 行空板部分
行空板作为寻找宝藏的助手,可以在显示屏显示当前位置在宝箱的哪个方位,应该朝哪个方向走,本来想加入距离的测算,但是使用经纬度测算距离,公式比较复杂,我又不想凑合着用两点距离公式,所以改成了方向。下面从程序开始、宝箱侦测和密码提示三个方面来展示程序。
一、程序开始
寻找宝箱,我一下子就想到了 ONE PIECE 所以在程序开始,我让画面展示出 ONE PIECE 的图片和音乐,按下A键,则开启寻宝模式。
(这里注意:如果使用SCI的数据,则不需要初始化北斗模块)
二、宝箱侦测
在寻宝模式下,接入的北斗定位模块会告诉玩家,想要找到宝藏,应该朝哪个方向走,根据经纬度关系,会在屏幕有两行,分别提示东南方向和西北方向,并且在靠近宝箱之后会发出响声提醒。
实物如图:
三、密码提示
在宝箱附近,行空板会给出密码的提醒,但是想要获得这个提醒本身,需要玩家,根据屏幕提示,进行解密!
实物如图:
四、关于北斗定位模块与经纬度
实际操作中,有几点需要注意,以及我自己的一些思考:
1.北斗定位模块需要在户外开阔的地方才可以搜索到卫星信号;
2.宝箱和玩家的位置都可以通过北斗定位模块获取,但是两点间的距离不能简单地使用两点距离公式进行计算
3.我使用腾讯的位置服务,分别获取了工作单位和居住小区的经纬度,再使用在线经纬度距离计算工具得知:家距离学校大致0.35km,这个距离经度差值在0.001个单位,纬度在0.0001个单位,如下图所示:
所以我在程序中设定“如果玩家出现在宝箱附近经度±0.005且纬度±0.0005时,播放提示音与音乐”
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import sys
sys.path.append("/root/mindplus/.lib/thirdExtension/liliang-gravitysci-thirdex")
from dfrobot_rp2040_sci import *
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from pinpong.board import Board
from unihiker import Audio
from unihiker import GUI
import math
import time
# 自定义函数
def XunZhaoBaoCang():
DangQianJingDu = (float(SCI1.get_valueFloat0("Lon")))
DangQianWeiDu = (float(SCI1.get_valueFloat0("Lat")))
if ((DangQianJingDu - BaoCangJingDu) > 0):
东西.config(text="东西方向:向西")
else:
东西.config(text="东西方向:向东")
if ((DangQianWeiDu - BaoCangWeiDu) > 0):
南北.config(text="南北方向:向南")
else:
南北.config(text="南北方向:向北")
Board().begin()
u_gui=GUI()
u_audio = Audio()
SCI1 = DFRobot_RP2040_SCI_IIC(addr=0x21)
while SCI1.begin() != 0:
print("Initialization Sensor Universal Adapter Board failed.")
time.sleep(1)
print("Initialization Sensor Universal Adapter Board done.")
背景=u_gui.draw_image(image="封面.png",x=0,y=0)
u_audio.start_play("onepiece.mp3")
u_gui.wait_a_click()
背景.config(image="背景2.jpg")
u_audio.stop_play()
buzzer.play(buzzer.JUMP_UP,buzzer.Once)
BaoCangJingDu = (float(108.894076))
BaoCangWeiDu = (float(34.165289))
DangQianJingDu = SCI1.get_valueFloat0("Lon")
DangQianWeiDu = SCI1.get_valueFloat0("Lat")
提示=u_gui.draw_text(text="注意看方向提示",x=0,y=0,font_size=20, color="#0000FF")
东西=u_gui.draw_text(text=(str("东西方向:") + str(" ")),x=0,y=140,font_size=20, color="#FF6600")
南北=u_gui.draw_text(text=(str("南北方向:") + str(" ")),x=0,y=180,font_size=20, color="#33FF33")
while not ((((-0.005 <= (DangQianJingDu - BaoCangJingDu)) and ((DangQianJingDu - BaoCangJingDu) <= 0.005)) and ((-0.0005 <= (DangQianWeiDu - BaoCangWeiDu)) and ((DangQianWeiDu - BaoCangWeiDu) <= 0.0005)))):
XunZhaoBaoCang()
buzzer.pitch(523,2)
提示.config(text="ONE PIECE!!")
case=u_gui.draw_image(image="宝箱1.png",x=70,y=50)
东西.config(text="距离ONE PIECE")
南北.config(text="仅一步之遥")
提示2=u_gui.draw_text(text="提示:",x=0,y=210,font_size=20, color="#000099")
提示3=u_gui.draw_text(text="计算机世界不止有1",x=0,y=240,font_size=20, color="#000099")
u_audio.play("永久指针.mp3")
附件
这两天下大雨,抽空补视频~
伦**2024.03.19
666
小含糊online2024.03.19
666
小含糊online2023.11.26
补充一下,腾讯定位服务用的是“坐标拾取”功能https://lbs.qq.com/getPoint/
柳春晓2023.09.04
寻宝的时候不准,是因为拿在手里的时候定位模块的天线是垂在下面的,没有面向天空,所以精度会变差
小含糊online2023.09.05
原来如此!一开始设想加上一个电机,模拟雷达,把扫描宝箱位置的画面展现在行空板来着,受限于能力和精力,惭愧……
恩果2023.08.29
增加一个标记宝藏位置的功能
小含糊online2023.09.02
是啊,如果能让行空板展示一个微型地图就更好了
hacker_2023.08.28
666
小含糊online2023.09.05
666
匿名
该评论已删除
小含糊online2023.09.05
okk