|
“ 讀大學的時候就很喜歡這些開腦洞的小玩意兒?吹揭粋印度小哥用ESP32 做了個高分辨率的 POV,而且開源了全部的硬件和代碼,忍不住想分享給大家。”
什么是 POV?POV(Persistence of Vision)中文翻譯為“視覺暫留”,它的基本原理是使我們的眼睛能夠從獨立的圖像中感知連續(xù)的運動,這也是電影中運動錯覺的關(guān)鍵概念。實現(xiàn)原理其實也很簡單,就是把一定數(shù)量的 LED 安裝可以旋轉(zhuǎn)或者搖晃的桿子上,通過 MCU 對 LED 編程,結(jié)合桿子搖晃和旋轉(zhuǎn)的特定頻率,就會在視覺上產(chǎn)生動態(tài)的效果。下面的視頻可以直觀地理解 POV 的實現(xiàn)和效果:
你肯定在網(wǎng)上看到過很多這樣的項目,但它們大多分辨率很低,只能顯示一些文字和幾何圖形。而這位印度小哥創(chuàng)建的 POV 顯示屏不僅限于文本或簡單的形狀,他的 POV 顯示器可以顯示分辨率為 128 像素的圖像和動畫,而且很容易制作。
項目概覽項目選擇了 ESP32 模塊作為顯示器的大腦,因為它便宜、容易獲得,而且功能強大。顯示器將有兩個旋轉(zhuǎn)臂,每個旋轉(zhuǎn)臂裝有 64 個 LED,總分辨率為 128 像素。在 ESP32 的控制下,旋轉(zhuǎn)臂將以恒定的速度旋轉(zhuǎn),LED 燈以精心安排的模式閃爍。通過這種同步方式,顯示屏可以生成懸浮在半空中的圖像或文字,帶來流暢、連續(xù)的視覺體驗。
POV 顯示器項目特點:128 像素分辨率。幀頻為 20 FPS。易于制造。易于控制。基于 ESP32。完全開源。配套網(wǎng)絡應用程序,可輕松轉(zhuǎn)換圖像。
元器件 BOM
ESP32 WROOM 模塊 - x174HC595D 移位寄存器 - x16CH340K USB - UART 控制器 - x1TP4056 鋰離子充電器 IC - x1AMS1117 3.3v LDO - x1AO3401 P - MOSFET - x12N7002DW 雙 N - MOSFET - x1霍爾效應傳感器 - x2SS34 二極管 - x1Typc C USB 連接器 16 針 - x1SMD LED 藍色 0603 - x128775 電機 - x1直流電機速度控制器 - x1SMD 電阻和電容SMD LEDSMD 輕觸開關(guān)SDM 滑動開關(guān)連接器3D 打印部件和安裝螺釘。其他工具和耗材。
原理圖
完整的原理圖如下所示:
fzs0ygwi3246402516.png (331.53 KB, 下載次數(shù): 0)
下載附件
保存到相冊
fzs0ygwi3246402516.png
前天 21:29 上傳
讓我們看一下原理圖的細節(jié),以便更好地理解。USB Type C 端口用于充電和編程。USB 端口的電源連接到 P 溝道 MOSFET U7 和二極管 D67 構(gòu)成的電源控制電路。連接器 J4 可用于提供外部 5V 電壓。同一端口還可用于連接無線充電器模塊,以備在不充電的情況下連續(xù)運行。在電壓調(diào)節(jié)方面,使用了常用的 AMS1117 3.3V LDO,它能夠提供高達 1A 的電流,滿載時的壓降約為 1.1V。連接器 J3 用于連接外部開關(guān),以打開和關(guān)閉整個電路。為了給內(nèi)部電池充電,我們使用了 TP4056 充電控制器,其最大充電電流為 1A。現(xiàn)在我們來看看編程電路,它是圍繞 WCH 的 CH340K 芯片構(gòu)建的。為了實現(xiàn)自動復位,我們使用了雙 MOSFET 2N7002DW,F(xiàn)在,整個電路的大腦是一個 ESP32-WROOM 模塊。我們之所以選擇這個 SoC,是因為它價格便宜、易于獲得,而且功能強大,能夠以足夠的幀速率驅(qū)動顯示屏。LED(像素點)分別位于兩個旋轉(zhuǎn)臂,每個旋轉(zhuǎn)臂有 64 個 LED(像素)。因此,我們總共有 128 個像素的分辨率。我們還使用了兩個霍爾效應傳感器進行轉(zhuǎn)速測量和位置感應。在PCB中,我們原本設計了 SMD 封裝,但后來決定使用 TO-92 封裝的普通 A3144 傳感器,因為它們更容易采購,而且易于安裝到當前的支架設計中。
0alhgetbv2v6402616.png (97.23 KB, 下載次數(shù): 0)
下載附件
保存到相冊
0alhgetbv2v6402616.png
前天 21:29 上傳
tl2tpfvmowb6402717.png (75.19 KB, 下載次數(shù): 0)
下載附件
保存到相冊
tl2tpfvmowb6402717.png
前天 21:29 上傳
下一部分是 LED 及其驅(qū)動。我們使用 74HC595D 移位寄存器來驅(qū)動 LED。由于單個 s74HC595 最多可以驅(qū)動 8 個 LED,因此總共使用了 16 個這樣的芯片來驅(qū)動全部 128 個 LED。我們使用了一個 1KOhms 電阻器來限制電流,但您可以根據(jù)自己需要的亮度來改變電阻值。由于有兩只旋轉(zhuǎn)臂,因此只需要轉(zhuǎn)半圈就能繪制整個畫面或圖像。一只旋轉(zhuǎn)臂繪制圖像的一半,另一只旋轉(zhuǎn)臂繪制圖像的另一半。通過這種方法,我們可以將幀頻提高一倍。顯示屏可以提供大約 20FPS 的幀頻。
g5fjohb04bx6402917.png (256.18 KB, 下載次數(shù): 0)
下載附件
保存到相冊
g5fjohb04bx6402917.png
前天 21:29 上傳
PCB
PCB 的尺寸約為 210 毫米 x 60 毫米。下面是 PCB 的頂層和底層。
preo1ldmtu06403017.png (190.23 KB, 下載次數(shù): 0)
下載附件
保存到相冊
preo1ldmtu06403017.png
前天 21:29 上傳
jev0sgfy0bq6403117.png (167.81 KB, 下載次數(shù): 0)
下載附件
保存到相冊
jev0sgfy0bq6403117.png
前天 21:29 上傳
qfzpmn3o2q46403217.png (167.43 KB, 下載次數(shù): 0)
下載附件
保存到相冊
qfzpmn3o2q46403217.png
前天 21:29 上傳
crvuw43zsop6403318.png (156.17 KB, 下載次數(shù): 0)
下載附件
保存到相冊
crvuw43zsop6403318.png
前天 21:29 上傳
裝配完成后的樣子:
mkzdz2p0c1f6403418.png (130.55 KB, 下載次數(shù): 0)
下載附件
保存到相冊
mkzdz2p0c1f6403418.png
前天 21:29 上傳
idk3xfxijsd6403518.png (96.9 KB, 下載次數(shù): 0)
下載附件
保存到相冊
idk3xfxijsd6403518.png
前天 21:29 上傳
oihix0muvx46403618.png (368.81 KB, 下載次數(shù): 0)
下載附件
保存到相冊
oihix0muvx46403618.png
前天 21:29 上傳
工作原理
現(xiàn)在讓我們來看看 POV 顯示屏是如何工作的。請看下圖,我們將一個圓平均分成 32 塊。如果用這樣分割來的方式完成一幅圖像,必須在每次旋轉(zhuǎn)就繪制 32 行像素。在顯示每一行像素時時,必須根據(jù)像素數(shù)據(jù)來決定每個LED(像素)是點亮還是熄滅。通過快速旋轉(zhuǎn)和逐行點亮像素,就可以在觀察者眼中形成一幅連續(xù)的圖像。
2q3pv0wkio56403718.png (238.97 KB, 下載次數(shù): 0)
下載附件
保存到相冊
2q3pv0wkio56403718.png
前天 21:29 上傳
圖像分割
在實際項目中,我們將每個圖像徑向分成 360 塊。也就是說必須在每次旋轉(zhuǎn)時畫 360 條相距 1 度的線來繪制圖像。
線條和像素
每條線上將有 64 個像素或 LED 燈(兩條手臂上共有 128 個 LED 燈),這些像素或LED需要根據(jù)像素數(shù)據(jù)進行操作。坐標系統(tǒng)問題
一般圖像使用的是笛卡爾坐標系。但為了在旋轉(zhuǎn) POV 顯示器上顯示圖像,我們必須使用極坐標。在笛卡爾坐標系中,位置由水平距離(x)和垂直距離(y)指定。而極坐標則基于圓形網(wǎng)格,位置由半徑(r)和水平角度(θ)指定。因此,像素并不均勻:隨著與原點距離的增加,像素的面積也會增加,形狀也會改變。
0r0c5je0hye6403818.png (147.04 KB, 下載次數(shù): 0)
下載附件
保存到相冊
0r0c5je0hye6403818.png
前天 21:29 上傳
要從圖像中獲取像素數(shù)據(jù),我們必須使用一些三角函數(shù)計算和插值法。然而,對每幅圖像的每個像素都進行這樣的計算將耗費大量時間,并會減慢像素的響應時間。為了避免這種情況,并獲得極短的像素響應時間和最高的刷新率,我們決定使用預計算值來處理圖像,這將在編碼部分進行說明。根據(jù)我們目前的設置,繪制一幀或一幅分辨率為 128 像素、360 段的圖像大約需要 50 毫秒,因此有效幀頻為 20fps。
下一個挑戰(zhàn)是優(yōu)化圖像的存儲方式。使用傳統(tǒng)工具轉(zhuǎn)換的普通圖像陣列,每個像素也會占用 1 個字節(jié)的空間。也就是說,128x128 的圖像需要 16384 字節(jié)的空間。但這樣一來,我們在代碼空間內(nèi)存儲的圖像數(shù)量就會受到限制。為了克服這個問題,并獲得更好的優(yōu)化效果,我們采用了一種新方法。每行圖像像素將存儲在 16 個字節(jié)中。每個字節(jié)將包含 8 個像素的數(shù)據(jù),即黑色或白色。然后使用一個簡單的函數(shù)對這些數(shù)據(jù)進行解碼,得到實際的像素數(shù)據(jù)。使用這種方法,一幅 128x128 像素的圖像只需要 2048 (128x16) 個字節(jié)空間。使用這種方法,我們可以將圖像的大小縮小 8 倍。
代碼 & 倉庫
所有的代碼及 KiCad 設計文件都可以在以下倉庫找到,這里就不再贅述:
https://github.com/Circuit-Digest/POV-Display
結(jié)束語
今天的分享就到這兒,感興趣的小伙伴趕緊動手實踐吧!
部分內(nèi)容引用自:https://circuitdigest.com/microcontroller-projects/diy-pov-display-using-ESP32-Arduino
注意:如果想第一時間收到 KiCad 內(nèi)容推送,請點擊下方的名片,按關(guān)注,再設為星標。
常用合集匯總:
和 Dr Peter 一起學 KiCad
KiCad 8 探秘合集
KiCad 使用經(jīng)驗分享KiCad 設計項目(Made with KiCad)常見問題與解決方法KiCad 開發(fā)筆記插件應用
發(fā)布記錄 |
|