Raspberry Pi 5とソフトウェアPLCでステッピングモーターを使う

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を使ったステッピングモーターの制御でした。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

上部へスクロール