Arduino アナログ入力に対応したLED(NEOPIXEL)表現

このチュートリアルは武蔵野美術大学通信教育課程授業用に作成したものです。

今回は具体的にインプットした値に対応して振る舞いをみせるサンプルを紹介します。

Neopixel(の類似品のWS2812)とポテンショメータを使ってポテンショメータの値に反応して光るデバイスの製作です。まず構成は以下の通りです。pin3にLEDの信号線を、analog pin0にポテンショメータを接続します。(アナログピンはポテンショメータ以外にも曲げセンサーや距離センサーなども使えます。)

FastLEDライブラリはインストールしておいてください

プログラム

Arduino ポテンショメータを使うArduino フルカラーLEDを光らせる(NEOPIXEL)Arduino フルカラーLEDを光らせる(NEOPIXEL)2はすでに確認済みという前提で進めます。

ポテンショメータは段階的に値を取得でき、0~1023までの数値を回転位置に合わせて出力します。今回は回転位置が一定の位置(半分くらい)より大きい場合と小さい場合でLEDの光り方を変えるサンプルを作ってみましょう。

#include <FastLED.h>  //フルカラーLEDを便利に使うためのライブラリを呼び出しています。
#define NUM_LEDS 4    //プログラム中の定数に対して名前を付けることができます。#defineで定義された定数は、コンパイル時に値へと置き換えられ、チップ上のメモリ(RAM)を消費しません。
#define DATA_PIN 3
CRGB leds[NUM_LEDS];

unsigned long previousLEDMillis = 0;
unsigned long LEDinterval = 1;  //delayの代わりの待機ミリ秒
int hue = 0;

////////////////////////////////////////////////////////////
void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  LEDS.setBrightness(84);
}
////////////////////////////////////////////////////////////
void loop() {
  int sensorValue = analogRead(A0);
  unsigned long currentMillis = millis();
  if (sensorValue > 750) {
    if (currentMillis - previousLEDMillis >= LEDinterval) {
      hue = hue + 1;
      if (hue >= 255) {
        hue = 0;
      }
      for (int j = 0; j < NUM_LEDS; j++) {
        leds[j] = CHSV(hue, 255, 255);
      }
      FastLED.show();
      previousLEDMillis = currentMillis;
    }
  } else {
    for (int j = 0; j < NUM_LEDS; j++) {
      leds[j] = CHSV(0, 0, 255);
    }
    FastLED.show();
  }
}
////////////////////////////////////////////////////////////

「sensorValue」の値が750を超えるとフルカラーLEDがレインボーに輝きます(パーティタイム!!)。それ以外(else内)では白色発光します。こういった状況に合わせて振る舞いを切り替えるにはif構文にて製作すると簡単に実装できます。

アナログインプットはポテンショメータ以外にも感圧センサーや曲げセンサーでも同様に実装できますので、色々と試してみてください。