LoginSignup
3
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-30

NeoPixelをMaxで光らせるまでの続きの記事です。

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

image.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側で展開しています。

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

スクリーンショット 2018-11-29 22.48.54.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();
  } 
}

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2