Android Things Tutorial(九)GPIO輸出 – 七段顯示器 << 前情
認識繼電器模組
Raspberry Pi可以使用GPIO輸出針腳,控制嵌入式設備裡面的各種零件與設備,GPIO輸出針腳最大只能輸出3.3V的電壓,如果需要控制3.3V以上的直流電,或是一般的家用交流電,就沒有辦法完成這樣的需求。所以需要控制大電流直流電或交流電時,就必須使用像下面圖片的繼電器模組:

一般的零件與設備也經常需要比較大的直流電電壓,例如經常用來驅動機器人或自走車的直流電12V馬達,還有一般家用電器的110V交流電。嵌入式系統需要控制這些零件與設備的時候,可以搭配繼電器(Relay)這種零件,就可以控制大電流電源或交流電。
一般比較常見的是電磁式繼電器,它使用一些鐵芯、線圈、觸點簧片和其它零件,通常包裝為方形或長方形的小盒子,你可以找到包裝許多其它零件的繼電器模組。依照系統需要控制的電源數量,可以選擇包裝不同繼電器數量的模組。上面圖片的兩種繼電器模組,左側包裝兩個繼電器的模組稱為2路繼電器模組,右側是4路繼電器模組,市面上常見的有1、2、4、8路可以選購。
在購買繼電器模組的時候,要特別留意它的規格。以下面圖片的1路繼電器模組來說,模組上面提供輸出、入控制針腳與接點,還有它們的規格說明:

繼電器上面會分別標示輸出、入控制兩個部份的規格資訊:
- 輸入控制:繼電器上面標示的「SRD-05VDC-SL-C」資訊,其中「05VDC」表示可以使用5V直流電控制繼電器。因為Raspberry Pi GPIO輸出針腳的高電壓為3.3V,所以要選購5V的繼電器。
- 輸出控制:可以控制的電源範圍。繼電器上會方別標示可以控制的交流電與直流電範圍。交流電的部份,標示的「10A 250VAC、10A 125VAC」資訊,表示可以連接與控制10安培、125V與250V的交流電(AC);直流電的部份,標示的「10A 30VDC、10A 28VDC」資訊,表示也可以連接與控制10安培30V與28V直流電。實際的應用在標示的範圍都可以放心的使用。
繼電器模組的運作
Raspberry Pi這類小電流與低電壓的設備,都需要透過繼電器控制大電流電源與交流電。繼電器模組用來控制電源的部份有三個連接孔:

- COMMON:共用接點。以控制家用交流電源來說,用來連接其中一條電源線。
- Normal Open、NO:常開接點。與COMMON(共用接點)保持斷線狀態,透過輸入控制可以讓這個接點與COMMON連接。
- Normal Close、NC:。常關接點。與COMMON(共用接點)保持連接狀態,NO與COMMON連接的時候,這個接點就會與COMMON斷線。
瞭解繼電器模組輸出控制的運作以後,接下來說明輸入控制的部份,經由下面的圖型認識繼電器模組的運作方式。以1路繼電器模組來說,VCC與GND針腳用來提供模組運作的電源,IN針腳輸入低電壓的時候,COMMON與NC保持連接,COMMON與NO保持斷線。右側的圖型在IN針腳輸入3.3V高電壓,COMMON與NC保持斷線,COMMON與NO保持連接:

一般的家用電器使用110V的交流電,以燈泡來說,從電源插座連接電源給燈泡後,交流電源經過燈泡就會讓它點亮:

Raspberry Pi可以使用繼電器,控制使用110V交流電燈泡的開與關。以下面的圖型來說,把燈泡的其中一條線連接到插座的家用電源,插座的另一條線連接到繼電器的共用接點(COMMON),燈泡的另一條線連接到繼電器的常開接點(NO)。因為圖型的左側的IN針腳輸入低電壓,所以燈泡與電源沒有流通的電路,共用接點與常開接點是斷線的,所以燈泡不會點亮。下面圖型右側的IN針腳輸入高電壓以後,繼電器讓共用接點與常開接點連接,形成流通的電路後,燈泡就會被點亮。

如果需要使用繼電器控制110V交流電源,一定要特別注意這些重點,否則很容易發生燒壞零件或設備,甚至有觸電的危險:
- 110V交流電是很危險的。
- 絕對不可以使用杜邦線當作110V交流電的電源線,必須使用交流電專用的電源線。
- 不要在交流電通電的狀況下連接線路。
- 連接好所有需要的線路,經過詳細檢查以後再開啟交流電電源。
- 部份家庭用電可能是220V交流電,不可以提供220V交流電給使用110V的電器。
- 110V交流電「真的很危險」。220V交流電「真的非常危險」。
設計控制繼電器模組的應用程式
在執行接下來的工作之前,先準備好下列的零件:
依照下面的線路圖連接繼電器模組:

如果你只有公-母規格的杜邦線,也可以依照下面的線路圖連接繼電器模組:

控制繼電器模組的應用程式,其實跟控制LED是一樣的,只是GPIO輸出的控制。參考下面的程式碼完成這個應用程式:
package net.macdidi5.at.hellorelay;
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();
// 控制繼電器的Handler物件
private Handler relayHandler = new Handler();
// 連接繼電器的GPIO物件
private Gpio relayGpio;
// 連接繼電器的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物件
relayGpio = service.openGpio(PIN_NAME);
// 設定GPIO為輸出模式,預設為低電壓
relayGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
// 啟動控制繼電器的Handler物件
relayHandler.post(relayRunnable);
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
// 移除控制繼電器的Handler物件
relayHandler.removeCallbacks(relayRunnable);
try {
// 關閉GPIO物件
relayGpio.close();
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
finally {
relayGpio = null;
}
}
// 控制繼電器的Handler物件
private Runnable relayRunnable = new Runnable() {
@Override
public void run() {
if (relayGpio == null) {
return;
}
try {
// 設定GPIO狀態
relayGpio.setValue(!relayGpio.getValue());
Log.i(TAG, "Relay: " + (relayGpio.getValue() ? "ON" : "OFF"));
// 1秒以後重複執行
relayHandler.postDelayed(relayRunnable, 1000);
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
}
};
}
執行應用程式,繼電器模組在運作的時候,如果發出「喀」的聲音,表示線路與應用程式正確的運作。瞭解GPIO輸出的應用以後,如果搭配藍牙或雲端的應用,就可以設計遠端控制的應用程式,例如使用在行動電話的Android App控制電燈。
下一步
接下來準備認識GPIO的輸入原理與應用,讀取零件與模組的輸出訊號,包含開關、紅外線與磁簧模組。
相關的檔案都可以在GitHub瀏覽與下載。
http://github.com/macdidi5/Android-Things-Tutorial
後續 >> Android Things Tutorial(十一)GPIO輸入 – 開關
|