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

実験3:四輪メカナムホイールカーの位置PID制御

実験の目的:

  1. 目標位置を設定し、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]

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

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

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

ピン配置

シャーシ 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();
  }
}

操作手順:

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

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

実験結果:

四輪メカナムホイールシャーシの基本的な運動制御(前進・後退・左平行移動・右平行移動)ができます。

サポート窓口

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