Raspberry Pi5 で CODESYSを動かす
ラズパイの構成は,以下で使用したものと同じです。
今回は、安価なモーターを使用します。アマゾンで以下のモーターを購入しました。
KKHMF 2個セット 28BYJ-48 5V ステッピングモーター+ ULN2003ステッピングモーター駆動テストモジュールボード 4フェーズ 5ライン

これをRaspberry Pi5に接続します。

モーターモジュールに5V〜12Vを供給する必要があります。ラズパイの5Vを使用するのではなく、今回は別途DCアダプタ経由でUSBケーブルから5Vを取り出して供給するようにしました。
アマゾンでも売っていますが、今回は不要になったUSBケーブルを利用しました。
さて前回の記事
https://smartphone-zine.com/raspberry-pi5-%e3%81%a7-codesys%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99/
では、Raspberry Pi5にCODESYSをインストールし、Raspberry Pi5にCODESYSのランタイムをインストールし、ラダー言語でGPIOを操作するところまで実装を行いました。
今回は、ソフトウェアPLCを使って、ステッピングモーターを制御したいと思います。
まず前回の記事を参考に、プロジェクトを新規作成します。
その時前回はLD(ラダー)を選択したと思いますが、今回は、「構造化テキスト(ST)」を選択して下さい。

GPIOの設定をB+/Pi2に変更しておきます。
次に、GPIO_A_Bをダブルクリックして、開きます。GPIOsパラメータで、ステッピングモーターで使用する4つのGPIOをOutputに設定します。

PLC_PRGをダブルクリックして開きます。次のようにソースコードを入力しましょう。

PROGRAM PLC_PRG
VAR
motorRun : BOOL := TRUE; // モーター動作フラグ
rotateDir : INT := 1; // 回転方向(+1: 正転, -1: 逆転)
stepIndex : INT := 0; // ステップインデックス
delayTime : TIME := T#1MS; // ステップ間の遅延時間
stepTimer : TON; // タイマーFBのインスタンス
stepPatterns : ARRAY[0..7] OF BYTE := [
16#01, // OUT1
16#03, // OUT1 + OUT2
16#02, // OUT2
16#06, // OUT2 + OUT3
16#04, // OUT3
16#0C, // OUT3 + OUT4
16#08, // OUT4
16#09 // OUT4 + OUT1
];
// GPIOマッピング(ビット番号に対応)
OUT1 AT %QX2.1 : BOOL := FALSE; // GPIO17
OUT2 AT %QX3.3 : BOOL := FALSE; // GPIO27
OUT3 AT %QX2.6 : BOOL := FALSE; // GPIO22
OUT4 AT %QX2.7 : BOOL := FALSE; // GPIO23
END_VAR
// === 実行サイクルごとの処理 ===
// タイマー入力の設定
stepTimer.IN := motorRun;
stepTimer.PT := delayTime;
stepTimer(); // タイマーの実行
IF motorRun THEN
IF stepTimer.Q THEN
// タイマーのトリガーを検出したら、次のステップへ
stepTimer.IN := FALSE; // タイマーのリセット(次回再起動のため)
// ステップインデックスの更新(正転/逆転対応)
stepIndex := (stepIndex + rotateDir + 8) MOD 8;
// ビットパターンから出力を設定
OUT1 := (stepPatterns[stepIndex] AND 16#01) <> 0;
OUT2 := (stepPatterns[stepIndex] AND 16#02) <> 0;
OUT3 := (stepPatterns[stepIndex] AND 16#04) <> 0;
OUT4 := (stepPatterns[stepIndex] AND 16#08) <> 0;
END_IF;
ELSE
// モーター停止時:すべての出力をOFF
OUT1 := FALSE;
OUT2 := FALSE;
OUT3 := FALSE;
OUT4 := FALSE;
END_IF;
【オンライン】→【ログイン】します。
// === 実行サイクルごとの処理 ===
// タイマー入力の設定
stepTimer.IN := motorRun;
stepTimer.PT := delayTime;
stepTimer(); // タイマーの実行
IF motorRun THEN
IF stepTimer.Q THEN
// タイマーのトリガーを検出したら、次のステップへ
stepTimer.IN := FALSE; // タイマーのリセット(次回再起動のため)
// ステップインデックスの更新(正転/逆転対応)
stepIndex := (stepIndex + rotateDir + 8) MOD 8;
// ビットパターンから出力を設定
OUT1 := (stepPatterns[stepIndex] AND 16#01) <> 0;
OUT2 := (stepPatterns[stepIndex] AND 16#02) <> 0;
OUT3 := (stepPatterns[stepIndex] AND 16#04) <> 0;
OUT4 := (stepPatterns[stepIndex] AND 16#08) <> 0;
END_IF;
ELSE
// モーター停止時:すべての出力をOFF
OUT1 := FALSE;
OUT2 := FALSE;
OUT3 := FALSE;
OUT4 := FALSE;
END_IF;
実行するとステッピングモータが回ります。

motorRunにTRUEを設定して「Device.Application」のすべての値を書き込み」で反映すると、モーターが回転します。rotateDirに1を書き込むと正転、-1を書き込むと逆転します。

以上PLCを使ったステッピングモーターの制御でした。