# Raspberry Pi - Relay
## Relay | 繼電器
> 透過高低電壓來控制外部裝置是否接通電源
例如:
1. 透過繼電器控制插座是否通電

2. 透過繼電器控制抽水馬達(智慧農業之類)

- Sensor 連接方式
- 通常遇到 +、VCC 都是接在 5V (正極)
- 通常遇到 -、GND 都是接在接 GND (負極)
- 通常遇到 S、IN、OUT 都是接在 GPIO 橘色的 (訊號輸入輸出)


:::info
上面 `5VDC` 代表 S (訊號) 使用 5V DC(直流) 進行控制 / Raspberry Pi 的輸出全部都是 DC
`10A250VAC` 可以控制最高電流為 10A 且最高電壓為 250V 使用交流電(AC)的設備
或也是可以控制 `15A125VAC` 設備最高電流 15A 最高電壓 125V 的交流電設備
當然直流(DC)電的也都可以控制
:::
### NO / NC / COM

簡單來說 NO 或 NC 都會接到 COM,差別在於一個是平常就通(高電壓時中斷)與高電壓才通(平常中斷)
- NO Normal Open (常開)
- 平常與 COM 中斷
- 通電時與 COM 接通
- NC Normal Close (常關)
- 平常保持與 COM 接通
- 通電時與 COM 中斷
- COM 共同接點
- 同一時間只會跟 NO 或 NC 其中之一接通
可能有些人會覺得 `常開` 就應該是常常開著電之類的,可以想成像是 `臼` 的樣子迴路是打開的(所以斷電),然後 `長閉` 就像是 `口` 的樣子迴路是關起來的(所以通電)
## Pi 的 GPIO
- 灰色為 `GPIO.BOARD` 板子上的接腳編號
- 橘色 GPIO {數字} 為 `GPIO.BCM` 接腳的邏輯編號

### 使用 Python 控制
由於 Raspbian 內建 Python2 / Python3 故以這個為例,可以用任何語言在 Raspbian 上寫,Java/C#/C++/C/Python/Golang 都沒問題。
1. 先把繼電器的 + 接到5V、- 接到 GND、S 接到 GPIO 4(灰色7)
2. 撰寫程式 (每 5 秒接通 `NO` 一次(持續3秒),會發出一個蠻大的聲音)
```python=
import RPi.GPIO as GPIO
import time
# 設定使用 GPIO.BOARD (板子上灰色編號)
GPIO.setmode(GPIO.BOARD)
# 設定接腳 7 為輸出模式
GPIO.setup(7, GPIO.OUT)
for i in range(5):
GPIO.output(7, GPIO.HIGH)
time.sleep(3)
GPIO.output(7, GPIO.LOW)
time.sleep(5)
```
:::info
繼電器可能會分為兩種模式
1. 高電壓觸發(高電壓才會控制磁鐵接通 `NO`)
2. 低電壓觸發(低電壓才會控制磁鐵接通 `NO`)
:::
### Bonus / 透過 Linux kernel sysfs 控制
#### 輸出控制
- 查看目前 gpio 控制檔案位置 (應該會有 export / unexport)
```shell=
ls /sys/class/gpio
```
- 設定使用橘色的 GPIO4
```shell=
echo 4 > /sys/class/gpio/export
```
- 設定 GPIO4 為輸出模式
```shell=
echo out > /sys/class/gpio/gpio4/direction
```
- 設定 GPIO4 輸出高電壓
```shell=
echo 1 > /sys/class/gpio/gpio4/value
```
- 設定 GPIO4 輸出低電壓
```shell=
echo 0 > /sys/class/gpio/gpio4/value
```
#### 輸入控制
把上面輸出模式改為 in
- 設定 GPIO4 為輸入模式
```shell=
echo in > /sys/class/gpio/gpio4/direction
```
- 讀取 GPIO4 數值
```shell=
cat /sys/class/gpio/gpio4/value
```
:::warning
記得最後不用要恢復成原本的樣子
:::
## Reference
- [繼電器 Wiki](https://zh.wikipedia.org/wiki/%E7%BB%A7%E7%94%B5%E5%99%A8)
-