Arduino 3軸サーボ制御で自作するセルフスタビライジングジンバル
このチュートリアルでは、サーボモーターを使ったArduinoジンバル(セルフスタビライジングプラットフォーム)の作り方を学びます。これは前回のMPU6050チュートリアルの拡張版です。 以下の動画を見るか、書面チュートリアルをお読みください。 ジンバルを3Dモデリングソフトで設計。3軸制御用にMG996Rサーボモーター3個、ベースにはMPU6050センサー、Arduino、バッテリーを搭載します。 Thangsで3Dモデルを探索・ダウンロードできます。 STLファイル: Creality CR-10 3Dプリンターで全パーツをプリント。完璧な仕上がりでした。 ジンバルの組み立ては簡単です。まずヨー(Yaw)軸サーボを取り付け。M3ボルト・ナットでベースに固定。 同様にロール(Roll)軸サーボを固定。パーツはMG996Rサーボにぴったり合うよう設計されています。 パーツ同士の接続には、サーボ付属のラウンドホーンを使用。 まずラウンドホーンをベースに2本のボルトで固定し、前のサーボの出力軸に別のボルトで取り付けます。 同じ要領でピッチ(Pitch)軸サーボとトッププラットフォームも組み立てます。 サーボ配線をホルダーの開口部に通して整理。MPU6050センサーをベースに挿入し、ボルト・ナットで固定。 電源にはリチウムイオン電池2個をバッテリーホルダーに入れ、ボルト・ナット2本でベースに固定。 2個のリチウムイオン電池で約7.4Vになりますが、Arduinoとサーボには5Vが必要です。 そこでバックコンバーターで7.4Vを5Vに降圧します。 すべてを接続します。プロジェクトの回路図と接続方法はこちら。 このArduinoチュートリアルに必要なコンポーネント: 最後に電子部品と配線をベースに押し込み、底面カバーで覆って完成です。 これでセルフバランシングプラットフォーム、つまりArduinoジンバルが完成し、期待通りに動作します。あとはプログラムを見てみましょう。 この例のArduinoコードは、Jeff Rowberg氏のi2cdevlibライブラリに含まれるMPU6050_DMP6例を改変したものです。 コードのダウンロードはこちら: コード解説: 読み取り可能なヨー、ピッチ、ロールの出力を使用します。 値を取得したら、まずラジアンから度に変換します。 センサーがまだ自己キャリブレーション中のため、300回分の読み取りをスキップ/待機します。また、最初はピッチとロールが0なのに対し、ヨーは常にランダムな値から始まるため、その値を取得しておきます。 300回読み取り後、まず上記で取得したランダム値を減算してヨーを0度に設定。その後、ヨー、ピッチ、ロールの値(-90〜+90度)を、サーボ制御用の0〜180度にmap()で変換します。 最後にwrite()関数でこれらの値をサーボに制御信号として送信します。ヨーサーボを無効にすれば、X/Y軸のみのスタビライゼーション、つまりカメラジンバルとしても使えます。 ただし、これは決して良いカメラジンバルではありません。動きがスムーズでないのは、これらのサーボがそういう用途向けではないからです。本物のカメラジンバルは特殊なBLDCモーターを使って滑らかな動きを実現しています。このプロジェクトは教育目的としてお考えください。 以上でこのチュートリアルは終了です。お楽しみいただけたら幸いです。質問はコメント欄でどうぞ。Arduinoプロジェクトコレクションもご覧ください。概要



組み立て








Arduinoジンバルの回路図



Arduinoコード
// Get Yaw, Pitch and Roll values
#ifdef OUTPUT_READABLE_YAWPITCHROLL
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
#endif// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
製造プロセス
- 自作LUMAZOID:Arduino音楽ビジュアライザーDIYガイド
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
- Arduino、Google Cardboard、Bluetoothで作るDIY VRスケートボード
- Arduino Mega 2560搭載 総合トレーニングキット – センサー、モーター、カスタムPCB完備
- DIY ArduinoラジオニクスEMR治療デバイスの構築
- Arduino NanoとSG90サーボで作るDIY 2軸モーションレーシングシミュレータ
- Arduinoで作るスマートゴミ箱 – 自動開閉蓋付き
- ArduinoでSoloドローンのサーボ制御をマスター:簡単セットアップ&スイープチュートリアル
- Arduinoで作るポータブルRFIDドアロック - ステップバイステップガイド
- DIY 3軸CNCフライス盤:精密加工機を自作する