怠惰になるために本気出す

電子工作で色々作ってます

USB扇風機におやすみタイマーとゆらぎ風を作ってみた

夏ということで扇風機を使うようになったのですが、安物のUSBタイプの扇風機なので弱と強の二択しかない貧弱なやつなのでずっと扇風機にあたっていると体が冷えるし、かといって扇風機を回していないと暑いのでどうにかならないかと思っていました。

「鳴かぬなら鳴かせてみようホトトギス」信長さんもなんて言うし「ないのなら作ってみせようリズム風」ということで作りました。せっかくなら車中泊する際に体が冷えすぎないようにおやすみタイマーもつけておいて汎用性を高くしたいと思います。

私が持っている扇風機は扇風機側のスイッチを入れた状態で電源(USB)を接続すると勝手に動き出すタイプ(ハードスイッチ)なので、USBを抜き差ししたらリズム風はできます。が、手動でやるには限界があるのでこの作業をマイコンにやらせる形です。(扇風機自体にマイコンが使われているものに対しては使えません)
マイコンの出力電流は最大で40mAに対して扇風機の最大電流が700mAなので、直接つなぐと扇風機がマイコンから過剰に電流を引き出そうとするため、最悪マイコンを壊しかねません。そこで活躍するのがmosfetと呼ばれる部品で別電源をマイコンの出力でON/OFFのスイッチングを行います。
deviceplus.jp

回路図

今回作成するリズム風用の回路図です。
回路図ではトランジスタになっていますが、実際はNch MOSFETを使用しています。
回路図上の抵抗は全てプルダウン抵抗です。


必要なもの

・DC5Vの扇風機(後述) 当時Amazonで1700円ぐらい

・延長ケーブル CanDo110円

マイコン
ELEGOOから販売しているarduino nanoの互換機を当時一個500円ぐらいで購入したのですが久しぶりに見たら販売ページ自体がなくなってました。
ちょっと高いですがarduino nanoでいいと思います。


・タクトスイッチ
(電源ON/OFF、リズム風ON/OFF、おやすみタイマー切替用のスイッチ)
3Pトグルスイッチ 1回路2接点 パネル取付用: パーツ一般 秋月電子通商-電子部品・ネット通販
3Pトグルスイッチ 中点OFF付 1回路2接点 パネル取付用: パーツ一般 秋月電子通商-電子部品・ネット通販

・抵抗10kΩ (プルダウン抵抗用)
カーボン抵抗(炭素皮膜抵抗) 1/4W10kΩ (100本入): パーツ一般 秋月電子通商-電子部品・ネット通販

マイコンを覆う物 家に転がっていた容器

・nch mosfet
NchパワーMOSFET 30V5.7A AO3400A (10個入): 半導体(モジュール) 秋月電子通商-電子部品・ネット通販

充電器(ハードオフで適当に購入)
今回使用する扇風機は最大700mAなのでApple製(5V 1A)の充電器を使用

ハード作成

まずは配線等のハード側から作っていきます。
延長ケーブルはケーブルの中間ぐらいで切ります。オス側のケーブルは充電器からマイコンへの電源供給用、メス側はマイコンから扇風機への電源供給用として使います。
一番外側の被覆を向いたらわかるのですが、中には4本の線が入っています。4本中2本がデータ通信用のプラスとマイナス、残りの2本が電源供給用のプラスとマイナスとなっています。今回データ通信はしないので電源供給用の赤色(プラス)と黒色(マイナス)を使用して分岐させてマイコンと扇風機に電源供給していきます。


ハード完成

ソフトはあとからどうにでもなるしとりあえずハードから作ろうと見切り発車したおかげで非常にブサイクになりました。
当初の予定ではトグルスイッチを切り替えたときに即時出力が切り替わるようにしようと思っていました。が、外部割込みが行えるピンがD2及びD3のみでしか使用できないようで、それを知らずにソフトを後回しにして適当に入力ピンを選んでいたせいでハードも作り直しという最悪の展開になってしまいました。しかも外部割込み関数の上手な使い方がわからず結局普通のデジタルピンとして使用しているので本当に無駄骨でした。

ソフト作成

無駄の結晶に入っているソフトです。

int rism, t1, t2, tm1, tm2, timer1, timer2;
int t=0;
int out=11;

void setup(){
  pinMode(out, OUTPUT); //出力ピン
  pinMode(2,INPUT); //タイマー1入力
  pinMode(3,INPUT); //タイマー2入力
  pinMode(5,INPUT); //リズム風用入力
}

void loop(){
  t1=digitalRead(2);
  t2=digitalRead(3);
  if(t1==HIGH && t==0){ //タイマー1がON
    timer1=10799; //タイマー1に10799秒(3時間)
    while(tm1<=timer1){
      if(digitalRead(5)==HIGH){
        Rism();
      }else{
        Normal();
      }
      if(tm1==timer1){ //タイマーが満了時
        t=1;
      }
      tm1=tm1+1;
      if(digitalRead(2)==LOW){
        tm1=0;
        break;
      }
    }
  }else{
    if(t2==HIGH && t==0){ //タイマー2がON
      timer2=21599; //6時間
      while(tm2<=timer2){
        if(digitalRead(5)==HIGH){
          Rism();
        }else{
          Normal();
        }
        if(tm2==timer2){  //タイマー満了時
          t=2;
        }
        tm2=tm2+1;
        if(digitalRead(3)==LOW){
          tm2=0;
          break;
        }
      }
    }else{
      if(t1==LOW && t2==LOW){ //通常時
        t=0;
        tm1=tm2=0;
        if(digitalRead(5) == HIGH){
          Rism();
        }else{
          Normal();
        }
      }else{ //タイマー満了時OFF
        if(t1==HIGH && t==2){
          t=0;
        }else{
          if(t2==HIGH && t==1){
            t=0;
          }else{ //タイマーが正常に終了
            digitalWrite(out,LOW);
            delay(200);
          }
        }
      }
    }
  }
}

void Normal(){
  digitalWrite(out,HIGH);
  delay(10000);
}

void Rism(){
  digitalWrite(out,HIGH);
  delay(7000);
  digitalWrite(out,LOW);
  delay(3000);
}


動作確認がこちら↓
youtube.com


ソフトを読み込むとわかるのですが、リズム風ON/OFF時それぞれ10秒サイクルで回っているのですが、10秒経過しないとトグルスイッチの状態を読み取ってくれない仕様となっています。これが製品だったらクレームいれるレベルですが、切り替え時間が早くなったところで劇的に涼しくなるわけでもないですしこれを使うのは私自身だけで困らないのでヨシッ!!
当初の予定では市販の扇風機と同じように風量のボタンを押すと即時「リズム風のON/OFF」や「タイマーON/OFF」が切り替わる、という感じのソフトにしたかったのですが、技量が足りずにできませんでした。外部割込みを使っていけるかも?と作ってみたものの市販の扇風機の廉価版のような動きしませんでした。
これ以上改善できる気がしないので試行錯誤した残骸を本記事の最下部に載せておきます。一応動きはしますが挙動不審です。(分かる方いらしたら教えてください)



と、しばらくほったらかしにしていたのですが後日やる気スイッチが入りソフトを修正しました。
iotblog5296.hatenablog.com

終わりに

トランジスタmosfetの勉強を学生の頃していたはずなのですが、綺麗さっぱり忘れていて非常に勉強になりました。
学生の頃は座学ばかりで実地がなく、勉強している部品がどのような場面で使われているか想像が全くつかず講義がお経にしか聞こえなかったあの頃。自分で回路を組みだすと、進研〇ミみたいに「あ!これ授業でやった計算だ!」とこれまでの知識が数年越しに開花してちょっと嬉しくなりました。

トランジスタは電化製品のいたるところで使われているので今後は電子工作に多用していきたいところです。

参照:

DCモーターをArduinoUnoで動かしてみる(その1) by R_Castle | elchika



外部割込み関数を使おうと試みた残骸