ArduinoでNeoPixelを光らせてアイアンマンのアークリアクターもどきを作る

# 概要
アイアンマンのアークリアクターのようなものが作りたくてリング状のLEDを探してたところNeoPixel なるものがあったのでArduinoでアイアンマンのアークリアクターのように光るように実装しました。
# 目次
- [実行環境](#実行環境)
- [環境構築](#環境構築)
- [コード](#コード)
- [コードの解説](#コードの解説)
- [実行結果](#実行結果)
- [おわりに](#おわりに)
# 実行環境
- Windows OS PC
- Arduino IDE
- NeoPixel ws2812b 16素子タイプ
↓これと同じ種類のNeoPixelを千石で購入しました。
https://eleshop.jp/shop/g/gJ1H311/?srsltid=AfmBOoqrEuSVWNdiHl3rXJbf24vSgxJx28xUjr_paLn0qgOz5wbBH688
- 抵抗 10kΩ


### NeoPixelをArduinoで使用する場合の接続例
ArduinoでNeoPixelを使用するにあたって以下のサイトを参考にしました。
https://www.marutsu.co.jp/pc/static/large_order/WS2812B_0124?srsltid=AfmBOooFLz6-bT2ulVaOjO6KqFeYUQzO68GFqPvw8GluUPo9MwM-pBm8

NeoPixel WS2812Bのリングモジュールには以下の4つのピンがあります。
	•	5V: 電源ピン（5V）。Arduino UnoやRaspberry Piの5Vピンに接続します。
	•	GND: グランドピン（GND）。Arduino UnoやRaspberry PiのGNDに接続します。
	•	DI (Data In): データ入力ピン。ArduinoやRaspberry Piから制御信号を送るピンに接続します。
	•	DO (Data Out): データ出力ピン。次のLEDリングや他のデバイスを接続する場合に使用します。今回は使用しません。

 今回はNeoPixcelを以下のようにArduinoのピンに接続します。
	•	5V → Arduino Unoの5Vピンに接続
	•	GND → Arduino UnoのGNDピンに接続
	•	DI → Arduino Unoのデジタルピン（例: D6）に10kΩの抵抗を挟んで接続
	•	DO → 未接続（次のLEDに繋げる場合はここに接続）
 抵抗に関して、LEDの故障を防ぐために抵抗を挟んでLEDに流れる電流を制限します。今回はAdruinoのD6ピンとNeoPixelのDIピンの間に抵抗を置きます。
![NeoPixcel_arduino_bb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/1736c7da-3170-1044-25a2-048a884828db.jpeg)



# 環境構築
今回はArduino IDEで
NeoPixelを使用するためのIDEでの環境構築方法について説明します。
- ライブラリのインストール方法
1. まずは左上のメニューバーにある「ツール」を選択し「ライブラリを管理」を選びます。
2. そこから「neopixel」と入力すると「Adafruit NeoPixcel」のライブラリが表示されます。
3. ここのインストールボタンを押して、ライブラリをインストールします。
![スクリーンショット 2024-11-20 201432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/7ef84eef-cf25-4c62-cc60-82ed22a4ea8a.png)
- サンプルプログラムの実行
1. メニューバーの「ファイル」から「スケッチ例」を選択します。
2. スケッチ例から「Adafruit NeoPixel」を選び、「simple」のプログラムを開きます。
![スクリーンショット 2024-11-20 201446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/9b8ec544-7307-909b-f32c-4d8cf2cf138a.png)




# コード
以下のコードは、スケッチ例にあったsimple.inoのコードです。

```c++:simple.ino

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// Released under the GPLv3 license to match the rest of the
// Adafruit NeoPixel library

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

// Which pin on the Arduino is connected to the NeoPixels?
#define PIN        6 // On Trinket or Gemma, suggest changing this to 1

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 16 // Popular NeoPixel ring size

// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels

void setup() {
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.

  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}

void loop() {
  pixels.clear(); // Set all pixel colors to 'off'

  // The first NeoPixel in a strand is #0, second is 1, all the way up
  // to the count of pixels minus one.
  for(int i=0; i<NUMPIXELS; i++) { // For each pixel...

    // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255
    // Here we're using a moderately bright green color:
    pixels.setPixelColor(i, pixels.Color(0, 150, 0));

    pixels.show();   // Send the updated pixel colors to the hardware.

    delay(DELAYVAL); // Pause before next pass through loop
  }
}

```
# コードの解説
自分でArduinoに実装する際に気を付けるべき点について紹介します。
- ピンの設定
どのピンをArduino Unoに接続するかを定義しています。今回はArduinoのD6に接続します。
```
#define PIN 6 
```
- NeoPixelの素子の数の決定
NeoPixelのLEDをいくつArduinoで制御するか、接続するかを定義しています。
```
#define NUMPIXELS 16 
```

## コードの改良
先ほどのサンプルプログラムを改良します。リング状のNeoPixcelLEDを使ってアイアンマンのアークリアクターを再現したいと思います。１つの素子が一定時間光ります。一定時間を過ぎると光っていた素子を暗くし、隣の素子を明るくします。その動作を一周するたびに素子の光る時間を短くします。すると周期が短くなり、周期が一定を超えると、全ての素子が光るというものになっています。

```c++:remake.ino
#include <Adafruit_NeoPixel.h>

#define PIN 6           // Pin connected to DI of the LED ring
#define NUMPIXELS 16    // Number of LEDs in the ring

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int brightness = 10;    // Starting brightness level
int delayTime = 200;    // Starting delay for the slow rotation
int step = 5;           // Brightness increment step
int maxBrightness = 255;// Maximum brightness level

void setup() {
  pixels.begin();
  pixels.show();        // Initialize all pixels to off
}

void loop() {
  // Step 1: Slow rotation with low brightness
  for (int i = 0; i < NUMPIXELS; i++) {
    // Set all pixels off before lighting the new one
    pixels.clear();
    pixels.setPixelColor(i, pixels.Color(brightness, brightness, brightness));  // Light the current pixel
    pixels.show();
    delay(delayTime);
    
    // Gradually increase brightness and speed
    if (brightness < maxBrightness) {
      brightness += step;
      delayTime = max(10, delayTime - 5);  // Decrease delay to speed up rotation
    }
  }

  // Step 2: Rapid rotation with maximum brightness
  if (brightness >= maxBrightness) {
    for (int i = 0; i < NUMPIXELS; i++) {
      pixels.clear();
      pixels.setPixelColor(i, pixels.Color(maxBrightness, maxBrightness, maxBrightness));
      pixels.show();
      delay(10); // Fast rotation at maximum brightness
    }

    // Step 3: Light up all LEDs like the arc reactor
    pixels.fill(pixels.Color(maxBrightness, maxBrightness, maxBrightness));
    pixels.show();
    delay(1000);  // Keep all LEDs on for 1 second

    // Reset for the next cycle
    brightness = 10;     // Reset brightness
    delayTime = 200;     // Reset rotation delay
  }
}

```
# 実行結果

https://youtube.com/shorts/keCtBOkmkYk?feature=share
![スクリーンショット 2024-11-19 235018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/541f7c7e-b782-972a-60e7-0155bee380f0.png)

# おわりに
せっかくリング状のLEDを買ったので、3Dプリンターでアイアンマンのアークリアクターの外形をを作りたいと思います。