Android Things Tutorial(七)認識Raspberry Pi的GPIO與基本零件 << 前情
Raspberry Pi的GPIO
Raspberry Pi的GPIO依照用途,可以分為電源、一般用途、I²C、SPI與UART。下面的圖片顯示Raspberry Pi GPIO的位置與編號:

電源
跟一般的家用電器一樣,連接到Raspberry Pi零件與模組,也需要提供電源才可以運作。Raspberry Pi提供的電源輸出有:
- 3.3V直流電,最大的電流為50mA(0.05A)
- 5V直流電,最大的電流為200mA(0.2A)
- GND表示接地,在零件與模組也經常使用減號(-)表示
一個零件與模組須要根據規格書的說明,連接正確的3.3V或5V電壓還有GND。下面的圖片顯示Raspberry Pi提供電源的GPIO:

一般用途與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:

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:

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

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
依照下面的線路圖連接所有的零件:

依照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
依照下面的線路圖連接所有的零件:

下一步
瞭解基礎的GPIO輸出控制以後,接下來繼續使用顯示數字的七段顯示器,加強GPIO輸出控制的應用。
相關的檔案都可以在GitHub瀏覽與下載。
http://github.com/macdidi5/Android-Things-Tutorial
後續 >> Android Things Tutorial(八)GPIO輸出 – 七段顯示器
|