NeoPixelをMaxで光らせるまで

# はじめに

LEDを光らせたい。

少しもらったNeoPixel

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/cbcfbf4d-3894-a3da-37f4-b699c1d81872.png)


なぜか家にあったArduino Uno

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/e992264e-60ae-1840-ef50-1220f9773ebf.png)

これで光らせるまでの記録（備忘録）

# まず光らせる

##　Arduino IDEをダウンロード

https://www.arduino.cc/

しばらく使っていなかったので、何も環境がなかった。

環境：macOS High Sierra　10.13.6

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/c19c2503-7c20-b13f-c7a2-31c942164f27.png)

起動した。


## NeoPixcelのライブラリインストール

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/532c9f47-0185-b3ab-468b-93bfee4081ed.png)

スケッチメニューから＞ライブラリをインクルード＞.ZIP形式の

でインストール

ライブラリはこれ
https://github.com/adafruit/Adafruit_NeoPixel

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/02b5fab2-f3ef-b650-03cc-292c1253e05e.png)

メニューの下の方にNeoPixelの文字が

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/b9ecd17f-78ea-6dce-9309-6a83dca8085f.png)

## コードを拝借

[Arduinoに接続したNeoPixelの色と明るさをシリアル通信で制御する](https://qiita.com/yuji_miyano/items/ad92ae41ac2d97ab0171)
のコードをお借りし、
コピペ

## 実行＆エラー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/9e3befd0-a138-ba11-66ef-462e39cb7d4d.png)

ポートを指定する必要がありそう
って、でてきていない？

## ポート認識していない原因はこんなだった

回路で5Vを使っていて、GRDに繋がっていなかったため、電圧足りなかったみたい。
3.3Vのところに回路を変えたらあっさり認識した。
（というか回路がちゃんと繋がっていない状態は危ないなこれ！）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/d353ab91-fb35-024c-017e-53e3fa98ab7a.png)

## ランダムウォークなライトを作ってみた

32個のLEDなので個数は32個に
ランダムな色が出るようにしたのと、
countで光の位置がうろうろするように変更してみた。

``` sketch_LEDTest20181113.ino

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

#define PIN            6   //Arduinoで使うピン
#define NUMPIXELS      32   //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;

int count = 15;
int countdelta = 1;
int count2 = 0;

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

}

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);
  }

  if(count %30 == 0){
    count2+=countdelta;
    color(random(8, 16)*8,random(8, 16)*8,random(8, 16)*8,200);

    countdelta = random(-1,1);
    if(countdelta == 0)countdelta = 1;
  }
  
  count++;
  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(0,0,0));
  }
  
    pixels.setPixelColor(count2%NUMPIXELS+2,pixels.Color(cred,cgreen,cblue));
}
```

## 実際の動作

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ランダムウォークなライト <a href="https://t.co/cRcp3wD8Nr">pic.twitter.com/cRcp3wD8Nr</a></p>&mdash; tatmos (@tatmos) <a href="https://twitter.com/tatmos/status/1062373915383619584?ref_src=twsrc%5Etfw">2018年11月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>




# Maxで制御したい

## Maxuinoを試すが失敗
http://www.maxuino.org/downloads

ダウンロードしたものをdocument/Max 8/Libraryにインストール（コピー）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/69e9f1e3-ba59-ef73-962c-ce0d079b1af4.png)

### example
ファイルメニューからexampleを起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/2a926d29-23ed-453d-50cc-f7bdd3713969.png)

しかし、
Maxuinoで直接PWMとかまだ難しそうなのでこれはちょっと諦める。

NeoPixcelのライブラリのありがたさを感じた。


# Maxからserialで通信

NeoPixcelのライブラリをそのまま使って、
制御信号だけMaxから送ることに変更。

serialというオブジェクトで、直接arduinoとシリアル通信が行えそう。
これを使って、色を変えたりできるかも。

いろいろ試した結果こんな感じに

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">クラップに反応して赤く光る <br>フェードアウトするように修正 <a href="https://t.co/ejpmL73U9H">pic.twitter.com/ejpmL73U9H</a></p>&mdash; tatmos (@tatmos) <a href="https://twitter.com/tatmos/status/1063558415627112448?ref_src=twsrc%5Etfw">2018年11月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/0f852d86-07a1-453a-2962-e94ce4efe9f7.png)

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

#define PIN            6   //Arduinoで使うピン
#define NUMPIXELS      64   //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;

int count = 15;
int countdelta = 1;
int count2 = 0;
int started = 0;  // シリアル入力を受信しているかどうかを示すフラグ

int clap = 255;

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

}

void loop() {
  
  count+=countdelta;
  
  if(Serial.available()>0){
    started = 1; // set the started flag to on
  } 

  if(started)
  {
    //tred=Serial.parseInt();
    tgreen=0;//Serial.parseInt();
    tblue=0;//Serial.parseInt();
    tbrightness=200;//Serial.parseInt();
    color(tred,tgreen,tblue, tbrightness);

    clap = 255;
    //Serial.println("red " + (String)tred + " green  " + (String)tgreen + " blue " + (String)tblue + " brightness " + (String)tbrightness);
    //delay(5);  // 停止

    while(Serial.read()!=-1)
    {
      Serial.read();
    }

    started = 0;
  }
  else {

  if(clap >0){
    tred=clap;//+((count/4)%3)*2;
    clap-=2;
  }
    tgreen=0;//+((count/3)%3)*2;
    tblue=0+((count/5)%3)*2;
    tbrightness=80;
    color(tred,tgreen,tblue, tbrightness);
  }

  if(count %1 == 0)
  {
      count2+=countdelta;
    if(count2 > NUMPIXELS || count2 < 0)
    {
  
      countdelta = countdelta*-1;
    }
  }

  if(Serial.read()==-1)pixels.show(); 
}

void color(int cred, int cgreen, int cblue, int brightness) {
  pixels.setBrightness(brightness);

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

    pixels.setPixelColor(count2%NUMPIXELS,pixels.Color(255,255,255));
}
```

## ポイント

### タイムアウトの設定大事

```
Serial.setTimeout(4);
```

これがないと、デフォルト1000msecなので、ブロックされてしまうので注意。

[Serial.setTimeout](https://www.arduino.cc/reference/en/language/functions/communication/serial/settimeout/?fbclid=IwAR103gwbAc0wogkitF-57yRPeaN3QBh3hz2mxjFdpQM3ONsdmETGdeG3OAQ)


### 短時間に大量に送るのはNG

あと、あまりに短時間で大量にserialを送ると、何か処理がたまって。遅延してしまうので、ほどほどに送るようにするのが良さそう。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Max8からserialでarduinoをコントロールしてみたところ <a href="https://t.co/7q39GNl0c3">pic.twitter.com/7q39GNl0c3</a></p>&mdash; tatmos (@tatmos) <a href="https://twitter.com/tatmos/status/1063380195963396096?ref_src=twsrc%5Etfw">2018年11月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

動画再生の続きはこちらにまとめました
[NeoPixelをMaxでSerial通信で動画を光らせるまで](https://qiita.com/tatmos/items/c2ea57da9dd071d2b995)


# こういうの使ったハッカソンを計画中

グローバルゲームジャム(2019/1/25-27)という、３日で同じテーマでゲームを作るハッカソンがあるのですが、
これを企画中です。

グローバルゲームジャムにはコントローラハックという部門もあるようで、arduinoとか電子工作を使ったゲームもありな様子。

興味あるかたは腕試しにどうぞ。

https://effectorhack.connpass.com/event/109734/