実験4:四輪メカナムホイールカーのカスケード(速度+位置)PID制御
実験の目的:
- 速度と位置の2つの観点からPIDカスケード制御を行います。2. 四輪全方向メカナムホイールシャーシの基本的な運動制御(前進・後退・左平行移動・右平行移動)を習得します。
基本的な運動原理:
四輪全方向メカナムホイールシャーシは全方向への平行移動が可能で、そのためには各ホイールの回転方向を制御する必要があります。シャーシの移動方向と各ホイールの回転方向の関係は以下のとおりです。
| 前進 | 後退 |
| 右平行移動 | 左平行移動 |
| その場で左旋回 | その場で右旋回 |
ハードウェアの準備:
Arduino mega2560 メインボード * 1、uni mega2560 拡張ボード * 1、USBケーブル(Type-B)* 1、3S電池ボックス * 1、リチウム電池 * 3、エンコーダ付きモーター 30*4、エンコーダモーターケーブル(2.0→2.54)*4
試作構成:
実験7 サスペンション付き長方形フレームと四輪駆動全方向メカナムホイール駆動シャーシの構造設計
回路接続:
ハードウェアモジュール
ヒント:ハードウェアモジュールの使用説明
Uni Mega2560 拡張ボード ユーザーガイド[V1.1]
ピン配置
| シャーシ | mega2560 拡張ボード |
|---|---|
| 車体の左前輪 | M1 |
| 車体の右前輪 | M2 |
| 車体の左後輪 | M3 |
| 車体の右後輪 | M4 |
各駆動輪の番号:

実機配線

ソフトウェアの実装:
ソースコードとライブラリのダウンロード
ソースコードリンク:(HumansX サポートより提供) AE /3.PID%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B% AE /4.%E5%9B%9B%E8%BD% AE %E9%BA%A6%E5%85%8B%E7%BA%B3%E5%A7%86%E8%BD% AE %E5%B0%8F%E8%BD%A6%E4%B8%B2%E7%BA%A7%EF%BC%88%E9%80%9F%E5%BA%A6+%E4%BD%8D%E7%BD% AE %EF%BC%89PID%E6%8E%A7%E5%88%B6
ライブラリリンク:(HumansX サポートより提供)
ライブラリファイルのインポート:
インポートが必要なライブラリ:Unirobot_Mega_V1.2
プログラムコード:
Uni_Four_Pos.ino がメインプログラムです。プロジェクトの完全なコードは(ソースコードリンク)からダウンロードしてください。
/***************************************************************************
编程环境:----------
软件:Arduino2.3.4
实验现象:-----------
实现小车按照位置模式运动,实现小车
小车右平移一段距离后,停止1.5秒
小车前进一段距离后,停止1.5秒
小车左平移一段距离后,停止1.5秒
小车后退一段距离有,停止1.5秒
实验接线简略图:----------
车头
M1________________M2
| |
| Car |
| |
|________________|
M3 M4
车尾
.__________________________________________________________________________________________
| 丝印标签 |对应程序标签| 对应Mega2560引脚号 \
|_____________|___________|_________________________________________________________________|
| M1 | 1 |电机方向1:36 电机方向2:37 电机pwm:8 编码器A相:18 编码器B相:32 |
| M2 | 2 |电机方向1:A2 电机方向2:A3 电机pwm:5 编码器A相:19 编码器B相:38 |
| M3 | 3 |电机方向1:35 电机方向2:34 电机pwm:12 编码器A相:3 编码器B相:33 |
| M4 | 4 |电机方向1:42 电机方向2:43 电机pwm:9 编码器A相:2 编码器B相:39 |
` ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
库函数版本号:1.2
data:2025.8.18
****************************************************************************/
#include "uni_motor.h" //调用直流编码电机库函数
#define rate 115200 //定义串口波特率
UNI_MOTOR motor1(1); //声明编码电机M1对象
UNI_MOTOR motor2(2); //声明编码电机M2对象
UNI_MOTOR motor3(3); //声明编码电机M3对象
UNI_MOTOR motor4(4); //声明编码电机M4对象
float position = 0.5; //设置编码电机的目标位置,单位:m
void setup() {
delay(1000); //程序开机等待1秒
Serial.begin(rate); //打开串口,并设置串口波特率
motor1.init(); //编码电机M1初始化
motor2.init(); //编码电机M2初始化
motor3.init(); //编码电机M3初始化
motor4.init(); //编码电机M4初始化
//右平移
move_distance(position, position, -position, -position);
unsigned long time = millis();
while( (millis() - time) < 1500 ){
motor_update();
}
//前进
move_distance(2*position, 0, 0, -2*position);
time = millis();
while( (millis() - time) < 1500 ){
motor_update();
}
//左平移
move_distance(position, -position, position, -position);
time = millis();
while( (millis() - time) < 1500 ){
motor_update();
}
//后退
move_distance(0, 0, 0, 0);
time = millis();
while( (millis() - time) < 1500 ){
motor_update();
}
}
void loop() {
//实时更新编码电机位置,并保持编码电机在当前位置
motor_update();
}
//更新编码电机状态,并保持编码电机在当前位置
void motor_update(){
motor1.update(); //实时更新电机1的状态
motor2.update(); //实时更新电机2的状态
motor3.update(); //实时更新电机3的状态
motor4.update(); //实时更新电机4的状态
delay(10);
}
/************************************************
设置编码电机需要移动的距离函数
dis1:电机1需要转动的距离
dis2:电机2需要转动的距离
dis3:电机3需要转动的距离
dis4:电机4需要转动的距离
*************************************************/
void move_distance(float dis1, float dis2, float dis3, float dis4){
motor1.set_pos(dis1); //使用绝对位置模式,如果想要使用相对位置,使用motor1.set_relpos(m1);函数即可
motor2.set_pos(dis2); //使用绝对位置模式,如果想要使用相对位置,使用motor2.set_relpos(m2);函数即可
motor3.set_pos(dis3); //使用绝对位置模式,如果想要使用相对位置,使用motor3.set_relpos(m3);函数即可
motor4.set_pos(dis4); //使用绝对位置模式,如果想要使用相对位置,使用motor4.set_relpos(m4);函数即可
while( motor1.pos_flag || motor2.pos_flag || motor3.pos_flag || motor4.pos_flag){
if(motor1.pos_flag){motor1.pos_loop();}
if(motor2.pos_flag){motor2.pos_loop();}
if(motor3.pos_flag){motor3.pos_loop();}
if(motor4.pos_flag){motor4.pos_loop();}
delay(10);
}
}
操作手順:
-
メインプログラムを書き込みます。ボードの種類として Arduino mega または mega 2560 を選択し、ポート番号を選択してください。
-
電池ボックスのスイッチと拡張ボードのスイッチをオンにし、動作させて結果を確認します。
実験結果:
PIDにより、四輪メカナムホイールシャーシの基本的な運動制御(前進・後退・左平行移動・右平行移動)ができます。
サポート窓口
資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。
ドキュメント