ソロでたのしむ

キャンプ、電子工作、DIY、乗り物などの趣味を紹介

人の動きに同調する1/fゆらぎのつくりかた。USB扇風機を改造してみます(動画あり)

USB扇風機を癒しの1/fゆらぎ風に改造して、パソコン前スペースを快適化

空調の効いた屋内でも、いつも風を感じていたい!ので、パソコンのUSB端子を電源とする小型扇風機を使ってみる事にしました。

せっかくなので、自然風のような1/fゆらぎの風を感じられるように改造してみます。

1/fゆらぎについて

1/fゆらぎとは、振幅が周波数 f に反比例する波の集合波形です。

ゆらぎは平均値からの変動幅なので、周波数が小さい、ゆっくりとした波の成分ほど大きく変動するという意味になります。

人体も1/fゆらぎをしていて、周りの1/fゆらぎ を感じると、共鳴して精神安定などの効果があると考えられています。

USB電源のミニ扇風機

改造ベースとなる扇風機は、しっかり風を感じられて静かなものを選びます。

飛行機でSBも採用例がある二重反転プロペラ(コントラペラ)で、効率よく空気を押し出すものが良いようです。

たまたま、実際に使っている人のパソコン前を、静かなので扇風機に気付かずに通った時に、予想外の風量に驚かされたこともあり、写真の二重反転プロペラを持つ扇風機を選びました。

f:id:solocamptouring:20180719045658j:plain

リズム時計製のコントラペラ扇風機で、他にも「くまのプーさん」や「ミッキー」をデザインモチーフとしたバージョンもあります。

私は、一番安かったオーソドックスな形の薄紫色をチョイスしました。

この扇風機は、風量をハイ/ローの二段階に切り替えられます。

ローはそのまま使えるようにして、ハイに切り替えると1/fゆらぎの風になるように改造します。

Arduino と赤外線センサーで1/fゆらぎをつくる

1/fゆらぎの風は、扇風機と人との距離に応じて変動するようにします。

基本は、距離が

  • 近いと弱風
  • 遠いと強風
  • さらに遠いと停止(OFF)

にします。

赤外線センサーは、正面の平面体に対しては安定して距離を測れますが、服などの凹凸物に対しては少しばらつきがある測定結果になります。

これを逆手にとって、ばらつきが

  • 大きい時は、ゆっくり風量を変える
  • 小さい時は、早く風量を変える

ことで、1/fゆらぎの風をつくります。

これをモーターの回転数を変化させて実現するために、Arduinoを使って赤外線センサーで計測した扇風機前のもの(人)との距離から、モーターの目標スピードと、目標スピードに変わるまでの時間を決めて、PWM制御のパルスで出力します。

PWM(Pulse width modulation、パルス幅変調)は、電圧一定で、周期も一定のパルス波形です。このパルスを電源に使いつつ、ONパルスの幅を変える(=デューティ比を変える)と電圧の平均値が変わるため、結果として電圧を変えた時と同じ効果があります。

Arduino を使う回路

回路図は、Fritzingで作成しました。

f:id:solocamptouring:20180722133259j:plain

赤外線センサーGP2Y0E02Aの接続

シャープの、赤外線式の測距モジュールGP2Y0E02Aには、4本の端子があります。

  1. VDD(3.3V電源)
  2. GND
  3. Vout(出力)
  4. GPIO1

1番はArduinoの3.3Vに、2番はGNDに接続します。

3番のVoutは、電圧で距離情報を返してくるので、Arduinoのアナログピン(回路図ではA3ピン)に接続します。

4番のGPIO1は、電圧がVDD付近であれば計測、GND付近であればスタンバイ(計測しない)モードとなります。Arduinoのデジタルピン(回路図ではD5ピン)からの5V信号を、抵抗3個とダイオードで約3.3Vに減圧して接続します。

赤外線センサーGP2Y0E02Aの接続(USB扇風機の癒し改造)

モーターの接続

PWMで速度を変えるため、Arduinoのデジタルピン7からパルス信号を出力します。

パルス信号はトランジスタのベースに送ってスイッチングして、モーターに電流供給します。

パルスがLOW(0V)の時に、モーターの逆起電力からトランジスタを守るために、ダイオード(D1)を、モーターと並列に使用します。 

トランジスタとベース抵抗値の計算

トランジスタ2SD882を使う回路設計

使用するUSB扇風機は、商品説明によると定格電流210mAです。

トランジスタは、余裕を持って作動させられる2SD882を使います。

  • Ic=210mA
  • hFE=100倍
  • VBE=0.8V

の値を使って、ベースに接続する抵抗値を求めます。

RB=(5-0.8)/(0.21/100)=2000Ω

2000Ωの抵抗RBを使用して、トランジスタのベースとArduinoのデジタルピン(D7)を接続します。 

作動を安定させるため、抵抗RBと平行にコンデンサを、またトランジスタのBE間に抵抗を入れておきます。

扇風機から、そのまま使う電子部品

f:id:solocamptouring:20180719050203j:plain

使用するUSB扇風機の、ハイ/ロー切り替えの元回路は、

  • ハイ側: 電源は、2個の直列配置モーターに直接供給
  • ロー側: 2個の定電流ダイオード(直列)を通して、2個の直列配置モーターに電源供給

となっていました。

ロー側の定電流ダイオードは、電源のプラス側からマイナス側に移設して、そのまま使います(回路図では、2個をまとめてD4と記載)。

スイッチをハイ側に切り替えると、Arduinoの電源が入り、トランジスタを通してPWMでモーターを駆動するように、回路を作ります。

USB扇風機にArduinoを搭載して、癒しの1/fゆらぎ風に改造

1/fゆらぎ扇風機のスケッチ(プログラム)

1/fゆらぎのつくりかた

赤外線測距センサーで計測した距離は、100回測定した平均値を使います。

得られた距離に応じて、

  • 5〜60cm: PWMのデューティ比を50%〜100%に変化
  • それ以外: 停止

として、目標速度と、そこに到達するまでの時間を設定します。

また、目標速度に到達するまでの間も距離を測定して、その時点におけるデューティー比のゆらぎ(計算値と、距離測定値から置き換えた数値の差を1/3したもの)を変化量として瞬時に加えます。

デューティー比のゆらぎが負(マイナス)の場合は、数値に応じて短い間、電源を遮断して即答させます。

距離が60cmより遠い場合は、人(私)が扇風機前から席を外したと判断して停止し、以後1秒毎に距離測定して、人が戻ってきたら再開します。

USB扇風機をArduinoで改造

スケッチの紹介

int trigPin = 5;
int pwmOutput = 7;
int distResult = 0;
long distA = 0 ;
int i = 0 ;
int j = 0 ;
int frequencyWindChange = 0 ;
int speedOutput = 0 ;
int speedCurrent = 50 ;
int speedNowTarget = 50 ;
int speedOldGoal = 50 ;
int speedGoal = 50 ;
int speedAdjust = 0 ;
int speedAdjustParameter = 3 ;

void setup() {
pinMode(trigPin, OUTPUT); 
pinMode(pwmOutput, OUTPUT); 
delay (100);
digitalWrite(trigPin, HIGH);
}

void loop() {
  
     long voltAns ;
     voltAns = IDMread(3)  ;           // アナログピン3番のセンサーの値を読込む
     long distAns1 = map(voltAns,0,1023,0,500) ; // 電圧値に変換する(0から5V)
     long distAns2 = map(distAns1,55,220,50,4) ;  // 電圧値から距離に変換する(0.55から2.2Vを50から4cm)
     int distResult = distAns2; 

  if(distResult > 60){
  analogWrite(pwmOutput, 0) ;
  speedOldGoal = 50 ;  
  delay(1000) ;
  }else{
  speedGoal = map(distResult,0,65,50,100) ;
  frequencyWindChange = abs(speedGoal - speedOldGoal) ;

    for (j=0 ; j < frequencyWindChange; j++) {
   speedNowTarget = speedOldGoal + (speedGoal - speedOldGoal)/frequencyWindChange*j ;

      
    long voltAns ;
     voltAns = IDMread(3)  ; 
     long distAns1 = map(voltAns,0,1023,0,500) ; 
     long distAns2 = map(distAns1,55,220,50,4) ; 
     int distResult = distAns2; 
     
     speedAdjust = (map(distResult,0,65,50,70) -  speedNowTarget)/speedAdjustParameter ;
     speedOutput = 255*(speedNowTarget + speedAdjust)/100 ;
     if(speedAdjust < 0){
      analogWrite(pwmOutput,0);
      delay(70*abs(speedAdjust));
     }
     analogWrite(pwmOutput,speedOutput);
     delay(200);
     } 
     
   speedOldGoal = speedGoal ;  
  }
}

// 赤外線測距モジュールから読み込む処理
int IDMread(int PinNo) {
     distA = 0 ;
     for (i=0 ; i < 100; i++) {
          distA  = distA + analogRead(PinNo) ;   // アナログピンから読取る
     } 
     return distA/100 ;                        // 100回の平均値を返す
}

癒しの風を感じてみます

扇風機のプロペラ回転数は細かく変動しています。時々、自然に風のような、ゆっくりとした大きな変動もあり、1/fゆらぎらしくなっています。

回転数に応じてプロペラの残像が刻々と変化するので、ぼ~っと見ていても飽きません。

また、席をはずして戻ってきた時には、停止状態から自動で動き始めるので、「おかえり!」と言われたようで、少し幸せな気持ちになります。

youtu.be

ちょっとした改造ですが、Arduinoと測距センサーを使うことで、オフィスなどの密閉された屋内空間でも、自然のような風のそよぎを感じる事ができて、眠気を誘うほど快適になります。