ラズパイPicoでシーケンサを作ろう(動作確認編)基板製造、部品実装

ラズパイPicoシーケンサ動作確認アイキャッチ
この記事にはプロモーションを含みます。
PCBGOGOバナー600_1
PCBGOGOバナー600_2

前回「ラズパイPico」を使ったシーケンサ基板を設計しましたが、基板が届いたので動作確認の様子を詳しく紹介します。

入力12点、出力6点、アナログ入力2点、I2C通信、UART通信、OLED表示と動作確認用のサブ基板(スイッチ、ボリューム、リレー基板)の動作について、サンプルプログラムを使って確認していきます。

今回動作確認するシーケンサ基板の回路図や仕様については以下のリンクで詳しく紹介しています。

ラズパイPicoでシーケンサを作ろう(基板設計編)簡単基板見積り
Raspbrry Pi Picoを使用したシーケンサ基板の回路設計から基板の見積もり発注方法まで詳しく紹介。入力12点,出力6点,アナログ入力2点,I2C,UART,OLED表示付です。

1.製作するラズパイPicoシーケンサについて

複数の入出力を制御するために、産業用途や自動化システムではシーケンサ(PLCProgrammable Logic Controller)による制御が広く普及していますが、産業用ということで価格は高価です。

専用のソフトで「ラダー図」を使えば複雑な制御も比較的容易に実現でき、メンテナンスも容易になりますが、小規模な用途ではその機能を持て余すことも多いように思います。

そんな小規模な用途で安価に、シーケンサのように使えるものがあれば便利と思い、今回「ラズパイ Pico」を使用した「シーケンサ基板」を作ることにしました。
「ラダー図」程ではないですが「Python」でラダーのようにプログラミングが書けるため、小規模な用途では手軽に使えて、動作の修正やメンテナンスも容易にできるので、便利に使えるのではと思います。

「ラダー図」の動作を「Python」で書く方法は以下のリンクで詳しく紹介しています。

ラズパイPicoシーケンサ、ラダーをPythonで書く方法
シーケンサのラダー図からPythonプログラムに置き換えて動作確認する方法を、Raspberry Pi Picoでサンプルプログラムを使って詳しく紹介します。

製作したシーケンサ基板の3Dデータは下画像のようになります。
名前は「LogikaraーPLC」とでもしておきます^^♪

ラズパイPicoシーケンサ 端子配列

主な機能は以下のようになります。

  • 入力端子:「X00〜X03 / COM(0V)×2」で 6極(6P)端子台
         「X04〜X07 / COM(0V)×2」で 6極(6P)端子台
         「X10〜X13 / COM(0V)×2」で 6極(6P)端子台
  • 出力端子:「Y00〜Y05 / OUT 5V / VSYS 5V / COM(0V)」で 9極(9P)端子台
  • アナログ入力端子:「ADC1 / ADC2 / VSYS 5V / COM(0V)」で 4極(4P)端子台
  • UART(UART0):「TX0 / RX0 / COM(0V)」で3極(3P)端子台
  • I2C(I2C0):「SDA0 / SCL0 / VSYS 5V / COM(0V)」で4極(4P)端子台
    ※「SDA0 / SCL0」端子は UART1の「TX1 / RX1」端子としても割り付けて使用できます。

入出力の回路図は以下のようになります。(VSYSは、電源5Vー約0.3Vで4.7V程になります。)

入力回路(フォトカプラ)

ラズパイPicoシーケンサKicad回路図

入力用端子台と「ラズパイPico」の入力端子はフォトカプラで絶縁されているので、外来ノイズの影響を受けにくくなります。
動作確認用LED付きです。

出力回路(トランジスタアレー)

ラズパイPicoシーケンサKicad回路図

出力にはトランジスタアレー(オープンコレクタ)を使用してより大きな電流を扱えます。
動作確認用LED付きです。

1点なら最大500mAですが、複数使用の場合は発熱に注意して低減する必要があります。
通信機能の端子は「Pico」基板の端子に直接接続しています。
外部で接続する通信デバイスとの配線はできる限り短くし、ツイストペア配線やシールドケーブルを使用する等、必要に応じてノイズ対策を行なってください。
アナログ入力や通信機能を使用しない場合、これらの端子は入出力端子として割り付けて使用することもできますが、これらの端子は「Pico」基板に直接接続されているため、外来ノイズの影響や出力電流にご注意ください。

入出力の動作確認用サブ基板もメイン基板と面付けして製作しています。
「Vカット」で割り取ると下画像のように使用できるので、必要に応じて部品を実装して使用します。

入力スイッチ、ボリューム基板

ラズパイシーケンサ動作確認用サブ基板

この基板はさらにスリットで3分割できます。
「タクトスイッチ」は押したらON、離したらOFFする動作、「トグルスイッチ」はON状態を保持したい動作の確認用です。
ボリューム基板はアナログ入力の動作確認に使用できます。

出力リレー基板

ラズパイシーケンサ動作確認用サブ基板

リレーはオムロンのG5LEが実装できます。個人では入手が難しいですが、「秋月電子通商」や「Amazon」で買える相当品が豊富にあるのでこれを選定しています。

サブ基板は「L形のピンヘッダー」でメイン基板の端子台に直接接続できますが、ピンヘッダーは両端を残して1つおきにピンを抜くかカットしておく必要があります。
「出力リレー基板」は5Vリレーの消費電流が大きい(80mA × 6個)ため、ACアダプターで5Vを供給します。
この基板をメインのシーケンサ基板と接続すると「ラズパイ Pico」への電源供給もできます。
この場合は「Pico」のUSBケーブルは必ず外して、ACアダプターのみから電源供給するようにしてください。(USBの5VとACアダプターの5Vのわずかな電位差でお互いに電流が流れて、接続した機器の破損につながる可能性があります。)
詳細は下の「5.ACアダプターでの動作確認、注意点」を参照してください。

各基板の回路詳細については、以下のリンクの中で詳しく紹介しています。

ラズパイPicoでシーケンサを作ろう(基板設計編)簡単基板見積り
Raspbrry Pi Picoを使用したシーケンサ基板の回路設計から基板の見積もり発注方法まで詳しく紹介。入力12点,出力6点,アナログ入力2点,I2C,UART,OLED表示付です。

2.製作した生基板と実装部品の確認

今回設計して製造した「生基板」と実装する部品について紹介します。

・生基板の製作(PCBGOGO)

生基板は中国の深センにある基板製造メーカーの「PCBGOGO」さんに製造をお願いしました。

PCBGOGOジャパン

新規会員登録で「$50」のクーポンが貰えて、さらに製造データを登録した時点で「$100」のクーポンが2枚(2023/11/19時点の情報です。今だけでしょうか?お早めにどうぞ)貰えました♪
しかも期間は永久だそうで・・・$1=¥150で計算すると合計¥30,000分以上?!いいのかなぁ〜と思いながらも、ありがたく使わせてもらいます!^^

基板の見積もりは会員登録も不要でHP上からすぐに確認できるので見積もりだけしてみるのもいいと思います。今回の基板は5枚で「$54(約¥8,000)」ですが、新規会員登録の場合は割引があって「$9」で製作できます。安い!

PCBGOGOバナー600_1
PCBGOGOバナー600_2

基板製造依頼後に支払いが完了すると製造状況が以下のように更新されて確認できます。

PCBGOGO基板製造状況、製造過程
PCBGOGO基板製造状況、製造過程

どこまで進んでいるかわかるのもいいですし、基板の製造工程もよくわかって勉強になります!

[振り込み完了]から[製品発送完了]まで、ちょうど2日でした。
特急指定はしていません。通常納期です!早いですね〜

深夜2時に「銅メッキ」とか、22時に「包装」とか・・・ありがとうございます^^;

完成して到着した基板は以下になります。

PCBGOGO試作基板入荷

中国からお馴染みの「OCS」でいつもの感じで届きました。

PCBGOGO試作基板入荷

丈夫な箱に入っていて、へこみ等もなく、非常に状態は良かったです。

PCBGOGO試作基板入荷

梱包材もしっかりしてます。

PCBGOGO試作基板入荷

さらに基板はエアキャップでラミネートされています。

PCBGOGO試作基板入荷

今回は5枚制作しました。

PCBGOGO試作基板入荷

シルク印刷やランドのハンダメッキも非常に綺麗です。

PCBGOGO試作基板入荷

小径ビアや細パターンも綺麗に仕上がっています。

PCBGOGO試作基板入荷

Vカットやスリットも問題なく綺麗に基板を分離することができました。

・実装部品

実装する部品の全ては下画像のようになります。

Picoシーケンサ部品一式

部品入手については「Amazon」でも買えますが、探すのが結構大変です・・・トグルスイッチやリレー、端子台は安かったりしますが、「秋月電子通商」だとすぐに全部揃うので今回は全て秋月さんで購入しました。

「部品リスト」は以下のリンク先で秋月さんの品番と一緒に公開しています。

ラズパイPicoでシーケンサを作ろう(基板設計編)簡単基板見積り
Raspbrry Pi Picoを使用したシーケンサ基板の回路設計から基板の見積もり発注方法まで詳しく紹介。入力12点,出力6点,アナログ入力2点,I2C,UART,OLED表示付です。
ダイオードや抵抗は10個や20個でしか購入できないものもあるので注意してください。
画像の中の抵抗4.7kΩと10kΩは手持ちがあったので必要数量だけ準備しています。
端子台は黒がいいかと思って「秋月電子通商」で黒を購入しましたが、地味だったので^^; 実装は「Amazon」で購入した青を実装しました。

3.部品実装

基板へ部品を実装したものは下写真のようになります。

ラズパイシーケンサ基板

基板はメインの「シーケンサ基板(Logikara-PLC)」と動作確認用の「サブ基板」を面付けして作成しています。
各基板の境目には「Vカット」の溝がついているため下写真のように割って分割することができます。

ラズパイシーケンサ基板
ラズパイシーケンサ基板

動作確認用サブ基板の「L形ピンヘッダー」は、メイン基板の端子台に接続して使用しますが、そのままでは干渉してしまうため、下画像のように両端を残して1つおきにピンを抜いておきます。

ラズパイシーケンサ基板ピンヘッダー
ラズパイシーケンサ基板ピンヘッダー

サブ基板は下写真のようになります。

ラズパイシーケンサ動作確認用サブ基板

入力動作確認用スイッチ、ボリューム基板

ラズパイシーケンサ動作確認用サブ基板

出力動作確認用リレー基板

スイッチ基板とボリューム基板は以下のようにスリットでさらに3分割できます。

ラズパイシーケンサ動作確認用サブ基板

スリットで簡単に割れます。

ラズパイシーケンサ動作確認用サブ基板

接合部も工具を使って簡単に割り取れます。

サブ基板の接続例は各端子台に固定して、下写真のようになります。

ラズパイシーケンサ動作確認用サブ基板

入力動作確認用スイッチ基板は「X00〜X03、X04〜X07、X10〜X13、COM」に接続して使用できます。

アナログ入力確認用ボリューム基板は「VSYS、ADC1〜2、COM」に接続して使用できます。

出力動作確認用リレー基板は「Y00〜Y05、COM、VSYS 5V、OUT 5V」に接続して使用します。

リレー基板にはACアダプター5Vを接続して、メイン基板に電源を供給することができますが、この場合は「Pico」のUSBは同時に接続しないよう注意してください。
USBとACアダプターのDC5Vの微妙な電位差で互いに電流が流れて、最悪接続した機器を破損する可能性があります。
「ラズパイ Pico」へのプログラムの書き換え時はメイン基板から外して、プログラムを書き込んでから取り付けて使用してください。
詳細は下の「5.ACアダプターでの動作確認、注意点」を参照してください。

4.動作確認

シーケンサ基板(Logikara-PLC)の動作確認をしていきます。

今回は試作基板の動作確認のため、単純な入出力テストや、接続した通信機器が問題なく動作できるかを各動作ごとにサンプルプログラムで確認していきます。

問題なく動作確認できたら、次回以降はこれらの機能を利用した応用プログラムを公開していきたいと思います。

・入出力テスト

入出力の確認だけなので以下の単純な「ラダー」動作で、入力端子12点(X00〜X07、X10〜X13)、出力端子6点(Y00〜Y05)の動作確認を行います。
入出力のON/OFFはシーケンサ基板上のLEDで確認できます。

X00とX01   がONで Y00 をON
X02とX03   がONで Y01 をON
X04とX05   がONで Y02 をON
X06とX07   がONで Y03 をON
X10とX011 がONで Y04 をON
X12とX013 がONで Y05 をON

この動作では、2つの入力が同時にONしたときに1つの出力をONさせています。
全ての入力をONさせたときに、全ての出力がONされれば問題なく動作している確認ができます。

この動作をシーケンサの「ラダー図」で書くと以下のようになります。

'''
# 入出力確認 *********************
    x0     x1
  --| |----| |-----------( y0 )--
    x2     x3
  --| |----| |-----------( y1 )--
    x4     x5
  --| |----| |-----------( y2 )--
    x6     x7
  --| |----| |-----------( y3 )--
    x10    x11
  --| |----| |-----------( y4 )--
    x12    x13
  --| |----| |-----------( y5 )--
'''

この「ラダー図」を「Python」で書くと以下のようになります。

# Pythonへ変換
y0 = x0 and x1
y1 = x2 and x3
y2 = x4 and x5
y3 = x6 and x7
y4 = x10 and x11
y5 = x12 and x13

シーケンサの「ラダー図」を「Python」で書いて動作確認を行う方法については、以下のリンクで詳しく紹介しています。

ラズパイPicoシーケンサ、ラダーをPythonで書く方法
シーケンサのラダー図からPythonプログラムに置き換えて動作確認する方法を、Raspberry Pi Picoでサンプルプログラムを使って詳しく紹介します。

実際にサンプルプログラムを書き込んで動作確認した様子は下画像になります。
サブ基板の「トグルスイッチ基板(3セット作りました)」を使用して動作確認しています。

ラズパイPicoシーケンサ動作確認I/0

サンプルプログラムは以下になります。
今回は単純な入出力の確認だけのため「タイマー割り込み」や「カウントクラス」は省略しています。

from machine import *  # 制御用モジュールを準備

# 本体LEDを出力設定
led = Pin("LED", Pin.OUT)

# INPUT:入力端子(x0〜x3)設定(プルアップ)
input_pins = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]  # 使用する入力端子を設定(リスト作成)
inputs = [Pin(pin, Pin.IN, Pin.PULL_UP) for pin in input_pins]

# OUTPUT:出力端子(y0〜y3)設定
output_pins = [18, 19, 20, 21, 22, 26]  # 使用する出力端子を設定(リスト作成)
outputs = [Pin(pin, Pin.OUT) for pin in output_pins]

# 初期化
x0 = x1 = x2 = x3 = x4 = x5 = x6 = x7 = x10 = x11 = x12 = x13 = False  # 入力接点(12点)
y0 = y1 = y2 = y3 = y4 = y5 = False  # 出力点数(6点)
m0 = m1 = m2 = m3 = m4 = m5 = m6 = m7 = m8 = m9 = \
m10 = m11 = m12 = m13 = m14 = m15 = m16 = m17 = m18 = m19 = False  # 補助リレー(20点)

# メイン処理 ---------------------------------------------------------------
while True:  # ずっと繰り返し
    # 入力状態スキャン
    x0, x1, x2, x3 = not inputs[0].value(), not inputs[1].value(), not inputs[2].value(), not inputs[3].value()
    x4, x5, x6, x7 = not inputs[4].value(), not inputs[5].value(), not inputs[6].value(), not inputs[7].value()
    x10, x11, x12, x13 = not inputs[8].value(), not inputs[9].value(), not inputs[10].value(), not inputs[11].value()

    # ************* シーケンス処理(ラダーから変換) *************
    '''
    # 入出力確認 *********************
        x0     x1
      --| |----| |-----------( y0 )--
        x2     x3
      --| |----| |-----------( y1 )--
        x4     x5
      --| |----| |-----------( y2 )--
        x6     x7
      --| |----| |-----------( y3 )--
        x10    x11
      --| |----| |-----------( y4 )--
        x12    x13
      --| |----| |-----------( y5 )--
    '''
    # Pythonへ変換
    y0 = x0 and x1
    y1 = x2 and x3
    y2 = x4 and x5
    y3 = x6 and x7
    y4 = x10 and x11
    y5 = x12 and x13

    # 本体LED動作(電源ONで点灯)
    led_state = True
    led.value(led_state)

    # ************* シーケンス処理 ここまで *************

    # 出力実行
    outputs[0].value(y0)
    outputs[1].value(y1)
    outputs[2].value(y2)
    outputs[3].value(y3)
    outputs[4].value(y4)
    outputs[5].value(y5)
全ての入力をONさせると、全ての出力がONできたため、問題なく動作していることが確認できました。

次に、同じプログラムでサブ基板の「リレー基板」の動作確認をしていきます。
「リレー基板」は下画像のように「シーケンサ基板(LogikaraーPLC)」と接続して「リレー基板」に接続したACアダプターからDC5Vを供給します。

ラズパイシーケンサ動作確認リレー基板
電源供給を「リレー基板」のACアダプター(DC5V)から行うため「ラズパイ Pico」本体のUSBケーブルは外しておく必要があります。
詳細は下の「5.ACアダプターでの動作確認、注意点」を参照してください。

リレーがONしているかどうかはブレッドボード上にLEDを並べて、全てのLEDが点灯するかどうかで確認しています。
LEDの電源は「リレー基板」上の端子台から供給できます。

全ての入力をONすると下画像のように、ブレッドボード上の全てのLEDが点灯したため、問題なく動作していることが確認できました。

ラズパイシーケンサ動作確認リレー基板

設計時に心配された、出力に使用しているトランジスタアレーの発熱についても確認しておきます。

今回はDC5Vのリレーを採用したため、消費電流が大きい(1個約80mA[5V])です。
1個2個なら問題ないですが、6個全部をONさせると、トランジスタアレーの発熱の問題が想定されます。

今回は、できるだけリレーの消費電流を抑えるため、あえて効率の悪い「トランジスタ」タイプの「トランジスタアレー」を採用しています。
「トランジスタアレー」のコレクタ-エミッタ間電圧は大きいため、リレーの両端電圧がその分低くなり、消費電流も低くなります。

リレーコイルの動作電圧は「75%以下(3.75V)」のため、全てのリレーをONした状態で、各リレーの電圧が「3.75V」より十分高いかを確認していきます。
リレーのコイル抵抗(70Ω±10%のため最小の63Ωとする)から各リレーの消費電流値も求めておきます。

確認結果は以下表のようになりました。

リレー番号Y00Y01Y02Y03Y04Y05
コイル両端電圧(V)4.244.244.224.234.234.23
コイル電流計算値(mA)67.367.367.067.167.167.1

リレーコイルの両端電圧は「4V」以上のためOKとします。消費電流の合計は「402.9mA」でした。
コイル電流による発熱は、以下の「トランジスタアレー(ULN2003A)」のデータシートのグラフで確認します。
このグラフから、トランジスタON/OFFのDutyサイクルごとに、85℃となる電流の最大値が確認できます。

ラズパイPicoシーケンサKicad回路設計

同時に6個ONするため「N=6」のグラフで、Dutyサイクルは連続ONのため「100%」の時の電流値を確認すると「1素子あたり約120mA」なのがわかります。
目一杯使うと85℃なので半分以下を目安とします。

上表で計算で求めた各「コイル電流値」は「67mA」程度でほぼ半分のため、問題なしとします。

念の為、全てのリレーをONした状態で1時間程放置してみましたが、リレーが少し暖かくなる程度で、トランジスタアレーの発熱は感じられなかったため、問題なしとします。

入出力の確認は問題なく想定通り動作しましたのでひとまず安心です。
改善点としては「リレー基板」にも動作表示灯としてLEDをつけるべきでした・・・
離れた場所に「リレー基板」を設置した時に、表示灯があると動作確認ができて便利なので、電流値にもまだ余裕がありそうですから次作る時にはつけたいと思います。

・OLEDディスプレイ表示

OLEDディスプレイ(SSD1306)の動作は下画像のように「Hello!!」を表示するプログラムで確認を行いました。

ラズパイPicoシーケンサ動作確認OLED

サンプルプログラムは以下になります。

# Thonnyの「パッケージ管理」からssd1306で検索して「micropython-ssd1306」をインストールしておく

from machine import I2C  # I2C制御用モジュールを準備
import ssd1306  # 液晶表示器用ライブラリを使用
import time     # タイマーモジュールを準備

# I2C設定
i2c = I2C(1, sda=2, scl=3)  # (I2C識別ID 0or1, SDA, SCL)

# 使用するSSD1306のアドレスを取得して表示(通常は0x3C)
addr = i2c.scan()
print("OLED I2C Address :" + hex(addr[0]))

# ディスプレイ設定(幅, 高さ, 通信仕様)
display = ssd1306.SSD1306_I2C(128, 64, i2c)

# メイン処理 ---------------------------------------------------------
while True:  # ずっと繰り返し
    display.fill(0) # 画面表示初期化

    # 文字表示("表示内容", x座標, y座標, 色, フォント)
    display.text("OLED SSD1306", 17, 0, True)
    display.text("Hello!!", 37, 36, True)
    # 線の描画(始点x, 始点y, 終点x, 終点, 色)
    display.line(0, 9, 128, 9, True)
    # 四角の描画(x座標, y座標, 幅, 高さ, 色)
    display.rect(5, 20, 118, 40, True)

    display.show()  # 画面表示実行
    time.sleep(0.5) # 待ち時間
OLEDディスプレイは問題なく動作させることができることが確認できました。

OLEDディスプレイの使用方法は以下のリンクで詳しく紹介しています。

ラズパイPicoでSSD1306有機ELディスプレイの使い方 MicroPython編
液晶表示器のないRaspberry Pi PicoでOLED SSD1306の使い方をMicroPythonのサンプルプログラムで紹介。開発環境はTonnyを使用します。

・アナログ入力

アナログ入力は下画像のように、ボリューム基板を使用して、2つのアナログ入力値(A1、A2)と電圧換算値をOLEDディスプレイに表示して確認を行いました。

ラズパイPicoシーケンサ動作確認ADC
ラズパイPicoシーケンサ動作確認アナログ入力

サンプルプログラムは以下になります。

# Thonnyの「パッケージ管理」からssd1306で検索して「micropython-ssd1306」をインストールしておく

from machine import Pin, ADC, I2C  # 使用する制御用モジュールを準備
import ssd1306  # 液晶表示器用ライブラリを使用
import time     # タイマーモジュールを準備

# I2C設定
i2c = I2C(1, sda=2, scl=3)  # (I2C識別ID 0or1, SDA, SCL)

# 使用するSSD1306のアドレスを取得して表示(通常は0x3C)
addr = i2c.scan()
print("OLED I2C Address :" + hex(addr[0]))

# ディスプレイ設定(幅, 高さ, 通信仕様)
display = ssd1306.SSD1306_I2C(128, 64, i2c)

# アナログ入力ピン設定
adc1 = ADC(27)  # アナログ入力(A0)の端子番号27を設定
adc2 = ADC(28)  # アナログ入力(A1)の端子番号28を設定

# メイン処理 ---------------------------------------------------------
while True:  # ずっと繰り返し
    adc_val1 = 65535 - adc1.read_u16()    # アナログ入力(ADC)値1を取得
    adc_volt1 = (adc_val1 * 3.3) / 65535  # アナログ入力(ADC)値1を電圧(3.3V)に変換
    adc_val2 = 65535 - adc2.read_u16()    # アナログ入力(ADC)値2を取得
    adc_volt2 = (adc_val2 * 3.3) / 65535  # アナログ入力(ADC)値2を電圧(3.3V)に変換
    print("adc_val = {:5d}, {:5d}  adc_volt = {:5.2f}V, {:5.2f}V".format(adc_val1, adc_val2, adc_volt1, adc_volt2))  # 結果を表示する

    # 液晶画面表示内容設定
    display.fill(0)  # 表示内容消去
    display.text('Analog Input', 15, 0, True)  # タイトル表示
    display.hline(0, 10, 128, True)            # 指定座標から横線
    display.text('ADC ={:6d}'.format(adc_val1), 17, 15, True)    # アナログ入力1値表示
    display.text('VOLT={:5.2f}'.format(adc_volt1), 17, 27, True) # 電圧1表示
    display.hline(10, 38, 108, True)            # 指定座標から横線
    display.text('ADC ={:6d}'.format(adc_val2), 17, 43, True)    # アナログ入力1値表示
    display.text('VOLT={:5.2f}'.format(adc_volt2), 17, 55, True) # 電圧1表示

    # 設定した内容の表示実行
    display.show()

    time.sleep(1.0)  # 待ち時間

それぞれのボリュームを操作すると「0〜約3.3V」の可変ができることが確認できました。

・I2C通信

I2C通信(SDA0、SCL0)はOLEDディスプレイを使用して下画像のように確認を行いました。

ラズパイPicoシーケンサ動作確認I2C

サンプルプログラムは、上で紹介した「OLEDディスプレイ表示」のサンプルプログラムと同じで、I2C通信で使用する端子の指定を以下のように変更したものです。

# I2C設定 (I2C識別ID 0, SDA0端子, SCL0端子)
i2c = I2C(0, sda=4, scl=5)
I2C通信も問題なく使用できることが確認できました。

・UART通信

UART通信は、専用の端子「TX0、RX0」と、割り付けて使用できる「TX1、RX1」のそれぞれの送信端子と受信端子を下画像のように接続して行います。

ラズパイPicoシーケンサ動作確認UART

動作確認は「X00」のスイッチ(赤)をONすると、文字列「Hello」を「TX0」から送信し「RX1」で受信します。
データを受信したら受信した文字列に「World!」加えて「TX1」から送信し「RX0」で受信します。

最終的に受信したデータ「Hello World!」が「OLED表示器」に表示されたら、正常に動作していることが確認できます。

サンプルプログラムは以下になります。

# Thonnyの「パッケージ管理」からssd1306で検索して「micropython-ssd1306」をインストールしておく

from machine import Pin, UART, I2C  # 使用する制御用モジュールを準備
import ssd1306  # 液晶表示器用ライブラリを使用
import time     # タイマーモジュールを準備

# I2C設定
i2c = I2C(1, sda=2, scl=3)  # (I2C識別ID 0or1, SDA, SCL)

# 使用するSSD1306のアドレスを取得して表示(通常は0x3C)
addr = i2c.scan()
print("OLED I2C Address :" + hex(addr[0]))

# ディスプレイ設定(幅, 高さ, 通信仕様)
display = ssd1306.SSD1306_I2C(128, 64, i2c)

# UART0を初期化
uart0 = UART(0, 9600) # (UART番号, ボーレート) ※端子を指定しなければ RX/TX=1/0

# UART1を初期化
uart1 = UART(1, 9600) # (UART番号, ボーレート) ※端子を指定しなければ RX/TX=5/4

# 入力ピン設定
x0 = Pin(6, Pin.IN, Pin.PULL_UP) # スイッチのピン番号を指定してswとして入力設定(プルアップ)

# 変数宣言
state = False  #  スイッチ状態保持用

# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
    
    #  スイッチONでUART0(TX0) から「Hello 」を送信
    if (x0.value() == False and state == False):  # スイッチが押されていてstateがFalseなら
        state = True  # スイッチON状態を保持
        
        # OLED表示
        display.fill(0) # 画面表示初期化
        display.text("Hello", 0, 0, True)  #("表示内容", x座標, y座標, 色, フォント)
        display.show()  # 画面表示実行
        
        # UART0(TX0)でデータ送信
        uart0.write("Hello")  # 文字「Hello」を送信
        
    if x0.value() == True:  # スイッチがOFFなら
        state = False  # スイッチON状態を解除

    # UART1(RX1)で受信したデータに「World!」を加算
    if uart1.any() > 0:  # 受信データがあれば
        data = uart1.readline()  # 受信済みの文字データを全て読み込む
        print(data)              # 受信した文字を表示
        
        # UART1(TX1)でデータ送信
        uart1.write(data + " World!")  # 受信した文字に「World」を追加して送信

    # UART0(RX0)で受信したデータをOLEDに表示
    if uart0.any() > 0:  # 受信データがあれば
        data = uart0.readline()  # 受信済みの文字データを全て読み込む
        print(data)              # 受信した文字を表示
        
        # OLED表示
        display.text(data, 0, 10, True)  #("表示内容", x座標, y座標, 色, フォント)
        display.show()  # 画面表示実行

    time.sleep(0.2)  # 遅延時間
2系統のUART通信が問題なく使用できることが確認できました。

5.ACアダプターでの動作確認、注意点

サブ基板の「リレー基板」にはDC5VのACアダプターを接続して、シーケンサ基板への電源を供給することができますが、いくつか注意点があります。

この基板は、まだ試作段階のため「ACアダプターを接続するときにはUSBを外す必要があります」としています。
USBを外さないと「USBの5V」と「ACアダプターの5V」を接続することになり、お互いの微妙な電圧差で電圧の高い方から低い方へ電流が流れ、接続した機器を最悪破損させてしまう可能性があるためです。

実際はダイオード(ショットキーバリアダイオード)を使用して、「USBの5V」へは電流は流れません。
「ACアダプターの5V」が「USBの5V」より低くない限り問題無いようにしていますが、今の段階では十分な動作確認をしていないためUSBは外すこととします。
USBとACアダプターを同時接続する場合は以下回路図をご理解の上、自己責任でご使用をお願いします。

リレー基板の回路図は以下になります。
「J9-1(J26-17)」がシーケンサ基板の「OUT 5V(VBUS)」と接続されます。
「J9-2(J26-15)」がシーケンサ基板の「VSYS 5V(VSYS)」と接続されます。

ラズパイPicoシーケンサKicad回路設計

シーケンサ基板側の「リレー基板」と接続する端子台の回路図は以下になります。

ラズパイPicoシーケンサKicad回路図

「ラズパイ Pico」の電源部の回路図は以下になります。
「VBUS」がシーケンサ基板の「OUT 5V」にあたり、「VSYS」がシーケンサ基板の「VSYS 5V」にあたります。

Raspberry Pi Pico 電源回路(VSYS端子)詳細

「リレー基板」のACアダプターの5Vから「ラズパイ Pico」の「VBUS」には逆流防止用のダイオードが入れてあるため電流は流れませんが、ACアダプターの5Vが低い場合は「VBUS」から「ACアダプター」へ電流が流れるため注意が必要です。

ACアダプターの5Vは「リレー基板」上のダイオード経由で「ラズパイ Pico」のVSYSへ電源を供給します。
この時のVSYSの電圧はショットキーバリアダイオードの順方向電圧(約0.3V)分低下し「約4.7V」になります。

「VSYS」に入力された電圧は「Pico」上の電源ICで制御用の3.3Vを生成します。
「VSYS」はシーケンサ基板の5V電源(VSYS 5V)としても使用しています。

「Pico」基板単体での動作を考えると「VSYS」端子には「1.8V〜5.5V」の電圧を入力すれば、「Pico」基板上の電源ICで「3.3V」電源が生成されるため動作できますが、シーケンサ基板としては「VSYS 5V」のラインが全て「VSYS」に入力された電圧になるため注意が必要です。
(フォトカプラの1次側ダイオードの電源も「VSYS 5V」から供給しているため、電圧が低いとONできない可能性があります。)
この回路図ではACアダプターを接続しなくても「VBUS」からの電源供給でリレー基板を駆動できることになりますが、リレーはDC5Vのため消費電流が大きく(1個約80mA)、「VBUS」ラインの許容電流がわからないため使用はおすすめできません。

6.ガーバーデータから基板を製作する方法紹介

シーケンサ試作基板(Logikara-PLC)の動作確認を行いましたが、概ね予定通りに動作しました。
ここでは「基板製造のためのガーバーデータ」を公開予定でしたが、思いのほか高額となったため保留としました(汗)

今回メイン基板と一緒にサブ基板を面付けして製作しましたが、基板製造を依頼した「PCBGOGO」さんでは、異なる回路を同一基板上で製造すると「異種面付け」となり、面付け数分の追加費用が発生するようです。

代わりにメインのシーケンサ基板だけのデータで基板を製造依頼する方法を以下のリンク先にまとめて詳しく紹介しています。(ガーバーデータも公開)

個人でも格安、簡単、自作プリント基板製造、発注方法
基板製造は数千円で5日もあれば注文できる今、個人の電子工作でもフリーソフトのKiCAD等で製作したガーバーデータで簡単にプリント基板を製造依頼する方法を詳しく紹介します。

上記のリンクの方がわかりやすいと思いますが、以下のガーバーデータから基板を発注する方法も残しておきます。
最終的な価格はデータ確認後に確定します。価格に問題なければ支払いを行なって、製造が始まります。

基板価格の確認

ガーバーデータを登録して基板を発注するには以下のボタンから「PCBGOGO」さんのホームページにアクセスします。

PCBGOGOジャパン

新規会員登録の場合、基板製造「-$25」、送料「-$25」の割引があります。
割引適用には条件があります。詳細は以下の「PCBGOGO」さんのページでご確認ください。ページ最下部に注意事項が記載されています。
$1でPCB試作&新規ユーザー送料無料

以下のようなページが表示されたら[自動お見積もり]ボタンをクリックします。

PCBGOGO基板発注方法

以下のようなページが表示されたら[外形寸法(長さ×幅)]と[枚数]を入力して、[見積作成]ボタンをクリックします。

PCBGOGO基板発注方法

以下のようにページ右に見積もり金額が表示されたら、2箇所の[新規ユーザー割引]に「チェック」を入れます。

PCBGOGO基板発注方法
今回の例では基板製造の「$34」が「-$25の割引」で「$9」に、送料は割引後「$0」となり合計金額は「$9」になりましたが、最終的な価格はデータチェック後確定しますので、価格に問題なければ支払い手続きを行なってください。

基板製造を依頼するには「新規会員登録」が必要なため[今すぐ登録!]をクリックして、会員登録を行いましょう。
会員登録がお済みの方は[カートに入れる]をクリックしてログインします。
「マイページ」からガーバーデータを登録して、支払い方法を選択すると発注完了となります。

会員登録するだけで「50ドル(約7千円以上)」のクーポンが獲得できるので、この機会に会員登録だけでも済ませておきましょう。
PCBGOGOバナー600_1
PCBGOGOバナー600_2

新規会員登録方法

今すぐ登録!]をクリックすると、以下のような画面が表示されるので[会員登録に進む(無料)]をクリックしましょう。

PCBGOGO新規会員登録

以下のような画面が表示されたら、「メールアドレス」と「パスワード」を決めて入力します。
パスワードは忘れないようにメモしておきましょう。

入力したら「私はロボットではありません」にチェックを入れて、利用規約等を確認し、問題なければ[規約に同意して次へ進む]をクリックします。

PCBGOGO新規会員登録

登録したメールアドレス宛に、下画像のような「認証番号」が記載されたメールが届くのでしばらく待ちます。届いた番号はメモまたはコピーしておきましょう。

PCBGOGO新規会員登録

以下のような認証番号を入力する画面が表示されたら、先ほどメモした認証番号を入力し[次に進む]をクリックします。(謎のカウントダウンが始まりますが、0になっても問題なく進めたので焦らず作業しましょう。)

PCBGOGO新規会員登録

以下のような「お客様情報の入力」ページが表示されたら、ご自分の利用状況に合わせて「会社」「個人」「ディーラー」を選択し、以下の情報を入力して[確認]ボタンをクリックします。

PCBGOGO新規会員登録

次に、入力内容の確認を行って問題なければ[新規登録]ボタンをクリックします。

PCBGOGO新規会員登録

登録が完了すると、以下のようなメールが届きます。
PCBGOGOさんでは「1対1サポート」があり、何かあった時は直接担当の方と連絡ができるようです。
対応も日本語で大丈夫のなので、何かあった時は気軽に問い合わせてみましょう。

PCBGOGO新規会員登録

以下のように、ログイン画面が表示されたら登録した「メールアドレス」と「パスワード」を入力し、「私はロボットではありません」にチェックを入れて[ログイン]ボタンをクリックします。

PCBGOGOログイン

ガーバーデータの登録

会員登録が完了して「ログイン」すると、以下のようにマイページが表示されます。
画面右上の[カート]アイコン上に「1」が表示されていると思うのでここをクリックします。

「1」が表示されていない場合は、画面上の中央辺りにある[プリント基板発注]ボタンをクリックして表示される見積もり画面から、再度「外形寸法、枚数」を入力して、2箇所の「ユーザー割引」にチェックを入れた後に[カートに入れる]ボタンをクリックしてください。
PCBGOGOガーバーデータ登録方法

以下のように、カート内に製造する基板の情報が登録されています。
この画面で「ガーバーデータ」の登録を行います。
ガーバーデータを入稿]ボタンをクリックしてください。

PCBGOGOガーバーデータ登録方法

以下の画面が表示されたら[ガーバーデータを入稿]ボタンをクリックします。
パソコンのフォルダが表示されたら、製造する基板の「ガーバーデータ」を選択します。(登録できるデータはzip[圧縮]データなのでご注意ください。)

PCBGOGOガーバーデータ登録方法

登録が完了して、以下のような画面になったら[確認]ボタンをクリックします。

PCBGOGOガーバーデータ登録方法

マイページのカート情報が更新され、以下のように[ステータス]が「データ確認中」になれば、ひとまず完了です。
「PCBGOGO」さんの方でデータの確認が終わったら[ステータス]が更新され価格が確定するので、それまでしばらく待ちましょう。

価格が確定して、間違いがなければ[レジに進む]をクリックして、支払い方法を登録したら、あとは基板の完成を待つだけです。その間、次のお届け先情報の登録を済ませておきましょう。

PCBGOGOガーバーデータ登録方法
上の画面では基板の価格がまだ「$34」となってます。
データチェック完了後に割引が適用されれば、割引価格が表示されるので問題なければ[レジに進む]をクリックして支払い手続きを行いましょう。

お届け先情報の登録

スムーズに基板製造を進めてもらえるように、先に[お届け先情報]の登録をしておきましょう。
マイページのサイドメニューから以下のように[アカウント情報]の[お届け先情報]をクリックします。

PCBGOGOガーバーデータ登録方法

以下のように表示されたら[新しい送り先を追加]ボタンをクリックします。
(私は登録済みなので、既に送り先情報が表示されています。)

PCBGOGOお届け先情報登録

以下のウインドウが表示されたら[会社]か[個人]を選択して情報を入力し、[確認]をクリックして完了です。

PCBGOGOお届け先情報登録
基板製造の進捗状況は「マイページ」から確認できます。
運送状況にもよりますが、遅くても1週間以内には届くと思いますので、その間に部品を準備して待ちましょう。

7.まとめ

「ラズパイ Pico」を使用して制作したシーケンサの試作基板(Logikara-PLC)について、動作確認を行いました。

入力12点、出力6点、アナログ入力2点、I2C通信、UART通信、OLEDディスプレイ表示について、それぞれ個別に動作確認を行いましたが、無事設計通りに動作することが確認できました。

ひとまず安心ですが、より使いやすくするための改善点も見えてきました。
今のままでも十分実用的なので、しばらく使いながら、他の改善点も探ってみたいと思います。

次回製作するときは、これらの改善点を踏まえて再設計したもので製作予定ですが、今回は5枚制作してあるので、しばらくはこれで実際のシーケンサとして「タイマー」や「カウンタ」も含む「ラダー図」での動作確認をしていきたいと思います。

また、「OLED表示」や「I2C/UART通信」をしながら、安定してラダー動作を「タイマー割り込み」で一定間隔で動作させ続けるには「ラズパイ Pico」のマルチコアを使用して処理を分担して動作させる必要があるので、マルチコアでの動作方法についても以下で詳しく紹介しています。

ラズパイPicoマルチコアで並列動作させる方法:MicroPython編
Raspberry Pi Picoのデュアルコアを使用して2つの処理を同時に並列処理させる使い方について詳しく紹介。一定間隔で実行させたいプログラムが簡単に実現できます。
ラズパイPicoでシーケンサを作ろう(基板設計編)簡単基板見積り
Raspbrry Pi Picoを使用したシーケンサ基板の回路設計から基板の見積もり発注方法まで詳しく紹介。入力12点,出力6点,アナログ入力2点,I2C,UART,OLED表示付です。
PCBGOGOバナー600_1
PCBGOGOバナー600_2

コメント

  1. logikara より:

    今のところ販売予定は無いですが^^; 基板のガーバーデータを次の記事で公開予定です。
    ガーバーデータを元に生基板を製造依頼する手順も紹介しますのでよろしければお試しください。

    半田付けは少し手間ですが、部品は高価なものはないので、安価で完成できると思います。
    部品の入手先や、総額いくらで製作できるか等も紹介しますので、またご確認ください。

タイトルとURLをコピーしました