ARGB PC ファン を MicroPython で光らす

# ARGB ファン

[<img width="200" alt="" src="https://www.thermalright.com/wp-content/uploads/2022/12/4-2.jpg" />](https://www.thermalright.com/product/tl-c12cw-s/)

ARGB の PCファンは各社から様々なタイプが販売されています。
その中で、今回使用したファンは、お手軽な価格で購入できる ↓この ファンです。

Amazon；[Thermalright TL-C12CW-S 3個組1689円](https://www.amazon.co.jp/dp/B0BS5L1BC3)

ファンの種類により フルカラーLED の配置や個数は変わってくると思われますが、このファンは、ブレードの枚数と同じ 8個のフルカラーLED がブレードの根元に配置されているタイプです（LED自体は回転しません）。

ファン自体は 12VのPWM方式の4ピンで制御しますが、ARGB は5Vの3ピンで制御します。ファンを回すことと、ARGB を光らすことは 独立して制御する必要があります。

_なお、12Vの4ピンRGBとは、電圧も制御方法も まったく異なり互換性がありません。_

- 関連記事1：[12V 4pin RGB LED をマイコンで制御](https://qiita.com/nak435/items/f567c6d9e85555f8d91e)
- 関連記事2：[PC用のPWMファンを回す](https://qiita.com/nak435/items/d6e307bdb403f2de73d8)


## 3ピン仕様ARGB

![argb_3pin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/40d9199f-9fe3-34bd-d3ba-ab19e89ebd4a.png)

ARGBの（マザーボードに接続する側の）コネクタは上記の様なメス型の形状です。

<img width="200" alt="argb-Types.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/44500998-45ba-cc5d-dad9-e27fe15b115d.png" />


マザーボード上のARGBヘッダーは 上記の様な配列で、コネクタの『矢印マーク』が『5V』側になります。_なお、逆向きには挿さらないピン配列になっています。_


# ARGB とは

アドレッサブルRGB の略で、ディージーチェーン接続した複数の RGB LED の、一つ一つを個別の色で光らせることができる マイコン内蔵の RGB LED です。マイコン界隈で有名な [NeoPixel](https://www.adafruit.com/category/168) と同等のフルカラーLED（シリアルLED）です。（ _[NeoPixel は Adafruit の商標](https://www.adafruit.com/trademarks)_ ）


冒頭で触れましたが、今回使用するファンには ディージーチェーンによる 8個のフルカラーLEDが内蔵されていて、さらに、このファン同士を複数接続することができます。
試しに2つのファンをつないでみましたが、ファン同士はシリアル接続ではなく、パラレル接続でした。つまり、複数のファンを接続した場合は、すべてのファンは同じ光らせ方しかできません。

_ファンを分解して Data Out ピンを引き出せば、ファン間のシリアル接続もできると思います。_


## MicroPython で光らす

勘が良い方なら もうお分かりだと思いますが、MicroPython には 最初から [NeoPixel](https://micropython-docs-ja.readthedocs.io/ja/latest/esp8266/tutorial/neopixel.html#controlling-neopixels) 制御モジュールが組み込まれているため、それを利用するだけです。

次のようなコードで ARGB を簡単に光らすことができます。

```python:MicroPython＜8個のLEDを順に点灯＞
from machine import Pin
from neopixel import NeoPixel
import time

np = NeoPixel(Pin(16), 8)

for n in range(64):
    np[(n-1)%8] = (0, 0, 0)
    np[n%8] = (0, 255, 0)
    np.write()
    time.sleep_ms(500)
```

![mov1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/8d6deaa2-1137-9018-f783-426eb601b90d.gif)

<br>

- グラデーションで変化させてみました

```python:＜グラデーション点灯＞
from machine import Pin
from neopixel import NeoPixel
import time

#https://tori29.jp/blog/export_17
#def hsv_to_rgb(h, s, v):

np = NeoPixel(Pin(16), 8)

for n in range(8):
    np[n] = hsv_to_rgb(359, 1, 1)
np.write()
for r in range(360):
    np[r % 8] = hsv_to_rgb(r, 1, 1)
    np.write()
    time.sleep_ms(100)
```

![mov4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/4cf9d6f9-3e8f-4bd7-b579-e59293de37d4.gif)

（ _肉眼では綺麗に光って見えているのですが、動画ではなぜか中央が真っ白です。_ ）

`hsv_to_rgb()`は、次のサイトのコードを丸々利用させていただきました。

https://tori29.jp/blog/export_17

<br>

- グラデーション＋補色を逆回転させてみました

```python:＜グラデーション＋補色を逆回転＞
from machine import Pin
from neopixel import NeoPixel
import time

#https://tori29.jp/blog/export_17
#def hsv_to_rgb(h, s, v):

def complementary_color(color):
    r, g, b = color
    mix = min(r, g, b) + max(r, g, b)
    r, g, b = mix - r, mix - g, mix - b
    return (r, g, b)

np = NeoPixel(Pin(16), 8)

for r in range(360):
    color = hsv_to_rgb(r, 1, 1)
    for n in range(8):
        np[n] = color
    np[7 - (r % 8)] = complementary_color(color)
    np.write()
    time.sleep_ms(100)
```

![mov3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a19b90d3-eb26-b707-3b64-584363f9e118.gif)
↑ _クリックして、別タブ（別ウィンドウ）で見てください_


<br>

12V 4pin RGB LED に比べ、5V ARGB を光らすことは とても簡単です。
以前作成した『[CPU使用率に応じてRGB LEDの色を変化させる](https://qiita.com/nak435/items/a247da43db5a3899ee50)』を、こちらのファンで再構築してみようと思います。

---

:::note warn
多数の ARGB を マイコンで光らす場合の注意点

PC の USB ポートの VBUS は、USB2.0ポートで 500mA、USB3.0ポートで 900mA 程度の電流しか取り出せません。そのため、数十、数百の LED を同時に点灯させる場合は、PSU から直接 5V を給電する必要があります。

_物の本によると、0.5A で LED 約8個、0.9A で 約14個、1A で 約16個、2A で 約33個 とありましたが、保証数ではありません。_ 自己責任で容量算出しましょう。
:::

**以上**