基于Linux驱动的可见光通信方案 —— 开源 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/pingmian/88552.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88552.shtml

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

相关文章

Git系列--4.Git分支设计规范

目录 一、了解开发环境 1.1概念阐述 1.2系统概括图 二、设计规范之GitFlow模型 2.1具体分支概念 2.1.1master 分⽀ 2.1.2release 分⽀ 2.1.3develop 分⽀ 2.1.4feature 分⽀ 2.1.5hotfix 分⽀ 2.2宏观表格 三、分支流程图 一、了解开发环境 1.1概念阐述 对于开发人员…

【时间之外】AI在农机配件设计场景的应用

目录 农机制造业痛点 AI场景畅想 落后就要挨打 农机制造业痛点 最近,我与一位在制造业摸爬滚打多年的老友相聚。酒过三巡,话题渐渐转到他的事业上。他兴致勃勃地跟我讲起,自己正主导着一个规模达几千万的项目,生产基地远在孟加…

基于定制开发开源AI智能名片与S2B2C商城小程序的旅游日志创新应用研究

摘要:本文探讨了旅游日志在记录旅行美景与人物中的重要性,结合当下数字化发展趋势,引入定制开发开源AI智能名片与S2B2C商城小程序的概念。分析如何将这两者与旅游日志风格元素相融合,打造一种创新的旅游记录与分享模式&#xff0c…

XGBoosting算法详解(Boosting思想的代表算法)

文章目录相关文章一、Boosting思想:从弱到强的串行提升二、XGBoost算法思想:GBDT的极致优化三、XGBoost数学原理:从目标函数到树分裂3.1 目标函数定义3.2 正则化项:控制树的复杂度3.3 泰勒二阶展开:简化目标函数3.4 化…

Vue + Element UI 实现选框联动进而动态控制选框必填

目录 一. 需求描述 二. 解决思路 三. 代码实现 四. 效果展示 一. 需求描述 如下图所示,新增人员页面,有字段"Leader DS"和"Leader DS名称"。 现在我要在字段"Leader DS"和"Leader DS名称"字段下方再添加一…

高通SG882G平台(移远),Ubuntu22编译:1、下载代码

不要使用Ubuntu24,不稳定。 docker听着美好,其实也有问题。比如你给别人的时候,虚拟机直接给过去,马上就能用。 安装工具 sudo apt-get install -y \ diffstat xmlstarlet texinfo chrpath gcc-aarch64-linux-gnu libarchive-d…

Android音视频探索之旅 | C++层使用OpenGL ES实现视频渲染

一.前言 在学习音视频的过程中,实现视频渲染是非常常见的,而渲染的方式也挺多,可以使用Java层的OpenGL ES进行图形渲染,也可以使用Ffmpeg来显示,还有就是通过C层的OpenGL ES来进行渲染。OpenGL ES是OpenGL三维图形API…

公链的主要特征有哪些?

公链(公共区块链)是指对所有人开放、无需授权即可参与的区块链,其主要特征包括:- 开放性:任何人都可以自由加入网络,参与节点运行、数据验证或交易,无需经过中心化机构的审核。- 去中心化&#…

博途多重背景、参数实例--(二)

引用官方技术支持: 《《 博图,怎么把DINT类型转换成TIME,就是MCGS触摸屏上设置时间,PLC里的定时器TIME 》》 我们把上面的实现,封装成FC,FB块(FB程序内调用定时器指令时的选项不…

单片机基础

什么是嵌入式系统? 嵌入式系统通常指的是专门为某种功能设计的微型计算机系统,比如智能手表、家电控制板、汽车ECU等。 什么是嵌入式系统的IO? IO(Input/Output,输入/输出)就是嵌入式系统与外部世界“交…

全连接神经网络(MLP)原理与PyTorch实现详解

一、全连接神经网络概述全连接神经网络(Fully Connected Neural Network),也称为多层感知机(Multi-Layer Perceptron, MLP),是深度学习中最基础的神经网络结构之一。它由多个全连接层组成,每一层的神经元与下一层的所有神经元相连接。1.1 神经…

推荐系统-数据分割、性能验证

推荐系统基础概念前言 作者根据开源项目 gorse 的每一步提交, 系统性学习推荐系统架构组成以及gorse中使用的推荐算法的实现。 通过参考算法文档以及代码实现,作者对gorse的学习过程以及进度 与 博客发布的时间线保持一致数据集分割原因 推荐系统的根本任…

从电商新手到单日变现5000+,我是如何做到闲鱼爆单的

很多人想做项目赚钱,却总是迈不出第一步。今天给大家分享一个可以从电商小白到成功跑通项目,实现单日GMV 5000的项目。今天将分享从选品、内容制作、销售服务的全过程实战经验。1:闲鱼实战,强执行力01实操前的准备执行力就是你的动…

vue3实现pdf文件预览 - vue-pdf-embed

参考地址:https://juejin.cn/post/7105933034771185701 这个参考文章的代码直接可以复制使用,样式也是给到的,但是实现的是一页一页的显示pdf内容,我的需求是要全部展示出来,页码切换时是做一个滚动定位操作。 思路&am…

【AI论文】OmniPart:基于语义解耦与结构连贯性的部件感知三维生成

摘要:创建具有显式、可编辑部件结构的三维资产,对于推动交互式应用的发展至关重要。然而,大多数生成方法仅能生成整体式形状,限制了其实际应用价值。我们提出OmniPart——一种新型的部件感知三维物体生成框架,旨在实现…

Pandas-数据查看与质量检查

Pandas-数据查看与质量检查一、数据查看:快速掌握数据概况1. 整体概览:shape与info()2. 数值特征预览:describe()3. 随机抽样:head()与sample()二、数据质量检查:识别与处理问题1. 缺失值检查与处理处理策略&#xff1…

类和对象拓展——日期类

一.前言通过前面对类和对象的学习&#xff0c;现在我们可以开始实践日期类的代码编写。在实际操作过程中&#xff0c;我会补充之前文章中未提及的相关知识点。二.正文 1. 日期类代码实现我们先来看看要实现什么功能吧&#xff0c;把他放在Date.h中#pragma once #include<ios…

大模型KV缓存量化误差补偿机制:提升推理效率的关键技术

大模型KV缓存量化误差补偿机制&#xff1a;提升推理效率的关键技术摘要 随着大型语言模型&#xff08;LLM&#xff09;参数规模突破千亿级别&#xff0c;推理过程中的显存占用与计算延迟成为制约其实际部署的核心瓶颈。KV缓存&#xff08;Key-Value Cache&#xff09;作为Trans…

QT跨平台应用程序开发框架(6)—— 常用显示类控件

目录 一&#xff0c;Label 1.1 主要属性 1.2 文本格式 1.3 设置图片 1.4 其它常用属性 1.5 设置伙伴 二&#xff0c;LCD Number 2.1 主要属性 2.2 实现倒计时 ​2.3 两个问题 三&#xff0c;ProgressBar 3.1 主要属性 3.2 进度条按时间增长 3.3 改变样式 3.4 一个问题 四&#…

LINUX文件系统权限,命令解释器alias,文件查看和查找

1、文件査看:查看/etc/passwd文件的第5行[rootserver ~]# head -5 /etc/passwd | tail -1 #先找到前5行&#xff0c;用管道符过滤&#xff0c;显示倒数第一行2、文件查找(1)在当前目录及子目录中&#xff0c;查找大写字母开头的txt文件[rootserver ~]# find / -name "[…