転職して産業系の知識が必要になってくるのでPLCの勉強をしようと思う。
ただ、PLCも安いものではないし、使い勝手はメーカに結構左右されるらしいので、Raspberry Pi上にOpnePLC入れることを検討。
何事も形から入ることをモットーとしてるので、
まずはOpenPLCに使えるハードウェアを用意しようと思う。
色々とネットでOpenPLCに対応しているラズパイハットを探してみたが、
どうもUnipi位しか無さそうだが、数万円と高い。
これなら三菱とかオムロンとかのPLC買うのと変わらないし、
どうせ金を払うなら自作しようと思う。
Contents
仕様
という訳で、まずは仕様を固める。
IOピン仕様
OpenPLC公式に記載されているOpenPLC on Raspberry PiのIO仕様:

入力も出力もすべて使うことは全く考えていないので、リレー用に4ピン、デジタル出力用に4ピン、デジタル入力用に4ピン程度かな。
まぁ、足りなくなったらスタックするなり、作り直す。
電源仕様
ラズパイの入力はUSB 5Vだけど、産業用途としてはこれはきつい。
やはり、DC24V対応させるために、24V->5V電源は必須。
5Vの消費電流は以下のように約2.8[A]。
| # | 分類 | 容量 | 備考 |
|---|---|---|---|
| 1 | ラズパイ | 2.4 [A] | USB給電なければ1.2Aほど |
| 2 | LED | 0.1 [A] | input x4, output x4, Power On x1, etc x1 10[mA] x 10 = 0.1[A] |
| 3 | リレー | 0.3 [A] | SRD-05VDC-SL-C 71.4[mA] 71.4[mA] x4 = 0.3 [A] |
~20Wほどの降圧DCDCが必要。
色々探してみたけど、最近のDCDCはQFNだったり、SOPでも部品裏パッドなど、手付け半田ができないタイプが多い。
まぁ、一枚しか作成する気はないので、高価だけどDIPのモジュールタイプにする。
¥2,300と高価だけど許容範囲であるので、TI製 PTN78020Wを使うことにする。
ただ、実設計を行った結果、PTN78020Wではどうしても基板サイズが110 x 56mmになってしまい、基板コストが$77以上となってしまう。
基板サイズを100 x 56mmにすると、$44程度になるため、若干容量に不安はあるけど、3A品のTI製PTN78060Wを使用することにする。
出力仕様
リレー出力
リレー切り替え入力は5Vを使う。
中華製で怪しいけど、このようなハット系でよく使われているSRD-05VDC-SL-Cを採用することにする。

当初はリレー x4個を用意する予定だったけど、基板サイズを100mm以下に抑えるためx3個に変更。
デジタルIO出力
ラズパイの3.3V IOから、フォトカプラを挟んでNPNトランジスタのエミッタフォロア出力で24Vを出力するようにする。

[2020/9/18 追記]
よく考えたら、論理反転させるのを忘れていた。
このままでは、OpenPLC側からLow出力の時に+24Vが出力されてしまう。
単純に、1pin, 3pin共にカットして、1pinにQX0_0出力を繋いで、3pinをGNDに繋ぐようにする。
入力仕様
相手側の24V出力をフォトカプラで受けて、ラズパイの3.3V IOに接続する。

プリント基板
基板サイズを100 x 56mmとした。
ラズパイよりも若干大きくなってしまうが、許容範囲。
ラズパイのLAN, USBコネクタがある面にデジタルInputとOutput用のターミナルブロックを、HDMIコネクタがある面にリレー用と24V電源用のターミナルブロックを配置。
3Dモデルがない部品が多いけど、3D表示すると以下の感じ。

プリント基板発注
今回もelecrowでプリント基板を作成する。
ガーバー出力
ファイル -> プロットから、以下の設定で”製造ファイル出力”を実行。
\GERBER配下にがーばファイルが出力される。

ドリルファイル出力
上図の右下にある”ドリルファイルを生成”をクリックして、
以下の設定でドリルファイルを出力する。

ファイル名変更
elecrowの注記にあるようにファイル名を変更する。
| ファイル種類 | Kicad出力ファイル名 | elecrow用ファイル名 |
|---|---|---|
| 部品面パターン | PLC_HAT_R03-F_Cu.gtl | PLC_HAT.GTL |
| 内層1パターン | PLC_HAT_R03-In1_Cu.g2 | PLC_HAT.G1 |
| 内層2パターン | PLC_HAT_R03-In2_Cu.g3 | PLC_HAT.G2 |
| 半田面パターン | PLC_HAT_R03-B_Cu.gbl | PLC_HAT.GBL |
| 部品面レジストマスク | PLC_HAT_R03-F_Mask.gts | PLC_HAT.GTS |
| 半田面レジストマスク | PLC_HAT_R03-B_Mask.gbs | PLC_HAT.GBS |
| 部品面シルク | PLC_HAT_R03-F_SilkS.gto | PLC_HAT.GTO |
| ドリルファイル | PLC_HAT_R03.drl | PLC_HAT.TXT |
| 基板外形図 | PLC_HAT_R03-Edge_Cuts.gm1 | PLC_HAT.GML |
基板到着
9/11に発注して、9/17に到着。1週間も経ってない。相変わらず早い。
今回は、レジストを青色にした。

下がラズパイで、上が今回作成したPLCハット。
電源実装
まずは電源のみ実装して、正常に5V出力してラズパイに電源供給できるか確認。

TI製PN78060Wとその周辺回路、スイッチ、ターミナルブロック、スタックコネクタのみを搭載。
ラズパイにスタックして、ターミナルブロックに24V入力してラズパイが正常に起動することが確認できた。
完成
リレー -> 入力部 -> 出力部(布線改造対応込み)と
1ブロックだけ作って動作確認 -> 残りの全ブロック実装と
都度確認しながらくみ上げていく。
最終的な完成体:

左上の黄色の線が改造部。
かなり細かい作業になってしまった。
DINレール実装
ラズパイDINレールに取り付けたRaspberry PI 3Bにスタックして、
DINレールに搭載した例が以下:

右端から順に以下。
・ACDCコンバータ (100V -> 24V 1.5A)
・Raspberry Pi 3 model B rev. 1.2
・PLC HAT (今回作成した基板)
・リレー+リレーソケット
失敗
・QX0.0~QX0.3の極性が反転
・D1~D3, D21-D23のカソードシルクの向きが逆
・CN5のDC24V入力は2.54mmピッチではなく5mmピッチのターミナルブロックが良い
・Q1~Q3のフットプリントがSOT-23なので、SOT-23-HandSoldingが良い
=> 配置密集してる&実装さほど難しくないため、そのまま
・CN1のシルク位置が悪い(回路図修正後の更新で置き換わってしまった模様)
・ラズパイの基板に面合わせしたけど、USBコネクタに面合わせの方が良い
・D11, D12のカソードシルクが移動されてない
出力ピン(QX)に注意
OpenPLC for Raspberry Piは、ラズパイ起動時に立ち上がるようになっているが、GPIO設定がされていない。
ラズパイ起動時のgpioの状態:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ gpio -g readall +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | | | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 0 | IN | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 0 | IN | CE1 | 11 | 7 | | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 | | 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | | | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 | | 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 | | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+ |
全てIN設定になっている。
QX0.4~6には10kΩプルダウンを付けているが、内部プルアップのせいで0.5V程の電位が出てしまい、Transistorが微妙にONしてしまう。
プルアップ抵抗値の値はフォーラムの中に記載されていた。
When a Pi is first powered up, the first eight GPIOs have pull-ups enabled, and the rest have pull-downs enabled. After it has finished booting, you can change that if you wish, in your software.
The pull-ups don’t “supply voltage” – they merely connect a high-value resistor (about 50k) between the 3v3 rail and the GPIO
If nothing else is connected to it, that resistor supplies enough electrons – current for a certain time – to the GPIO, such that its voltage rises to 3v3.
A pull-down works similarly – electrons are removed so that its voltage reaches 0vIn your Arduino drawing, the 10k resistor does the job of the pull-down – it removes electrons to reduce the voltage to ground.
GPIO0~8までは内蔵プルアップが、その他は内蔵プルダウンが有効で、値は~50kΩ程度だと。
QX側の内蔵プルアップ/プルダウン情報をまとめると以下。
| OpenPLC | PLC HAT | BCM | プルアップ/プルダウン |
|---|---|---|---|
| %QX0.0 | Digital Output#0 | GPIO14 | プルダウン |
| %QX0.1 | Digital Output#1 | GPIO15 | プルダウン |
| %QX0.2 | Digital Output#2 | GPIO23 | プルダウン |
| %QX0.3 | Digital Output#3 | GPIO24 | プルダウン |
| %QX0.4 | Relay#1 ON | GPIO25 | プルダウン |
| %QX0.5 | Relay#2 ON | GPIO8 | プルアップ |
| %QX0.6 | Relay#3 ON | GPIO7 | プルアップ |
問題になるのは、%QX0.5と%QX0.6のみ。
プルダウン抵抗が10kΩだと、3.3 x (10k/(10k+50k)) = 0.55VでIceに0.1mA程度の電流を流してしまう。
周囲温度が高くなるともっと増えてしまう。
Base抵抗と同じ3.3kΩに変更しておく。
Power on Reset時に注意
QX0.0は内蔵プルダウンが有効になるはずなのに、電源投入時にHighになる。
色々調べた結果、UART TXDのデュアルピンであり、Raspberry Pi OSでは初期値(デバイスツリー)はUART TXDになっており、Highドライブされる。
その後、raspi-configの設定に従ってGPIOに切り替えられるらしい。
ドライブされてしまうので、基板上にプルダウン抵抗を置いても無駄。
QX0.0は使用不可になってしまう・・・
QX0.1もUART RXDとして内蔵プルアップが有効になるとのこと。
ただ、こちらは10kΩのプルダウン抵抗を基板に置くことで対応可能。
QX0.0の使用はあきらめていたが、ブート中のピン設定が変更できた。
詳細についてはブート中のGPIO設定変更を参照。
これを適用することでブート中もHighドライブすることはない。
One Reply to “OpenPLCハット作成”
[…] 詳細はOpenPLCハット作成を参照だが、GPIO14とGPIO15は、デフォルトではUART TXD, RXDに割り付けられており、ブート中TXDはOutput w/ Highドライブ、RXDはInput w/内蔵プルアップとなり、Raspberry Pi OS起 […]