PCファン扇風機(そよ風機能付き) ラズパイpico

PCファン扇風機の製作記録です。

ラズパイpicoでPWM制御し、定速回転とランダム変数でそよ風機能を付けました。


Youtubeリンク

https://youtu.be/xo4L9hSoTp4


ダクトを付けて風の直進性を上げ、ファンの回転数を下げて低騒音化しました。


ダクトは蓄光PLAフィラメントで3Dプリント。
暗闇で怪しく光ります。


配線はごちゃごちゃ。



今回使用したPCファンは4pin仕様でPWM信号で直接制御できるものです。

PCファンには他に2pin(+-)、3pin(+-と回転数出力pin)がありますが、これらの回転数を変更するには電圧を直接可変抵抗等で変えるか、MOSFETを介してPWM制御する必要があるので気を付けてください。

電気効率は電圧変更よりPWM制御の方が優れるようですが、まあ、PCファンを1個、扇風機にしたところで電力なんてたかが知れてるので日常生活では誤差でしょう。


PCファン扇風機の配線図




制御はラズパイpico。
電源はUSBでいらないUSBケーブルをぶった切って使ってます。
電源をUSBにしておけば、PCでもモバイルバッテリーでも使えます。
ヒューズはガラス管ヒューズの0.75Aが無かったので1Aにしました。
電源スイッチはLED照光付きなので配線が増えてます。
DC-DC昇圧コンバーターでDC5VをDC10Vに昇圧してます。
トグルスイッチで定速運転とそよ風運転を切り替えます。
ロータリーエンコーダーでファンの回転数を変更します。
PCファンは12V仕様ですが、12Vで使ってもうるさいだけなので10Vにしました。


PCファン扇風機のプログラム
Thonnyにコピペすれば動きます。

# そよ風機能付きPCファン扇風機
from machine import Pin, PWM
import time,random

#PWM Pinの指定
pwm = PWM(Pin(2))
pwm.freq(25000)#周波数

#Switch
switch1 = Pin(16, Pin.IN, Pin.PULL_DOWN)
switch2 = Pin(17, Pin.IN, Pin.PULL_DOWN)

#ロータリーエンコーダーのA,B端子 プルアップ
pinA = Pin(20, Pin.IN, Pin.PULL_UP)
pinB = Pin(21, Pin.IN, Pin.PULL_UP)

#回転方向判定初期値
befDat = 0x11
curDat = 0
count = 0
D = 0

#duty比の増減値
dutynum=5

#回転方向判定
def watchRotation(p):
    global curDat
    global befDat
    global count
    global direction
    global dutynum
    
    curDat = pinA.value() + (pinB.value()<<1)
    if curDat != befDat:
        D = ((befDat<<1)^curDat) & 3
        if D < 2:
            count = count + 1
        else:
            count = count -1
            
        befDat = curDat
        
        if count >= 3:
            print('ASC')
            direction = dutynum
            count = 0
        elif count <= -3:
            print('DESC')
            direction = -dutynum
            count = 0

#directionからduryを計算する
def getDuty(duty, d):
    duty += d
    #上限加減を設定する
    if duty > 100:
        duty = 100
    elif duty < 0:
        duty = 0
    return duty

#ロータリーエンコーダーの割り込み設定
pinA.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler = watchRotation)
pinB.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler = watchRotation)


#初期値
duty = 0
direction = 0

while True:
    
    #ロータリーエンコーダーの回転からduty比を計算
    if direction != 0:
        duty = getDuty(duty, direction)
        print('duty =' + str(duty))
        direction = 0    #dirctionのクリア
    
    #速度変更(duty比を変更)
    if switch1()==1:
        pwm.duty_u16(int(65535*duty/100))
        time.sleep(0.01)#回転数変更までの間隔
        
    #そよ風(ランダム値でduty比を変更)
    if switch2()==1:
        x=random.random()
        x=x*duty/100
        pwm.duty_u16(int(65535*x))
        time.sleep(0.2) #ランダム値変更までの間隔




参考ページ















コメント