リニアアクチュエータをRaspberry Pi Picoで制御する方法

2025年度のアルバイトさんが作ってくれた資料です。お気づきの点があれば小泉までご連絡ください。

このページは?

 本ページでは、Raspberry Pi Picoを用いてアクチュエータを制御し、正転・逆転・停止の3動作をArduino IDEのシリアルモニタ上でコマンド入力により手動切り替えする方法を解説する。
 本実装では、Raspberry Pi Picoをマイコンとして利用し、入出力ピンを介してアクチュエーターの方向制御信号およびパルス信号を生成する。
 ユーザーは、シリアルモニタ上で「a」(正転)、「d」(逆転)、「s」(停止)といったコマンドを入力することで、動作をリアルタイムに切り替えることが可能である。

準備するもの

  • リニアアクチュエータ EAS4RNX-E040-AZAK
  • ステッピングモーター AZM46AK
  • RaspberryPi Pico
  • Arduino IDE
    事前にインストールしてください。https://www.arduino.cc/en/software/

大まかな流れ

このページでは、Raspberry Pi Picoを使ってアクチュエータを制御し、正転・逆転・停止の3動作を切り替える方法を紹介する。
また、各手順の見出しについている☆マークは、実際にアクチュエータを動作させるために必須の作業を示している。短時間で動作を確認したい場合は、☆マークの付いた手順だけを進めれば問題ない。
以下に、全体の大まかな流れを示す。Arduino IDEのインストールは済んでいることを前提で進めていく。

  1. ボード定義のインストールとプログラムの書き込み
    • Arduino IDEの「ボードマネージャ」から「RaspberryPi Pico/RP2040/RP2350 by Earle F. Philhower, III」をインストールする。(インストール後、ボードに「Raspberry Pi Pico」系が選べるようになる。)
    • その後、プログラムを書き込む
  2. 配線:
    • Raspberry Pi Picoのピン(GP0,GP3,GP6,GP9)をCN5コネクタへ接続する。
  3. プログラムを貼り付ける
    • サンプルコードをArduino IDEに貼り付ける。コードはアクチュエータを正転・逆転・停止させる制御信号を生成する。
  4. 動作確認
    • Arduino IDEのシリアルモニタを開き、以下のキーを入力して動作を切り替える。
      • a:正転
      • d:逆転
      • s:停止

詳細な手順

Arduino IDE に RaspberryPi を使えるようにする。

  • 「RaspberryPi Pico/RP2040/RP2350 by Earle F.Philhower,Ⅲ」をインストールする。
    1. スケッチのFile>Preferencesを選択
  1. 下のような画面に飛ぶので、下にスクロールし、「Additional Boards manager URLs」にhttps://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json を貼り付ける。

  2. スケッチの Tools>Board>BoardsManager を選択する

  3. 画面左側に下の画像のような選択画面が出る。検索窓に 2040 と打ち込み、 Rapberry Pi Pico/RP2040/RP2350 by Earle F.Philhower,Ⅲ を選択し、 INSTALL をクリックする。

  4. BoardとPortの設定をする。スケッチの Tools>Board を選択する。Raspberry Pi Pico/RP2040/RP2350 を選択し、Raspberry Pi Picoを選択する。

    • Portは、Raspberry Pi Picoにつながるポート番号を設定する。わからない場合は、windowsの検索窓から「デバイスマネージャー」と検索するとよい。

配線

プログラムの書き込み

  • 1パルス入力方式で動かす。以下は実際に使用したコードである。ArduinoIDEを開き、スケッチにコピーして保存する。
/*
1パルス入力を用いて、アクチュエータを動かすサンプルプログラムです。
aを押すことでCW方向、dを押すことでCWW方向に進みます。sを押すことで停止させれます。
パルス生成は割り込み処理によって行っています。
*/
#include <Arduino.h>
#include "pico/time.h"

// パルスと方向のピン定義
int PlusPin=0;              //CN5のピンNo.1に接続(PLS+)
int MinusPin=3;              //CN5のピンNo.13に接続(PLS-)
int dirPlusPin=6;      //CN5のピンNo.2に接続(DIR+)
int dirMinusPin=9;     //CN5のピンNo.14に接続(DIR-)

repeating_timer_t pulseTimer;
struct repeating_timer st_tm1ms;

int check=0;                        //パルスのON/OFF
int direction_flag=1;           //方向決定用
int DoesStop=0;                 //止めるかどうか
int default_intvl_us=6000;
int pulse_width=2000;       //パルス幅 正ならCW方向、負ならCWW方向としている
int MAX_PULSEWIDTH=2000;  //最大パルス幅 これ以上なら動かない

void setup() {
    pinMode(PlusPin, OUTPUT);
    pinMode(MinusPin, OUTPUT);
    pinMode(dirPlusPin, OUTPUT);
    pinMode(dirMinusPin, OUTPUT);

    Serial.begin(115200);         // シリアル通信の開始

    add_repeating_timer_us(default_intvl_us, Generate_Pulse, NULL, &st_tm1ms);
}

void loop() {
    // モータの方向設定
    digitalWrite(dirPlusPin, direction_flag);
    digitalWrite(dirMinusPin, !direction_flag);
    if (Serial.available() > 0) {
        char command = Serial.read();
        if(command=='a'){
            pulse_width=300;  //CW方向に移動
        }else if(command=='d'){
            pulse_width=-300; //CWW方向に移動
        }else if(command=='s'){
            pulse_width=2000; 
        }
    }
    //pulse_widthが正ならflag=1、負ならflag=0
    direction_flag=(pulse_width>0);

    // パルスの幅が最大値を超えている場合停止
    DoesStop = (pulse_width >= MAX_PULSEWIDTH);
    if(pulse_width>0) Accelerate(pulse_width);
    else Accelerate(-pulse_width);
}

//割り込み処理でパルス生成
bool Generate_Pulse(struct repeating_timer *t){
    if(DoesStop) return true;

    check = !check;
    digitalWrite(PlusPin, check);
    digitalWrite(MinusPin, !check);

    return true;
}

/*割り込み時間変更 
このプログラムでは300,2000usのパルス幅しか取らないが、
ここを可変にすることで、例えば指の動かす速さに応じてアクチュエータの速度を変えるなどできる
*/
void Accelerate(int dist_intvl_us){
    st_tm1ms.delay_us=dist_intvl_us;
}

/*未使用時のアクチュエータの自動運転を防ぐ*/
void forceStop(){
    cancel_repeating_timer(&pulseTimer);
    noInterrupts();
    digitalWrite(PlusPin,LOW);
    digitalWrite(MinusPin,LOW);
    digitalWrite(dirPlusPin,LOW);
    digitalWrite(dirMinusPin,LOW);
/*信号線が未接続になり、電圧が不安定にならないように、何もしていないときは0Vにする*/
    pinMode(PlusPin,INPUT_PULLDOWN);
    pinMode(MinusPin,INPUT_PULLDOWN);
    interrupts();
}
  • 上記のコードは、アクチュエータを前後に動かすプログラムである。キーボード入力に応じてモータードライバーへパルス信号(PLS)と方向信号を送る。
    • 「a」を入力すると正転方向に回転
    • 「d」を入力すると逆転方向に回転
    • 「s」で停止

動作確認

  1. プログラムを実行する。

    • スケッチの左上の「→」マークでマイコンに書き込みを行う。
    • 書き込んだだけでは動かないので、画面右上の「Serial Monitor」(虫眼鏡のようなアイコン)を選択し、画面下にコマンドラインを表示させる。
    • ここで、「d」、「a」のように入力することで、モーターを正転・逆転させることができる。

参考資料

各種情報源

記事等