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

実験4:四輪メカナムホイールカーのカスケード(速度+位置)PID制御

実験の目的:

  1. 速度と位置の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]

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 /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);
  }
}

操作手順:

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

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

実験結果:

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

リンク

サポート窓口

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