電子工作107 – 1個の押しボタンスイッチでUSB扇風機の回転速度を3段階に変えられる装置

Electronics Project 107 – One-Switch 3-Rotational Speed Controller for USB Fans

 

概要    Introduction

   このプロジェクトでは、DC5Vで動作するUSB扇風機の回転速度を1個の押しボタンスイッチで3段階に変えられる装置を製作した。ハードの構成の外に、マイクロコントローラ12F629の内蔵プログラムの作成にもいろいろ工夫が必要であった。

 

  In this project, I made a device that can control the rotational speed of USB fan in three stages by using a push-button switch. That is, when the power of the device is turned on for the first time, the fan stands still. But by pressing Speed changing SW (SW connected to GP0) one after another, the fan rotates at three different speeds - the low, middle and high speeds while lighting up LED1, LED2 and LED3 for the respective speeds. After that, the pressing of the same SW stops the rotation of the fan. This speed changing routine with an single SW is repeated endlessly.

The program (SpeedCtlUSBitems2LEDs.bas) written in PicBasic Pro (Basic compiler) shown below produces PWM signals for the transistor 2SD2012 which controls the supply of DC5V current to USB fan.

 

回路図   Circuit Diagram

   PIC12F629を中心に図のような構成に組み、プログラムを作成導入して動作するようになる。GP0につながるSpeed changing SW (SW)を押すとH(5V)からL(0V)に変化し、このポートからプログラムに読み込まれる。GP5からの出力はトランジスタ2SD2012に送られ、USB扇風機を回すDC5Vの電流をON/OFFする役目をする。3つのPWM出力モードを使いトランジスタのON/OFFを制御して各モードに対応する。扇風機の電源(Power SW)をONにすると、扇風機は停止したままで、Speed changing SW (SW)を押すと扇風機は最低速度で回転を始める。次にSWを押すと中速で、3回目に押すと高速で回転する。さらにSWを押すと、回転は停止する。以上の回転速度可変サイクルをSWを押す毎に繰り返す。

 

基板に組み立てた装置を蓋付のプラスチックケースに収めた。写真で、大小2つのUSBコネクタが見えるが、下がDC5Vの電源入力側、上が扇風機につながる出力側。中央部右手にトランジスタとVR2k (可変抵抗)が配置され、その下の黄色いボタンが入力SW。その左が12F629マイクロコントローラ、更に、その左手がリセットボタンである。黒いトランジスタの左手に3個の緑色LEDが見えるが、左から低速、中速、高速の位置で各々点灯する。この写真では現在「高速」の位置にあり、もう1回入力SW(黄色いボタン)を押すと、LEDは消灯して扇風機が停止する。なお、電源SW (Power SW)は電源入力USBコネクタ(下)の左側に見える。

The device built into plastic box. The upper and lower plugs are the Output and Input USB connectors, respectively.The yellow colored button is Speed changing SW. Three LEDs, shown in the upper-left hand, are LED1, LED2 and LED3 – left to right. The LED3 (high speed) is lit now.

 

プラスチックケースに収める前の基板の表と裏

 

写真のような直径14cm、DC5V 0.4AのUSB扇風機の回転速度を3段階に制御する。

 

実験中の様子  An experimental scene

 

 

結果とコメント  Comments

1)       予想通り動作する。プログラムのロジックを考えつくまで1ヶ月ほどかかった。最低速モードで、起動を確実にするために一時的(100ms)に回転速度を上げたりするところが難しかった。係数‘n’を使ったトリック上手くいった。後で分かるようにプログラムの流れを詳しく書き残した。

2)       今回は3段階に変えられるようにしたが、4、5段階と増やすには、PWM GPIO.5,xxx,100の数を増やしてやればよい。

3)       可変抵抗VR2Kの役割は釈然としないところが、中間位置の1K位でちゃんと動作するので、一応その位置で使うことにした。抵抗値の両端に近い部分への設定では正常に動作しない。

4)       USB扇風機に付けたコンデンサは必須で、無いと回転速度切替え入力スイッチは正常に動作しない。迷走する。

5)       しばらく振りで、ブログラムを作成した。いろんな関連事項を忘れてしまっていることが分かった。継続しないとダメ、実感した。

 

 

プログラム    Program

扇風機の回転速度はPWM出力で制御する。プログラムはPicBasic Pro というBasic compilerで作成されている。PWM出力を簡単に作成できるコマンドがあるので、今回はそれを使う。PWM GPIO.5, 235, 100などと書くとポートGPIO.5から235/255の割合の矩形波が出力される。235の値が小さければ小さいほど矩形波のL(0V) の部分が増え、流れる電流量は減り、扇風機の回転数は下がる。極端な話、この値が0/255 なら電流は流れない。反対に255/255に設定した場合、矩形波は全体がH(5V)になり流れる電流量は最大になり、扇風機の回転は高速になる。 プログラムの流れ: 初期設定を読み込んでから、Loopに入り、PWM GPIO.5,0,100を読み込んで、PWM出力はL(0V)を保持する、すなわち、扇風機を回す出力はない。次いで、If InputSW=0 THEN GOTO SpPWM50でInputSW(GPIO.0)からの入力を待つ、1(5V)―>0(0V)に変わったらSpPWM50に飛ぶ、そうでなければ5ms待って(キー入力を確実にするため)、Loopに戻り、入力待を続ける。 一方、SpPWM50に飛んだ場合、 まずLED1を点灯させる。Loopの下にn=0がが入れてあるのでn=n+1はn=1となり、If n=1 THEN GOSUB Startup で、サブルーチンStartupに飛ぶ。StartupではPWM GPIO.5,180,100とPause 100で、180/255のPWM出力をGPIO.5に100ms間出して扇風機を回す。終了したら元に戻ってPWM GPIO.5,120,100を実行する。ここでは120/255とPWM出力は低下して扇風機を回す。Startupを入れた理由は、最初から120/255出力では扇風機が起動しないことがあるので、一時的(100ms)に出力を上げて起動を確実にするためである。 If InputSW=0 THEN GOTO SpPWM75では入力キー待で、入力があればSpPWM75に飛ぶ、無ければn=n+1をn=1+1=2にしてLoop1に戻り、n=2+1=3になり、GPIO.5,120,100を保持し、入力キー待し、あれば SpPWM75へ飛ぶ。無ければnの数を増やして行って、n var Byteで定義された最大数255を越す(実測約1min後)と、また、1か始まりStartupにアクセせするようで一瞬(100ms)回転が増す。Loop1内では上記の動作を実測約1min毎に繰返すようで、扇風機の音を耳を澄ませて聞いていると一瞬音が変わるのが分かるが、気にならない。SpPWM75は回転速度の中速(150/255)を出力するルーチンで、動作中にキー入力があれば、SpPWM100の高速(253/255)に飛び、動作中にキー入力があればLoopに戻って扇風機へのPWM出力はゼロになり、その回転は停止する。

'***********************************************

'SpeedCtlUSBitems2LEDs.bas  2019.4.20 Worked!

'Using 12F629 and PicBasic Pro V2.50A

'3 LEDs added as indicators

'***********************************************

'Pin 1: Vdd(5V)

'Pin 8: Vss(GND)

'Pin 7: GPIO.0 - Input

'Pin 6: GPIO.1 - Output to LED1

'Pin 5: GPIO.2 - Output to LED2

'Pin 4: GPIO.3 - Reset Input

'Pin 3: GPIO.4 - Output to LED3

'Pin 2: GPIO.5 - Tr Drive Output

'***********************************************

CMCON=7  'Comparator off

InputSW var GPIO.0

TrDrive var GPIO.5

TRISIO=%001001

LED1 var GPIO.1

LED2 var GPIO.2

LED3 var GPIO.4

n var Byte  'up to 255

 

Loop:

LED1=0

LED2=0

LED3=0

n=0

PWM GPIO.5,0,100    '0 means the output to GPIO.5 is 0.

If InputSW=0 THEN GOTO SpPWM50

PAUSE 5  'ms, for solving bouncing problem

GOTO Loop

 

 

Loop1:

SpPWM50:

HIGH LED1

n=n+1

If n=1 THEN GOSUB Startup

PWM GPIO.5,120,100     '120 means the output to GPIO.5 is 120.

If InputSW=0 THEN GOTO SpPWM75

PAUSE 5

n=n+1

GOTO Loop1

 

Loop2:

SpPWM75:

LED1=0

HIGH LED2

PWM GPIO.5,150,100

If InputSW=0 THEN GOTO SpPWM100

PAUSE 5

GOTO Loop2

 

Loop3:

SpPWM100:

LED2=0

HIGH LED3

PWM GPIO.5,253,100

If InputSW=0 THEN GOTO loop

PAUSE 5

GOTO Loop3

 

Startup:  'a trick to produce an output of 180/255 to GPIO.5 for 100 ms for an easier start.

PWM GPIO.5,180,100

PAUSE 100  '100 ms

RETURN

 

END

 

'*****End of Program******

'Note:

'melabs U2 Programmer's configurations for 12F629:

'Oscillator - INTOSC, WDTE - Enable, PWRTE - Disable, MCLR - Reset, BODEN - Enable, CD - Disable, CDP – Disabl

 

 

Menu Paggeへ戻る       (Return to Menu Page)

Top of Pageへ戻る       (Return to Top of Page)