loading

安価なジャイロ・モジュールとArduinoを使った工作をこれまで2つ行いました(倒立振子三次元書道)。今回その第3弾として、カメラ安定化のジンバル(gimbal)の作成を思い立ちました。開発方針は次の3つです。

  • 普通のデジタル・カメラを搭載 ・・・ GoProより大きなカメラ用
  • できるだけシンプルで一般的な構成 ・・・ 特殊な部品を使わない
  • 自力で作る ・・・ webの先人になるべく頼らない

当初は、サーボ・モータを使った2軸ジンバルを作るつもりでした。しかし思い通りの効果が得られず、最終的にブラシレス・モータを使った3軸ジンバルを作ることになりました。このジンバルの効果は下の紹介動画で確認できます。(動作ノイズが急に再生されるのでご注意ください。素のパフォーマンスが分かるように、編集は控えています)

:

■紹介動画:自作ジンバルの有効性

:

上の動画を見て分かるように、作成した3軸ジンバルは実用レベルにあるように思えます。ただ、そこに到るまでには幾つか困難がありました。主なものは以下の通りです。

  • Arduinoによるブラシレス・モータの制御
  • フレームの工作精度の確保
  • ジャイロとArduinoの通信異常(SPIの不具合)
  • フレームの震動(ビビリ)
  • 意図的な回転の円滑性確保

:

この内、最初の問題はプログラム(スケッチ)に関するものです。一方、2番目の問題は純粋にハード(工作能力)の問題で、下の3つはソフトとハードの複合問題と言えます。

また最初の問題以外の4つは、1軸から2軸に移行する際に生じました。すなわちプログラムの基本は、1軸から軸数が増えても大きな変更はありません。これに対し躯体の工作は、軸数が増えると一気に複雑になります。

:

そこでここでは、作り方の詳細(How to)は1軸にとどめ、開発の初期段階から最終的な3軸ブラシレス・ジンバルに到るまでの過程の話を主にします。以下、話の概要です。

  1. モータを使ったカメラ安定化装置(ジンバル)の基礎知識
  2. 安価なDCモータ(ブラシ付きモータ)を使った1軸ジンバル
  3. サーボ・モータを使った1軸ジンバル
  4. ブラシレス・モータを使った1軸ジンバル
  5. 可動軸の追加と諸問題
  6. DIYジンバルの有効性と改善余地

:

この内 How to の話は主にステップ9〜13で行います。また、ステップ12開発動画(12)ステップ13を見れば、必要最小限の工作はできるかもしれません。逆に、完成品の動作を見たい場合、上の紹介動画に加えて、ステップ15開発動画(15)ステップ16開発動画(17)を見れば概略分かると思います。

:

なお、instructablesの英語版に「Brushless Gimbal with Arduino」という記事があります。今回、ブラシレス・モータの利用に転じる際、この記事は「出発点」として大変参考になりました。ただし開発方針に関する限り、この記事は本記事と対照的です。この点についてはステップ8で説明します。

This instructable has been translated in English. There three steps, ステップ1、4、7, are omitted.

(Arduino、ブラシレスモータ、制御、ジンバル、ブラシレスモーター、自作)

:

Step 1: カメラ用のジンバルの歴史

Infinity Hobbyさんのサイトに、カメラ用ジンバルの発展の経緯をまとめた記事があります。日付が見当たらないのですが、2008年頃の記事ではないかと思います。以下、この記事のポイントをまとめました。

:

<発展の経緯>

  • カメラ用のジンバルは、(ラジコンの)オートパイロット装置から発展した
  • スタートは、ドイツ人が始めたオープン・プロジェクト(記事の1~2年前)
  • 良い成果が出たので、中国で類似製品が作られるようになった
  • これとは別に、ロシア人のプロジェクトもあった(*記事には、クローズド、オープン双方の記載あり)
  • ロシアのプロジェクトの方が更新が速かったので、ハード的にはドイツ側もこれに収斂した

:

<サーボ式ジンバル>

  • 長所は大型カメラを搭載可能で、重心位置の正しさからの影響が小さいこと
  • 短所は反応がより遅く、作動の時騒音がすること
  • ブラシレス・ジンバルが登場した後、サーボ式ジンバルはあまり使われなくなった

Step 2: ポイント 「ジャイロの取り付け場所」

モノの動きは回転」と「移動(平行移動)に分けられます。この内、回転を防ぐ装置は「ジンバル(gimbal)」と呼ばれます。ここで開発するのはカメラの回転を防ぐ装置です。そこで重要なのが、カメラの向き、すなわち「角度」の評価です。

角度の評価方法はいくつかありますが、ここでは安価なジャイロを使用します。具体的にはジャイロで角速度を計測し、これをArduinoで積算して角度を評価します。この場合、ジャイロの取り付け場所は大きく2つに分けられます。

 (1)カメラ側(マウント側)

 (2)持ち手側(ハンドル側)

:

両者の主な違いは、意図的な制御(モータの動き)のフィードバックの有無です。ジャイロを(1)カメラ側に取り付けると、外から加わる動きと意図的なモータの動きが一緒になり、その合計値を計測します。これに対し、(2)持ち手側にジャイロを付けると、外から加わる動きは計測できますが、意図的なモータの動きは計測できません。このため次のような長短が生じます。

(1)ジャイロをカメラ側(マウント側)に取り付ける

  • 制御方法:カメラが少しでも回転すると、その動きを打ち消すまでモータを逆に回す
  • 長所:正確な角度評価は不要・・・モータの回転角度を知る必要はない
  • 短所:モータを上手く制御しないと振動が生じる

(2)ジャイロを持ち手側(ハンドル側)に取り付ける

  • 制御方法:持ち手の回転角度を評価して、逆方向に同じ角度だけモータを回す
  • 長所:フィードバックがないので振動が生じない
  • 短所:正確な角度評価が必要・・・ハンドルとモータの回転角度をそれぞれ正確に知る必要がある

:

こうした違いは、使用するモータの選択にも影響を与えます。ジャイロを(2)持ち手側に付ける場合、持ち手(ハンドル)とモータの回転角度をそれぞれ正確に評価する必要があります。このため、サーボ・モータステッピング・モータのように、角度を直接制御できるモータが向いているように思えます。

これに対し、ジャイロを(1)カメラ側に付ける場合、持ち手(ハンドル)の回転とモータの回転を合わせたカメラ(マウント)の回転を抑えればよいので、正確な角度評価は必ずしも必要ではありません。そうなると、簡素で安価なブラシ付きモータの利用も視野に入ります。

こうして見ると、要求される角度評価のレベル、およびモータ選択の自由度の双方で、(1)カメラ側にジャイロを付ける方に利があるように見えます

Step 3: 安価なDCモータの利用可能性

ジャイロをカメラ側に取り付けて、カメラ自体の回転を察知すれば、安価な模型用のDCモータ(ブラシ付きDCモータ)でもジンバルに使えるかもしれません。しかし、この種のモータは相対的に高回転型であるため、ギアやプーリを使って減速する必要があります。

ここでは、以前作った倒立振子を1軸のジンバルに見立てて、その利用可能性を確認しました。プログラムをジンバル用に修正して試したところ、追随性は悪くないものの、標準的な振動対策では振動を抑えきれないことが分かりました。(開発動画(1)参照)

:

■開発動画(1):ブラシ付きDCモータを使った1軸ジンバル

:

この振動の主な原因は、使用したギア・ボックスのバックラッシュ(ガタ、遊び)です。ギアが噛み合っている時とそうでないときとでは、角度や角速度の評価値が同じでも、モータの制御は異なります。しかし、ギアが噛み合っているか否かをリアルタイムで区別するのは簡単ではありません。

制御の感度を下げれば、振動をある程度抑えることもできます(開発動画(2)参照)。しかし、ギアが噛み合っていない間は制御を放置することになります。したがって、カメラのジンバルに安価なDCモータを用いるには、バックラッシュが極めて小さな(ガタを感じない)減速装置が求められます。しかし、そうした装置の作成は難しいと判断しました。

:

■開発動画(2):ブラシ付きDCモータを使った1軸ジンバルの改良

Step 4: Webの動画で見たサーボ・ジンバルの有効性

ステップ1で見たように、ブラシレス・ジンバルが主流になる前は、サーボ・ジンバルが活用されていたようです。実際、ジャイロを組み込んだ特殊な(専用の?)サーボも市販されていました。

ただwebで見た幾つかの動画では、回転の補正(追随)はいずれも十分ではない印象でした(参考サイト参考動画)。なおこれは、搭載したカメラのバック・モニタの映像もしくは鏡に映った映像を見た印象です(*)。

(*)上の写真は市販のサーボ・ジンバルのイメージであり、これらの動画と無関係です

私が見た中で補正効果が最も良く見えたのは、MOMOKOさんの記事の動画でした。この動画では、カメラのバック・モニタが写る時間は短かく、映像も不鮮明ですが、まずはこの動画レベルの動作を目指して、1軸のサーボ・ジンバルのテストを開始しました。

Step 5: 1軸サーボ・ジンバルの試験開発(1)

サーボ・モータを使う場合、ジャイロの取り付け場所は、(1)カメラ側、(2)ハンドル側の双方を選択できます。ここではまず、正確な角度評価が不要な(1)カメラ側にジャイロを取り付けてみました。その結果、次のことが分かりました。

  • カメラの回転を単純に補正する(評価値だけサーボ・モータを逆回転させる)方法では、カメラの回転を十分補正できない
  • カメラの回転角度がゼロになるまでサーボの角度を(逆方向に)増やしていく方法は、補正の遅延もしくは振動を招き易い
  • サーボ・モータに与える角度の選択は簡単ではない

:

まず最初の点ですが、ジャイロの取り付けが(2)ハンドル側ならこの方法は妥当です。しかしジャイロを(1)カメラ側に付ける場合、この方法ではカメラの回転角度の半分しか補正できません(詳細は省略)。

これに対し、カメラの回転角度がゼロになるまでサーボ・モータを逆に回す2番目の方法は、ジャイロを(1)カメラ側に付ける時の基本です(ステップ2参照)。しかし、サーボ・モータの制御は角度の指示で行うので、回転の速さや加速度の制御は困難です。

角度の増加ペースを変えれば、回転の速さをある程度コントロールできますが、増加ペースを上げると振動が生じ、ペースを下げると追随が悪くなる二律背反がすぐに現れます。

「角度を正確に制御できる」というサーボ・モータの特長を踏まえると、振動の心配のない(2)ハンドル側にジャイロを取り付ける方が、制御の効率性の点で望ましいと考えられます。

Step 6: 1軸サーボ・ジンバルの試験開発(2)

サーボ・モータを使う場合、ジャイロを(1)カメラ側に取り付けるのは得策でないことが分かりました。このため、ジャイロを(2)ハンドル側に取り付けて、改めて動作を確認しました。その結果、次のことが分かりました。

  • サーボ・モータは加減速が苦手
  • 特に回転を止める時の減速ペースが遅い
  • サーボ・モータの加減速のペース変更は困難

:

上のグラフは、指定する回転角度を変えて(8~60度)、回転開始から回転終了までの「角速度」の推移を見たものです。横軸が経過時間、縦軸が角速度を表します。この図で推移線の傾きを見ると、回転開始と回転終了の「角加速度」を評価できます。その結果次のことが分かります。

  • 回転開始から角速度の最大値に到る角加速度はほぼ一定
  • これに対し、回転終了時の減速ペースは段階的に低下する
  • この結果、角速度の最高値から停止までの所要時間は、加速時の2~3倍を要する
  • 指定角度が15度以下だと、角速度の最大値に到ることなく減速する

:

上記の最初の3点は、サーボ・モータが停止の動作を「慎重に」行っていることを意味します。そして最後の点は、不規則な姿勢の変化に素早く対応できないこと、およびサーボ・モータの性能を表す代表的な指標(定常回転の角速度=角速度の最大値)が役に立たないことを意味します。

サーボ・モータが停止動作を慎重に行うのは、振動のリスクを極力抑えるためだと考えられます。しかし、この慎重な動きはジンバルに必要な素早い動きを損ないます。下記の開発動画(3)を見ると、回転開始の遅れとともに、回転終了時における減速ペースの低減を確認できます。

:

■開発動画(3):サーボ・モータの追随性の確認

:

不規則な動きを補正するカメラ用ジンバルに求められるのは、回転速度の最大値もさることながら、回転開始と終了の加減速の良さです。この点サーボ・モータは、振動のリスクを抑えるため、この加減速の性能を犠牲にしていると言えます。その程度はモータによって異なりますが、いくつか異なるサーボ・モータを試しても満足できる効果は得られませんでした。(開発動画(4)参照)

:

■開発動画(4):1軸サーボ・ジンバルのパフォーマンス(軽量高速サーボを使用)

Step 7: ブラシレス・ジンバルの自作例(1)

前ステップの試行により、サーボ・モータは機敏な加減速が得意でなく、カメラ用のジンバルには不向きと判断しました。そこで代替策として、ブラシレス・モータの利用を考えました。

ただし、それまでブラシレス・モータを見たことがなかったので、まずはwebで工作の事例を調べました。その結果、主にラジコンの分野で、関係する記事や動画を相当数見つけることができました。それによると、この分野では、ESC(Electronic Speed Controller)と呼ばれる専用機材を使ってブラシレス・モータを制御するのが一般的なようです。

:

一方、ブラシレス・モータを使ったカメラ用のジンバルの自作例も、数は多くないですがいくつか見かけました。例えば下記の記事や動画です。みな素晴らしい工作ですが、これらも専用のボード(おそらく市販品)を使ってモータを制御しているようです。

冒頭のイントロで述べたように、今回の工作は、特殊な部品は使わない方針です。このため、全ての制御はArduinoだけで行うつもりです。しかしwebで見る限り、Arduinoでブラシレス・モータを直接制御する実用的な工作はほとんど見当たりませんでした(*)。

(*)それらしいタイトルの動画をwebで見つけたのですが、これもESCを使うものでした。

Step 8: ブラシレス・ジンバルの自作例(2)

ブラシレス・モータをArduinoで直接制御したいのですが、知識も経験もない上、実用的な工作の事例も見当たりませんでした。それで実物を見るため、ジンバル用の安価なブラシレス・モータを一つ購入しました。しかし説明書は付いておらず、使用方法はやはり見当がつきませんでした。

そこで参照したのが、英語版のinstructablesの「Brushless Gimbal with Arduino」という記事です。タイトルはそのものズバリですが、完成品の動画を見る限り、著者も認めるように実用レベルとは言い難い仕上がりです。

ただこの記事は、参考にした別の記事をいくつか紹介しており、その中にブラシレス・モータをArduinoで直接回す記事がありました。この参考記事が、この段階での事実上の出発点になりました。その詳細は次のステップに譲り、ここではまず、この参考記事を知ることになったinstructablesの元の記事を簡単に整理します。

:

この記事は米国の2人の学生が自らの工作を紹介したものです。この記事と今回の工作の共通点は次の3つです。

  • 専用の制御基板を使わずに、ブラシレス・モータを使ったジンバルを作りたい
  • 具体的には、Arduinoで全て制御したい
  • 他の事例を調べても、こうした工作を見つけることができなかった

一方、今回の工作との相違点は次の通りです。

  • 搭載するカメラはGoPro
  • ジンバルの躯体とモータは、GoPro用の市販セットを使用
  • ブラシレス・モータの制御プログラムは、上述の参考記事をほぼ流用
  • ジャイロ・モジュールは特殊なものを使用(MPU6050搭載)
  • このモジュールの使用方法は、公開されている既存のプログラムをほぼ流用

:

「専用機材を使わずに、ブラシレス・モータをArduinoで制御したい」という目標、および「実用的な工作の事例が見当たらない」という状況認識は、この記事も今回の工作も同じです。ただしこの記事の著者は、この目標を実現するために、利用できる市販品や公開情報を積極的に利用しています。

これは、「独自性の強い目標を、他人の手を借りて実現する」、もしくは「汎用性の高い目標を、特殊な部品や方法で実現する」アプローチと言えます。この点に思い至った際、「水平分業」という言葉を思い出し、何ともいえぬ感慨を覚えました(*)。

(*)「垂直統合」を得意とする日本の製造業が、水平分業の前に苦戦しているという話を聞いたことがあります。「自力で作る(webの先人になるべく頼らない)」という今回の方針は、垂直統合に近いように感じました

:

閑話休題。ここで紹介した記事では、MPU6050というセンサを載せたモジュールが使われています。このセンサはDMP(Digital Motion Processor)という特殊かつ強力な機能を有しています。これにより、標準的なセンサを超えるノイズ処理だけでなく、3次元での「座標の回転(*1)」をリアルタイムで評価できます(*2)

(*1)固定された座標軸まわりの回転ではなく、座標そのものの回転
(*2)この計算はなかなか大変なので、以前やった工作ではパソコンのソフトで事後処理していました

現時点でこれは驚くべき機能ですが、逆に言うと「特殊な部品」と言えます。したがって、今回の工作ではこのセンサ(正確にはDMP)の使用は見送ることにしました。なお今回の工作では、モータドライバとしてL298を使いましたが、これはここで紹介した記事に倣ったものです。記事の著者には感謝します。

Step 9: 模倣スケッチで回すブラシレス・モータ

ここでは最初の How to の話をします。

前ステップで紹介したinstructablesの記事では、Arduinoでブラシレス・モータを回しています。その際、eLABZさんの記事のプログラム(スケッチ)を使っています。後者の記事は、DVDドライブのブラシレス・モータを転用して、「ストロボスコープ(Stroboscope)」を作るものです。

私が見た限り、Arduinoでブラシレス・モータを回す情報が一通り揃っていたのは、eLABZさんのこの記事だけでした(*)。なお、この記事は全部で3つのパートで出来ています。(* ミニマムの情報を載せた別の動画を先日見つけました)

  1. ブラシレス・モータ(三相)の基礎
  2. ブラシレス・モータをArduinoで回す話
  3. ストロボスコープの作成

この内「2.」では、Arduinoでブラシレス・モータを回すプログラム(スケッチ)を2つ紹介しています。記事の説明によると、要は、三相モータにつながる3つの線に、位相が120度ずれた交流電圧をそれぞれ印加すればよい、というものでした。それで試したところ、実にあっけなく回りました。(下の開発動画(5)参照)

:

■開発動画(5):Arduinoによる三相ブラシレス・モータの駆動(矩形波による)

:

この工作で用意するのは三相のブラシレス・モータです。たぶんモータから3本の線が延びていると思います。これらの線とArduinoの#9、#10、#11ピンをまずは順不同につないでください。

次に、本ステップ末尾の2つのpdfファイルをパソコンにダウンロードして開いた後、いずれかの内容をコピーしてArduinoにアップロードしてください。これらのスケッチは、eLABZさんのスケッチを基に書き直したものです。なお場合によっては、コピーの際にミスプリが生じるかもしれないので、適当に修正してください。

ジンバル用の低回転型モータであれば、アップロード後にすぐ回り始めると思います。一方、ラジコン用の高回転型モータを使う場合、Arduinoのデジタル・ピンでは力不足かもしれません。この場合、ドライバICと外部の電池で給電してください。(下の開発動画(6)の後半参照)

:

■開発動画(6):Arduinoによる三相ブラシレス・モータの駆動(ドライバIC使用、正弦波による)


Step 10: 先行例にならった一軸ブラシレス・ジンバル

前ステップでは、webで公開されているスケッチを模倣して、ブラシレス・モータをArduinoだけで回すことができました。ちなみに、前ステップで用意した2つのスケッチで、1行目の変数「motorDelayActual」の値を変えると、ブラシレス・モータの回転スピードをある程度制御できます。そこで早速、このスケッチをベースにして、1軸のブラシレス・ジンバルを作ってみました。

なお、ステップ3で用いた安価なDCモータと同様、ここでもモータの回転角度は評価していません。このため、ジャイロはカメラ側に付ける必要があります。この場合、振動対策が必要になるので、適当な対策を試しつつテストを開始しました。(開発動画(7)参照)

:

■開発動画(7):三相正弦波を使った1軸ブラシレス・ジンバル

:

上の動画を見て分かるように、この試作機はベース側(ハンドル側)の回転を概略補正しています。しかし、次のような問題も同時に確認できます。

  • 補正の開始が遅れる
  • 補正のペースが一定でない(脈動する)
  • 停止時に少し振動が見られる

そこで、これらの問題点の解決を目指してスケッチの改良を進めました。(開発動画(8)参照)

:

■開発動画(8):三相正弦波を使った1軸ブラシレス・ジンバルの改良(対症的)

:

上の動画を見て分かるように、最初の試作機で見られた問題点はある程度改善しています。しかし、カメラを載せて上手く動作するレベルにはなく、サーボ・モータを使ったジンバルを超えるのは難しいと思われます。

Step 11: 発想の転換とサーボ的な運用

ステップ8では、Arduinoを使った2軸のブラシレス・ジンバルの工作の記事を紹介しました。この工作は、webで公開されているプログラム(スケッチ)を使っています。ただしその動作は、この記事の著者も認めているように十分ではありません。

また前ステップでは、同じスケッチを模倣して1軸のブラシレス・ジンバルを試作しました。しかし、思いつく限りの改善を加えても、やはり十分な動作を得ることができませんでした

実際、オリジナルのスケッチに関するeLABZの記事によると、「この回路は回転負荷が極めて軽い工作用であり、ホール・センサ(磁気センサ)のないモータでは正確な制御ができない」(抄訳)との但し書きがあります。

:

万策尽きて試作機の動作を悄然と見ても、やはり何とも言えぬ頼りなげな様子です。実用化は困難と諦めかけた時、ふと、モータを円滑に回すのではなく、むしろ強力に止めることが重要なのでは、という考えが頭をよぎりました。

そこで、ブラシレス・モータを単純化したモデルを描き、任意の角度で停止力が最大になる運用を計算してみました(*1)。そしてこれを基に全く新たなプログラムを用意したところ、これまでとは比べ物にならない強さの停止状態を確認できました(*2)。さらにそこから、与える停止角度を少し変えてみたところ、指示した角度に直ちに回転して再び力強く停止しました。

(*1)三相ブラシレス・モータの基本は、主に飯島さんの解説記事で勉強しました。これによると、モータの結線には幾つか流儀があるようです。ちなみに今回使ったモータはY結線(Star Style)です(※:当初はデルタ結線と勘違いしていました。英語版への指摘を受けて調べたところ、Y結線であることが分かりました)
(*2)飯島さんの解説記事に基づいて計算したところ、何故かモータにパワーが生じませんでした。不思議に思って調べたところ、次の資料を見つけて解決しました(※:この資料はデルタ結線ですが、コイルの配置は使用したモータと同一です)。Y結線、デルタ結線ともにいろいろあるようです。

:

これにより、ブラシレス・モータをサーボ的に運用できる可能性が急に開けました。試しにジャイロを繋いで動作を確認したところ、サーボ・モータを超えるパフォーマンスを期待できそうなことが分かりました。(開発動画(9)参照)

:

■開発動画(9):ブラシレス・モータのサーボ的な運用

Step 12: 1軸ブラシレス・ジンバルの実用化

前ステップで考案した新たな運用方法により、Arduinoを使ったブラシレス・ジンバルの実用化が視野に入ってきました。これは、ブラシレス・モータをサーボ的に運用するものです。

この場合、ジャイロはジンバルのベース側(手元側)に取り付けることができます。そこで早速、1軸ジンバルの上部マウントにカメラを載せて、そのパフォーマンスを確認してみました。(開発動画(10)参照)

:

■開発動画(10):独自プログラムによる初めての1軸ブラシレス・ジンバル

:

上の動画を見て分かるように、動きに少し粗い所は見られるものの、補正の追随性はステップ6で試したサーボ・ジンバルを明らかに上回ります(開発動画(4)との比較)。さらに、パラメータの調整も含めて改善の余地はまだ十分あります。

そこで動作の詳細を知るため、カメラ側(マウント側)にもジャイロを付けて、ベース側とカメラ側の動きを同時に計測してみました。これにより、次の3つの問題が残っていることが分かりました。

  1. 補正の開始と終わりに若干の遅れ(タイム・ラグ)がある
  2. 補正の開始と終わりに減衰する振動(shake)が生じている
  3. 補正の前後でマウントの角度にズレが生じている(バイアスの発生)

:

この内、2番目の問題は、新たにカメラ側に付けたジャイロの情報の利用すれば、標準的なPD制御で解決できそうです。3番目の問題も、制御の係数を変えたり、新たなジャイロの情報を使えばなんとかなりそうです。そこで、カメラ側のジャイロの計測値も利用するようにプログラムを修正してその効果を試してみました。(開発動画(11)参照)

:

■開発動画(11):独自プログラムによる1軸ブラシレス・ジンバルの改良(ジャイロを追加)

:

上の動画を見ると、カメラ側に追加したジャイロの情報を用いることで、上に挙げた3つ問題を大幅に抑制できることが分かります。

さらに改善の余地を探るため、モータ駆動用の電池を4本(5~6V)から8本(10~12V)に増やし、このモータの推奨電圧(11~15V)での動作を確認しました。(開発動画(12)参照)

:

■開発動画(12):独自プログラムによる1軸ブラシレス・ジンバルの改良(推奨電圧使用)

:

上の動画を見ると、モータに加える電圧を推奨レベルに引き上げることで、補正の開始と終了の追随を改善できることが分かります。この結果を見て、1軸のテスト段階を終了し、実用的な2軸ブラシレス・ジンバルの開発に移ることにしました。

Step 13: 1軸ブラシレス・ジンバルの作り方

ここでは2軸ジンバルの話に移る前に、前ステップの開発動画(12)で用いた1軸ブラシレス・ジンバルの作り方を紹介します。多少面倒な所もあるので、以前紹介した工作のいずれか(倒立振子の研究三次元書道)を経験された方を前提にします。

:

<用意するもの>

  • ジンバル用の三相ブラシレス・モータ(1個)・・・14極・12スロットに限る(Y結線、デルタ結線ともにOKですが、コイルの配置はこの資料に準じたものに限ります:詳細は英語版へのコメント参照)
  • Arduino UNO(1個)
  • ジャイロ・モジュール(2個)・・・ここではL3GD20を使った秋月製を使用 (*同じチップを使ったPololu製のモジュールを使う場合、上に添付したチップの配線図を参照して秋月製との異同を確認)
  • 単三電池(4~8本)
  • モータ・ドライバICL298(1個)
  • プレート(2枚)・・・ジンバルのベース(ハンドル)用とマウント用
  • その他・・・標準的な工作の小道具や材料もろもろ

:

<プログラム(スケッチ)>

  • 本ステップ末尾のpdfファイルをパソコンにダウンロードし、内容をIDEにコピーしてください
  • カメラ側(マウント側)のジャイロは、取り付け方によって出力の符号が反転します
  • この場合、モータが正常に動作しないので、「chkAndCtl」のコメント・アウトしている2行を有効にして、その直上の2行を無効にしてください(*1)

(※:このスケッチはデルタ結線のモータを前提にしていますが、Y結線のモータにも適用できます)

:

<配線>

  • 上の図に従ってください
  • モータの3つの線とArduinoのピンの対応は適当です
  • モータが振動したり補正方向と逆に回る時はこの対応を適当に変えてください(*2)

(*1, *2)モータが正常に動作するには、ジャイロと配線の両方がプログラムとうまくマッチする必要があります。正しく動作しない場合、「*2→*1→*2→*1」の順に試してください。それでもうまくいかない場合、ジャイロ自体に異常が生じている可能性もあるので、下記の対策を試してください

:

<キャリブレート>

  • Arduinoをリセットしたら、ジャイロに触れずに8秒ほど放置してください

:

用意したプログラム(スケッチ)の大まかな流れは、ブロック単位で見ればつかめると思います。一方、ブロック内の詳細は分かり難いかもしれません。ご要望が多ければ別途解説を考えます。なお、ここで使用してたジャイロ・モジュールは、何かの拍子に出力に異常が生じることがあります。その内容と対策は、こちらの記事のステップ1の「問題」を参照してください。

Step 14: 2軸ブラシレス・ジンバルの作成

Arduinoとブラシレス・モータを使った1軸ジンバルが、所期の動作水準に達したので、実用的な2軸ジンバルの作成に取り掛かりました。補正の対象は、ティルト(見上げ/見降ろし)とロール(水平線の傾き)です。なお、ブラシレス・モータにつなぐPWM端子の数を確保するため、ArduinoのボードをUNOからMEGA変更しました。

:

ジンバルのフレームは、工作が容易なプラスチック製のユニバーサル・プレートと金属製のL字アングルを主に使いました。このフレームの工作で最も大変だったのは、次の2つです。

  • カメラを載せるマウントの部品選択・・・カメラの重心に上手く合う部品を見つける
  • ティルト軸のピン(軸と穴)の取り付け

上の2番目の困難は、GoProより大きなカメラを搭載することで生じます。ブラシレス・モータは基本的に良質なピン(回転軸)として機能します。しかしカメラが重いと、片持ち梁では無理があります。このため、カメラを挟んでモータの反対側に円滑でガタのないピン(軸と穴)を別途取り付ける必要があります。

:

取り敢えずフレームを仕上げて、搭載予定のカメラを載せてテストしたところ、下記の2つの問題が生じました。これらの原因と対策の概要は最後のステップで説明します。

  • フレーム全体の震動(減衰しないビビリ:chattering)
  • ジャイロとArduinoの通信異常(SPIの不具合)

なおこの段階の電装は、ブレッド・ボードとジャンパ・ワイヤを使った仮組です。下の開発動画(13)は、意図的なティルト機能を加味した2軸ジンバルの動きを見たものです。この動画で見る限り、上手く動作しているように見えます。

:

■開発動画(13):2軸ブラシレス・ジンバルの動作確認(その1)

:

これに対し下の開発動画(14)では、ジンバルに載せたカメラの撮影映像(右上)も同時に確認できます。これによると、水平線(ロール)の補正に改善余地があることが分かります。

:

■開発動画(14):2軸ブラシレス・ジンバルの動作確認(その2)

Step 15: 3軸ブラシレス・ジンバルの実用化

2軸ジンバルの作成の際に生じた2つの問題は、対症的な措置で取り敢えず悪影響を軽減できました(その概要は最後のステップで説明します)。

そこで、電装部品を自作のシールドに移し、新たにパン(左右の動き)を制御するモータを追加しました。そして、意図的なパンを許容できるようにプログラムを修正し、幾つかのパラメータを調整しました。これにより、ほぼ実用レベルのパフォーマンスを備えた3軸ブラシレス・ジンバルが完成しました。(開発動画(15)参照)

:

■開発動画(15):3軸ブラシレス・ジンバルの動作確認

:

上の動画は、このジンバルにカメラを載せて、鏡の前で撮影したものです。これにより、外から見たジンバルの動きと、ジンバル上のカメラの撮影映像を同時に確認できます。この開発動画(15)と前ステップの開発動画(14)を比べると、ロールの補正が大幅に改善されていることが分かります。そこで、完成したジンバルを屋外に持ち出して、そのパフォーマンスを見てみることにしました。

Step 16: 3軸ブラシレス・ジンバルを用いた屋外撮影

屋外に持ち出して撮影すると、屋内のテストでは分からなかった問題も見えてきます。そこで、動画を撮影しながら、改めてパラメータの調整を行いました。調整中の動画は、下の開発動画(16)にまとめています。なお、ジンバルは角度の補正装置です。このため、歩行に伴うカメラの上下動(角度変化を伴わない位置の移動)は補正の対象外である点にご注意ください。

:

■開発動画(16):パラメータ調整のための屋外撮影

:

パラメータの調整で一番苦労したのは、やはりロールの補正でした。上の動画で「遠景の水平線」の動きを見ると、角度の安定性に違いがあることが分かります。下の開発動画(17)もパラメータ調整時の撮影です。この動画は比較的シンプルな構図で、電池切れの状態も写っているので、ジンバルの性能を見るには良いかと思います。

:

■開発動画(17):パラメータ調整のための屋外撮影(前方撮影/後方撮影)

:

最後に、パラメータの調整が比較的進んだ段階の動画を幾つか紹介します。すぐ下の確認動画(1)は、意図的なパンを多用しており、その効果を確認できます。次の確認動画(2)は、長い階段の上り下りを未編集で収めています。その下の確認動画(3)~(6)も、撮影の条件等をいろいろ変えているので、ここで紹介したジンバルのパフォーマンスを知るのに参考になると思います。

:

■確認動画(1):意図的なパンの効果(約540度回転)

:

■確認動画(2):丘の階段の上りと下り(駆け足~速足:未編集版)

:

■確認動画(3):公園の散歩(人と風景)

:

■確認動画(4):足場の悪い林の道

:

■確認動画(5):ジンバルの起動から停止までの未編集動画

:

■確認動画(6):ロー・アングル

Step 17: 改善の余地

これまで、Arduinoを使った3軸ブラシレス・ジンバルの開発経緯を紹介しました。webで見ても、ブラシレス・モータをArduinoで直接回す話は少なく、唯一見つけたスケッチはジンバルに不向きでした(ステップ11参照)。このため新たなスケッチを独自に用意して、1軸、2軸、3軸の順に開発を進めました。

結果的に、「特殊な部品を使わず、自力で作る」という方針は維持できたと思います。ただ、他のジンバルを見たことがないので、このジンバルの特徴や長短は良くわかりません。ここでは最後に、改善を要する点をまとめます。

:

(1)高周波のノイズ

ステップ11で用意したスケッチでブラシレス・モータを制御すると、静止状態でも強いトルクが得られます(作り方はステップ13参照)。ただしモータからは、常に500Hz程度のノイズ(騒音)が生じます。このノイズは映像には影響ないですが、ジンバルにカメラを載せて撮影すると、かなりの騒音が録音されます。

<追記>
この高周波のノイズは、PWMパルスによるモータのコイルの唸りが原因でした。PWMパルスの周波数を上げると、この唸りを不可聴域(31kHz)に移せます。 ステップ13に戻って試す場合、Arduinoのピン割当てを変更し、サンプル・スケッチのsetup内に下記の4行を追加してください。

・ピンの変更(配線とスケッチの両方)
 pin8→5
 pin9→6
 pin5→9
 pin6→10

・コードの追加
 TCCR1B &= B11111000;
 TCCR1B |= B00000001;
 TCCR2B &= B11111000;
 TCCR2B |= B00000001;

下記の動画(7)は、この修正を加えて撮影したものです。耳障りな高周波ノイズは聞こえず、周囲の自然な音が録音されています。なお、この修正によってジンバルの挙動が変化するため、プログラムの係数の再調整が必要になります。その下の動画(8)は、係数を再調整して撮影したものです。強い風にもかかわらず映像の安定性が改善しています。

:

■確認動画(7):スケッチの修正による高周波ノイズの除去

■確認動画(8):修正スケッチの係数再調整

長回しの確認動画(各15分): テスト(1)テスト(2)テスト(3)

:

(2)フレームの震動

実用的な2軸ジンバル開発段階で、フレームに震え(震動)が生じるようになりました。上の騒音と異なり、この震動は動画の映像に影響を与えます(輪郭がうねるように見えます:開発動画(18)参照)。正確な振動数は分かりませんが、感覚的には50Hz程度でしょうか。フレームの適当な場所を指で触れると直ぐ収まりますが、動作中に可動部分に触れる訳にもいきません。

:

■開発動画(18):フレームのビビリによる映像の乱れ

:

この震動の根本原因は必ずしも明らかではありませんが、チルト制御のダンパ機能が直接の原因になっています。今のところ、下記の対症的な方法の組み合わせで概ね抑制していますが、フレームの剛性アップ等のより根本的な解決法が望まれます。

  • プログラムの係数調整・・・補正をややルーズにする
  • モータの駆動電圧の抑制・・・モータの推奨電圧の下限(11V)の2/3(7.5V)に抑える
  • ハンドルの大型化・・・大型のハンドルに金具を幾つか付けてこれらを鷲掴みすることで、掌で震動を吸収(もしくは固有振動数を調整)

:

(3)ロール補正の改善

ジンバルの動きを外から見る限り、カメラの姿勢は安定しているように見えます。しかし撮影した動画を見ると、ロールの補正に未だ改善余地があります。その原因として考えられるのは下記の諸点です。

  • プログラムの係数の不適・・・フレームの震動を抑えるために、補正をややルーズにしている
  • モータ駆動電圧の不足・・・フレームの震動を抑えるために、モータ推奨電圧の2/3にとどめている
  • ジャイロとフレームの軸の不一致

:

最初の2点は上記の震動対策によるものなので、ここでも抜本的な震動対策が望まれます。これに対し、最後の点はジャイロのキャリブレーションに関するもので、専らプログラムの問題です。

現在のプログラムは、ジンバルに取り付けた4つのジャイロと、ジンバルのフレームの軸が、全て一致していると仮定しています。しかし、これらの軸の間には、無視できないズレがあると考えられます(*)。このズレは、フレームの軸毎にジャイロの出力を見れば分かると思います。ただ、作業が面倒なのと効果が分からないこともあり今のところ実行していません。

(*)ジャイロをフレームに取り付ける時も、特別な測定や調整は行っていません。

:

(4)SPIの不具合

ジャイロとArduinoの情報のやり取りは、SPIインターフェースを用いています。SPIは短距離の通信手段ですが、webの解説記事によると、1m程度ならば問題ないようです。実際、ブレッド・ボードとジャンパ・ワイヤでテストしていた時には、特に問題は生じませんでした。しかし、仕上げのために、ジャンパ・ワイヤをリボン・ケーブルに置き換えたところ、ジンバルの動作が急に不安定になりました。

最初、全く原因が分からなかったのですが、試行錯誤の末、いくつかの線を近づけた時に、ジャイロの情報がArduinoに正しく伝わらないことが分かりました。中でも、クロック(SCK)出力(MISO)の線が近いと、高い確度で異常が生じます。このような報告はwebでも見当たらないので、これはおそらく、使用したジャイロとArduinoに固有の問題だと思われます。原因の詳細は不明ですが、束ねる線の組み合わせを適当に選ぶことで、対症的な解決を図っています。

<p>ESCの開発には、(知人の飯島さんだけでなく、)こういう日本人もいます。There is a one Japanese guy who likes BL ESC design.</p><p><a href="https://www.rcgroups.com/forums/showthread.php?200567-BLDC-controller" rel="nofollow">https://www.rcgroups.com/forums/showthread.php?200...</a></p><p>なお、サーボの加速度は、ブラシDCドライブモータを1mS程度Openして発電電圧をフィードさせます。BTW, the acceleration of RC servo spin is measured by DC motor genarating voltage while the motor drive OFF about 1mS when the PPM signal in.</p><p>大王怒(ダイオード)</p>
Oh i got it!!
English???
<p>お世話になっております。</p><p>開発動画(8):三相正弦波を使った1軸ブラシレス・ジンバルの改良</p><p>のようにモーターを動かしたいのですが、このプログラムも参考に見せていただくことは可能でしょうか?</p>
<p>使用するジャイロは1つだけで、カメラと同じマウントに固定します。ジャイロによる角度評価void chkAndCtl() { } は、ステップ13のサンプル・スケッチをベースにしてください。前回頂いた質問とは逆に、omegaDの係数を0に代えれば基台側のジャイロは無効化されます。</p><p>あとは、カメラの回転角度の評価値 thetaMa の符号に応じてモータを逆方向に回転させます。この補償回転は、ステップ9のサンプル・スケッチをベースとして、loop{ } のif文を修正します。具体的には、thetaMa の符号に応じて、「currentStepA~C」の増減(++もしくは--)を決定します。</p>
<p>回転の方向の変えかたでつまずいていましたが、currentStepA~Cを++かーーの増減にすることで変えれました。毎回ご丁寧に変身いただきありがとうございます。助かります。</p>
<p>こんにちわ。</p><p>私は大型の1軸ブラシレスジンバルをつくるためにこの記事を参考にさせていただいています。</p><p>step13のジャイロを二つ使用したジンバルは無事動かせたのですが、ジャイロ一つだけを使用している実験もやりたく、</p><p>開発動画10の「独自プログラムによる初めての1軸ブラシレス・ジンバル」のarduinoコードを参考にさせていただきたいのですが、見せていただくことは可能でしょうか?</p><p>よろしくお願い致します。</p>
<p>こんにちは<br>ご照会の件ですが、添付のスケッチを1か所変えるだけでOKです。<br>具体的には、void chkAndCtl() の中の下記の式の右辺係数(0.025)を「0」に置き換えると、2つ目のジャイロの機能がキャンセルされます。 </p><p>omegaDa = ( Ra - dRza ) * 0.025; <br><br>また、この2つ目のジャイロに関する変数や関数は、最初のジャイロに関するものに「a」を付けた形にしています。</p><p>omegaDa、rza、Ra、L3GD20a_write、など<br><br>なので、プログラムからこれらに関する記述を削除するとかなりスッキリするはずです。</p><p>なお、「omegaD = ・・・」の係数も 0.025 ですが、これは2つめのジャイロによる補正を前提として少し大きな値にしています。ジャイロのデータシートの標準値に基づく係数は0.021875です。</p>
<p>ありがとうございます。</p><p>無事にできました。</p><p>もうすこしこのプログラムでブラシレスモーターの制御について勉強させていただきます。</p>
<p>こんばんは</p><p>step1の写真見るとジャイロセンサ3rd,4thがあるってことは全部で4個使ってるんでしょうか?</p><p>別のCPUと言語使ってるのでそっちに移植試みてます。BLDC_3phase_squareと</p><p>BLDC_3phase_sinusoidalは動きましたが</p><p>single_axis_brushless_gimbal_with_aruduino.pdfを読んで移植しようとしてますが</p><p>chkAndCtl()とcalcPwms()の計算内容がさっぱりわかりません。なにか簡単な説明などないでしょうか?</p>
<p>&gt; step1の写真見るとジャイロセンサ3rd,4thが・・・</p><p>冒頭のイントロダクションの写真に付けたコメントですね。ここでは、管理する軸毎にジャイロを2つペアで使用しています。なお1つのモジュールで3軸感知できるので、使用するモジュールの数は制御する軸の数+1個です(Step13の1軸ジンバルでは2つ使うことになります)。ジャイロのペアリングの意味については、Step2、5、6、11、12を参照してください。<br><br>&gt; chkAndCtl()とcalcPwms()の計算内容が・・・</p><p><a href="https://www.instructables.com/id/DIY-Brushless-Gimbal-with-Arduino/" rel="nofollow">英語版</a>の方に同様の質問がいくつか寄せられています。まずはそちらをご参照ください。なお、指定のモータ(12スロット14極)を使う限り、ご照会の部分はブラックボックスにしておいて全く構いません。あえて調整するとしたら、chkAndCtl()の中の切りの良い数字(0.025、500、1000)をトライ&エラーで変えてみるくらいでしょうか。</p>
<p>こんにちは</p><p>ジンバルに興味があったので読ませて頂いてます。質問ですがジャイロは静止していてもドリフトがあるし一度動かすと元に戻してもドリフトのせいで元の値にもどりませんがこの補償については特に書かれていませんがこれは当たり前の処置として省略されているのですか?</p>
<p>ここでは温度計つきのデジタル出力のジャイロ・モジュールを使用しています。村田製作所製のアナログ出力センサと比べるとかなり扱いやすいですが、初期のカリブレーションは一応行っています(サンプル・スケッチにも載っています)。2つのモジュールの違いは、<a rel="nofollow">こちらの記事</a>を参照してください。</p><p>それでも累積する長期の誤差については、パンとチルトは手動、ロールについては自動(加速度計で重力評価)で修正しています。</p>
<p>初めまして、とても判りやすい説明で大変参考になりました。</p><p>しかし、僕の国でL3GD20が販売されていなくて、代りにMPU6050を使っています。<br>そのためArduino コードでのiPwm計算で少し躓いていて、Step13のcalcpwms()の部分を簡単に説明してもらえばいいなと思っています。<br>有難うございます。</p>
<p>こんにちは。<a href="http://akizukidenshi.com/catalog/g/gK-06779/" rel="nofollow">秋月製品</a>は安価で良いですが、海外在住だと入手困難ですよね。同じジャイロ・センサ(<strong>L3GD20</strong>)を積んだ<a href="https://www.pololu.com/product/2125" rel="nofollow">Pololu製のモジュール</a>は海外でも入手可能です。</p><p>一方、L3GD20に代えてMPU6050を積んだモジュールを使う場合、下記の2点を変更する必要があります。詳細は、<strong>イントロ、ステップ</strong><strong>1</strong><strong>、ステップ5</strong><strong>の解説(5</strong><strong>)と(6</strong><strong>)</strong>を参照してください。</p><ul><li>Arduinoとモジュールのやりとり(インターフェース)・・・SPIからI2Cに変更 <li>角速度の計測範囲と出力信号の変換係数</ul>

About This Instructable

56,351views

30favorites

More by ArduinoDeXXX:A Levitating Sphere Rotates Glows and Blinks with Arduino Arduinoで作る浮遊光球 Another Easier Inverted Pendulum Robot 
Add instructable to: