前のレッスンチュートリアルトップ次のレッスン

購入リンク

OSOYOOストアで購入 米国Amazonで購入

目次


1目標

このチュートリアルでは、MPU6050 慣性計測ユニット(IMU)を使用して OSOYOO V3 ロボットカーの自律走行能力を高め、目標方向を維持する方法を解説します。MPU6050 は 3 軸モーションセンサーで、角速度(ジャイロスコープ)と線形加速度(加速度計)のデータを提供し、ロボットが進行方向を自動補正できるようにします。このレッスンでは、センサーフュージョン技術と PID 制御アルゴリズムを使った安定した直進走行の実現方法を学びます。MPU6050ジャイロスコープを搭載したOSOYOO V3 Arduinoロボットカー

2必要なパーツとデバイス

このレッスンでは次のコンポーネントが必要です。作業を始める前にご用意ください。

番号 画像 デバイス 数量 アクセサリ リンク
1 MPU6050 3軸ジャイロスコープモジュール MPU6050 3軸ジャイロスコープ 1 こちらから購入

3MPU6050:動作原理

MPU6050 は 3 軸ジャイロスコープと 3 軸加速度計を統合したセンサーです。ジャイロスコープは角速度を測定し、ロボットの X、Y、Z 軸まわりの回転速度を提供します。このデータを時間積分すると角変位(例:ヨー角)が得られます。ただし、ジャイロスコープの生データはドリフトが生じやすく、時間とともに小さな誤差が蓄積します。加速度計は線形加速度を測定し、重力に対するデバイスの向きを求めるために使用できます。加速度計は長期的には安定していますが、振動や急激な動きに非常に敏感であるため、生の姿勢データにはノイズが多くなります。
OSOYOO V3ロボットカーに取り付けられたMPU6050ジャイロスコープモジュール

4ハードウェアの取り付け

ステップ 1:ロボットカー レッスン 1の説明に従って基本的なハードウェアを組み立ててください。レッスン 1 をすでに完了している場合は、そのままにしておいてください。

OSOYOO V3ロボットカーの基本シャーシ組み立て

ステップ 2:以下の図のように、MPU6050 モジュールをロボットシャーシにしっかり固定してください。(MPU6050 は I2C プロトコルで Arduino と通信します。必要な配線は SDA(シリアルデータ)と SCL(シリアルクロック)の 2 本のデータ線と、電源(VCC)とグランド(GND)のみです。)

OSOYOO V3 Arduino ロボットカー用 MPU6050 配線図

 

5ソフトウェアのインストール

オープンソース Arduino
ソフトウェア(IDE)
Arduino IDEロゴ こちらからソフトウェアをダウンロード:
https://www.arduino.cc/en/Main/Software?setlang=en
7-Zip は ZIP ファイルを
解凍する無料ツールです
7-Zipロゴ 7-Zip を無料でダウンロード:
https://www.7-zip.org/

1. Arduino IDE のセットアップ:最新版の Arduino IDE を https://www.arduino.cc/en/Main/Software?setlang=en からダウンロードしてインストールしてください。

Arduino IDEのインストール
2. サンプルコードのダウンロードレッスン 2 のサンプルコードをここからダウンロードしてください。解凍すると v3car-lesson2 フォルダ内に v3car-lesson2.ino ファイルが見つかります。v3car-lesson2.ino を Arduino IDE で開いてください。

Arduino IDEでサンプルコードを開く

3. ライブラリのインストール
まず、以下のリンクからライブラリの ZIP ファイルをダウンロードしてください:
https://osoyoo.com/driver/2wd/MPU6050_light.zip
https://osoyoo.com/driver/2wd/PID.zip
ZIP ファイルは解凍しないでください。Arduino IDE を開き、スケッチ -> ライブラリをインクルード -> .ZIP 形式のライブラリをインストール を選択し、ZIP ファイルを 1 つずつ追加してください。

Arduino IDEでZIPライブラリを追加する

4. ボードとポートの選択:OSOYOO Basic Board(Arduino UNO 互換)を USB ケーブルでコンピューターに接続します(重要:ボードを PC に接続する前に、ロボットカーの電源スイッチが OFF になっていて、バッテリーが取り外されていることを確認してください)。Arduino IDE を起動し、ツール > ボードで Arduino Uno を選択します。次にツール > ポートで正しいシリアルポートを選択してください。ポートがわからない場合は、OS のデバイスマネージャーを確認してください。

Arduino IDEでボードとポートを選択する

5. コードのアップロード:「マイコンボードに書き込む」ボタン(右矢印アイコン)をクリックして、スケッチをコンパイルし OSOYOO Basic Board に書き込みます。

Arduinoボードにコードをアップロードする

6. Arduino が MPU6050 を認識しているか確認する

Arduino IDE 右上のシリアルモニタを開き、ボーレートを 9600 に設定すると、以下のように MPU6050 Found! と表示されるはずです。おめでとうございます!Arduino が MPU6050 を認識しています。カーをテストする準備ができました。

シリアルモニタにMPU6050 Foundが表示された様子

注意:「Failed to find MPU6050 chip」と表示された場合、MPU6050 の配線に問題があります。次の点を確認してください:
1)MPU6050 の VCC/GND/SDA/SCL が、OSOLINK Wi-Fi/BLE I/O シールドに説明書どおり正しく接続されているか
2)Arduino の A4/A5 ピンと SDA/SCL ピンに他のケーブルが接続されていないか(ラインセンサープロジェクトでは A4/A5 がセンサーに使用されている場合があります)

6走行テスト


カーを床に置いて電源を入れます。Arduino がジャイロスコープを初期化する間、カーはしばらく停止します。その後、直進します。足でカーを押して方向を変えると、自動的に元の方向に修正されます。

7原理とコードの簡単な説明

1)Move() 関数はカーの動きとステアリングをどのように制御しますか?
このレッスンで使用する OSOYOO ロボットカーは、差動ステアリング方式を採用しています。move(speedL, speedR) 関数は、左右のホイールの回転速度を表す speedLspeedR の 2 つのパラメータを持ちます。速度値は -255 から +255 の範囲で、正の値が前進回転、負の値が後退回転を意味します。例えば、move(-50, 100) は左ホイールが速度 50 で後退、右ホイールが速度 100 で前進することを意味し、カーは急激に左折します。
2)MPU6050 プログラミング入門
初期化後、MPU6050 ジャイロスコープはロボットの方向を出発時の向きを基準に常時追跡します。ロボットカーがこの初期方向からずれると、MPU6050 はそのずれ量を Arduino に報告します。
コード内の Direction 変数は、カーを床に置いた瞬間の向きを表します(前を向いていると仮定し、Direction0 に設定します)。
loop() 関数の最初の数行の計算の後、カーの現在の向きが 129 行目の currentAngle 変数に格納されます。

3)PID とコードの入門:

a)基本的な考え方:PID とは何か?
車を運転していて、車線の中央に完璧に保つことを目標にしていると想像してください。それがまさにロボットに求めていること、つまり「まっすぐ前」の線に留まることです。
PID は、注意深い運転手のように機能する制御アルゴリズムです。ステアリングをどう切るかを判断するために、常に次の 3 つの問いを投げかけます:
  1. P(比例):今この瞬間、車線中央からどれだけ離れているか?
  2. I(積分):ここ数瞬間、ずっとずれ続けていたか?
  3. D(微分):中央に向かって、またはそこから離れる方向に速すぎる速度でずれているか?

これら 3 つの問いへの回答を組み合わせることで、PID コントローラーは滑らかで効率的なステアリング補正を行います。

b)コード内で PID 関数がどのように機能するか
この理論を PID_v1.h ライブラリとコードに直接結びつけてみましょう。
1. 初期化(setup() 内):
// We tell the PID controller what to watch and what to control.
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

Direction = 0; // Our TARGET is to have an angle of 0 degrees.
myPID.SetMode(AUTOMATIC); // Turn on the controller.
  • &Input:センサー読み値へのポインタ。コード内で InputcurrentAngle です。PID コントローラーはこの値を継続的に読み取ります。
  • &Output:結果へのポインタ。PID コントローラーは計算した補正値を Output 変数に書き込みます。
  • &Direction:目標値へのポインタ。直進させたいので 0 に設定します。
2. メインループ(loop() 内):
// 1. We get the sensor reading and put it into the Input variable.
Input = currentAngle; 

// 2. We call the compute function. This is where the PID magic happens!
myPID.Compute(); 

// 3. We use the result to control the motors.
int speedL = baseSpeed - Output;
int speedR = baseSpeed + Output;
move(speedL, speedR);
myPID.Compute() 関数はすべての計算を内部で処理します。呼び出されるたびに(ライブラリが SetSampleTime に基づいてタイミングを管理)、次の処理を行います:
  1. Input 変数(currentAngle)の値を読み取る。
  2. 誤差を計算する:error = Direction - Input
  3. 比例項を計算する(Kp * error)。
  4. 積分項を計算して加算する(Ki * accumulated_error)。
  5. 微分項を計算して加算する(Kd * rate_of_error_change)。
  6. すべてを合計して最終的な補正値を得る。
  7. この最終値を Output 変数に書き込む。
Output+15 の場合、ロボットは 15 単位の補正が必要です。片方のモーターを減速させ(baseSpeed - 15)、もう片方を加速させる(baseSpeed + 15)ことで、ロボットを旋回させて誤差を減らします。ロボットが完全に直進している場合、Input0、誤差は 0Output0 となり、両モーターが baseSpeed で動作します。

4)Kp、Ki、Kd の調整方法(安定した走行のために)

  1. まずここから:コード内で Ki = 0.0Kd = 0.0 に設定します。
  2. 振動しない(またはほとんど振動しない)安定した Kp 値を見つけます。おそらく 1.5 未満です。
  3. (任意ですが推奨)センサーノイズを無視するために、ループに約 0.5 度の不感帯(deadband)を追加します。
  4. Kp が安定したら、残りのオーバーシュートを減らすために Kd をゆっくり増やします。
  5. 最後に、長期的なドリフトを除去するために Ki をゆっくり増やします。

 

8応用とトラブルシューティング

これらのガイドラインに従い、基本原理を理解することで、OSOYOO V3 ロボットカーを自律ナビゲーションのための優秀なプラットフォームに変え、より高度なロボティクスプロジェクトへの基礎を築くことができます。

前のレッスンチュートリアルトップ次のレッスン