22浏览
查看: 22|回复: 0

[M10项目] 基于行空板M10打造一个离线便携导航仪!

[复制链接]
PathFinder 是一款可穿戴便携设备,可以存储离线地图,并通过方向键来查看和导航。
基于行空板M10打造一个离线便携导航仪!图1

基于行空板M10打造一个离线便携导航仪!图2

PathFinder,一款由 行空板M10 驱动的 DIY 数字离线地图设备,旨在帮助你找到方向。

我经常在家乡附近的山区骑行,那里经常有些地方完全没有信号。完全依赖谷歌地图是绝对不行的;有时由于数据问题,地图无法完全加载,
如果我们有实体地图和一些导航技能,这些问题都能解决。我没有实体地图,但我制作了一个数字地图,加载在 UNIHIKER M10 板上。我们可以通过方向键导航地图。有了这个,如果被困住了,人们就可以自救

为了测试这个方法,我去了家乡附近山区的一个偏远地区,用这张地图导航一条我从未去过的路。我跟着地图走,顺利找到了路。

本文涵盖了该项目的完整构建过程,从 PCB 的构建到代码和器件组装,让我们开始吧。

准备工具
  • 行空板M10
  • 定制PCB板
  • 3D打印零件
  • IP5306 电源管理集成电路
  • 10uF 1206 电容
  • 垂直按钮
  • LED灯
  • 1uH 电感器 SMD
  • 按钮(尺寸为 4x4 毫米)


基于行空板M10打造一个离线便携导航仪!图3

地图方面,我从《辐射:新维加斯 Pip-Boy 3000》的界面中获得了灵感,它带有琥珀色调。普通地图很无聊,作为《辐射》粉丝,我有责任制作一张受 Pip-Boy 启发的地图。
使用了两个库。第一个是 UNIHIKER 驱动,它控制内置的 240×320 显示屏。还有 PinPong 库,用于读写 GPIO 引脚。

显示帧
我们先创建一个图像小部件,然后每帧更新其文件。
  1. gui = GUI()
  2. # Create once
  3. display_img = gui.draw_image(x=0, y=0, image="/tmp/frame.png")
  4. # Every frame: save new image, then update the same widget
  5. frame.save("/tmp/frame.png")
  6. display_img.config(image="/tmp/frame.png")
复制代码

用Pillo渲染
所有图形均通过 Pillow 在内存中合成 ——没有帧缓冲区,也没有 pygame。每一帧通过:
  • 从2000×2000地图裁剪出320×240的视窗
  • 涂上琥珀色
  • 绘制 CRT 网格+POI 图标
  • 复合扫描线叠加
  • 动画准星
  • 绘制 HUD 条
  • 旋转到横向
  • 保存并推送

  1. ```python
  2. from PIL import Image, ImageDraw
  3. viewport = self._map.crop((x0, y0, x0 + VIEWPORT_W, y0 + VIEWPORT_H))
  4. frame    = viewport.convert("RGBA")
  5. draw     = ImageDraw.Draw(frame)
  6. ```
复制代码

设置地图颜色
地图加载时是正常的 RGB。为了获得 Pip-Boy 的荧光粉外观,红色通道作为三个通道的亮度源:
  1. r, g, b = img.split()
  2. img = Image.merge("RGB", (
  3.     r,
  4.     r.point(lambda v: int(v * 0.71)),   # amber green
  5.     r.point(lambda v: int(v * 0.26)),   # amber blue
  6. ))
  7. Ratios `(1.0, 0.71, 0.26)` match the target amber `(255, 182, 66)`.
复制代码

物理按钮
按钮接线到带有内部上拉电阻的 GPIO 引脚。按下时,针脚会拉低电位,读数为“0”表示“被压”。
  1. from pinpong.board import Board, Pin
  2. Board("unihiker").begin()
  3. btn_up = Pin(Pin.P3, Pin.IN, Pin.PULLUP)
  4. if btn_up.read_digital() == 0:
  5.     move_y = -PAN_SPEED
  6. if not hasattr(Pin, "PULLUP") and hasattr(Pin, "PULL_UP"):
  7.     Pin.PULLUP = Pin.PULL_UP
复制代码

竖屏上的风景
实体显示是240×320(竖屏)。我会在320×240画布(横幅)中绘制,并在保存前旋转每一帧:
  1. frame = frame.rotate(-90, expand=True)
  2. # result: 240×320 — fills the screen when held sideways
复制代码

渲染环
标准固定时间步循环——在帧预算剩余时间内休眠。
  1. target_fps = 15
  2. frame_time = 1.0 / target_fps
  3. while True:
  4. t0 = time.time()
  5. # ... read buttons, render, push frame ...
  6. sleep_t = frame_time - (time.time() - t0)
  7. if sleep_t > 0:
  8. time.sleep(sleep_t)
复制代码

Libraries
  1. | Library | Install | Purpose |
  2. |---|---|---|
  3. | `pillow` | `pip install pillow` | All image rendering |
  4. | `unihiker` | pre-installed | Push frames to the screen |
  5. | `pinpong` | pre-installed | GPIO buttons and buzzer |
  6. | `math`, `time`, `os` | standard library | Animation, timing, file checks |
复制代码


电源输入
接着,在配置好地图设置后,我们解决了行空板的电源输入问题。行空板M10 使用 USB Type-C 端口作为电源输入,提供稳定的 5V 电压,使设备能够正常运行。这块板的问题是没有内置电池接口。
在 Type-C 端口附近,我们发现了两个终端。第一个端子连接到 USB Type-C 端口的 VCC,另一个端子连接到 GND。
通过给这两个端子提供 5V,我们可以为这块板供电,但为此,我们需要一个稳定的电源。

3D设计
基于行空板M10打造一个离线便携导航仪!图4

基于行空板M10打造一个离线便携导航仪!图5

在这个项目中,我的想法是做一个屏幕旁边有四个按钮的设备,灵感来源于赛博朋克类型,强调显示屏,造型方正对称。
为了提升设计效果,我添加了屏幕反光遮阳板部分,这也具有实用功能。当设备在户外使用时,它为行空板的显示屏提供遮阳,使视野更为清晰。
为了美观,特意加了一个较大的按钮,通过添加不同部件,用三种彩色耗材——红、白、黑——来 3D 打印这些部件,创造出极佳的色彩组合。
模型内部有完善的电路布局,包括按钮板。每个电路都有自己的安装螺丝凸台,我们用 M2 螺丝固定电路板并固定。
我们还在设备一侧增加了开口,方便访问 UNIHIKER M10 的 USB 端口,以便重新编程设备。还增加了开口,用于连接电源模块的 USB 端口和开关按钮。
我们在一端加了一个类似挂钩的部分,可以连接带子来存放证件。

基于行空板M10打造一个离线便携导航仪!图6

模型最终确定后,我们用 Hyper PLA 在相同设置下 3D 打印了所有零件,包括 0.2 毫米层高、25%填充和树木支撑,Z 轴距离为 0.3 毫米。
前身印有白色 Hyper PLA 字样。背部机身、遮阳部分和美观部分均采用黑色 Hyper PLA 印刷。红色 Hyper PLA 用于打印四个开关和旋钮部分。

PCB 设计——电源板
基于行空板M10打造一个离线便携导航仪!图7

基于行空板M10打造一个离线便携导航仪!图8

在该电路中,IP5306 电源管理集成电路从 3.7V 锂离子电池中获得稳定的 5V/2A 电流。其高切和低切特性防止了电池的过充和过放电。
我们使用的充电口是一个 C 型通孔口,连接到 IC 充电口。除了充电口和 GND,我们还加入了一个 10uF 滤波电容和一个 10uF 电容组合,并配有 2 欧姆电阻。
此外,IC 的 LED 接口还增加了四个 LED 灯,作为电池满电指示灯。
新增了一个按钮,用于设备开关。
此外,我们在 IC 和 GND 输出端增加了两个额外的滤波电容。

动力来源本项目的电源是锂离子电池,具体来说是 14500 的 3.7 伏 600mAh 锂离子电池,预装了 PCM 电路。该 PCM 电路保护电池免受过载和过放电,甚至提供短路保护。
基于行空板M10打造一个离线便携导航仪!图9

  • 电池的B+和B-通过烙铁焊接到我们的电源管理板电池端子上。
  • 为了测试设置,我用万用表按下垂直按钮,打开了电路,我们可以看到指示灯亮起。
  • 用万用表,我们可以检测电路的输出电压,测得稳定的5V,说明设备是正常的。

按钮板组装
按钮板的组装相当简单。
我们把四个按钮都放到原位,翻过主板,然后用烙铁焊接所有按钮的引脚。

连接设备
基于行空板M10打造一个离线便携导航仪!图10

基于行空板M10打造一个离线便携导航仪!图11

基于行空板M10打造一个离线便携导航仪!图12

按以下顺序连接:
  • 按钮 A 连接到行空板的 P3接口。按钮 B 连接到行空板的 P0。按钮 C 连接到 P1。D 键连接到 P2。
  • 将车载蜂鸣器连接到接口 P26。
  • 用连接线将电源板的 5V 和 GND 端子与行空板的 5V 和 GND 端子配对。
  • 按下垂直按钮,设置启动,行空板屏幕亮起,即设置成功。

外壳部件组装
  • 首先将按钮板放在四个螺丝凸台上,用四颗 M2 螺丝固定它。
  • 接下来,锂电池被放置在下面,我们在那里建模了一个电池支架。电路也放置在两个螺丝凸台上,并用两颗 M2 螺丝固定。我们用一点热熔胶把细胞保持完整并固定住。
  • 用万用胶把建模的美观部件粘在外壳前端上。我们在正面涂上强力胶,放置美观部分,并固定好。
  • 行空板M10从正面外壳的内侧安装,用热熔胶固定。
  • 3D 打印的按钮是从前侧内部安装的,前后机身被组装并用四颗 M2 螺丝固定。
  • 将按钮安装在设备正面,起到装饰作用。
  • 用两颗M2螺丝安装剩余配件。

你还可以额外加一条肩带,方便外出携带设备。

成果与展望
进过以上步骤,基于行空板M10的DIY 的数字地图设备就完成了,可以帮助旅行者找到自己的道路。它基本上是一个屏幕里的地图,加载时没有 Wi-Fi 或任何网络连接。用方向键,我们可以轻松导航地图。
为了测试,我骑着摩托车去了一个以前没去过的地方,用 PathFinder 导航,效果相当不错。

另外,还可以通过添加温度传感器、视频录制,甚至一些 AI 功能,比如追踪前方车辆来扩展它的功能。如果安装在车上,甚至可以配备蓝牙扬声器,拥有可能性无限。



作者:Arnov Sharma
首发平台:探路者 - Hackster.io --- PathFinder - Hackster.io


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

本版积分规则

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

硬件清单

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

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

mail