公開日:2020/03/07
title.png

9th Season


#9-8 3D首振りサーキュレータ

 「#8-10 2軸カメラマウントの組み立て」の記事で組み立てたカメラマウントを使って、3D首振りサーキュレータ(Air Circulator)を作ってみようと思います。

 サーキュレータって言うのは、扇風機みたいなものですけど人間に風を当てて涼しくするのとは違って、部屋の空気をかき混ぜるのが目的の送風装置、と言う認識です。だとすると、扇風機みたいに左⇔右に首を振るだけではなくて、上⇔下にも首を振らせた方が効果が上がるはずです。
 カメラマウントのサーボ×2個を使って、少し複雑な3D首振りを実現してみようと思います。

サーボモータ制御

 「#3-4 サーボモータ」で使った、Servoライブラリを使います。今回は、制御すべきサーボモータが2個になりますので、以下(抜粋)の様に2個のインスタンスで制御します。

  #include <Servo.h>

  static Servo srvo_pan;  // srvo: pan
  static Servo srvo_tlt;  // srvo: tilt

  // servo motor
  srvo_pan.attach (pin_SRVOP, srvo_PULSE_0,srvo_PULSE_180);
  srvo_tlt.attach (pin_SRVOT, srvo_PULSE_0,srvo_PULSE_180);


 パン(pan,左右回転)、チルト(tilt,傾斜)の2個分です。
 今回使用するカメラマウントでは、パン側は0〜180°までの可動範囲でしたが、チルト側は90〜180°が可動範囲でした。いずれにしても、このままだと制御しにくいので、以下の角度座標系で制御してあります。

  パン:−90〜90°、0°で左右中央。
  チルト:0〜90°、0°で傾斜台が水平になる位置。

 パン・チルトとも、90°の下駄を履いているので、上の座標系で計算した変数(act_pan,act_tlt)を使って、以下の様にServoクラスへ指示を出します。

  srvo_pan.write (act_pan + 90);
  srvo_tlt.write (act_tlt + 90);


 次節で説明しますが、ジョイスティックでカメラマウントを制御可能な様にしますので、あまり高速に回転しない様に、単位時間(msec_ITVL)当たりの回転可能角度(srvo_MAX_SPD)を設定して、制御するようにしておきました。

  if (msec - msec_srvo_last>msec_ITVL)
  {
    int dlt;

    msec_srvo_last=msec;

    // pan
    dlt=tgt_pan - act_pan;
    if (dlt>srvo_MAX_SPD)
      dlt=srvo_MAX_SPD;
    else if (dlt<-srvo_MAX_SPD)
      dlt=-srvo_MAX_SPD;
    act_pan += dlt;
    act_pan=(act_pan<-90)? -90: (act_pan>90)? 90: act_pan;
    srvo_pan.write (act_pan + 90);

    // tilt
    dlt=tgt_tlt - act_tlt;
    if (dlt>srvo_MAX_SPD)
      dlt=srvo_MAX_SPD;
    else if (dlt<-srvo_MAX_SPD)
      dlt=-srvo_MAX_SPD;
    act_tlt += dlt;
    act_tlt=(act_tlt<0)? 0: (act_tlt>90)? 90: act_tlt;
    srvo_tlt.write (act_tlt + 90);
  }


 今あるべき、座標を(tgt_pan,tgt_tlt)で指定しておくと、現在の座標(act_pan,act_tlt)が、(tgt_pan,tgt_tlt)に向かって変位します。この時、変位量(dlt)がsrvo_MAX_SPD以下であれば、(act_pan,act_tlt)=(tgt_pan,tgt_tlt)と、追従します。srvo_MAX_SPD以上であった場合でも、srvo_MAX_SPDで(tgt_pan,tgt_tlt)に近づいて行くので、ある程度時間が経てば等しくなります。
 単位時間当たりの最大変位量(角度)を抑えてあるだけです。

ジョイスティックで操作できる

 おまけで、ジョイスティック(下図)を使って、カメラマウントを動かせるようにしてみました。

ar29_joyst.jpg

 何か、「自分で動かしている感」を体験したくて、つい(1^^;)っ。

 制御方法として、2つのモードを試してみたいと思います。以下、ジョイスティック制御仕様です。

 単に、自動的に首を振るだけではなくて、自分で制御できる手動モードがあった方が面白そうでしょ?……何に使うか?使い道あるの?って言うのは、二の次w(1^−^)w。

ファン用モータの選択

 市販のサーキュレータや扇風機は、100V ACで回る、結構パワフルなモータが搭載されていますが、今、使えるモータは精々3〜5[V]のDCモータとなります。実用的なサーキュレータを作るにはパワー不足なので、3D首振りの実験用と位置付けます。

 ともあれ、羽根を付けたDCモータを、あの、小さなカメラマウントに装着しなければなりません。いつも使っていたUSBファンがあるのだけど、大きすぎてカメラマウントには取り付けできませんでした。そこで、二代目のスタータキットに入っていた3V DCモータを使うことにします(下図)。

ar38_3vmtr.jpg

 一度、「#3-8 ブラシDCモータ」の記事で使おうとして、「モータドライバL293Dでは電圧が合わない」と断念したのですが、結局、L293Dを5Vで駆動すると、ドライバ出力が精々3Vくらいまでしか掛からないことが判ったので、L293D+3V DCモータでおおよそ定格内使用可能と判断して使用します。
 キットについていたおもちゃみたいな羽根があったので、これを装着して使います。ぺらっぺらなビニル製の羽根なので、ぶん回してもほとんど風は吹いて来ません……。まあ、気分ですね。羽根を装着することで、サーキュレータっぽくは見えます(1^^;)。

 モータドライバL293Dを使うと、ファンの逆回転とか、回転速度制御とかもできるようになりますが、プログラムとしては未対応にしておきます。メインテーマは「3D首振り」であって、ファン制御の方はおまけなためです。必要な方は各自、「#3-8 ブラシDCモータ」を参照してコードを追加してください。

※「#6-3 1/fゆらぎ扇風機」で作ったコードを取り込むと、「3D首振り&1/fゆらぎサーキュレータ」にすることもできますよ。

3D首振りサーキュレータの仕様検討

 3D首振りの方法について考察します。
 円の方程式はx2+y2=r2ですが、パラメータθを使ってx=r×cosθ、y=r×sinθと表示することができます。この(x,y)をカメラマウントのパンおよびチルト角度に適用して、空間に円(楕円)を描かせてみましょう。横方向にしか首を振らない扇風機と比べて、縦方向にも首を振ることから、「3D首振り」と称しています。

 ですが、円運動って、「空気をかき回す」と言うサーキュレータの特徴に対してはどうなんでしょうか?円運動する首振りの、中心軸上の空気はほとんどかき回されないことになります。cos,sinの周期の比を変えると、もっと複雑な動きをして、満遍なく空気をかき混ぜてくれるはずです(下図)。

ar98_lissaj.png

 これ、「リサージュ図形(Lissajous curve)」って、言うのかな?図形の上部に記載された数値が周期の比です。比が重要なので、絶対値は無視してください。32:64みたいに、サーキュレータとしてはどうなの?って思うような図形もあるので、良さそうな比を選んで使ってください(上図以外にも、無限の組み合わせがあります)。

※無理数比にすると、上図の様に閉じた曲線にならず、軌跡が少しづつずれながら四辺形領域を塗りつぶすような曲線になるそうです。

 プログラムとしては、パンとチルトの周期を1/10秒単位で指定可能にしておきました。例えば、上図の32:48のリサージュ図形で首振りさせたい場合は、パン周期を3.2秒、チルト周期を4.8秒等に設定すれば良いことになます。

回路の設計

 ほぼほぼ繋ぐだけなので、回路図をササッと引いてみましょう(↓)。

ar98_schem1.png

ar98_schem2.png

 モータ3個を駆動する必要があるので、Arduinoの5Vからではなく、電源モジュール+ACアダプタを使います(下図)。

ar26_acpow.jpg

 電流駆動能力の問題で電源は分けましたが、全て単一の5V電源と言うことで、L/S等の挿入はしていません。駆動電圧が異なるモータを使用される方は、別途電源と信号レベルの設計を行ってください。

制御プログラムの設計

 前の節で考察した仕様に基づいて作成した制御プログラムをリンクしておきます。

  制御プログラム:circula_3d.ino

 コンパイルしてArduinoへ転送すると、シリアルモニタから以下のコマンドを受け付けるようになっています。

  コマンド仕様:

実験するよね

 以下、実験中の様子です。

ar98_expr.jpg

 ATmega328P-PUと一緒に購入したU形ジャンパ線のお陰で、少し結線が楽になって見た目もスッキリしました。両脇に電源レールの引いてあるブレッドボードだと、電源やVcc/GNDに直結する端子の処理が圧倒的に楽です👍

  実験サンプル:【 】内はシリアルモニタからの送信データ
  【mod,1】
  OK: mode 1
    …… 手動モード1に設定しました。ジョイスティックで操作してみてください。

  【mod,2】
  OK: mode 2
    …… 手動モード2に設定しました。ジョイスティックで操作してみてください。

 手動モード1と手動モード2の操作感の違いに着目して見てください。夏場、机上のミニ扇風機として使う時、「ジョイスティックで風の向きを丁度良い方向に調整できる」なんて言う使い道はいかがでしょうか?

  【mod,0】
  OK: mode 0

  【fan,1】
  OK: fan 1

 自動モード0で3D首振りをしてみました。空間に円(楕円)を描くように首を振ります。

  【pan,6.4,-45,45】
  OK: pan 6.4[s] -45 ~ 45[deg]

  【tlt,9.6,0,40】
  OK: tilt 9.6[s] 0 ~ 40[deg]

 パンとチルトの周期を変えてみました。前節の図で、32:48のリサージュ図形を描くように首を振ります。

 実際に動いているところをご覧に入れましょう。



 初めて動かしてみた時、何だかちょっと、サーボの動きが怪しげでした。中華サーボだからか??900円そこそこで購入した2軸カメラマウントについてきたサーボだからね……。とりあえず、830穴ブレッドボードの電源レール(+U形ジャンパ)を使って給電したところ、電源が弱いのか動かない時がありました。
 Arduino本体のGNDからジャンパを飛ばしたら動くのだけど、何なのだか?ACアダプタ+降圧電源モジュールにしたら、そこそこ動いたので、やっぱり電流の供給能力が足りなかったのかな??ちなみに、その場合も、U形ジャンパだけでは、GNDが弱かった模様。
 そこで、回路図にあるようにパスコンを設置したところ、安定しました。動き出す時に、結構大きな電流が流れるらしいです。
 手持ちの電解コンデンサ(バリエーションが少なく、10μFと100μFのみ)を使ったので、100μF×1個にしてありますが、本来は、サーボ1個にパスコン1個を配置した方が良いと思います。その場合は、もう少し小さい容量×2個で良いかと……。最適値はわかりかねますので、動作を確認して決定してください。
 サーボのせいだと思ってしまってゴメンナサイ → サーボくん m(1__)m。


 「#8-10 2軸カメラマウントの組み立て」では、カメラマウントを組み立てただけで終わってしまったけど、ようやく動かして応用してみました。


btn_arduino.png

btn_prev.png btn_next.png

home