01: Raspberry Piでフォトカプラを制御する - 移植編

# はじめに
こちらは
[Arduino と Raspberry Pi の違いのまとめ](https://qiita.com/KZ2/items/5e0e79f84e4dd26bd373)
の最初の個別記事で、Raspberry Pi でフォトカプラを制御する。

# 目的
ここでの目的は、他の電気回路のon/offをRaspberry Piからコマンドで制御することである。つまり、希望するタイミングでon/offすることを狙う。 具体的なアプリケーションとしては、カメラのシャッター制御や任意の機器のプッシュスイッチを外から制御するような事例がある。

実装は、俗にいう「Lチカ」で、LEDを光らせるごとく、フォトカプラを用いて、on/offの制御を行う。

手始めにまずは、LED を光らせてみる。LEDのOn/Offが制御できれば、フォトカプラを制御できることとほぼ同じと考えられる。フォトカプラの送信側の中身はLEDらしい。

## 下準備
1. LEDそのものが生きているかどうか確認する。3V-GND間で直接接続して光ることを確認する。
2. LEDの抵抗は適当に計算する。ここでは 100 ohm を利用する。


### ハードウェア
配線は、LEDのアノード(プラス)をGPIOの25番に抵抗を入れて接続し、LEDのカソード(マイナス)をGNDに接続する。ちなみにGPIOの25番がどこにあるかは、Raspberry pi pinoutなどで検索すればすぐにピン配列の絵が見つかる。Arduinoと違って基板上で分からないのが面倒くさい。

photo

- 【出力の極性】
フォトカプラの出力は、単なるスイッチではなく極性がある。


### ソフトウェア
ちなみにLEDを光らせるためのcodeとして、ArduinoのBLINKではこうだった。

```c:BLINK.ino
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);   
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);       
}
```

Raspberry PiでPythonではこうする。

```python
LED.py
import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)

while True:
    GPIO.output(25, GPIO.HIGH)
    sleep(1)
    GPIO.output(25, GPIO.LOW)
    sleep(1)
```

### 実行
Raspberry PiでIDLEというPythonの開発環境が用意されているので、そこに記入してF5で実行すると早い。
terminalでtext editor で書いて、コマンドラインからの実行でももちろんかまわない。
時間指定の時間の単位がArduinoと違うことも注意である。

```
$　pyhton foo.py
```

ここでLEDのon/offが確認できた。実際にフォトカプラを接続する。フォトカプラでモーターの制御はできないので、モーターなど大電流が必要なApplicationの場合はリレーを使うことになる。

## フォトカプラで実装
フォトカプラとRaspberry Piを接続するだけだが、抵抗値で入力側の電流を制御しておく。詳細はデータシートを参照して計算する。

フォトカプラの使い方については、RENESASの解説記事が分かりやすい。
[フォトカプラの使い方](https://www.renesas.com/ja-jp/products/optoelectronics/technology/usage.html)

### Hardware
- フォトカプラ(Photocoupler)　TLP621
- 抵抗 200 [ohm]

```math
\frac{5.0 [V_{cc}] - 1.15 [V_F]}{16 [mA]} = 240 [ohm]
```

- Connection

|Side  | Pin# | Parts        |        |
|------|:-----|:------------:|--------|
|INPUT |pin1  | 100+100 ohm  | GPIO26 |
|INPUT |pin2  |    -         | GND    |
|OUTPUT|pin3  |         -    | +      |
|OUTPUT|pin4  |        -     | -      |


### Raspberry Pi 3

GPIOの26に接続した。

```c:Raspberry_Pi_3_pinout
|Pin#   NAME |    NAME Pin#|
|01          |           02|
|03          |           04|
|05          |           06|
|07          |           08|
|09          |           10|
|11          |           12|
|13          |           14|
|15          |           16|
|17          |           18|
|19          |           20|
|21          |           22|
|23          |           24|
|25          |           26|
|27          |           28|
|29          |           30|
|31          |           32|
|33          |           34|
|35          |           36|
|37 [GPIO 26]|           38|
|39 [GND]    |           40|
```

### Software
```python:bar.py
GPIO.setmode(GPIO.BCM)
GPIO.setup(PC_GPIO, GPIO.OUT)


try:
    while True:
        GPIO.output(PC_GPIO,GPIO.HIGH)
        sleep(1.25)
        GPIO.output(PC_GPIO, GPIO.LOW)
        sleep(1.25)

except KeyboardInterrupt:
        pass

GPIO.cleanup()
```
# まとめ
フォトカプラの出力をテスタの通電モードでチェック。ぴっぴっと音がなって動作確認ok.

# おまけ
- gpio readall で現在のGPIOの状況を一覧できる

```shell-session


$ gpio readall
```

# 親記事
[Arduino と Raspberry Pi の違い](https://qiita.com/KZ2/items/5e0e79f84e4dd26bd373)