実験3:四輪メカナムホイールカーの位置PID制御
実験の目的:
- 目標位置を設定し、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 /3.%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%BD%8D%E7%BD%AEPID%E6%8E%A7%E5%88%B6
ライブラリリンク:(HumansX サポートより提供)
ライブラリファイルのインポート:
インポートが必要なライブラリ:Unirobot_Mega_V1.2
プログラムコード:
mac_car_pos_test.ino がメインプログラムです。プロジェクトの完全なコードは(ソースコードリンク)からダウンロードしてください。
/***************************************************************************
编程环境:----------
软件:Arduino2.3.4
实验现象:-----------
实现小车按照位置模式运动,实现,小车前进,后退,左转,右转,左平移,右平移
小车在地面运行的状态,就是在地面上画矩形
实验接线简略图:----------
车头
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.19
****************************************************************************/
#include "uni_motor.h"
#define BORD_RATE 115200 //设定串口波特率为115200
UNI_MOTOR motor1(1); //声明编码电机M1对象
UNI_MOTOR motor2(2); //声明编码电机M2对象
UNI_MOTOR motor3(3); //声明编码电机M3对象
UNI_MOTOR motor4(4); //声明编码电机M4对象
int motor_loop_delay = 10;
float pos = 0.4; //单位是米
void setup() {
delay(500);
Serial.begin(BORD_RATE);
Serial.println("begin");
motor1.init(); //M1编码电机初始化
motor2.init(); //M2编码电机初始化
motor3.init(); //M3编码电机初始化
motor4.init(); //M4编码电机初始化
car_move( pos, pos, -pos, -pos); //小车右平移一段距离测试
car_keep_pos(1000); //小车保持当前状态1秒
car_move( pos, -pos, pos, -pos); //小车前进一段距离测试
car_keep_pos(1000); //小车保持当前状态1秒
car_move(-pos, -pos, pos, pos); //小车左平移一段距离测试
car_keep_pos(1000); //小车保持当前状态1秒
car_move(-pos, pos, -pos, pos); //小车后退一段距离测试
car_keep_pos(1000); //小车保持当前状态1秒
}
void loop() {
motor_update(); //实时更新编码电机状态
}
//实时更新编码电机状态
void motor_update(){
motor1.update(); //时刻保持编码电机1的位置
motor2.update(); //时刻保持编码电机2的位置
motor3.update(); //时刻保持编码电机3的位置
motor4.update(); //时刻保持编码电机4的位置
delay(10);
}
/***********************************************************************************
小车移动函数
形式参数释义:
m1: 小车M1编码电机需要移动的距离
m2: 小车M2编码电机需要移动的距离
m3: 小车M3编码电机需要移动的距离
m4: 小车M4编码电机需要移动的距离
使用示例:
car_move( pos, -pos, pos, -pos); //小车前进一段距离测试
car_move(-pos, pos, -pos, pos); //小车后退一段距离测试
car_move(-pos, -pos, -pos, -pos); //小车左转测试
car_move( pos, pos, pos, pos); //小车右转测试
car_move(-pos, -pos, pos, pos); //小车左平移一段距离测试
car_move( pos, pos, -pos, -pos); //小车右平移一段距离测试
*/
void car_move(float m1, float m2, float m3, float m4){
motor1.set_relpos(m1); //使用相对位置模式,如果想要使用绝对位置,使用motor1.set_pos(m1);函数即可
motor2.set_relpos(m2); //使用相对位置模式,如果想要使用绝对位置,使用motor2.set_pos(m2);函数即可
motor3.set_relpos(m3); //使用相对位置模式,如果想要使用绝对位置,使用motor3.set_pos(m3);函数即可
motor4.set_relpos(m4); //使用相对位置模式,如果想要使用绝对位置,使用motor4.set_pos(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);
}
}
//保持小车四个编码电机当前状态持续时间
void car_keep_pos(unsigned long time_delay){
unsigned long time_now = millis();
while( (millis() - time_now) < time_delay){
motor_update();
}
}
操作手順:
-
メインプログラムを書き込みます。ボードの種類として Arduino mega または mega 2560 を選択し、ポート番号を選択してください。
-
電池ボックスのスイッチと拡張ボードのスイッチをオンにし、動作させて結果を確認します。
実験結果:
四輪メカナムホイールシャーシの基本的な運動制御(前進・後退・左平行移動・右平行移動)ができます。

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