如何通过一个 LED 矩阵将 360 度图像呈现为一个可交互的观看窗口
扫描二维码
随时随地手机看文章
这个项目源于我在嵌入式设计课程早期时的一个想法。当时我试图思考能否用相对简单的基础组件构建出一些有趣且可行的系统,并由此提出了“低成本虚拟现实”这一概念——即通过一个单一屏幕连接到一个虚拟世界的单个画面,并利用惯性测量单元(IMU)动态地将其分割成适合我们模拟视窗的图像。
这融合了艺术与工程的元素,整体感觉很有趣,我对这个设计还算满意!
硬件
该系统的核心是一个名为“口袋贝格尔”的单板计算机,它使我们能够轻松地运行一个完整的 Linux 系统,并且能够便捷地访问大量的 GPIO(通用输入输出)和其他硬件通信协议。我们的“口袋贝格尔”接收到稳定的 5V2A 电压,然后通过分支连接来与所有其他传感器和组件进行接口和供电连接。
LED 矩阵使用 5V 逻辑电压工作,但 PocketBeagle 的 GPIO 只能支持最高 3.3V 的电压——我们使用了两块并联的双向电平转换板来将我们的 GPIO 引脚转换为 5V 逻辑电压!
用户交互通过四个按钮来实现,这些按钮采用了一个简单的 1kΩ 上拉电阻,并通过一个出色的 GPIO 接口与 PocketBeagle 进行连接。
该系统还会通过内置的蜂鸣器发出声音,这种声音是由一个 PWM 引脚驱动的(通过电平转换器转换为 5 伏电压)。这使我能够添加一些简单的音效,并通过一些设计元素来营造出我想要的“复古游戏机”那种氛围。
该系统还使用了一个通过 I2C 接口连接的 MPU6050 加速度计和陀螺仪来确定其方向。它能够通过一个简洁抽象的接口向任何内置应用程序提供这些数据,从而实现有趣的陀螺仪集成功能(比如“眼镜”应用程序,该应用程序会根据设备的方向生成并呈现全景图像的放大片段)。
软件
该软件系统本身是基于一个状态机设计的,它能够动态跟踪窗口运行所在的系统,并在不同应用程序之间传递控制权及抽象设备接口,同时确保没有任何一个应用程序能够同时对其进行控制。这使得我们能够将应用程序清晰地划分到一个整洁的文件系统中,并在应用程序层面将所有硬件抽象化。
这一层的抽象处理对于本地开发尤其有用……我有一个完全独立的、由pygame驱动的设备模拟器,我可以利用它来运行和测试我的应用程序,并且能看到它们的运行效果与在真实设备上运行时完全一致。
设计中的挑战
与显示器的连接耗费了相当多的时间,并且需要修改 Pocketbeagle 的设备树,以使用 prussdrv 而不是 PocketBeagle 的默认远程处理器。
我们正在使用的这个 pyledscape 库的编译安装过程在源代码方面也有些神秘难解,因此我无法弄清楚如何在不使用 sudo 操作的情况下让其正常运行(但它确实需要 sudo 权限!)
我还遇到了另一个问题,那就是我最初为一个较小尺寸的屏幕设计了一个完整的 3D 打印框架,后来当我需要修改设计时,却发现打印平台太小,无法容纳我新设计的框架。目前这个问题已经通过激光切割另一种框架得到了解决。
未来计划
我尽力为这个工具设计了相应的软件,使得运行在该软件上的实际应用与硬件的关联程度较低,并且易于扩展……在这方面,我有一个编程项目即将启动,该项目是基于康威的“生命游戏”模式来模拟气体云中的恒星生命周期,并且我打算将其移植到 Windows 系统上。这个项目应该会比较简单。
本文编译自hackster.io





