公開日:2019/06/22
title.png

6th Season


#6-3 1/fゆらぎ扇風機

 2回続いたオペアンプの探求はゆっくり進めるとして、今回は1/fゆらぎの風を送る、扇風機を作ってみます。

基本的な考え方

 今回の扇風機は、回転を始めると一定の風を送り続ける従来の扇風機とは異なり、モータの回転速度を1/fゆらぎ乱数列によって変化させることにより、送り出す風の強さに1/fゆらぎを持たせるものです。

 「1/fゆらぎ」については、「#4-6 LEDキャンドル」で解説していますので、そちらを復習してください。1/fゆらぎは、多くの自然現象に含まれており、例えば、扇風機の風が1/fゆらぎを持つことにより、自然に吹く風の様な心地良さを提供してくれるなど、自然界に暮らしてきた人間にとって、一定の効果が見込めるものと考えられます。

 と言って、ArduinoでAC駆動の扇風機を制御するのは難しいので、今回使うのはDC 5V駆動のUSB扇風機(以下USBファンと称します、例えば以下図の様な物)です。

ar38_usbfan.jpg

 このUSBファンは、「#3-8 ブラシDCモータ」の回で、L293DというモータドライバICを使って、回転方向と回転速度を制御しました。

 皆さんが真似して実験する場合、使用するUSBファンは、以下図の様にブラシDCモータの電源端子とUSBのVBUS、GNDが直結されたタイプのものであることが必要です。

ar38_usbfan.png

 USBファン自体に、速度制御や回転方向制御などがついている場合、上図の様な直結ではない可能性があります。その場合、使用する機器にダメージを与えかねないので、細心の注意を払って選定してください。

 基本的なことは、過去の2回で、既に実験済みでしたね。今回は、過去2回の実装を組み合わせるだけです。もう少し具体的に落とし込みながら解説してみます。

電源周り

 まずは、USBファンに供給する電源周りから。
 「#3-8 ブラシDCモータ」で検証した通り、L293Dを通したことによって出力電圧が低下するので、5V定格のUSBファンを、USBから供給されるVBUS(=5V)で回転させるにはパワー不足です。

 そこで、昇圧電源モジュールを購入しました(以下図)。

※既に「#5-10 電源電圧を計測する」の実験で使用しました。

ar63_stepup.jpg

 昇圧電源モジュールというのは、入力された電源電圧よりも、高い電圧を出力する電源モジュールのことを指します。今回購入したモジュールは、販売サイトのページに以下の様な仕様が記載されていました。

 いつもの如く、購入したモジュールには説明書1枚付いてこないので、読み取ることのできた情報はこれだけ。レギュレータらしき素子のマークから、XLSEMIと言うメーカ名とXL6009という型番を読み取ることができました。これで探すと、もう少し情報が得られるかもしれません。

  XLSEMI XL6009を検索する(別ウインドウが開きます)

 見つけたデータシートを見てみると、ちょっと、変です。この素子は、「入力電圧範囲が5〜32[V]」となっていて、購入ページにあった、「入力:3〜34[V]」と一致しません。
 試しに、ブレッドボード用電源モジュールから3.3Vを接続してみたところ、まず、LEDの表示はデタラメです。相変わらず、テスタを所持していないので(1^^;)、怖くて出力電圧は測定していませんが、本当に、仕様通り(入力5V以上が必要)なのでは?

※XL6009のデータシートを読む限り、「LED電圧計」の機能は持っていないようなので、3.3V入力時にLED表示が崩れるのは、別なチップの問題でしょう。しかし、肝心なレギュレータチップ(XL6009)の仕様を下回る入力電圧をモジュールとして保証できるものか??

 機会があれば(その気になったら)、もう少し検証してみたいと思いますが、今回はUSBから供給される5Vを昇圧しますので、問題は無いでしょう。

※それでも、本当に入力≧5Vが仕様なら、定格ギリギリで使うことになります……。

 もしかしたら、ArduinoとDCモータを1本のUSB端子から電源供給できるかも、知れませんが、念のため別々なUSB端子から取り出します。
 「#3-8 ブラシDCモータ」で作った、以下の治工具が使えます。

ar38_usbjig.jpg

 USBオス(M)端子の方をPCのUSBコネクタに挿して電源を取り、昇圧電源モジュール → L293D(モータドライバIC)と経由して、USBメス(F)端子の方に戻してやります。USBメス(F)端子には、さっきのUSBファンを繋ぎます。

 また、昇圧電源モジュールへはUSBファンを回す時だけ、電源を供給すれば良いので、リレー(以下図)を介して接続します(オプションです。リレーが無い場合は直結してもOK)。

ar38_relay.jpg

 リレーについても、「#3-8 ブラシDCモータ」で実験済みです。

 以上をまとめると、回路図は以下の様になります。

ar63_schem.png

モータ制御

 モータドライバIC、L293Dを使って、ブラシDCモータの回転方向と回転スピードを制御します。基本的には「#3-8 ブラシDCモータ」で作った回路の通りです。改めて回路図を引いてみると、以下図の如し。

ar63_schem2.png

 昇圧電源モジュールの出力(VOUT+/VOUT-)を、モータドライバ(L293D)のVs/GND端子に接続します。L293Dは、ブラシDCモータなら2チャンネル制御可能なので、その内の1組、OUT1とOUT2をUSB治工具のUSBメス(F)端子経由でUSBファンへ供給しています。
 従って、Arduinoで制御すべき信号線は、ENB12,IN1,IN2の3本です。他の入力端子は、気になるようならGNDに落としておいたら悪さはしないはずです。OUT3,OUT4は出力openで放置。

全体の接続確認

 上述2枚の回路図から追えるようにしたつもりですが、念のため、各モジュールの接続を確認しておきます。

Arduino 接続 制御部(L293D)
D5 IN1
D6 IN2
D9 ENB12
5V Vcc
GND GND
Arduino 接続 電源部(リレー)
D4 S
5V Vcc
GND GND
USB治工具 接続 電源部(昇圧&リレー)
USBオス(M).VBUS COM(リレー)
USBオス(M).GND VIN-(昇圧)
電源部(昇圧) 接続 制御部(L293D)
VOUT+ Vs
VOUT- GND
制御部(L293D) 接続 USB治工具
OUT1 USBメス(F).VBUS
OUT2 USBメス(F).GND
USB治工具 接続 USBファン
USBメス(F) USBオス

 回路図と上表で補完してご覧ください。

※全体回路を組み上げる前に、昇圧電源モジュールを単体で起動して、出力電圧値を調整しておいてください。USBから供給した5Vを6〜7[V]程度に昇圧すると、USBファンに十分な電力を供給できるはずです。

プログラムを組む

 次はプログラムの方に手を付けます。
 「#4-6 LEDキャンドル」で作成した1/fゆらぎ乱数列テーブルは、そのままコピー&ペーストして使い回します。Excelシートを使って作り直しても良いですが、使い回したとしても何ら不都合は無いので、時間と労力の無駄です。
 この1/fゆらぎ乱数テーブルを、適切な間隔でPWMデューティに設定(analogWrite())すると、1/fゆらぎを持った回転速度でモータが回転します。

 「#4-6 LEDキャンドル」では、millis()で適切に時間を計測して、analogWrite()でデューティを変化させましたが、今回はタイマのオーバフロウ割り込みを使って変化させてみます。割り込みを使ってPWMデューティを変化させるテクニックについては、「#5-6 正弦波を生成する」「#5-7 マイクロステップ励磁」で解説済みです。

 今回、PWMで駆動する相手が、LEDと違ってモータなので、恐らく490Hzでデューティを変化させても追従できません。
 そこで、割り込みduty_upd回に一度の割合で1/fゆらぎ乱数を更新できるように、パラメータを追加しました。以下、ISR(割り込みサービスルーチン)内の処理です。

  ISR (TIMER1_OVF_vect)
  {
    // TOI1 interrupt service routine
    uint16 dty;
    static int cnt=0;

    if (mtr_turn==0)
      return;

    // set pwm duty
    dty=pgm_read_byte (rand_1_f + idx_rand);
    dty=(duty_max*dty + duty_min*(255 - dty))/255;
    dty=(dty>255)? 255: dty;
    analogWrite (pin_MTENB, dty);
    // update rnd index
    cnt++;
    if (cnt>=duty_upd)
    {
      cnt=0;
      idx_rand++;
      if (idx_rand>=max_rand_1_f)
        idx_rand=0;
    }
  }


 上のコードで、idx_randという変数が、1/fゆらぎ乱数テーブルの読み出しポインタなので、割り込みduty_cnt回に一度の頻度で更新されていることがわかると思います。

実験

 残りの部分は、完成したプログラムでご確認ください。

  完成版プログラム:fan_1_f_fluc.ino

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

 L293DのDCモータドライバブロックは、170穴ミニブレッドボード上に構築しました。それ以外は、既成のモジュールの組み合わせですので、ジャンパ線等を使って接続します。実験中の様子は以下の通りです。

ar63_expr.jpg

 忘れてました。組み込んで実験を開始する前に、昇圧電源モジュールを単体で動作させて、出力電圧を調整しておいてください。
 「#3-8 ブラシDCモータ」で実験してみた通り、L293Dを通すと出力電圧が低下してしまうので、その分あらかじめ昇圧してからL293Dに供給する、と言うのがそもそもの発端です。以前の実験結果では、6〜7[V]程度に昇圧するのが良さそうでした。

  実験サンプル:【 】内はシリアルモニタからの送信データ
  【fan,1】 …… USBファンが1/fゆらぎで回転します
  OK: fan turn right
  【duty,192,192】 …… USBファンが一定のスピードで回転します
  OK: duty 192~192 (x1)
  【duty,64,255,4】 …… 1/fゆらぎ乱数の更新間隔が伸びます
  OK: duty 96~255 (x4)

 1/fゆらぎの場合と一定スピードの場合で風の吹き方が変わるのを確認して下さい。
 また、デューティを小さく設定しすぎると、パワー不足に起因するトルク不足で、モータが回転しなくなってしまいます。昇圧電源モジュールから供給する電圧値との関係で、実験条件によってデューティの下限値は異なるので、各自適切な範囲を確認の上、ご使用ください。

 ちょっと、見た目でわかるかどうか?USBファンを1/fゆらぎで回転させた時と、一定速度で回転させた時を並べて動画にしてみました。



 どちらが1/fゆらぎで回転させたものか、わかりましたか?答えは、動画の中で表示してあります。
 USBファンの前方にビニル紐を細かく裂いたものを配置して、風の強さが見えるようにはしてみたのですが、一定速度で回転させたとしても、吹く風自体には多少強弱が付くため、単に2つを並べた状態で、「どっちが1/fゆらぎでしょう?」と、質問されると、明確な差は見えないかな……w(1x_x)w。

 答えを知ってから改めて見てみると、確かに1/fゆらぎの方が、ビニル紐が上に行ったり下に行ったりする振れ幅が大きいことがわかります。→皆さんの目で確認してみてください。

今回のお買い物

 回路を構築するために必要だったのは、昇圧電源モジュール(DC-DC)だけ、だったのですが、実際の回路とは無関係な、スペーサなどの周辺備品に意外とお金がかかってしまいました……。


 ただ、170穴ミニブレッドボード(5個セット)は、すごく便利です。ちょっとした小さな回路でも、毎回部品ケースをひっくり返しながら組み上げるのは面倒なのですが、5個セットなので、そんな「ちょっとした小さな回路」を、崩さずにそのまま置いておけます。使いたくなった時にさっと出して使うだけ、と言う使い勝手はたまりません。


btn_arduino.png

btn_prev.png btn_next.png

home