実験1:単一モーターのPID位置モード制御
実験の目的:
PIDの基本原理を理解し、位置モードでのモーターの動作を実現します。
PIDの基本原理:
PIDコントローラは、産業用制御システムで広く使用されているフィードバック制御器です。その名称は、比例(P)、積分(I)、微分(D)という3つの基本的な制御機能に由来しています。以下にPID制御の基本原理を示します。
- PIDコントローラの構成
比例制御(P):現在の誤差(設定値と実測値の差)に基づいて制御します。比例制御には誤差を小さくする働きがありますが、定常偏差が残る場合があります。
式:

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

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

- 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]
ピン配置
| ハードウェア | 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);
}
}
操作手順:
-
メインプログラムを書き込みます。ボードの種類として Arduino mega または mega 2560 を選択し、ポート番号を選択してください。
-
電池ボックスのスイッチと拡張ボードのスイッチをオンにし、動作させて結果を確認します。
実験結果:
PIDによってモーターを目標位置まで正確に動かすことができます。
サポート窓口
資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。
ドキュメント