Android Things開發(fā)拦耐,離不開硬件的DIY組合杀糯,本例來介紹一些好玩的硬件模塊的使用。如果你手上有Google派發(fā)的NXP開發(fā)板骂际,或者已有樹莓派3B歉铝,那么就可以開始你的Android Things創(chuàng)客DIY之旅了柠贤。
案例代碼在Github上開源:https://github.com/sysolve/androidthings-moreDisplaySamples
案例代碼已升級到Android Things?Developer Preview 7版本臼勉,注意開發(fā)板系統(tǒng)與代碼版本一致。
在入門開發(fā)配件包中瓢谢,有提供紅恩闻、綠、藍(lán)三色的LED翅楼,那么我們是不是可以通過三種顏色的組合,顯示我們需要的顏色呢管嬉?答案是肯定的蚯撩。如下圖連接三種顏色的LED胎挎。
僅僅能讓三種顏色亮起來是不夠的芽卿,我們需要分別控制每種顏色的亮度称杨,通過三種顏色的比例列另,才能達(dá)到顯示所需顏色的效果摊滔。
對LED的亮度控制,可以通過控制電流的方式眨八,但一是不方便數(shù)字電路動態(tài)調(diào)節(jié)页响,二是亮度和電流的關(guān)系不是線性的,電流過小或過大時(shí)LED的顏色還會產(chǎn)生色差没陡。所以通常不用電流來調(diào)節(jié)LED的亮度盼玄。
我們通常會采用PWM來調(diào)節(jié)LED的亮度,通過改變對LED供電的占空比來改變亮度蝌箍。也就是說,我們的LED燈不是一直亮的妓盲,二是間歇的亮、暗筋粗、亮丽已、暗,通過控制亮和暗的時(shí)間比例來調(diào)節(jié)亮度嘁灯。只要我們切換的比較快,是看不出來燈是在閃爍切換的羹奉,一般要求頻率>60Hz滩褥。本例中铺然,我們設(shè)置為100Hz插勤。
PeripheralManagerService service = new PeripheralManagerService();
pwmRed = service.openPwm(BoardSpec.getInstance().getPwm(0));
pwmRed.setPwmDutyCycle(30);? ?//percent, 0-100
pwmRed.setPwmFrequencyHz(100);
pwmRed.setEnabled(true);
在上面的代碼中,我們設(shè)置了紅色LED助隧,使用第一個(gè)PWM腳(PIN_12)巍实。
我們將刷新頻率(PwmFrequencyHz)設(shè)置成了100Hz。
占空比是30:70,即PwmDutyCycle=30原环,相當(dāng)于LED我們顯示了30%的亮度。
同樣我們可以將綠色LED連接在第二個(gè)PWM腳上(PIN_33)。
之后是藍(lán)色LED绕德,這時(shí)候問題來了胞此,我們的開發(fā)板(無論是樹莓派3B還是NXP Pico)只有2個(gè)PWM腳!
這時(shí)候當(dāng)我們了解了PWM的原理刁赦,我們可以用GPIO,做一個(gè)SoftPWM,也就是說波闹,通過程序設(shè)置GPIO為高電平,持續(xù)一段時(shí)間a瘫证,再設(shè)置為低電平洞斯,再持續(xù)一段時(shí)間b。a:b就是我們前面說的占空比蝇刀。a+b就是我們一個(gè)周期的時(shí)間甸昏,而1秒/(a+b)就是我們設(shè)置的刷新頻率。
我們可以試算一下翻默,100Hz的刷新頻率检盼,即a+b=1000毫秒/100=10毫秒哄芜。那么要設(shè)置PwmDutyCycle=30,即a=3毫秒失晴,b=7毫秒灰伟。毫秒級的GPIO控制,在Android Java層面還是可以勝任的,那么我們就可以動手寫我們的SoftPwm了。具體代碼可以參見Github上的源碼胞谭,這里不再詳述伶棒。
代碼中增加了一個(gè)觸摸按鈕模塊宛渐,切換三色燈全亮還是漸變兩種顯示模塊鳞仙,按鈕模塊功能和按鍵一樣糊闽,都是通過GPIO輸入信號,模塊需要接3.3V或5V電源,GND和一個(gè)GPIO,例子代碼中我們接在PIN_40上侵佃。
下圖是三種顏色的燈全亮的效果仑乌。
下圖是顏色漸變顯示的效果,做個(gè)紙筒套在上面,顏色從紙反射出來于置,混色的效果更好。
如果沒有入門開發(fā)配件包柱查,或者覺得使用3個(gè)LED連接電阻比較麻煩淋硝,那么我們可以用一個(gè)三色LED模塊继谚,其實(shí)就是集成了三色LED和電阻的模塊臭挽,效果如下圖纽帖。
模塊和電路原理圖如下:
本例中尝偎,我們還引入了一個(gè)四色數(shù)碼管模塊,當(dāng)按下觸摸按鈕時(shí)醒陆,我們會顯示按下按鈕的次數(shù)。
接線很簡單嚷闭,VCC連接到+5V嗅榕,GND接開發(fā)板的GND,CLK連接到開發(fā)板的PIN38嘲碱,DIO連接到開發(fā)板的PIN36即可扶欣。
控制顯示的代碼也很簡單:
mSegmentDisplay =new NumericDisplay(
? ? ? ? BoardSpec.getInstance().getGpioPin(BoardSpec.PIN_36),? ? ? ? ?//DIO: Data
? ? ? ? BoardSpec.getInstance().getGpioPin(BoardSpec.PIN_38)? ? ? ? ? //CLK: Clock
);
mSegmentDisplay.setBrightness(1.0f);? //設(shè)置亮度
mSegmentDisplay.setColonEnabled(true);? //是否顯示冒號
mSegmentDisplay.display("1234");? //顯示數(shù)字
本例中顺呕,我們還引入了一個(gè)OLED顯示模塊启盛,可以顯示128*64個(gè)像素點(diǎn)技羔,我們可以用它來顯示圖形和文字藤滥。
模塊采用IIC接口,估連接到開發(fā)板的IIC接口即可趴梢,連接圖如下:
為不影響案例代碼在未連接OLED模塊時(shí)正常運(yùn)行簇抵,OLED顯示的代碼目前是注釋掉的郑临,連接好模塊,將代碼取消注釋即可屑宠。
//要顯示OLED顯示屏厢洞,先連接好開發(fā)板到OLED屏的IIC連接線,再取消下面行的注釋典奉。開啟OLED顯示屏躺翻,會導(dǎo)致藍(lán)色燈顯示閃爍
//oledScreen = new OledScreen(this);
例子參照官網(wǎng)Samples代碼,有三種顯示演示:顯示變化的點(diǎn)卫玖,顯示十字交叉線公你,顯示移動的小花圖片,按下觸摸按鈕會在三種模式切換假瞬。
想進(jìn)一步了解OLED模塊的使用陕靠,比如用OLED模塊顯示文字,可以參考我們開源的代碼:https://github.com/sysolve/androidthings-oledDisplayText
如需要本例中使用到的以上四種模塊脱茉,可以從淘寶購買:https://item.taobao.com/item.htm?id=564533484773
樹莓派3B開發(fā)板和NXP Pico開發(fā)板均適用剪芥。
如果你還沒有開發(fā)板,那么可以從這里購買樹莓派3B和入門配件套裝:https://item.taobao.com/item.htm?id=564158582078