ぬまのはてに消える

ぬまのそこのはてによる日々の記録

RGB123-2

前回は光らせるだけだったので他に面白いことをやってみる

動画を表示する

ただ単に光るだけじゃ芸がないので動画を16x16にして表示してみよう

動画などを扱うのに便利なProcessingを使った

ここは有名な「BadApple」を表示したいと思ったが

ちょうど白黒なので0と1で表現できるヽ(´▽`)ノ

ArduinoとProcessingはシリアルを使って通信をして
左上から順に書き換え#がきたら反映させるプログラムにしてみた
まあパフォーマンスは悪いかもしれないけど…

Processing

import processing.video.*;
import processing.serial.*;

Movie myMovie;
PImage img;
Serial port;
void setup() {
  myMovie=new Movie(this, "badapple.mp4");
  // "/dev/tty.usbmodem1411"は環境によって変わる
  port = new Serial(this, "/dev/tty.usbmodem1411", 115200);
  myMovie.loop();
}
void draw() {
  image(myMovie, 0, 0, 16, 16);
  img = get();
  int i; int k; int l;
  for (i=0; i<16; i++) {
    for (k=0; k<16; k++) {
      //LEDの配置が特殊なのでその変換
      l = (i%2 == 1)?15-k:k;
      color c = get(l, i);
      //一応グレースケールに変換
      float gray = 0.3 * red(c) + 0.59 * green(c) + 0.11 * blue(c);
      port.write((gray>127)?'1':'0');
    }
  }
  port.write('#');
  delay(50);
}
void movieEvent(Movie m) {
  m.read();
}

Arduino

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

//ピン設定
#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(256, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(115200);
  strip.begin();
  strip.show();// Initialize all pixels to 'off'
}
int k;
int n = 0;
void loop() {
  k = Serial.read();
  switch(k){
  case '#':
    delay(1);
    strip.show();
    delay(10);
    n = 0;
    break;
  case '0':
    strip.setPixelColor(n, strip.Color(0,0,0));
    n++;
    break;
  case '1':
    strip.setPixelColor(n, strip.Color(4,4,4));
    n++;
    break;
  }
}

とこんな感じで書いた

rip.setPixelColor( n, c);

はnに何番目のLED、cにstrip.ColorでRGBを指定したのを
渡すことで表示を変える

ただ単に渡すだけでなくその後に

strip.show();

を叩くことで表示を反映させる
けれどもstrip.show();を叩いた後
少しdelayを入れないとうまく動作しなかった

実際に表示してみる

実際に動画でちゃんと動いたが撮るのが面倒だったので←
f:id:numanohate:20150726174218p:plain
結構いい感じレスポンスもいいし