Android Things Tutorial(十)GPIO輸出 - 繼電器模組 by Michael | CodeData
top

Android Things Tutorial(十)GPIO輸出 - 繼電器模組

分享:

Android Things Tutorial(九)GPIO輸出 – 七段顯示器 << 前情

認識繼電器模組

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

att_10_01

一般的零件與設備也經常需要比較大的直流電電壓,例如經常用來驅動機器人或自走車的直流電12V馬達,還有一般家用電器的110V交流電。嵌入式系統需要控制這些零件與設備的時候,可以搭配繼電器(Relay)這種零件,就可以控制大電流電源或交流電。

一般比較常見的是電磁式繼電器,它使用一些鐵芯、線圈、觸點簧片和其它零件,通常包裝為方形或長方形的小盒子,你可以找到包裝許多其它零件的繼電器模組。依照系統需要控制的電源數量,可以選擇包裝不同繼電器數量的模組。上面圖片的兩種繼電器模組,左側包裝兩個繼電器的模組稱為2路繼電器模組,右側是4路繼電器模組,市面上常見的有1、2、4、8路可以選購。

在購買繼電器模組的時候,要特別留意它的規格。以下面圖片的1路繼電器模組來說,模組上面提供輸出、入控制針腳與接點,還有它們的規格說明:

att_10_02

繼電器上面會分別標示輸出、入控制兩個部份的規格資訊:

  • 輸入控制:繼電器上面標示的「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這類小電流與低電壓的設備,都需要透過繼電器控制大電流電源與交流電。繼電器模組用來控制電源的部份有三個連接孔:

att_10_03

  • 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保持連接:

att_10_04

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

att_10_05

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

att_10_06

如果需要使用繼電器控制110V交流電源,一定要特別注意這些重點,否則很容易發生燒壞零件或設備,甚至有觸電的危險:

  • 110V交流電是很危險的。
  • 絕對不可以使用杜邦線當作110V交流電的電源線,必須使用交流電專用的電源線。
  • 不要在交流電通電的狀況下連接線路。
  • 連接好所有需要的線路,經過詳細檢查以後再開啟交流電電源。
  • 部份家庭用電可能是220V交流電,不可以提供220V交流電給使用110V的電器。
  • 110V交流電「真的很危險」。220V交流電「真的非常危險」。

設計控制繼電器模組的應用程式

在執行接下來的工作之前,先準備好下列的零件:

  • 繼電器模組
  • 母-母杜邦線 X 3

依照下面的線路圖連接繼電器模組:

att_10_07

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

att_10_08

控制繼電器模組的應用程式,其實跟控制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瀏覽與下載。

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

後續 >> Android Things Tutorial(十一)GPIO輸入 – 開關

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

留言

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

關於作者

張益裕。目前的工作是講師與作者,專長是教育訓練課程規劃、教材編製與課程推廣,技術書籍與專欄寫作。涵蓋的領域有OOAD、Java程式設計、JavaFX、Java Embedded、Android與SQL。已出版電子書Google Play圖書Pubu

熱門論壇文章

熱門技術文章