Arduinoに接続したNeoPixelの色と明るさをシリアル通信で制御する


1. 概要

タイトルのままです。本来やりたいのはopenFrameworksからシリアルで信号を送り、Arduinoに接続したNeoPixelの色と明るさを変更することですが、まずはArduino IDEのシリアルモニタから制御するところまでやってみます。
これまで通信というとFirmataを使っていたのですが、馬場さんのページを見てシリアル通信をちゃんと勉強しようと思いました。

2. 用意するもの

  • Arduino UNO (今回はDuemilanoveを使用)
  • NeoPixel (今回はLEDが19個つながっているものを使用)
  • PC (MacBook Pro(Retina, 13-inch, Mid 2014) & macOS Sierra 10.12.3)
  • Arduino IDE 1.8.1

3. 参考サイト

  1. ArduinoでNeoPixelのLEDを使ってみる。 – あかさたな
  2. Read line from Serial
    • #12の回答を参考にしています

4. NeoPixelを光らせる

まずは参考サイト1に掲載されたプログラムを見ながらNeoPixelを白く光らせます。
ライブラリをインストールしていない場合は、先に「Adafruit neopixel」というライブラリをインストールしてください。
今回はLEDの数が19個だったので#define NUMPIXELS 1#define NUMPIXELS 19に変更しました。

5. シリアルモニタから色と明るさを制御する

参考サイト2の#12のプログラムを参考にしながら、

NeoPixel_test.ino
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN            6   //Arduinoで使うピン
#define NUMPIXELS      19   //LEDの数。

#define red  9
#define green 10
#define blue 11

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

int tblue = 0;
int tgreen = 0;
int tred = 0;
int tbrightness = 0;

void setup() {
  pixels.begin(); // ライブラリ使用開始
  pinMode(blue, OUTPUT);
  pinMode(red, OUTPUT);
  pinMode(green, OUTPUT);
  Serial.begin(9600);
  color(255,0,0,100);

}

void loop() {
  if(Serial.available()>0){
    tred=Serial.parseInt();
    tgreen=Serial.parseInt();
    tblue=Serial.parseInt();
    tbrightness=Serial.parseInt();
    color(tred,tgreen,tblue, tbrightness);

    Serial.println("red " + (String)tred + " green  " + (String)tgreen + " blue " + (String)tblue + " brightness " + (String)tbrightness);
  }
  pixels.show(); 
}

void color(int cred, int cgreen, int cblue, int brightness) {
  pixels.setBrightness(brightness);
  for(int i=0; i < NUMPIXELS; i++){
    pixels.setPixelColor(i,pixels.Color(cred,cgreen,cblue));
  }
}

5. 結果

今回は最初に赤く光るようにしてあります。

シリアルモニタを立ち上げて例えば0,100,100,150と入力してenterを押すと、red 0 green 100 blue 100 brightness 150という表示が出てLEDの色が変わります。

Serial.parseInt()のおかげで、ビットを操作しなくてもシリアル通信できていますが、結局あんまり勉強になってないのではないかという問題が残ります…。