ラズパイ

Raspberry Piとシーケンサを安全に接続!フォトカプラを使ったPLC制御の実践ガイド

ラズパイのGPIOでシーケンサをフォトカプラで接続する方法

Raspberry PiのGPIOは、扱える電圧が3.3Vや5Vです。

しかし、例えば三菱のシーケンサなど、24Vを使用する外部機器と接続する場合、

直接接続するとRaspberry Piが破損する危険があります。

この問題を解決する手段として「フォトカプラ」を活用することで、

異なる電圧間でも安全に信号をやり取りすることが可能です。

この記事では、Raspberry Piを用いてフォトカプラを活用する方法を解説し、

実際に動作確認を行いながら手順を説明していきます。

 

フォトカプラの基本知識:PC817を使った仕組みと活用方法

フォトカプラとは?

フォトカプラ(Photocoupler)は、光を介して電気的に絶縁しながら信号を伝える部品です。内部にLED(発光ダイオード)とフォトトランジスタが組み込まれており、入力信号を光に変換して出力側に伝える仕組みを持っています。この特性により、電圧の異なる機器同士を接続したり、ノイズの影響を防いだりする際に役立ちます。

フォトカプラPC817Cについて

ここでは、一般的によく使われるフォトカプラ、シャープ製PC817Cを使用します。

PC817Cは、小型で扱いやすく、

電気的絶縁と信号伝達を同時に実現できる部品として広く活用されています。

 

フォトカプラの仕組み

フォトカプラの内部構造とICピン配置は次の通りです。

<SHARP公式サイトより抜粋>

仕様など詳細は、こちらからデータシートを参照ください。

https://jp.sharp/products/device/doc/opto/PC817XxNSZ1B_j.pdf

 

(1) 内部構造

入力側
LED(発光ダイオード):入力信号を受けて発光します。

出力側
フォトトランジスタ:LEDの光を受けてオン/オフの信号を出力します。

(2) 動作原理

入力信号がLEDを点灯させると、光が発生します。

フォトトランジスタが光を受け取り、電流が流れることで出力信号が発生します。

このプロセスを通じて、入力信号が電気的に絶縁された状態で出力されます。

 

 

Raspberry Piとフォトカプラを用いた電子回路の作成

Raspberry PiのGPIOピンとフォトカプラを使用して、

三菱FXシーケンサと接続する回路を構築します。

この回路では、ラズパイのGPIOピンとシーケンサの入出力を

フォトカプラを介して接続し、電気的な絶縁を確保しています。

【仕様機器】

・三菱シーケンサ:FX1S-MR

・Raspberry Pi 4B

以下に回路図を示します。

 

【回路図】

 

シーケンサ(出力)→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とシーケンサの接続をしてみてください。