Android Things 外設(shè)I/O-GPIO

寫在前面的話:由于外設(shè)I/O涉及到GPIO狞洋、PWM窖维、和串行通信三部分榆综,而串行通信有講了I2C(IIC)、SPI铸史、UART鼻疮,這樣導(dǎo)致本文的篇幅過長不便于閱讀,特此將本文分成幾部分來方便閱讀

  1. Android Things 外設(shè)I/O-GPIO
  2. Android Things 外設(shè)I/O-PWM
  3. Android Things 外設(shè)I/O-I2C(IIC)
  4. Android Things 外設(shè)I/O-SPI
  5. Android Things 外設(shè)I/O-UART

Android Things提供了外設(shè)I/O API琳轿,使用行業(yè)標(biāo)準(zhǔn)協(xié)議和接口與傳感器和執(zhí)行器進(jìn)行通信判沟。

通用輸入/輸出(GPIO)


將此API用于簡單傳感器,例如運(yùn)動探測器崭篡、接近探測器和電平開關(guān)挪哄,它們將當(dāng)前狀態(tài)報告為二進(jìn)制值高或低。

通用輸入/輸出(GPIO)引腳提供了一個可編程接口琉闪,用于讀取二進(jìn)制輸入設(shè)備(例如按鈕開關(guān))的狀態(tài)或控制二進(jìn)制輸出設(shè)備(例如LED)的開/關(guān)狀態(tài)迹炼。

您可以將GPIO引腳配置為具有高或低狀態(tài)的輸入或輸出。 作為輸入時塘偎,當(dāng)外部源狀態(tài)確定疗涉,您的應(yīng)用程序就可以讀取當(dāng)前值拿霉,或者對狀態(tài)更改做出相應(yīng)反應(yīng)吟秩。 作為輸出時,您的應(yīng)用程序可以配置引腳的狀態(tài)绽淘。

注意:為避免損壞GPIO引腳涵防,請?jiān)谶B線之前檢查硬件的輸入和輸出限制。 請參閱硬件基礎(chǔ)并查閱硬件的文檔沪铭。

管理連接

為了打開到GPIO端口的連接壮池,您需要知道唯一的端口名稱。 在開發(fā)的初始階段或?qū)?yīng)用程序移植到新硬件時杀怠,通過getGpioList()PeripheralManagerService找到所有可用的端口名稱很有幫助:

PeripheralManagerService manager = new PeripheralManagerService();
List<String> portList = manager.getGpioList();
if (portList.isEmpty()) {
    Log.i(TAG, "No GPIO port available on this device.");
} else {
    Log.i(TAG, "List of available ports: " + portList);
}

知道端口名稱后椰憋,就可以使用PeripheralManagerService連接到該端口。 當(dāng)您完成與GPIO端口的通信后赔退,記得關(guān)閉連接以釋放資源橙依。 此外证舟,在現(xiàn)有連接關(guān)閉之前,無法打開與同一端口的新連接窗骑。 要關(guān)閉連接女责,請使用端口的close()方法。

public class HomeActivity extends Activity {
    // GPIO引腳名稱
    private static final String GPIO_NAME = ...;

    private Gpio mGpio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 嘗試訪問GPIO
        try {
            PeripheralManagerService manager = new PeripheralManagerService();
            mGpio = manager.openGpio(GPIO_NAME);
        } catch (IOException e) {
             Log.w(TAG, "Unable to access GPIO", e);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mGpio != null) {
            try {
                mGpio.close();
                mGpio = null;
            } catch (IOException e) {
                Log.w(TAG, "Unable to close GPIO", e);
            }
        }
    }
}

從輸入端讀取

要讀取GPIO作為輸入端的端口:

  1. 使用mode DIRECTION_IN的setDirection()將其配置為輸入创译。
  2. 通過使用ACTIVE_HIGH或ACTIVE_LOW調(diào)用setActiveType()抵知,將高電平(接近IOREF)或低電平(接近零)電壓信號配置為真(活動)。
  3. 使用getValue()方法訪問當(dāng)前狀態(tài)软族。

以下代碼顯示如何設(shè)置具有與高電壓電平相關(guān)聯(lián)的活動狀態(tài)的輸入:

public void configureInput(Gpio gpio) throws IOException {
    // 將引腳初始化為輸入
    gpio.setDirection(Gpio.DIRECTION_IN);
    // 高電平有效
    gpio.setActiveType(Gpio.ACTIVE_HIGH);

    ...

    // 讀取有效的高引腳狀態(tài)
    if (gpio.getValue()) {
        // 引腳為高電平
    } else {
        // 引腳為低電平
    }
}

監(jiān)聽輸入狀態(tài)變化

配置為輸入的GPIO端口可以在其狀態(tài)在高和低之間變化時通知應(yīng)用程序刷喜。 要注冊這些更改事件:

  1. 將GpioCallback附加到活動端口連接。
  2. 使用setEdgeTriggerType()方法聲明觸發(fā)中斷事件的狀態(tài)更改互订。 邊沿觸發(fā)支持以下四種類型:
  • EDGE_NONE:無中斷事件吱肌。 這是默認(rèn)值。
  • EDGE_RISING:從低到高的轉(zhuǎn)換時中斷
  • EDGE_FALLING:從高到低的轉(zhuǎn)換時中斷
  • EDGE_BOTH:所有狀態(tài)轉(zhuǎn)換的中斷
  1. 從onGpioEdge()內(nèi)返回true以指示偵聽器應(yīng)繼續(xù)接收每個端口狀態(tài)更改的事件仰禽。
    以下代碼為給定輸入端口上的所有狀態(tài)更改注冊了一個中斷偵聽器:
public void configureInput(Gpio gpio) throws IOException {
    // 將引腳初始化為輸入狀態(tài)
    gpio.setDirection(Gpio.DIRECTION_IN);
    // 設(shè)置低電平狀態(tài)有效
    gpio.setActiveType(Gpio.ACTIVE_LOW);

    // 注冊所有狀態(tài)更改
    gpio.setEdgeTriggerType(Gpio.EDGE_BOTH);
    gpio.registerGpioCallback(mGpioCallback);
}
private GpioCallback mGpioCallback = new GpioCallback() {
    @Override
    public boolean onGpioEdge(Gpio gpio) {
        // 讀取低電平有效的低電平狀態(tài)
        if (mDevice.getValue()) {
            // 引腳為低電平
        } else {
            // 引腳為高電平
        }

        // 繼續(xù)監(jiān)聽更多中斷
        return true;
    }

    @Override
    public void onGpioError(Gpio gpio, int error) {
        Log.w(TAG, gpio + ": Error event " + error);
    }
};
  1. 當(dāng)您的應(yīng)用程序不再監(jiān)聽傳入事件時氮墨,取消注冊所有中斷處理程序:
public class HomeActivity extends Activity {
    private Gpio mGpio;
    ...

    @Override
    protected void onStart() {
        super.onStart();

        // 開始監(jiān)聽中斷事件
        mGpio.registerGpioCallback(mGpioCallback);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // 中斷事件不再需要
        mGpio.unregisterGpioCallback(mGpioCallback);
    }
}

寫入輸出端口

以編程方式控制GPIO端口的狀態(tài):

  1. 使用setDirection()將其配置為輸出,模式為DIRECTION_OUT_INITIALLY_HIGH或DIRECTION_OUT_INITIALLY_LOW吐葵。 這些模式確保端口的初始狀態(tài)也在配置時正確設(shè)置规揪。
  2. 通過使用ACTIVE_HIGH或ACTIVE_LOW調(diào)用setActiveType(),將高電平(接近IOREF)或低電平(接近零)電壓信號配置為真(活動)温峭。
  3. 使用setValue()方法設(shè)置當(dāng)前狀態(tài)猛铅。

以下代碼顯示如何將輸出設(shè)置為初始為高,然后使用setValue()方法將其狀態(tài)切換為低:

public void configureOutput(Gpio gpio) throws IOException {
    // 將引腳初始化為高電平輸出
    gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
    // 低電平有效
    gpio.setActiveType(Gpio.ACTIVE_LOW);

    ...

    // 將值切換為LOW
    gpio.setValue(true);
}

參考文獻(xiàn) https://developer.android.google.cn/things/sdk

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凤藏,一起剝皮案震驚了整個濱河市奸忽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揖庄,老刑警劉巖栗菜,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹄梢,居然都是意外死亡疙筹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門禁炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來而咆,“玉大人,你說我怎么就攤上這事幕袱”┍福” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵们豌,是天一觀的道長涯捻。 經(jīng)常有香客問我阁危,道長,這世上最難降的妖魔是什么汰瘫? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任狂打,我火速辦了婚禮,結(jié)果婚禮上混弥,老公的妹妹穿的比我還像新娘趴乡。我一直安慰自己旁仿,他們只是感情好柿估,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布铺峭。 她就那樣靜靜地躺著牛哺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劫恒。 梳的紋絲不亂的頭發(fā)上肚医,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天悦穿,我揣著相機(jī)與錄音仓手,去河邊找鬼胖齐。 笑死,一個胖子當(dāng)著我的面吹牛嗽冒,可吹牛的內(nèi)容都是我干的呀伙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼添坊,長吁一口氣:“原來是場噩夢啊……” “哼剿另!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贬蛙,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤雨女,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阳准,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氛堕,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年溺职,在試婚紗的時候發(fā)現(xiàn)自己被綠了岔擂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片位喂。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡浪耘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塑崖,到底是詐尸還是另有隱情七冲,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布规婆,位于F島的核電站澜躺,受9級特大地震影響蝉稳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掘鄙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一耘戚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧操漠,春花似錦收津、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嚣鄙,卻和暖如春吻贿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哑子。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工舅列, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卧蜓。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓剧蹂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親烦却。 傳聞我的和親對象是個殘疾皇子宠叼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容