用3個(gè)IO口控制6個(gè)LED燈,怎么做到的?查理復(fù)用!
事情是這樣開始的。買了個(gè)電動(dòng)牙刷,幾十塊錢那種:收到的實(shí)物長這樣:牙刷手柄上有1個(gè)按鍵和6個(gè)LED燈:拆開看看電路板:可以看出,電路板上用的單片機(jī),只有8個(gè)腳,卻要控制1個(gè)按鍵、6個(gè)LED燈、1個(gè)震動(dòng)的馬達(dá)電機(jī):初看之下,GPIO應(yīng)該是不夠用的。單片機(jī)除去電源腳(正極)和GND腳(負(fù)極),只剩最多6個(gè)GPIO腳。那么是怎么做到夠用的?原來,經(jīng)過巧妙的電路設(shè)計(jì),這款電動(dòng)牙刷實(shí)現(xiàn)了用3個(gè)GPIO控制6個(gè)LED燈,節(jié)省了GPIO。這個(gè)巧妙的電路如下:6個(gè)LED燈為相同的型號(hào),為方便查看,用紅綠兩種顏色區(qū)分兩種不同的方向。
一、原理分析這個(gè)電路用到了單片機(jī)GPIO的三種狀態(tài):
- 高電平
- 低電平
- 高阻態(tài)
二、總結(jié)提升以上其實(shí)是用了一種叫“查理復(fù)用”(Charlieplex)的方法。為什么叫查理復(fù)用?很簡單,因?yàn)檫@個(gè)方法來源于美信半導(dǎo)體公司的工程師Charlie Allen。查理復(fù)用是一種能夠在驅(qū)動(dòng)LED,特別是驅(qū)動(dòng)大量LED時(shí)有效地節(jié)約GPIO的方法。使用該方法,n個(gè)GPIO可以驅(qū)動(dòng) n*(n-1) 個(gè)LED,所以:
- 使用2個(gè)GPIO可以驅(qū)動(dòng)2個(gè)LED。
- 使用3個(gè)GPIO可以驅(qū)動(dòng)6個(gè)LED。
- 使用4個(gè)GPIO可以驅(qū)動(dòng)12個(gè)LED。
- 以此類推。
- 單片機(jī)GPIO的三個(gè)狀態(tài):高電平、低電平、高阻態(tài)。
- LED具有單向?qū)щ娦浴?/span>
- 任意兩個(gè)GPIO引腳之間串入兩個(gè)LED,這兩個(gè)LED為并聯(lián),且LED方向相反。
- 當(dāng)你想要點(diǎn)亮某個(gè)特定的LED時(shí),就將其兩端所連接到的GPIO引腳分別設(shè)定為高電平和低電平,其它剩余的GPIO引腳設(shè)定為高阻態(tài)。
- 前面電動(dòng)牙刷中6個(gè)LED燈的電路,就是這么設(shè)計(jì)的。
三、繼續(xù)進(jìn)階如果要同時(shí)亮起兩個(gè)以上的LED,怎么辦?交替點(diǎn)亮他們就行,只要交替切換的速度夠快,由于人眼的視覺暫留效應(yīng),看起來就是同時(shí)亮起的。值得一提的是,如果要同時(shí)亮起的LED較多,比如大規(guī)模的LED點(diǎn)陣,那么還要注意一些新的問題,頗有門道。本文不再展開,感興趣的讀者可以自行查詢修煉,繼續(xù)進(jìn)階。
四、最后要感謝這款電動(dòng)牙刷,讓我有機(jī)會(huì)寫“查理復(fù)用”。只是最近更新又變慢了,畢竟寫公眾號(hào)不掙錢,還是努力上班,爭取買個(gè)貴的電動(dòng)牙刷呀!