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