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 调参示例

bash 复制代码
# 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 up
    iperf -s -u
    # 节点 B(192.168.3.2)
    ifconfig openvlc0 192.168.3.2 up
    iperf -c 192.168.3.1 -u -b 100K
  5. 看到 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

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

相关推荐
情绪总是阴雨天~42 分钟前
OpenClaw 核心机制深度讲解:开源个人 AI 智能体全解析
人工智能·开源
LabVIEW开发8 小时前
LabVIEW QMH 队列消息处理架构
架构·labview·labview知识·labview功能·labview程序
为何创造硅基生物8 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好8 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅9 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
rising start9 小时前
二、全面理解MySQL架构
mysql·架构
麦客奥德彪9 小时前
Android Skills
架构·ai编程
jolimark10 小时前
C语言自学攻略:小白入门三步走
c语言·编程入门·学习路线·实践项目·自学攻略
candyTong10 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
cen__y10 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git