NeoPixelをMaxでSerial通信で動画を光らせるまで

[NeoPixelをMaxで光らせるまで](https://qiita.com/tatmos/items/3d6a51d8098f4d3d75d3)の続きの記事です。


# Maxからムービー再生して制御

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【動画】NeopixelとMaxとArduinoでBad Apple!!影絵 <a href="https://t.co/T4G2jtWiaC">https://t.co/T4G2jtWiaC</a> を投稿しました。 <a href="https://twitter.com/hashtag/sm34208509?src=hash&amp;ref_src=twsrc%5Etfw">#sm34208509</a></p>&mdash; tatmos (@tatmos) <a href="https://twitter.com/tatmos/status/1065311892955062272?ref_src=twsrc%5Etfw">2018年11月21日</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/3297935d-021a-0511-8d7f-9f07fba44d19.png)

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

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

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

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

void setup() {
  pixels.begin(); // ライブラリ使用開始
  Serial.begin(9600);
  Serial.setTimeout(5);

  pixels.setBrightness(100);

  pixels.show(); 
}

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

  if(started)
  {
    for(int x = 0;x<64;x++)
    {
       char v =  Serial.parseInt();
          
       pixels.setPixelColor(x,pixels.Color(v,v,v));
       
    }
    started = 0;
  }  
  pixels.show();
}
```
## シリアル通信を文字列からバイナリに変更して高速化

文字列だと数値の桁数とかで変動するので、バイナリをそのまま送るように変更。
83mesec間隔くらいまでなら送っても大丈夫そう。
あまり間隔が短いと書き込みエラーになる。
あと、バイナリで送っている分にはtimeoutの設定も関係ない様子。



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

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

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

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

void setup() {
  pixels.begin(); // ライブラリ使用開始
  Serial.begin(9600);
  Serial.setTimeout(50);

  pixels.setBrightness(100);

  pixels.show(); 
}

char field[NUMPIXELS];

void loop() {
 if(Serial.available()>0){
    Serial.readBytes(field, NUMPIXELS);
    
    for(int x = 0;x<NUMPIXELS;x++)
       pixels.setPixelColor(x,pixels.Color(0,field[x],field[x]));
      
    pixels.show();
  } 
}


```


## 通信情報を圧縮して転送

64byte送信から8byteにまで圧縮。
色のありなしを1bitにして、1バイトで8個のLEDの情報を送り、
arduino側で展開しています。

例えば０から２５５まで数値を変化させると表示はこんな感じに変化します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">bitで表示 <a href="https://t.co/WgpG8eMSmY">pic.twitter.com/WgpG8eMSmY</a></p>&mdash; tatmos (@tatmos) <a href="https://twitter.com/tatmos/status/1068141099447775233?ref_src=twsrc%5Etfw">2018年11月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>





<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【動画】NeopixelとMaxとArduinoでBad Apple!!影絵30fps <a href="https://t.co/tBudXdjgRa">https://t.co/tBudXdjgRa</a> を投稿しました。 <a href="https://twitter.com/hashtag/sm34246166?src=hash&amp;ref_src=twsrc%5Etfw">#sm34246166</a></p>&mdash; tatmos (@tatmos) <a href="https://twitter.com/tatmos/status/1068132982202916864?ref_src=twsrc%5Etfw">2018年11月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



<img width="1920" alt="スクリーンショット 2018-11-29 22.48.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/96808/79075dd1-f2c8-881a-c5ef-e342b079d5f6.png">


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

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

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

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

void setup() {
  pixels.begin(); // ライブラリ使用開始
  Serial.begin(9600);
  Serial.setTimeout(50);

  pixels.setBrightness(100);

  pixels.show(); 
}

byte field[8];

void loop() {
 if(Serial.available()>0){
    Serial.readBytes(field, 8);

    for(int x = 0;x<8;x++)
    {
      byte v =(field[x] & 0x01) != 0;
       pixels.setPixelColor(7+x*8,pixels.Color(0,v*50,v*100));

       v =(field[x] & 0x02) != 0;
       pixels.setPixelColor(6+x*8,pixels.Color(0,v*60,v*100));

       v =(field[x] & 0x04) != 0;
       pixels.setPixelColor(5+x*8,pixels.Color(0,v*70,v*100));

       v =(field[x] & 0x08) != 0;
       pixels.setPixelColor(4+x*8,pixels.Color(0,v*80,v*100));

       v =(field[x] & 0x10) != 0;
       pixels.setPixelColor(3+x*8,pixels.Color(0,v*90,v*100));

       v =(field[x] & 0x20) != 0;
       pixels.setPixelColor(2+x*8,pixels.Color(0,v*100,v*100));

       v =(field[x] & 0x40) != 0;
       pixels.setPixelColor(1+x*8,pixels.Color(0,v*110,v*100));

       v =(field[x] & 0x80) != 0;
       pixels.setPixelColor(0+x*8,pixels.Color(0,v*120,v*100));

    }
    pixels.show();
  } 
}

```