産業(FA)機器のインターフェース

この記事は、「[Seeed UG Advent Calendar 2019](https://qiita.com/advent-calendar/2019/seeed_ug)」 の21日目です。

#1.はじめに

IoT機器のプロトタイピングに大変便利なGroveですが、工場などで使われる産業（ＦＡ）機器用のインターフェースが無かったので、自作してみました。
![P1090484.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/6196cca1-1331-c16b-47a7-51f9eea98b47.jpeg)

##動作環境
ここでのハードウェア環境は、以下を想定しています。

 - Raspberry Pi 3+
 - Raspbian Buster （2019年9月版）
 - Python 3.5
 
```bash:コマンドライン
~ $ uname -a
Linux RaspberryPi 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l GNU/Linux
``` 


#2.回路の考え方

ＦＡ機器は多くの場合、DC24Vの電源が使われています。

（左）スイッチ・ランプの例、（右）リレーの例
![（左）スイッチ・ランプの例、（右）リレーの例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/b4424b4b-3936-41c4-4519-3bc5154d8d01.jpeg)

これらの機器の基本的な接続方法としては、下記のようになります。（日本・シンク駆動の場合）

（左）出力回路、（右）入力回路
![a04-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/42fe34a0-9ff7-0137-f8f0-ab49047fb95f.png)

[参考：オリエンタルモータ社さんの解説記事](https://www.orientalmotor.co.jp/tech/teruyo/vol35/)


この方式に倣って、Arduino、RaspberryPiなどで接続する回路を作ってみました。

これらのマイコンボード類は
取り扱う電圧がDC5Vであったり、DC3.3Vであったりして、直接FA機器を制御することは出来ないので、電圧変換をする必要があります。



また、FA機器は、実際の現場でどのような使われ方をするか分かりません。
物理的な衝撃を受けるだけで無く、電気的な衝撃（短絡、過電流など）を受けることもあります。
そのような場合に、Arduino、RaspberryPiを保護する必要もあります。

ここでは、電圧レベルの変換と電気的な絶縁も兼ねる、簡単なレベルコンバータを作ってみました。

# 3.信号入力

##回路図
![信号入力回路](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/b1b8d774-1160-06f6-d445-7b7265365b7b.png)

##プログラム

実行すると、ボタンを押されるごとにコンソールにメッセージが表示されます。

```python:gpioin.py
#!/usr/bin/env /usr/bin/python3
# -*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO

# 制御対象のポート
PORT = 21

def callback_gpio(gpio_pin):
    """
    GPIO入力コールバック
    """
    # 該当ポートの値を読み込み
    ch_val = GPIO.input(gpio_pin)
    # ボタンが押されたメッセージ
    print(" Callback: GPIO [ %d ch ] > %d" % (gpio_pin, ch_val))

# GPIO初期化
GPIO.setmode(GPIO.BCM)

# ピンを入力設定し、プルアップ抵抗を有効化
GPIO.setup(PORT, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# ボタンを押された（離された）ときのコールバック関数を設定
# ・GPIO.BOTH：立ち上がり/立ち下がりで検知
# ・bouncetime：チャタリングを無視する時間(ms)
GPIO.add_event_detect(PORT, GPIO.BOTH,
                      callback=callback_gpio, bouncetime=100)

try:
    print(" -- GPIO IN Test --")
    # 無限ループで待機
    while True:
        time.sleep(1.0)
except KeyboardInterrupt:
    # Ctrl-Cが押されたとき
    # コールバック関数を削除
    GPIO.remove_event_detect(PORT)
    # GPIO解放
    GPIO.cleanup()
    print("done.")
```

# 4.信号出力

##回路図
![信号出力回路](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/a39fdfed-79ca-9c45-bfa4-fc1f7c4849d8.png)

##プログラム
実行すると、LEDが10回点滅します。

```python:gpioout.py
#!/usr/bin/env /usr/bin/python3
# -*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO

# 制御対象のポート
PORT = 26
# （複数指定する場合の書き方）
# PORT = [26, 19]

# 点滅間隔(s)
INTERVAL = 0.2

# GPIO初期化
GPIO.setmode(GPIO.BCM)

# ピンを出力設定し、初期は消灯状態にする
GPIO.setup(PORT, GPIO.OUT, initial=GPIO.LOW)

print(" -- GPIO OUT Test --")

# 10回点滅
for i in range(10):
    # 点灯
    GPIO.output(PORT, GPIO.HIGH)
    time.sleep(INTERVAL)
    # 消灯
    GPIO.output(PORT, GPIO.LOW)
    time.sleep(INTERVAL)

# GPIO解放
GPIO.cleanup()

print("done.")
```

#5.インターフェース・ボード

実際に使えるインターフェース・ボードを作ってみました。

##(1)Raspberry PiのHAT

GitHubに公開しました。(2020/3/29)

- https://github.com/trihome/RasPi_PiFA

![外観イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/d1e549f1-38ba-d7e2-3c35-c19a6b938cdb.png)

![実際に使っている様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/84b2bbef-3e26-67f6-4011-78e30f003c28.png)

プロトタイピングとして使える様に、4入力・4出力を任意のRaspberryPiのピンで制御できるようにしています。
（RaspberryPi側のピンは、QIコネクタで繋ぎ替えが出来ます）

また、（本文では言及していませんが）国内外のFA仕様に使える様に、シンク(NPN)/ソース(PNO)の切替も出来ます。

##(2)Grove規格互換

![外観イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/d292973e-c7ff-bc3d-e720-0e1dde27c124.png)

Grove規格（GPIO）互換のボードを作ってみました。

※12/21時点、まだ公開できてないです、すみません！！
[GitHub](https://github.com/trihome/Grove_FA)