基于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
英文地址,請注明出處:http://en.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 "[…