HumansXドキュメントセンター 公式サイトへ ↗

実験1:単一モーターのPID位置モード制御

実験の目的:

PIDの基本原理を理解し、位置モードでのモーターの動作を実現します。

PIDの基本原理:

PIDコントローラは、産業用制御システムで広く使用されているフィードバック制御器です。その名称は、比例(P)、積分(I)、微分(D)という3つの基本的な制御機能に由来しています。以下にPID制御の基本原理を示します。

  1. PIDコントローラの構成

比例制御(P):現在の誤差(設定値と実測値の差)に基づいて制御します。比例制御には誤差を小さくする働きがありますが、定常偏差が残る場合があります。

式:

積分制御(I):過去の誤差の累積に基づいて制御します。積分制御には定常偏差を解消する働きがありますが、システムの応答が遅くなる場合があります。

式:

微分制御(D):誤差の変化率に基づいて制御します。微分制御は将来の誤差の変化を予測し、システムの応答速度を向上させる働きがあります。

式:

  1. PIDコントローラの出力

PIDコントローラの総出力は、これら3つの成分の和になります。

機能要件:

1個のエンコーダ付きモーターを目標位置まで動かすよう制御します。

ハードウェアの準備:

Arduino mega2560 メインボード * 1、拡張ボード * 1、USBケーブル(Type-B)* 1、3S電池ボックス * 1、リチウム電池 * 3、エンコーダ付きモーター 30*1、エンコーダモーターケーブル(2.0→2.54)*1

回路接続:

ハードウェアモジュール

ヒント:ハードウェアモジュールの使用説明

Uni Mega2560 拡張ボード ユーザーガイド[V1.1]

Arduino プログラミングソフトのインストールとライブラリのインポート [V2.1]

電池・電源モジュール使用上の注意(必読)[v3.0]

電子モジュールの紹介 [V3.0]

ピン配置

ハードウェア mega2560 拡張ボード
エンコーダ付きモーター M1

実機配線

ソフトウェア設計:

ソースコードとライブラリのダウンロード

ソースコードリンク:(HumansX サポートより提供) AE /3.PID%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B% AE /1.%E5%8D%95%E4%B8%AA%E7%94%B5%E6%9C%BAPID%E4%BD%8D%E7%BD% AE %E6%A8%A1%E5%BC%8F%E6%8E%A7%E5%88%B6

ライブラリリンク:(HumansX サポートより提供)

ライブラリファイルのインポート

インポートが必要なライブラリ:Unirobot_Mega_V1.2

プログラムコード

Uni_Pos_M1.ino がメインプログラムです。プロジェクトの完全なコードは(ソースコードリンク)からダウンロードしてください。

/***************************************************************************************************
编程环境:----------
    软件:Arduino2.3.4
    注意:本实验使用的编码电机默认参数如下所示:
          线圈数:13   减速比:30   连接的轮子半径为:0.0475米
          如果使用的是其他型号编码电机和轮,请参考《2.修改编码电机线圈数-减速比-轮半径》程序修改电机参数

实验目的:-----------
    1.本实验为如何使用编码电机库驱动电机以位置模式运动

实验现象:-----------
    程序烧写完成后,将电机安装到M1引脚,上电后,
    观察电机M1连接的轮子是否正向转动20厘米,反向转动40厘米,之后电机保持当前位置不变

实验接线简略图:----------
.______________________________________________________________________________________________
|  丝印标签    |  对应程序标签  |                     对应Mega2560引脚号                          \
|_____________|_______________|_________________________________________________________________|
|     M1      |        1      |电机方向1:36  电机方向2:37  电机pwm:8   编码器A相:18  编码器B相:32  |
` ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
库函数版本号:1.2
data:2025.8.19
**************************************************************************************************/
#include "uni_motor.h"    //调用直流编码电机库函数
#define rate 115200       //定义串口波特率

UNI_MOTOR motor1(1);      //声明编码电机M1对象
float position = 0.2;     //设置编码电机的目标位置,单位:m

void setup() {
  delay(1000);            //程序开机等待1秒
  Serial.begin(rate);     //打开串口,并设置串口波特率
  motor1.init();          //编码电机M1初始化

  //电机正向移动距离测试-------------------------------------
  move_distance(position);     //设置编码电机1需要转动到的位置
  //电机反向移动距离测试-------------------------------------
  move_distance(-position);    //设置编码电机1需要转动到的位置
}

void loop() {
  motor_update(); //实时更新编码电机位置,并保持编码电机在当前位置
}

//更新编码电机状态,并保持编码电机在当前位置
void motor_update(){
  motor1.update(); //实时更新电机1的状态
  delay(10);
}

/*************************************************************************
设置编码电机需要移动的距离函数
dis1:电机1需要转动的距离.正值表示轮子正向转动的距离,负值表示轮子反向转动的距离
**************************************************************************/
void move_distance(float dis1){
  motor1.set_pos(dis1);

  while( motor1.pos_flag ){
    if(motor1.pos_flag){motor1.pos_loop();}
    delay(10);
  }
}

操作手順:

  1. メインプログラムを書き込みます。ボードの種類として Arduino mega または mega 2560 を選択し、ポート番号を選択してください。

  2. 電池ボックスのスイッチと拡張ボードのスイッチをオンにし、動作させて結果を確認します。

実験結果:

PIDによってモーターを目標位置まで正確に動かすことができます。

リンク

サポート窓口

資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。