60 美元玩转 Li-Fi —— 开源 OpenVLC 平台入门(附 BeagleBone Black 驱动简单解析)

60 美元玩转 Li-Fi —— 开源 OpenVLC 平台入门(附 BeagleBone Black 及驱动解析)


一、什么是 OpenVLC?
OpenVLC 是由西班牙 IMDEA Networks 研究所推出的开源可见光通信(VLC / Li-Fi)研究平台。它把硬件、驱动、协议栈全部开源,让通信、光学、嵌入式甚至艺术设计等不同背景的同学都能用 ≈ 60 美元 的成本快速搭出一套“用灯上网”的原型系统。

项目主页:http://openvlc.org

GitHub: https://github.com/openvlc/openvlc


二、OpenVLC 的系统组成

层级 说明 备注
硬件 BeagleBone Black(BBB)+ OpenVLC Cape 开源 PCB 原理图,60 左右即可复刻
软件 Linux 驱动 + 用户态 API 完全软件定义 PHY/MAC,可热插拔协议
光电器件 低功耗 LED ×2、高功率 LED ×1、光电二极管 PD ×1 低功耗 LED 同时承担 TX/RX,节省成本


三、BeagleBone Black 深度解剖
OpenVLC 选用 BBB 做核心,不是拍脑袋的决定,而是“实时 PRU + 丰富 GPIO + 开源生态”三重优势叠加的结果。

3.1 硬件资源一览

  • SoC:TI AM3358 ARM Cortex-A8,主频 1 GHz

  • 内存:512 MB DDR3

  • 存储:4 GB eMMC + micro-SD 卡槽

  • 2 个 PRU-ICSS(32-bit 实时 RISC):

    – 每个 PRU 200 MHz,指令周期 5 ns

    – 可 bit-bang 产生 100 kHz 8 MHz 的 Manchester / PWM / 自定义波形 → 完美适配 VLC 所需的 µs 级调制

  • GPIO

    – 65 个可编程引脚,其中 8 个支持 PWM,4 个支持 eCAP(输入捕获)

    – 3.3 V 电平,可直接驱动 LED 或经简单 MOSFET 驱动高功率 LED

  • 外设

    – USB 2.0 Host/Device

    – 10/100 M Ethernet(调试时使用)

    – JTAG(调试 PRU 利器)

3.2 系统启动路径

micro-SD 或 eMMC → MLO(1st stage)→ u-boot.img → zImage → dtb → rootfs

OpenVLC 官方镜像基于 Debian 10,内核 4.19+,已集成:

  • cape-universal(动态加载设备树)
  • PRU 固件加载器 pru_rproc
  • 用于 100 kHz-10 MHz 时钟的 clkdriver 内核模块

3.3 与 OpenVLC Cape 的物理连接

BBB 引脚 功能 Cape 信号 说明
P8_13 ehrpwm2B LED_TX_PWM 高功率 LED 调制
P8_19 ehrpwm2A PD_RX_ADC 光电二极管采样触发
P8_15 GPIO1_15 LED_RX_EN 低功耗 LED 开关
P8_16 GPIO1_14 PD_BIAS_EN 运放偏置开关
P9_31 PRU0_r30_0 MANCHESTER_OUT PRU 直接输出 Manchester 码
P9_29 PRU0_r31_3 MANCHESTER_IN PRU 直接采样输入

BBB 的 Cape EEPROM(0x54)里预写 "OpenVLC1.1",系统启动时会自动加载对应设备树片段 BB-OPENVLC1-00A0.dtbo,无需手动 echo 到 slots。


四、OpenVLC 驱动深入解读
源码位于 driver/openvlc/ 目录,主要模块关系如下:

openvlc.ko├─ openvlc_netdev.c  // 创建 net_device,实现 ndo_open/close/xmit├─ openvlc_phy.c     // 软件 PHY:Manchester 编码/解码、OOK、PPM├─ openvlc_mac.c     // MAC:CSMA/CA、TDMA、纯 Aloha(可切换)├─ openvlc_pru_fw.c  // 加载 PRU 固件 pru0-fw.bin└─ openvlc_sysfs.c   // /sys/class/openvlc/* 调参接口

4.1 TX 路径(用户态 → LED)

用户数据 → socket(PF_INET, SOCK_RAW, 0x00c0) → openvlc_xmit() → PRU 固件 → PWM/Manchester → LED
  • PRU 固件 tx_firmware.p 把 RAM 中的帧按 10 µs/bit 打码,同时翻转 GPIO 输出。
  • 若配置 echo 1 > /sys/class/openvlc/modulation 则切换到 OOK,PRU 固件会切换查找表。

4.2 RX 路径(PD → 用户态)

PD → ADC (BBB 内 12-bit 200 kS/s) → PRU 中断 → openvlc_rx_isr() → 软件 PLL → 解码 → 向上层递交 sk_buff
  • rx_firmware.p 用 eCAP 模块捕捉上升沿,时间戳差分解码 Manchester。
  • 通过 ethtool -i openvlc0 可查看实时统计:
    • rx_bytes / rx_packets / rx_crc_errors
    • tx_underrun / tx_collision

4.3 调参示例

# 1. 切换 MAC 协议
echo "tdma" > /sys/class/openvlc/mac_mode# 2. 调整 LED 亮度(占空比 0~255)
echo 180 > /sys/class/openvlc/tx_power# 3. 打开调试日志
echo 1 > /sys/module/openvlc/parameters/debug
dmesg -w | grep openvlc

五、快速上手 5 步走

  1. 淘宝/嘉立创打样 OpenVLC Cape(BOM ≈ 30 ¥)。

  2. 烧录官方镜像到 8 GB micro-SD:

    sudo dd if=openvlc-debian-10.img of=/dev/sdX bs=4M status=progress

  3. 插入 Cape + 上电,串口 115200 登录,确认 dmesg | grep openvlc 无报错。

  4. 两台 BBB 互相对灯,各跑:

   # 节点 A(192.168.3.1)ifconfig openvlc0 192.168.3.1 upiperf -s -u# 节点 B(192.168.3.2)ifconfig openvlc0 192.168.3.2 upiperf -c 192.168.3.1 -u -b 100K
  1. 看到 iperf 成功跑通 20-40 kbps,恭喜入门!

六、常见问题 FAQ

问题 原因 解决
insmod openvlc.ko 报 Unknown symbol 未加载 pru_rproc modprobe pru-rproc
只有 5 kbps LED 偏置电流太小 调大 Cape 的 R_set 或换高功率 LED
RX 报大量 crc_error 环境光过强 加 850 nm 带通滤光片,或在 rx_firmware.p 提高阈值


七、拓展阅读

  • 论文原文:OpenVLC, an Open-Source Platform for the Internet of Light

    http://eprints.networks.imdea.org/1100/1/paper.pdf

  • PRU 汇编指南:TI PRU-ICSS Reference Guide (SPRUHF8A)

  • 社区例程:基于 OpenVLC 的「光围栏」、可见光室内定位、AR 灯控游戏等,均在 GitHub Issue 里持续更新。


如果上述外链因网络原因无法打开,建议:

  1. 检查 URL 拼写;
  2. 使用教育网/国际出口代理;
  3. 直接访问 GitHub 镜像站 https://hub.fastgit.org/openvlc/openvlc 。

祝你在“光联网”的世界里玩得开心!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88574.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python性能优化

Python 以其简洁和易用性著称,但在某些计算密集型或大数据处理场景下,性能可能成为瓶颈。幸运的是,通过一些巧妙的编程技巧,我们可以显著提升Python代码的执行效率。本文将介绍8个实用的性能优化技巧,帮助你编写更快、更高效的Python代码。   一、优化前的黄金法则:先测…

easyui碰到想要去除顶部栏按钮边框

只需要加上 plain"true"<a href"javascript:void(0)" class"easyui-linkbutton" iconCls"icon-add" plain"true"onclick"newCheck()">新增</a>

C++字符串详解:原理、操作及力扣算法实战

一、C字符串简介在C中&#xff0c;字符串的处理方式主要有两种&#xff1a;字符数组&#xff08;C风格字符串&#xff09;和std::string类。虽然字符数组是C语言遗留的底层实现方式&#xff0c;但现代C更推荐使用std::string类&#xff0c;其封装了复杂的操作逻辑&#xff0c;提…

CMU15445-2024fall-project1踩坑经历

p1目录&#xff1a;lRU\_K替换策略LRULRU\_K大体思路SetEvictableRecordAccessSizeEvictRemoveDisk SchedulerBufferPoolNewPageDeletePageFlashPage/FlashAllPageCheckReadPage/CheckWritePagePageGuard并发设计主逻辑感谢CMU的教授们给我们分享了如此精彩的一门课程&#xff…

【C语言进阶】带你由浅入深了解指针【第四期】:数组指针的应用、介绍函数指针

前言上一期讲了数组指针的原理&#xff0c;这一期接着上一期讲述数组指针的应用以及数组参数、函数参数。首先看下面的代码进行上一期内容的复习&#xff0c;pc应该是什么类型&#xff1f;char* arr[5] {0}; xxx pc &arr;分析&#xff1a;①首先判断arr是一个数组&#x…

在HTML中CSS三种使用方式

一、行内样式在标签<>中输入style "属性&#xff1a;属性值;"。(中等使用频率)不利于CSS样式的复用&#xff1b;违背了CSS内容和样式分离的设计理念&#xff0c;后期难以维护。<p style"color: red">这是div中的p元素</p>二、内部样式在…

汽车功能安全-软件单元验证 (Software Unit Verification)【用例导出方法、输出物】8

文章目录1 软件单元验证用例导出方法2 测试用例完整性度量标准3 验证环境要求4 软件单元验证的工作产品1 软件单元验证用例导出方法 为确保软件单元测试的测试案例规范符合9.4.2要求&#xff0c;应通过表8所列方法开发测试用例。 表8 软件单元测试用例的得出方法&#xff1a; …

MySQL内置函数(8)

文章目录前言一、日期函数二、字符串函数三、数学函数四、其它函数总结前言 其实在之前的几篇中我们也用到了内置函数&#xff0c;现在我们再来系统学习一下它&#xff01; 一、日期函数 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp(…

苍穹外卖项目日记(day04)

苍穹外卖|项目日记(day04) 前言: 今天主要是接口开发, 涉及的新东西不多, 需要注意的只有多表联查和修改的逻辑,今日难点: 1.菜品的停起售状态设置 2.套餐的停起售状态设置 3.动态sql中的 useGeneratedKeys 与 keyProperty 两个参数 一. 菜品的停起售状态设置 ​ 在菜品的停售中…

React之旅-05 List Key

每个React的初学者&#xff0c;在调试程序时&#xff0c;都会遇到这样的警告&#xff1a;Warning: Each child in a list should have a unique "key" prop. 如下面的代码&#xff1a; const list [Learn React, Learn GraphQL];const ListWithoutKey () > (&l…

[特殊字符] 人工智能技术全景:从基础理论到前沿应用的深度解析

&#x1f680; 人工智能技术全景&#xff1a;从基础理论到前沿应用的深度解析 在这个AI驱动的时代&#xff0c;理解人工智能的核心技术和应用场景已成为技术人员的必备技能。本文将带你深入探索AI的发展脉络、核心技术差异以及在各行业的创新应用。 文章目录&#x1f680; 人工…

Go语言教程-环境搭建

前言 Go&#xff08;又称 Golang&#xff09;是由 Google 开发的一种 开源、静态类型、编译型 编程语言&#xff0c;于 2009 年正式发布。它旨在解决现代软件开发中的高并发、高性能和可维护性问题&#xff0c;尤其适合 云计算、微服务、分布式系统 等领域。 Go 语言国际官网…

windows指定某node及npm版本下载

下载并安装 nvm-windowshttps://github.com/coreybutler/nvm-windows/releases&#xff08;选择 nvm-setup.zip&#xff09;。打开命令提示符&#xff08;管理员权限&#xff09;&#xff0c;安装 Node.js v16.15.0&#xff1a; nvm install 16.15.0 nvm use 16.15.0 验证node版…

每天一个前端小知识 Day 28 - Web Workers / 多线程模型在前端中的应用实践

Web Workers / 多线程模型在前端中的应用实践&#x1f9e0; 一、为什么前端需要多线程&#xff1f; 单线程 JS 的瓶颈&#xff1a;浏览器主线程不仅负责执行 JS&#xff0c;还要负责&#xff1a; UI 渲染&#xff08;DOM/CSS&#xff09;用户事件处理&#xff08;点击、输入&am…

python:ImportError: cannot import name ‘ParameterSource‘ from ‘click.core‘

浏览器访问网站抛错&#xff1a;ImportError: cannot import name ParameterSource from click.core (E:\environment\python\Lib\site-packages\click\core.py)问题分析&#xff1a;1. click 版本问题ParameterSource 可能是在某个特定版本的 click 库中引入的&#xff0c;而你…

flink 去重

LOCALTIMESTAMP as time_stamp ts as case when time is null then CURRENT_TIMESTAMP else TO_TIMESTAMP_LTZ(time, 0) end , watermark for ts as ts - interval ‘60’ second PARTITION BY 的都有回撤流 group by 的没有回撤流 因为算的是指标 开窗又慢 SELECT * FROM (…

【音视频】TS协议解析

参考博客&#xff1a;https://blog.csdn.net/rell336/article/details/38109621?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_sourcedistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMac…

uniapp 日期组件可选择年月

month-picker 月份选择器组件 组件介绍 month-picker 是一个用于选择年月的自定义组件&#xff0c;基于 uni-app 开发&#xff0c;提供了简洁的月份选择功能。 解决弹框底部出现底部页面区域 safe-area属性设为true时&#xff0c;即可解决这个问题效果如图功能特点 支持选择年份…

从真人到数字分身:3D人脸扫描设备在高校数字人建模教学中的应用

在影视、动漫、游戏等数字创意产业蓬勃发展的当下&#xff0c;超写实虚拟数字人凭借其高度逼真的形象&#xff0c;成为行业关注的焦点。无论是影视特效中栩栩如生的角色&#xff0c;还是游戏里精致的NPC&#xff0c;超写实虚拟数字人的制作都离不开先进的技术支撑。而3D人脸扫描…

你以为大数据只是存?其实真正的“宝藏”藏在这招里——数据挖掘!

你以为大数据只是存&#xff1f;其实真正的“宝藏”藏在这招里——数据挖掘&#xff01; 曾经我也天真地以为&#xff0c;搞大数据就是会写几个SQL、部署个Hadoop集群&#xff0c;结果真到项目现场&#xff0c;甲方爸爸一句&#xff1a;“给我挖掘一下用户的购买意图”&#xf…