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(); }
#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を入れないとうまく動作しなかった
実際に表示してみる
実際に動画でちゃんと動いたが撮るのが面倒だったので←
結構いい感じレスポンスもいいし