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 步走
-
淘寶/嘉立創打樣 OpenVLC Cape(BOM ≈ 30 ¥)。
-
燒錄官方鏡像到 8 GB micro-SD:
sudo dd if=openvlc-debian-10.img of=/dev/sdX bs=4M status=progress
-
插入 Cape + 上電,串口 115200 登錄,確認
dmesg | grep openvlc
無報錯。 -
兩臺 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
- 看到 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 里持續更新。
如果上述外鏈因網絡原因無法打開,建議:
- 檢查 URL 拼寫;
- 使用教育網/國際出口代理;
- 直接訪問 GitHub 鏡像站 https://hub.fastgit.org/openvlc/openvlc 。
祝你在“光聯網”的世界里玩得開心!