ラズパイで24V PNP入出力をできるようにする基板作ってみた

# 今回設計する基板
24VのPNP出力6ch、PNP/NPN両対応の入力6chを搭載しているラズベリーパイHAT基板です。
![IMG_1372.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/ca53bd09-ffe7-5c86-8646-5dd358834736.jpeg)
> Raspberry Pi用　絶縁24VPNP入出力HAT基板(https://raspikoubou.theshop.jp/items/92486466)

# ラズパイをPLCのように使えるようにしたい
PLCで一般的に使用されている入出力ユニットは下図の左側のような24VのPNPまたはNPN回路を搭載しています。
![PNP回路.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/b00602a4-5182-8b8b-1a15-de0d736812c0.jpeg)
>センサとは.com(https://www.keyence.co.jp/ss/products/sensor/sensorbasics/pe-npn-pnp.jsp)

<br>

設備に使われるセンサや制御盤内に設置されるリレーも当然ながら、24VのPNP/NPNに対応した物になっています。
参考にネットで探した物のデータシートを見てみると、フォトマイクロセンサはNPN5V~24V、リレーは12V~になっています。
(フォトマイクロセンサって5Vでも使えたんですね、知らなかった)

![フォト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/4b4ea16f-a795-304c-1121-b3f83f4b5486.png)
>ミスミ フォトマイクロセンサ FPMF45(https://jp.misumi-ec.com/)

<br>

![リレー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/3a4ae277-879c-ed6c-e8fc-d9b9192cb24c.jpeg)
>オムロンミニパワーリレーMY(https://www.fa.omron.co.jp/products/family/948/)

<br><br>
ラズパイのGPIOはIN/OUT共に3.3Vですので、これらの機器を使うことはできません。24VのIN/OUTができるような回路を追加する必要があります。<br>この記事ではそのようなHAT基板を設計してみます。
![ラズパイデータシート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/7b5d342a-b717-9647-5b10-02f0104b82d8.jpeg)
>ラズベリーパイデータシート(https://datasheets.raspberrypi.com/rpi4/raspberry-pi-4-datasheet.pdf)

<br><br>

# 24V PNP出力回路の設計
まずは、ラズパイの3.3VGPIOで24VのPNP出力ができる回路を設計してみます。
東芝セミコンダクターのTLP172AMというフォトリレーを選定しました。秋月電子通商でも購入が可能です。(https://akizukidenshi.com/catalog/g/g116065/)
これなら、受光側(4,6ピン)で24Vで最大500mAを流すことができます。
三菱やキーエンスのPLCのトランジスタ出力ユニットの定格を調べると200mAや500mA程度なので、十分でしょう。

![フォトリレー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/891203f6-ea0c-b3ee-9ddc-5b4547003cb7.jpeg)
![フォトリレーその２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/eb8ad423-1da6-b09d-db40-11813f62600a.jpeg)
>TLP172AMデータシート(https://toshiba.semicon-storage.com/jp/semiconductor/product/isolators-solid-state-relays/photorelay-mosfet-output/detail.TLP172AM.html)

<br>

作成する回路イメージは下図のようになります。
設計する上で最も注意することは、ラズパイのGPIOからこの発光LEDに流れる電流を調整する抵抗値でしょう。
抵抗値が大きい(電流/発光エネルギーが小さい)と右側のMOSFETをONできなかったり、ONに切り替わるのに時間がかかってしまいます。
かといって、抵抗値を小さく(電流が大きく)し過ぎると、ラズパイのGPIOの電流定格をオーバーしてしまいます。
(GPIOの電流定格はピン当たり16mA、合計50mA以下)
今回はPNP出力を6ch作成しようと思っているので、最大50mA/6ch = 8.3mAを超えないよう、かつ上図データシートの「推奨動作条件」の「入力順電流」の最低5mA以上流せるように抵抗値を設定します。
また、受光側(出力側)の電流定格が500mAですが、使用者が誤ってそれより大きな電流を流してしまう負荷を接続して燃えたりしたら困りますので、安全対策としてヒューズも設けることにします。


![回路イメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/372dec79-0b1d-16c2-7fb4-83b957415162.jpeg)
>実現したい回路イメージ

<br>

設計した回路図が下図になります。ラズパイのGPIOの電流制限抵抗は300Ωとしました。
ばらつきを考慮せず単純に流れる電流を計算すると、
(3.3V - 1.27V) / 300Ω = 6.8mA　
とちょうど良い電流値となります。(1.27Vはダイオードの順方向電圧)
もちろんばらつきのワースト値で計算し、電流値が前述の最大最小値の範囲内になるように抵抗値を計算しました。
ヒューズは定格の大きいちょうど良いものが見つからなかったため、入手性の良い定格1Aのヒューズを2chごとに接続することにしました。

この3chの回路をもう一つ作成し、合計6chとしました。
欲を言えばサージ対策のダイオードもつければ良かったですね。
![PNP出力回路図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/2ba079ef-d125-8219-004b-37a37b305ebf.jpeg)
>作成した回路図
>「PNPOUTX」はラズパイのGPIOにつながっています。
「24V_X」は外部の24V電源です。
「APF-143,142」は外部へと接続するための端子です。
「COMMON」は後程説明します。

<br>

# 24V PNP/NPN入力回路の設計
次に、入力側の回路を設計します。東芝セミコンダクターのTLP182というフォトリレーを選定しました。
こちらも秋月電子通商で購入できます。(https://akizukidenshi.com/catalog/g/g118273/)
このフォトカプラは交流でも使えるようにダイオードが双方向についています。
PNP/NPN両対応で、できるだけ部品点数を減らしたかったため、この双方向ダイオードがついているフォトカプラを選定しました。

![入力フォトカプラ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/4b69543d-2759-13c9-4fc0-92bc92bad183.jpeg)
>TLP182データシート(https://toshiba.semicon-storage.com/jp/semiconductor/product/isolators-solid-state-relays/detail.TLP182.html)

<br>

作成する回路イメージが下図になります。
前述の通り、ダイオードが双方向ですので、外部電源のCOMMON端子が１つで済みます。
ここの設計で最も注意する所は、下図右側の外部からの信号に入れる電流制限抵抗でしょう。
ここに抵抗を入れないと、大きな電流がフォトカプラに流れ、壊れてしまいます。
壊れないように制限するだけではなく、十分な電流を流して発光させ、ラズパイ側のトランジスタがしっかりONするような抵抗値にする必要があります。
下図左側のラズパイのGPIOには、トランジスタOFF時に電圧が不定状態にならないためにプルダウン抵抗が必要になります。部品点数を減らしたいため、ラズパイのプルダウン抵抗機能を使うことにします。
ラズパイでは、下記のようにすることでプルダウンを設定することができます。(pythonの場合)
`GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)`

![入力回路概要.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/1eaf6c1f-ccb2-cec0-59c0-75ec27f6ab71.jpeg)
>実現したい回路イメージ

<br>

下図が、ダイオードに流す電流値を検討するのに重要な特性の図になります。
Vceが十分に小さくないと、トランジスタがONしても、ラズパイのGPIOに入力される電圧が低くなり、ロジックがHIGHとなるべきがLOWになってしまいます。
例えば、Vce=2V とすると、GPIOへの入力電圧は 3.3V-2V=1.3V となり、前述のラズパイのデータシートに記載されている、"Input high voltage"の最小2Vを下回ってしまいます。
今回の場合、ラズパイデータシートよりプルダウン抵抗が標準で47kΩですので、Vce=0Vとすると流れる電流値は 3.3V/47kΩ=0.07mAになります。(GPIOの入力抵抗は数MΩと思われるので考慮しない)
下図のグラフより、コレクタ電流Icが0.07mAの場合は If=2mA でもVceが1V未満になるので問題ありません。
余裕を見て、入力抵抗は3kΩとし、24V/3kΩ = 8mA としました。6Vでも2mA流れますし、100Vでも33mAで問題ありません。(絶対最大定格は50mA)

![フォトカプラ特性.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/ebacaa83-49b7-fe4f-b3d2-1c37bf7a75a3.jpeg)
>TLP182データシート(https://toshiba.semicon-storage.com/jp/semiconductor/product/isolators-solid-state-relays/detail.TLP182.html)


![トランジスタ電圧降下.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/9ad10854-8b43-31cc-da03-a38588d6c804.jpeg)
>トランジスタでの電圧降下イメージ

<br>

作成した回路図が下図になります。
念のため、ラズパイのプルダウン抵抗機能を使うと不都合がある場合のために(そんなことあるか？)チップ抵抗を実装できるパッドを用意することにしました。(図のR10~R12)
![入力回路図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/2851febc-1766-f3d4-175f-ce1ca3de88cb.jpeg)
>作成した回路図
>「COMMON」は前述の回路イメージの通り、+COMMON(外部24V)か、-COMMON(外部GND)がつながることになります。
「APF-143」は外部とつなぐ端子。
「3.3V_X」はラズパイのGPIOの3.3Vに繋がります。
「INX」はラズパイのGPIOに繋がります。

<br>

以上で回路図設計は完了です。
回路図全体は私「らずぱい工房」のホームページに記載してあります。興味あればご覧ください。
https://raspikoubou.theshop.jp/items/92486466

# 基板のデザイン設計
作成した回路図を基板にします。
この回路の基板デザイン設計は、それほど注意することは多くないでしょう。
PNP出力回路には最大で 500mA*6ch=3.0A とそれなりに大きい電流が流れますのでパターン幅に注意したり、ラズパイに外部回路のノイズが載らないようにパターンを離す、くらいでしょうか。


![基板設計.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/f7fb1581-9d5a-b35d-8039-f54802522978.jpeg)

<br>

# 完成した基板
完成した基板が下図になります。実際にラズベリーパイに載せてみた画像です。
制御盤でも使えるように、それなりに大きい配線でも使える端子(黒色の部品)を使用しました。
奥のほうに剣山のようなピンヘッダがありますが、このPNP入出力基板以外の回路にもGPIOを接続できるようなピンヘッダを選定しました。
![完成した基板.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909178/d47f2832-2b44-24cf-9cd5-4aa1d3430a16.jpeg)
>完成した基板

# 最後に
ラズパイでGPIOの入出力をコントロールするプログラムを作成し、動作確認した所、意図通り24VPNP出力回路、24VPNP/NPN入力回路が機能することを確認できました。
下記のようなよく目にするラズパイでGPIOを操作するプログラムでPLCのように24VのPNP出力、PNP/NPN入力を使えます。
```
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

# GPIOピンの番号を指定
input_pin = 5   # 入力
output_pin = 17  # 出力

# 入力ピンと出力ピンのセットアップ
GPIO.setup(input_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  # プルダウン抵抗付きの入力
GPIO.setup(output_pin, GPIO.OUT)  # 出力

while True:
    # 入力ピンの状態を読み取る
    input_state = GPIO.input(input_pin)
    
    if input_state == GPIO.HIGH:
        print("PNPが入力されました　PNP出力をします")
        GPIO.output(output_pin, GPIO.HIGH)  # 出力ピンをHIGHにする
    else:
        GPIO.output(output_pin, GPIO.LOW)  # 出力ピンをLOWにする
    
    # 0.5秒間待機
    time.sleep(0.5)

```

この記事で設計した基板は「らずぱい工房」HPで販売しています。
興味がありましたら是非ご覧ください。
https://raspikoubou.theshop.jp/items/92486466