視頻連接
1.6.1. 基本原理
根據色度空間理論,R/G/B三種顏色不同亮度組合,可以綜合出任一顏色,這是三基色LED的理論依據。
三基色LED也稱全彩LED,內部是由RGB三種顏色的LED組成的,控制三種基色LED的亮度,最終組合出不同的綜合顏色。
三基色LED有兩種:共陰三基色LED和共陽三基色LED,如下圖所示。
上圖右圖示一款插腳封裝的共陽三基色LED實物圖及引腳定義。
1.6.2. 硬件電路
既然三基色LED是封裝在一起的三個不同顏色的LED,LED的正極連在一起引出(共陽)或LED的負極連在一起引出(共陰)。
那么,三基色LED在電路中接法的接法,就相當於3個共用公共端的LED。
共陰三基色LED,在電路中的接法如下:
共陰三基色LED的控制邏輯:
a. IO輸出高電平(value=1),LED點亮;IO輸出低電平(value=0),led熄滅;
b. 與micropython的pwm占空比一致;
共陽三基色LED,在電路中的接法如下:
共陽三基色LED的控制邏輯:
a. IO輸出高電平(value=1),LED熄滅;IO輸出低電平(value=0),led點亮;
b. 與micropython的pwm占空比相反,故賦值占空比時使用1023-duty;
示意圖中:
R01=R02=R03=1K。
1.6.3. 程序設計(以共陰三基色LED為例)
案例描述:按1Hz的頻率循環切換紅、綠、藍
需求分析:LED點亮的條件是兩端有合適的電壓,共陰三基色Led的公共端接地,則點亮的通道需高電平(PWM的占空比duty是高電平占比,可以直接賦值)。控制單路LED的亮度可以使用PWM技術(頻率100hz,duty控制亮度0~1023),紅色時R支路duty=1023、G/B支路duty=0,綠色時G支路duty=1023、B/R支路duty=0,藍色時B支路duty=1023、G/R支路duty=0。
代碼實現:
from machine import Pin,PWM from time import sleep #r/g/b實例 r = PWM(Pin(18,Pin.OUT),freq=100,duty=1023) g = PWM(Pin(19,Pin.OUT),freq=100,duty=1023) b = PWM(Pin(21,Pin.OUT),freq=100,duty=1023) #[紅、綠、藍] color_ary = [[1023,0,0],[0,1023,0],[0,0,1023]] #計數器 i = 0 #循環 while True: #配置各通道duty print("%d:r->%d,g-%d,b-%d" %(i,color_ary[i][0],color_ary[i][1],color_ary[i][2])) r.duty(color_ary[i][0]) g.duty(color_ary[i][1]) b.duty(color_ary[i][2]) #指向下一顏色 i = i+1 if(i>2): i = 0 #延時1S sleep(1)
1.6.4. 函數
項目開發中,為了提高代碼的可讀性、復用性、層次感等,可以將具有獨立功能的代碼打包成函數,方便多處調用,如上節中顯示顏色的語句可以打包成函數,具體代碼如下:
from machine import Pin,PWM from time import sleep #r/g/b實例 r = PWM(Pin(18,Pin.OUT),freq=100,duty=0) g = PWM(Pin(19,Pin.OUT),freq=100,duty=0) b = PWM(Pin(21,Pin.OUT),freq=100,duty=0) #[紅、綠、藍] color_ary = [[1023,0,0],[0,1023,0],[0,0,1023]] #函數演示 def color(r_value,g_value,b_value): r.duty(r_value) g.duty(g_value) b.duty(b_value) #計數器 i = 0 #循環 while True: #配置各通道duty color(color_ary[i][0],color_ary[i][1],color_ary[i][2]) #指向下一顏色 i = i+1 if(i>2): i = 0 #延時1S sleep(1)
1.6.5. 其他測試
觀察r、g、b通道不同duty時的顏色變化。
from machine import Pin,PWM from time import sleep #r/g/b實例 r = PWM(Pin(18,Pin.OUT),freq=100,duty=0) g = PWM(Pin(19,Pin.OUT),freq=100,duty=0) b = PWM(Pin(21,Pin.OUT),freq=100,duty=0) #[紅、綠、藍] color_ary = [[1023,0,0],\ [0,1023,0],\ [0,0,1023],\ [511,511,511],\ [0,511,511],\ [511,0,511],\ [511,511,0]] #函數演示 def color(r_value,g_value,b_value): r.duty(r_value) g.duty(g_value) b.duty(b_value) #計數器 i = 0 #循環 while True: #配置各通道duty print("%d:r->%d,g-%d,b-%d" \ %(i,color_ary[i][0],color_ary[i][1],color_ary[i][2])) color(color_ary[i][0],color_ary[i][1],color_ary[i][2]) #指向下一顏色 i = i+1 if(i>(len(color_ary)-1)): i = 0 #延時1S sleep(1)
理論上,三基色不同亮度可以混合出全彩效果,這就是LED顯示器的工作原理,LED顯示器的最小顯示單元就是3基色LED。
小知識:python跨行代碼使用“\”。