DIYArduinoジンバル|自己安定化プラットフォーム
このチュートリアルでは、Arduinoジンバルまたはサーボモーターを備えた自己安定型プラットフォームを構築する方法を学習します。このチュートリアルは、実際には、MPU6050チュートリアルに関する前のチュートリアルを拡張したものです。
次のビデオを見るか、以下のチュートリアルを読むことができます。
3Dモデリングソフトウェアを使用してジンバルを設計しました。これは、3軸制御用の3つのMG996Rサーボモーターと、MPU6050センサー、Arduino、およびバッテリーが配置されるベースで構成されています。
この3Dモデルを見つけてダウンロードしたり、Thangsのブラウザで調べたりすることができます。
STLファイル:
Creality CR-10 3Dプリンターを使用して、すべてのパーツを3D印刷しましたが、完璧に仕上げられました。
ジンバルの組み立てはとても簡単でした。ヨーサーボの取り付けから始めました。 M3ボルトとナットを使用してベースに固定しました。
次に、同じ方法でロールサーボを固定しました。パーツは、MG996Rサーボに簡単にフィットするように特別に設計されています。
パーツ同士の接続には、サーボ付属の丸ホーンを使用しました。
まず、丸いホーンを2本のボルトでベースに固定し、次に別のボルトを使用して前のサーボに取り付ける必要があります。
残りのコンポーネント、ピッチサーボ、トッププラットフォームを組み立てるために、このプロセスを繰り返しました。
次に、ホルダーの開口部にサーボワイヤーを通し、整理しました。次に、MPU6050センサーを挿入し、ボルトとナットでベースに固定しました。
プロジェクトに電力を供給するために、私はこのバッテリーホルダーに置いた2つのリチウムイオンバッテリーを使用しました。 2本のボルトとナットを使用してバッテリーホルダーをベースに固定しました。
2個のリチウムイオン電池は約7.4Vを生成しますが、Arduinoとサーボに電力を供給するために5Vが必要です。
そのため、7.4Vを5Vに変換するバックコンバーターを使用しました。
今残っているのは、すべてをつなぐことです。このプロジェクトの回路図と、すべてを接続する必要がある方法は次のとおりです。
このArduinoチュートリアルに必要なコンポーネントは、以下のリンクから入手できます。
最後に、電子部品とワイヤーをベースに押し込み、下部にあるこのカバーを使用してそれらを覆いました。
これにより、セルフバランシングプラットフォームまたはArduinoジンバルが実行され、期待どおりに機能します。残っているのは、プログラムを確認することです。
この例のArduinoコードは、JeffRowbergによるi2cdevlibライブラリのMPU6050_DMP6例を変更したものです。
コードをダウンロードできます:
コードの説明: そのため、出力の読み取り可能なヨー、ピッチ、ロールを使用しています。
値を取得したら、最初にラジアンから度に変換します。
次に、この間、センサーはまだ自己校正プロセス中であるため、待機するか、300回の読み取りを行います。また、ヨー値をキャプチャします。これは、最初はピッチやロールの値のように0ではなく、常にランダムな値です。
300回の読み取りの後、最初に、上記でキャプチャされたランダム値を差し引くことにより、ヨーを0に設定します。次に、ヨー、ピッチ、ロールの値を–90〜 + 90度で、サーボの駆動に使用される0〜180の値にマッピングします。
最後に書き込み機能を使用して、これらの値を制御信号としてサーボに送信します。もちろん、X軸とY軸の安定化だけが必要な場合は、Yawサーボを無効にして、このプラットフォームをカメラのジンバルとして使用できます。
これは良いカメラジンバルからはほど遠いことに注意してください。これらのサーボはそのような目的のためのものではないため、動きはスムーズではありません。実際のカメラジンバルは、スムーズな動きを得るために特殊なタイプの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
Code language: Arduino (arduino)// 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;
Code language: Arduino (arduino)// 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++;
}
Code language: Arduino (arduino)// 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);
}
Code language: Arduino (arduino)
製造プロセス