動機
4年半ほど前に購入した 光るPCファンSCYTHE KazeFlex120 RGB PWM
のRGB部は 4pin仕様なのですが、今回使用するマザーボードには、4pin RGB や ARGB のソケットがありませんでした。このため、マイコンで このファンのLEDを光らすことにしました。

時代は ARGB のようで、当ファンも 4pin RGBコントローラーも、もはや製造していないようです。
回路図
マイコンの 3.3V や 5V では、このLEDを光らすことは出来ません。また、マイコンで12Vを直接駆動することも出来ないため、MOSFETでスイッチングします。単なるON-OFF制御では 7色しか表現できないので、PWM制御して1677万色で光らせることにします。

N-ch MOSFET は、手持ちにあった 2SK4017 を使います。もちろん、12VはPCの電源(SATA電源)を利用します。
使用するマイコン
CH552P か CH32V003 を使いたいところですが、PWMが 2本しか無かったり、複数のPWM制御が面倒だったりするため、今回は RP2040 を使い、お手軽に MicroPython でプログラミングすることにします。
PWM 制御
GPIO | PWM | RGB |
---|---|---|
18 | PWM-G | Green |
17 | PWM-R | Red |
16 | PWM-B | Blue |
from machine import Pin, PWM
pwm_g = PWM(Pin(18), freq=25000, duty_u16=0)
pwm_r = PWM(Pin(17), freq=25000, duty_u16=0)
pwm_b = PWM(Pin(16), freq=25000, duty_u16=0)
データシートによると、2SK4017 のスイッチング性能は、ターンオン時間:20ns、ターンオフ時間:35ns でした。実効性能を 40ns と想定して、周波数を 25KHz に設定します。明るさ(調光)は、普通に PWM のデューティ比で指定します。
pwm_r.duty_u16(0) # red-0% (off)
pwm_r.duty_u16(25000) # red-100%
pwm_r.duty_u16(12500) # red-50%
R, G, B の各色を 256階調で指定することにより、1677万色に対応します。
def rgb(color):
R, G, B = color
pwm_r.duty_u16(int(25000 * (R / 255))) # R 256階調 (0-255)
pwm_g.duty_u16(int(25000 * (G / 255))) # G 256階調 (0-255)
pwm_b.duty_u16(int(25000 * (B / 255))) # B 256階調 (0-255)
rgb((162, 148, 200)) #ふじいろ(藤色)
import time
def map(val, lo_val, hi_val, to_low, to_high):
return (val - lo_val) / (hi_val - lo_val) * (to_high - to_low) + to_low
while True:
r, g, b = 0, 0, 0
for h in range(360):
if h <= 120:
r = map(h, 0, 120, 255, 0)
g = map(h, 0, 120, 0, 255)
b = 0
elif h <= 240:
g = map(h, 120, 240, 255, 0)
b = map(h, 120, 240, 0, 255)
r = 0
else:
b = map(h, 240, 360, 255, 0)
r = map(h, 240, 360, 0, 255)
g = 0
rgb((r, g, b))
time.sleep_ms(50)
徐々に色が変化します。

実装
上記はブレッドボード
に回路を組んで動かした動画ですが、最終的には、ユニバーサル基板
に回路を組んで、PCケース内に収める予定です。
以上