リニアアクチュエータを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」で停止

動作確認

  • プログラムを実行する。

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

補足

Raspberry Pi Picoのピン設定と配線

本節の内容は実行に必須ではないが、Raspberry Pi PicoとCN5間の信号対応を理解しておくと、回路設計やプログラム修正時に役立つ。

すでに配線済みの場合は、本節を省略して次に進んでも構わない。

アクチュエータの制御には、Raspberry Pi Picoの以下のピンを使用する。

  • パルス波の生成:GP0,GP3
  • 方向の指定:GP6,GP9

ピンの位置関係を下図に示す。ぞれぞれのピンがどの端子に対応しているかを把握しておくと、配線時の混乱を防ぐことができる。

(引用:「ピン配置図」https://akizukidenshi.com/goodsaffix/Pico-R3-A4-Pinout.pdf)

また、Raspberry Pi PicoとCN5コネクタとの接続は以下の通りである。

配線図を下図に示した。

(CN5)→(Raspberry Pi Pico)

  • No.1→GP0
  • No.13→GP3
  • No.2→GP6
  • No.14→GP9

パルス入力方式について

パルス入力方式とは、ドライバに入力するパルス信号によりモーターの回転方向を判別する方式のことである。パルス入力方式の中でも代表的な、1パルス入力方式と2パルス入力方式について説明する。

1パルス入力方式 (今回はこの方式を採用)

  • パルス信号(PLS)入力部にパルスが入力されたとき、回転方向(DIR)入力部がHighかLowであるかで回転方向を判別する方式である。


(図)1パルス入力方式

 今回の配線では、CN5のピンNo.1とNo.13は(図)よりPLS+とPLS-が割り当てられているため、アクチュエータを動かす際にはこのピンからパルス波を制御し続ける。また、同様にピンNo.2とNo.14はDIR+とDIR-が割り当てられているため、回転方向の制御にはこのピンで方向の指定をする。

 No.1とNo.13を動かしている状態で、ピンNo.2(DIR+)をHigh、ピンNo.14(DIR-)をLowにすることで、CW方向(正転)にモーターを動かすことができる。No.2とNo.14のHigh,Lowを逆にすることで、CCW方向(逆転)にモーターを動かすことができる。

2パルス入力方式

  • CW(正転)入力部にパルスが入力されるかCCW入力部にパルスが入力されるかで回転方向を判別する方式。

(図7)2パルス入力方式

(図5)のピンアサインを見ると、ピンNo.1とNo.13はCW+とCW-が割り当てられており、これらのピンを制御することでCW(正転)方向に1ステップ回転させることができる。また、ピンNo.2とNo.14はCCW+とCCW-が割り当てられており、これらのピンを制御することでCCW(逆転)方向に1ステップ回転させることができる。

※この際、CW入力とCCW入力を同時に入力するとモーターを破損させるおそれがあるので注意する。

CN5コネクタ(入出力信号コネクタ)について

  • モータードライバーを使い、外部からパルス信号を与えてモータードライバーを動かす際に使う端子。

  • CN5コネクタのピン配置と使用ピン

    • 各ピンの配置と役割は下図のようになっている。今回は、No.1,2,13,14を使用する

オシロスコープでパルス波の波形を確認する

オシロスコープを使えばパルス波の波形を確認することができる。もしアクチュエータが動かなかったとき、パルス波が正しく生成できているかを確認する際に使うとよい。

モータードライバ側にパルス波が来ているかを確認する方法

  • CN5のピンNo.1とNo.13にジャンパ線をさす
  • モーターを動かすと(正転でも逆転でもよい)、図14のような波形になる。これは、1パルス入力方式ではモーターを動かす際、常にパルス波を生成するためである。

モータードライバー側にDIR入力が来ているか確認する方法

  1. No.2、No.14(Rasberry Pi Pico のGP6とGP9)にジャンパ線をさして、オシロスコープに繋ぐ
  2. 上述したソフトを動作させながら「a」を入力したら図15のような波形になる。これは、ピンNo.2(DIR+)がHigh、ピンNo.14(DIR-)がLowになっているため、DIR入力がONとなるからである。このとき、モーターは正転する。
  3. 「d」を入力したら図16のような波形になる。こおれは、ピンNo.2(DIR+)がLow、ピンNo.14(DIR-)がHighになっているため、DIR入力がOFFとなっているからである。このとき、モーターは逆転する。

ソフトウェアを使い、アクチュエータを動かす

  • 今回使用しているアクチュエータの開発元であるオリエンタルモーターが提供する、アクチュエータのソフトウェアが、「MEXE02」である。
  • アクチュエータが意図しない動作を起こした際に、ソフトウェアを使えば簡単にアクチュエータを動かしたり、アクチュエータが端に到達した際にかかる制限も外したりすることができる。
  • インストールに必要な情報:https://www.orientalmotor.co.jp/ja/download/software/mexe02

MEXE02のティーチング・リモート運転の使い方

  1. ソフトウェアを起動すると図17のような画面になる。まず、初期設定にある「通信ポート設定」を選択する。


    (図17)MEXE02の起動画面

  2. モータードライバを電源につなぎ、電源を入れ、モータードライバに接続されたケーブルをパソコンにつなぐと、図18のように通信ポートを選べるので、モータードライバにつながる通信ポートを選択する。わからない場合はWindowsの検索でデバイスマネージャーを開き、確認するとよい。

    (図18)通信ポートを設定するウィンドウ

  3. 再び図17のような画面に戻るので、機能の「データの読み出し(製品→PC)」を選択する。選択すると画面表示が図19のようになる。

    (図19)データの読み出しの選択後の画面

  4. 図19の画面左側のツールバーの運転にある、「ティーチング・リモート運転」を押すと、図20のようなウィンドウが表示される。このウィンドウの画面上部にある「ティーチング・リモート運転を開始する」にチェックを入れると(下の図ではチェックを入れた状態になっている)アクチュエータをGUI(ウィンドウ上のボタン)で操作できる。ウィンドウの下のほうにある、再生ボタンや停止ボタンを押すことで操作可能である。

    (図20)ティーチング・リモート運転選択後のウィンドウ画面

  5. 図21のように現在のアラームの「ALM-A」のチェックボックスが緑色になっていると、アクチュエータの操作ができなくなる。このとき、Raspberry Pi Picoに書き込んだプログラムを実行してもアクチュエータを動かすことができない。その場合は、先ほど同様に、「ティーチング・リモート運転を開始する」にチェックを入れ、「ALM-A」の隣にある「アラームをリセット」を押す。すると、再度アクチュエータを動かすことが可能になる。

    (図21)アラーム起動時

アラームが緑になるのは、先ほどのプログラムの実行時にアクチュエータが端に到達した際に起こる。そのたびにMEXE02を起動し、ティーチング・リモート運転からアラームをリセットすることで再度アクチュエータの操作が可能になる。

参考資料

各種情報源

記事等