2013年1月26日 星期六

Raspberry Pi (樹莓派) 驅動兩路繼電器模組

需要繼電器模組的話話請到露天賣場訂購:二通道光耦合隔離繼電器模組

使用繼電器可以實現使用小電壓控制大電壓設備的目的,若是再配合網路通訊便可實現遠端控制,家電自動化的目的。

利用繼電器實現遠端家電控制

以下,我們將使用 Raspberry Pi (樹莓派) 來控制繼電器開關。電源輸入使用數莓派 5V 的電源接腳,而控制兩顆繼電器的控制訊號分別為
  • GPIO #24  --> IN1 --> RELAY-1

  • GPIO #24  --> IN2 --> RELAY-2

二通道光耦合隔離繼電器模組的電路圖如下,
二通道光耦合隔離繼電器模組電路圖

材料列表:


賣場的樹莓派配件 - 二通道光耦合隔離繼電器


線路連接:

請照著下面四個顏色的杜邦線,連接數莓派與繼電器模組
繼電器模組與樹莓派連接線路圖

打開樹莓派電源,等待開機完成後,下載測試程式碼

cd
mkdir Relay
cd Relay
wget -O - http://goo.gl/bTVV8 | tar xvf -

解開 tar 檔案後,目錄下會增加兩個檔案。一個是執行檔,一個是 C 語言原始檔。


-rwxr-xr-x 1 pi pi 29445  1月 26 13:17 relay-2way
-rwxr-xr-x 1 pi pi  2927  1月 26 13:17 relay-2way.c

若線路已經裝設好,直接輸入

    sudo ./relay-2way

就會出現等待輸入的提示,此時輸入

    3 1

3 與 1 的中間要空一格。輸入完成後,就會看到繼電器模組的兩顆 LED 亮起與 "噠" 的聲音,表示正常動作。

pi@raspberrypi ~/Relay $ sudo ./relay-2way

Usage: relay(1 or 2) on/off(1 or 0), ex. 1 0 (relay 1 off)
3 0 all off, 3 1 all on, 0 0 to exit
relay turn on/off: (0 0): 3 1
relay turn on/off: (3 1):
Usage: relay(1 or 2) on/off(1 or 0), ex. 1 0 (relay 1 off)
3 0 all off, 3 1 all on, 0 0 to exit
relay turn on/off: (3 0):

輸入:3 1,開啟兩顆繼電器

輸入:3 0,關閉兩顆繼電器

輸入:1 1,開啟上方繼電器 (RELAY-1)

輸入:0 0,關閉兩顆繼電器

輸入:2 1,開啟下方繼電器 (RELAY-2)

最後輸入

    0 0 

離開程式


下面是使用 Android APP ConnectBot 使用 SSH 連線到樹莓派做繼電器模組的控制,指令與操作方式跟終端機一樣,當然控制方式也一樣,建議大家先這樣玩玩看,分常有趣!

Android 手機程式使用 SSH 連線控制繼電器模組


另外,因為只是單純的 IO 控制,建議上由樹莓派視窗的 PiStore 下載 WebIOPi 玩玩使用網頁控制繼電器模組,實現遠端控制的樂趣!!!

WebIOPi 官方網頁

source: https://code.google.com/p/webiopi/



二通道光耦合隔離繼電器模組展示程式碼


/*-
    relay-2way.c
    
    compile: gcc relay-2way.c -l rt -l bcm2835 -std=gnu99 -o relay-2way
    
    測試兩路繼電器
    
    線路說明:
    使用數莓派的GPIO控制兩路繼電器 (active low)
    
    未初始化前,繼電器保持之前狀態,但開機之後未操作GPIO前繼電器為 OFF。
    
    初始化後 (bcm2835_init()),繼電器保持之前狀態,但開機之後未操作GPIO前繼電器為 OFF。
    
    初始化後設定接腳為輸出 (bcm2835_gpio_fsel(#, BCM2835_GPIO_FSEL_OUTP), 
    繼電器保持之前狀態,但開機之後未操作GPIO前繼電器為  ON
    
    2 路繼電器接腳: GND, INP1, INP2, VCC
        樹莓派接腳: GND,  #24,  #25, 5V0 
    Vcc使用3V3 亦可,但要注意是否會電壓不足無法驅動; 建議使用 5V0 
      
-*/

#include <stdio.h>   // printf, scanf
#include <bcm2835.h>

#define RELAY_INP1  24 // GPIO #24 
#define RELAY_INP2  25 // GPIO #25

int prog_exit(void);

int main(int argc, char **argv)
{
 int relay = 0;
 int onoff = 0;
 
 // GPIO 初始化
    if(!bcm2835_init())
        return 1;

 // 設定接腳狀態       
    bcm2835_gpio_fsel(RELAY_INP1, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(RELAY_INP2, BCM2835_GPIO_FSEL_OUTP);
 
    // 初始輸出狀態
    bcm2835_gpio_write(RELAY_INP1, HIGH);
    bcm2835_gpio_write(RELAY_INP2, HIGH);
    
    while(1)
    {
        printf("\nUsage: relay(1 or 2) on/off(1 or 0), ex. 1 0 (relay 1 off) \n");
        printf("3 0 all off, 3 1 all on, 0 0 to exit\n");
        printf("relay turn on/off: (%d %d): ", relay, onoff);
        scanf("%d %d", &relay, &onoff);
        printf("relay turn on/off: (%d %d): ", relay, onoff);
        fflush(stdin);        
        
  if(onoff == 0)
   onoff = HIGH;
  else if(onoff == 1)
   onoff = LOW;
  else
  {
         printf("keyin the worng relay status!\n");
    if(!prog_exit)
     return 3;
        }
        
  if(relay == 0)
  {
   return prog_exit();
  }
  else if(relay == 1)
         bcm2835_gpio_write(RELAY_INP1, onoff);
        else if(relay == 2)
         bcm2835_gpio_write(RELAY_INP2, onoff);
        else if(relay == 3)
        {
         bcm2835_gpio_write(RELAY_INP1, onoff);
         bcm2835_gpio_write(RELAY_INP2, onoff);
        }
        else
        {
         printf("Keyin the wrong relay number!\n");         
   if(!prog_exit())
    return 3;
        }
    }
    
    return 0;
}

int prog_exit()
{
    bcm2835_gpio_write(RELAY_INP1, HIGH); // turn off relay
    bcm2835_gpio_write(RELAY_INP2, HIGH);
    
    // 關閉 bcm2835 函式庫
    if (!bcm2835_close())
    {
        printf("Failed to close the library, deallocating any allocated memory and closing /dev/mem\n");
        printf("\nPress any key to exit...");
        return 2;
    }
    return 0;
}


<<樹莓派編輯環境設置系列文章>>

沒有留言:

張貼留言