Android Things Tutorial(八)GPIO輸出 - LED by Michael | CodeData
top

Android Things Tutorial(八)GPIO輸出 - LED

分享:

Android Things Tutorial(七)認識Raspberry Pi的GPIO與基本零件 << 前情

Raspberry Pi的GPIO

Raspberry Pi的GPIO依照用途,可以分為電源、一般用途、I²C、SPI與UART。下面的圖片顯示Raspberry Pi GPIO的位置與編號:

att_08_01

電源

跟一般的家用電器一樣,連接到Raspberry Pi零件與模組,也需要提供電源才可以運作。Raspberry Pi提供的電源輸出有:

  • 3.3V直流電,最大的電流為50mA(0.05A)
  • 5V直流電,最大的電流為200mA(0.2A)
  • GND表示接地,在零件與模組也經常使用減號(-)表示

一個零件與模組須要根據規格書的說明,連接正確的3.3V或5V電壓還有GND。下面的圖片顯示Raspberry Pi提供電源的GPIO:

att_08_02

一般用途與PWM

安裝Android Things作業系統的Raspberry Pi,提供17個一般用途的GPIO。這些GPIO可以設定為輸入或輸出用途:

  • 設定為輸出的時候,可以在應用程式控制輸出低電壓(0V)或高電壓(3.3V),最大的電流為16mA(0.016A)。
  • 設定為輸入的時候,可以在應用程式偵測輸入的電壓低電壓(小於0.8V)或高電壓(大於2.0V)。

編號12與33可以依照系統的需求,當成一般用途或是PWM(PulseWidth Modulation),PWM可以輸出固定頻率的高、低電呀訊號,用來控制伺服馬達(Servomotor)這類設備。下面的圖片顯示Raspberry Pi提供的一般用途與PWM GPIO:

att_08_03

I²C、SPI與UART

  • I²C(Inter-Integrated Circuit)是一種串列通訊匯流排,由飛利浦公司在1980年代研發,讓主機板、嵌入式系統或行動電話可以連接低速週邊裝置而發展,是一種很常見的架構,有很多設備都採用I²C設計,例如行動電話的接近與光線感應器。
  • SPI是一種序列資料傳輸協定,有很多採用這種架構的設備。
  • UART( Universal Asynchronous Receiver Transmitter)是一種序列埠(serial ports)通訊協定,也有很多採用這種架構的設備。

下面的圖片顯示Raspberry Pi提供的I²C、SPI與UART GPIO:

att_08_04

使用Android Things GPIO API

Android Things SDK除了延續許多Android功能強大的API,經由Things Support Library,讓應用程式可以與硬體互動。下面的圖型是Anroid Things SDK的架構:

att_08_05

Peripheral I/O APIs提供設備輸出、入應用的程式庫,應用程式使用這些API就使用硬體設備題供的GPIO、PWM、I2C、SPI與UART。目前的階段先認識GPIO基礎的應用與輸出控制。

在Android Things作業系統,Peripheral I/O APIs主要的套件是「com.google.android.things.pio」,每一個GPIO都包裝為一個「Gpio」物件。建立Gpio物件必須透過「PeripheralManagerService」設備管理員服務。建立GPIO物件以後,根據它的用途,呼叫「setDirection」方法設定為輸出或輸出:

// 建立設備管理員服物物件
PeripheralManagerService service = new PeripheralManagerService();

try {
    // 建立GPIO物件
    ledGpio = service.openGpio(PIN_NAME);
    // 設定GPIO物件
    //     Gpio.DIRECTION_OUT_INITIALLY_LOW:輸出模式,預設為低電壓
    //     Gpio.DIRECTION_OUT_INITIALLY_HIGH:輸出模式,預設為高電壓
    //     Gpio.DIRECTION_IN:輸入模式
    ledGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
    ...
}
catch (IOException e) {
    Log.e(TAG, e.toString());
}

設定為輸出用途的GPIO物件,可以呼叫「setValue」方法,設定GPIO的輸出的訊號為高電壓或低電壓:

// 設定GPIO的輸出為低電壓(0V)
ledGpio.setValue(false);
...
// 設定GPIO的輸出為高電壓(3.3V)
ledGpio.setValue(true);

開發控制LED的Android Things App

這個實作需要這些零件:

  • LED X 1
  • 電阻(220 ohm) X 1
  • 杜邦線(公-母)X 2
  • 麵包板連接線 X 1

依照下面的線路圖連接所有的零件:

att_08_06

依照Android Things Tutorial(六)第一個Android Things應用程式的說明,建立一個Android Things App專案,參考下面的程式碼,完成控制LED的App:

package net.macdidi5.at.helloled;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.PeripheralManagerService;

import java.io.IOException;

public class MainActivity extends Activity {

    private static final String TAG = MainActivity.class.getSimpleName();

    // 控制LED閃爍的Handler物件
    private Handler ledHandler = new Handler();
    // 連接LED的GPIO物件
    private Gpio ledGpio;
    // 連接LED的GPIO pin
    private final String PIN_NAME = "BCM23";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.i(TAG, "onCreate");

        // 建立設備管理員服物物件
        PeripheralManagerService service = new PeripheralManagerService();

        try {
            // 建立GPIO物件
            ledGpio = service.openGpio(PIN_NAME);
            // 設定GPIO為輸出模式,預設為低電壓
            ledGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);

            // 啟動控制LED閃爍的Handler物件
            ledHandler.post(ledRunnable);
        }
        catch (IOException e) {
            Log.e(TAG, e.toString());
        }
    }

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

        Log.i(TAG, "onDestroy");

        // 移除控制LED閃爍的Handler物件
        ledHandler.removeCallbacks(ledRunnable);

        try {
            // 關閉GPIO物件
            ledGpio.close();
        }
        catch (IOException e) {
            Log.e(TAG, e.toString());
        }
        finally {
            ledGpio = null;
        }
    }

    // 控制LED閃爍的Handler物件
    private Runnable ledRunnable = new Runnable() {
        @Override
        public void run() {
            if (ledGpio == null) {
                return;
            }

            try {
                // 設定GPIO狀態
                ledGpio.setValue(!ledGpio.getValue());
                Log.i(TAG, "LED: " + (ledGpio.getValue() ? "ON" : "OFF"));
                // 1秒以後重複執行
                ledHandler.postDelayed(ledRunnable, 1000);
            }
            catch (IOException e) {
                Log.e(TAG, e.toString());
            }
        }
    };

}

執行應用程式專案,看看LED是否可以用一秒的頻率重複閃爍。

練習 – 設計控制三個LED的App

試試看設計一個可以控制三個LED的App,你可以讓三個LED同時或輪流點亮與關閉。這個實作需要這些零件:

  • LED X 3
  • 電阻(220 ohm) X 3
  • 杜邦線(公-母)X 4
  • 麵包板連接線 X 3

依照下面的線路圖連接所有的零件:

att_08_07

下一步

瞭解基礎的GPIO輸出控制以後,接下來繼續使用顯示數字的七段顯示器,加強GPIO輸出控制的應用。

相關的檔案都可以在GitHub瀏覽與下載。

http://github.com/macdidi5/Android-Things-Tutorial

後續 >> Android Things Tutorial(八)GPIO輸出 – 七段顯示器

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

熱門論壇文章

熱門技術文章