ラズパイのGPIOでシーケンサをフォトカプラで接続する方法
Raspberry PiのGPIOピンは3.3Vと5Vで動作しますが、
三菱のシーケンサのように24Vの電圧で動作する外部機器と直接接続すると、
Raspberry Piが破損するリスクがあります。
この問題を解決するためには、「フォトカプラ」を活用するのが有効です。
フォトカプラを使用することで、
異なる電圧環境の機器間でも安全に信号を送受信することが可能になります。
この記事では、Raspberry Piと電圧の異なる外部機器を接続する方法について、
フォトカプラを利用した回路の作成手順を詳しく解説します。
また、実際に動作確認を行いながら、その仕組みをわかりやすく説明していきます。
フォトカプラの基本知識:PC817を使った仕組みと活用方法
フォトカプラとは?
フォトカプラ(Photocoupler)は、光を介して電気的に絶縁しながら信号を伝える部品です。
内部にLED(発光ダイオード)とフォトトランジスタが組み込まれており、入力信号を光に変換して出力側に伝える仕組みを持っています。
この特性により、電圧の異なる機器同士を接続したり、ノイズの影響を防いだりする際に役立ちます。
フォトカプラPC817Cについて
この記事では、一般的に広く使用されている
シャープ製フォトカプラ「PC817C」を使用します。
PC817Cは、小型で取り扱いが簡単な部品であり、
電気的絶縁と信号伝達を同時に実現するため、さまざまな回路設計で利用されています。
これにより、異なる電圧環境の機器を安全に接続することが可能です。
フォトカプラの仕組み
フォトカプラは、光を利用して入力側と出力側を電気的に絶縁する部品です。
その内部構造は、LEDとフォトトランジスタの組み合わせで構成されています。
入力側に電流を流すと、内部のLEDが発光し、
その光がフォトトランジスタに照射されます。
これにより、出力側で電流が流れる仕組みです。
この光を介した信号伝達により、
異なる電圧環境の機器間でも安全に接続することが可能です。
一般的に入力ピン(LEDのアノード・カソード)と
出力ピン(フォトトランジスタのコレクタ・エミッタ)で構成されています。
今回使用する、シャープ製PC817Cのピン配置を示しています。
<SHARP公式サイトより抜粋>
仕様など詳細は、こちらからデータシートを参照ください。
https://jp.sharp/products/device/doc/opto/PC817XxNSZ1B_j.pdf
(1) 内部構造
入力側
LED(発光ダイオード):入力信号を受けて発光します。
出力側
フォトトランジスタ:LEDの光を受けてオン/オフの信号を出力します。
(2) 動作原理
入力信号がLEDを点灯させると、光が発生します。
フォトトランジスタが光を受け取り、電流が流れることで出力信号が発生します。
このプロセスを通じて、入力信号が電気的に絶縁された状態で出力されます。
Raspberry Piとフォトカプラを用いた電子回路の作成
Raspberry PiのGPIOピンとフォトカプラを使用し、
三菱FXシーケンサと接続する回路図を書いていきます。
【仕様機器】
・三菱シーケンサ:FX1S-MR
・Raspberry Pi 4B
下記の図は、Raspberry PiのGPIOピンと三菱FXシーケンサを
フォトカプラを介して接続する回路図です。
【回路図】
シーケンサ(出力)→Raspberry Pi(入力)
シーケンサ(出力)→Raspberry Pi(入力)の解説をしていきます。
シーケンサの出力からフォトカプラが駆動しているかを確認できるように
【LED】を点灯させ確認できるようにしています。
シーケンサからフォトカプラ駆動回路
シーケンサの内部回路を読み解いていく必要があります。
シーケンサは、FX1S-MRを使用しているため内部出力回路はリレーになります。
以下の通り
<三菱ホームページより抜粋>
フォトカプラを駆動するには、入力側に適切な電圧と電流を供給する必要があります。
シーケンサ側では24Vの電圧を使用しているため、
フォトカプラ内部のLEDに適切な電流を流すために10kΩの抵抗を直列に接続しています。
この抵抗により、電流が制御され、フォトカプラ内のLEDが発光します。
フォトカプラからRaspberry Pi(入力)回路
フォトカプラからRaspberry PiのGPIOピン(GPIO5)へ信号を送るために、
10kΩの抵抗を使用して、GPIO5に流れる電流を制限しています。
Raspberry Pi(出力)→シーケンサ(入力)
Raspberry Pi(出力)→シーケンサ(入力)の解説をしていきます。
Raspberry Piの出力からフォトカプラが駆動しているかを確認できるように
【LED】を点灯させ確認できるようにしています。
Raspberry Piからフォトカプラ駆動回路
Raspberry Pi(GPIO16)を出力へ割り当てます。
Raspberry Piの内部抵抗を足してフォトカプラの駆動する電流を計算します
ここでは、10Ωの抵抗を使っています。
フォトカプラからシーケンサ(入力)回路
フォトカプラからシーケンサへ信号を送るために配線します。
以下の通り、シーケンサの内部回路を見ると内部抵抗が内蔵されています。
そのため、そのまま配線することができます。
10kΩの抵抗を使用して、GPIO5に流れる電流を制限しています。
Raspberry Pi と シーケンサの接続する回路図を作成しました。
実際にブレッドボードを使い動作を確認していきます。
配線
ブレッドボードを使用して、先ほど作成した回路に従い配線を行います。
【Raspberry Pi GPIO】
・GPIO5:入力
・GPIO16:出力
【シーケンサ割り付け】
・入力:X00
・出力:Y00
フォトカプラの入力側(LED部分)に、24V電源と10kΩの抵抗を直列に接続します。
次に、抵抗のもう一方をフォトカプラのLED端子に接続し、
フォトカプラの出力端子をRaspberry PiのGPIO5ピンに接続します。
配線を確認したら、ブレッドボード上で接続がしっかり行われていることを
再度確認し配線ミスやショートがないかチェックしましょう。
チェックプログラムの作成
Raspberry Piに入力信号を確認するための簡単なチェックプログラムを作成します。
このプログラムは、シーケンサから出力された信号が
Raspberry PiのGPIOピンに入力された際に、
正しく「HIGH」状態になるかを確認するものです。
具体的には、GPIOピンを入力モードに設定し、
シーケンサからの信号がRaspberry Piに伝達され、そのGPIOピンの状態を監視します。
信号が受け取られると、ピンの状態が「HIGH」に変わるため、
プログラム上でその変化を確認することができます。
ラズパイに入力信号確認
GPIOの入力を確認するチェックCODEです。
シーケンサから出力された信号がラズパイに入力されると
「HIGH」になるかを確認します。
このコードを実行すると、
Raspberry Piの各GPIOピンの状態が1秒ごとに表示されます。
シーケンサからの出力信号が正しくラズパイに伝達されているか確認できます。
GPIOのピン番号の設定は次の通りに設定しています。
・入力:GPIOピン【5, 6, 12, 13, 19】
・出力:GPIOピン【16, 20, 21, 25, 26】
プログラムでは、出力ピンは安全のため
すべて、Lowに設定しています。
<サンプル:GPIO 入力チェック>
import RPi.GPIO as GPIO
import time
# GPIOのピン番号の設定
INPUT_PINS = [5, 6, 12, 13, 19] # 入力ピン
OUTPUT_PINS = [16, 20, 21, 25, 26] # 出力ピン
# GPIOの初期化
GPIO.setmode(GPIO.BCM) # BCM番号を使用
GPIO.setup(INPUT_PINS, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 入力ピンをプルアップ付きで設定
GPIO.setup(OUTPUT_PINS, GPIO.OUT, initial=GPIO.LOW) # 出力ピンを初期状態LOWで設定
i=0
try:
while True:
# 入力ピンの状態を取得
input_states = {pin: GPIO.input(pin) for pin in INPUT_PINS}
# 出力ピンの状態を取得
output_states = {pin: GPIO.input(pin) for pin in OUTPUT_PINS}
# 状態を表示
print("Input States:")
for pin, state in input_states.items():
print(f"GPIO{pin}: {'HIGH' if state == GPIO.HIGH else 'LOW'}")
print("\nOutput States:")
for pin, state in output_states.items():
print(f"GPIO{pin}: {'HIGH' if state == GPIO.HIGH else 'LOW'}")
print("\n" + "-" * 30 + "\n")
i=i+1
print(i)
# 1秒待機
time.sleep(1)
except KeyboardInterrupt:
print("プログラムを終了します。")
finally:
GPIO.cleanup() # GPIOのクリーンアップ
実行中は、
ループ回数:30(同じ出力でわからないのでループ」回数を表示しています)
各GPIO Inputの状態を表示しています。
このGPIOチェックCODEを利用して
入力が入ってくるか確認しましょう。
ラズパイからシーケンサへの信号確認
ラズベリーパイから出力された信号が、シーケンサに正しく入力されるか
確認するためのテストを行います。
Raspberry PiのGPIOピンから信号を出力し、その信号がシーケンサに伝達されることで、
シーケンサの入力端子が「ON」状態になるかを確認します。
シーケンサの入力端子が「ON」になると、
信号がRaspberry Piからシーケンサへ正しく伝わったことを示します。
以下のサンプルコードを使用することで、
Raspberry Piからの出力信号をシーケンサの入力に確認でき
正常に動作しているかを検証できます。
GPIOのピン番号の設定は次の通りに設定しています。
・入力:GPIOピン【5, 6, 12, 13, 19】
・出力:GPIOピン【16, 20, 21, 25, 26】
出力ピンは、5秒間隔で「ON」「OFF」を繰り返します。
<サンプル:GPIO 出力チェック>
import RPi.GPIO as GPIO
import time
# GPIOのピン番号の設定
OUTPUT_PINS = [16, 20, 21, 25, 26] # 出力ピン
ENABLE_PINS = [True, True, True, True, True] # ピンごとの有効/無効の設定 (True: 有効, False: 無効)
# GPIOの初期化
GPIO.setmode(GPIO.BCM) # BCM番号を使用
GPIO.setup(OUTPUT_PINS, GPIO.OUT, initial=GPIO.LOW) # 出力ピンを初期状態LOWで設定
try:
while True:
# 出力ピンをONに設定
print("有効な出力ピンをONにします。")
for i, pin in enumerate(OUTPUT_PINS):
if ENABLE_PINS[i]: # ピンが有効の場合のみ操作
GPIO.output(pin, GPIO.HIGH)
print(f"GPIO{pin}: ON")
else:
print(f"GPIO{pin}: 無効 (スキップ)")
# 5秒待機
time.sleep(5)
# 出力ピンをOFFに設定
print("有効な出力ピンをOFFにします。")
for i, pin in enumerate(OUTPUT_PINS):
if ENABLE_PINS[i]: # ピンが有効の場合のみ操作
GPIO.output(pin, GPIO.LOW)
print(f"GPIO{pin}: OFF")
else:
print(f"GPIO{pin}: 無効 (スキップ)")
# 5秒待機
time.sleep(5)
except KeyboardInterrupt:
print("プログラムを終了します。")
finally:
GPIO.cleanup() # GPIOのクリーンアップ
このコードを実行すると、
Raspberry Piの出力ピンが5秒間隔でONとOFFを繰り返します。
シーケンサ側で対応する入力が正しく変化しているか確認することで、
Raspberry Piからの出力信号が正しく伝達されているかを検証できます。
このGPIOチェックCODEを利用して
シーケンサへ出力されているかを確認しましょう。
まとめ
今回は、Raspberry Piとシーケンサを接続するための回路構築から、フォトカプラを使った信号伝達、そしてラズパイとシーケンサ間での信号の確認方法までを紹介しました。
これにより、異なる電圧を使用する機器同士でも、安全に信号をやり取りすることができます。
フォトカプラを活用した絶縁設計により、ラズパイをシーケンサと連携させる際の信号のやり取りが安全かつ確実に行えます。
信号の送受信を確認するための簡単なテストコードを使用することで、システムの正常動作をチェックでき、実際の運用に向けて準備が整います。
これらの手順を参考に、安全で効率的なRaspberry Piとシーケンサの接続をしてみてください。