2013年10月3日木曜日

10/21の授業:マトリクスLED+Webカメラ

次回の授業は10/21です。
ひきつづき前回利用したマトリクスLEDを使用しつつ、ProcessingによるWebカメラと連動させる演習を行う予定です。
 前回のマトリクスLEDについては、このページ(2008建築発明工作ゼミ)を参考に配線ならびに点灯実験を行ってきてください。使用しているマトリクスLEDによっては、配線番号や極性が異なることがあるので、各自確認してきてください(分からなければ、次回の授業で)。

必要なもの:
・ノートパソコン (ArduinoとProcessingをインストール済み)
・Arduinoボード+USBケーブル
ブレッドボード(できれば小型なもの2個)
ジャンパワイヤー(オスーオスタイプ:できれば20本以上)
マトリクスLED(アノードコモンタイプ)
・Webカメラ(ノートパソコン内蔵型も可)




Arduino側のプログラム(アノード/カソードコモンで極性が逆の場合は、digitalWrite()内のHIGH/LOWを逆にしてください):
 
//8x8の二次元配列を用意
byte matrix[8][8];

void setup(){
  //出力ピンの設定、すべてオフにする
  for(int i=2;i<=17;i++){
    pinMode(i,OUTPUT);
    digitalWrite(i,LOW);
  }
  //シリアル通信開始
  Serial.begin(9600);
}

void loop(){
  //シリアル通信(64個分のデータ)
  if(Serial.available()>63){
    for(int k=0;k<8;k++){
      for(int l=0;l<8;l++){
        //読み込んだ値を配列に代入
        matrix[k][l]=Serial.read();
      }  
    }
  }

  //各LEDの点灯制御
  for(int i=2;i<=9;i++){
    //列の点灯
    digitalWrite(i,HIGH);  //極性が逆の場合HIGHをLOW

    for(int j=10;j<=17;j++){
      //行の点灯
      digitalWrite(j,LOW); //極性が逆の場合LOWをHIGH
      //行の点灯継続時間
      delayMicroseconds(1+matrix[i-2][j-10]);
      //行の消灯
      digitalWrite(j,HIGH);  //極性が逆の場合HIGHをLOW
      //行の消灯継続時間
      delayMicroseconds(256-matrix[i-2][j-10]);    
    }
    //列の消灯
    digitalWrite(i,LOW); //極性が逆の場合LOWをHIGH
  }
}


Processing変更版:

import processing.video.*;
import processing.serial.*;
Capture cam;
Serial port;

int w=640; //画面幅
int h=480; //画面高さ
int s=60;   //モザイク一辺のサイズ

boolean start=false; //シリアル通信開始用フラグ
int[] pixelValue=new int[64];

void setup() {
  size(w,h);
  cam = new Capture(this, w,h);
  cam.start();

  stroke(1); //モザイクの外形線の色
  //noStroke(); //外形線なしの場合
}
int cnt=0;
void draw() {
  if (cam.available() == true) {
    cam.read();
    for(int i=0; i<w*h;i++){  //カメラ画像を8x8のモザイク画像に変換
      int x=i%w;
      int y=i/w;
      if(x%s==0 && x/s<8 && y%s==0){
        fill(cam.pixels[i]);
        rect(x, y, s, s);
       
        pixelValue[cnt]=int(brightness(cam.pixels[i]));
        cnt++;
        if(start){
          int pixColor=int(brightness(cam.pixels[i]));
          port.write(pixColor); //色データ値送信
        }
      }
    }
  }
  println(cnt);
  cnt=0;
}

void mousePressed(){  //クリックでシリアル通信開始または停止
  start=!start;
  if(start){
    port=new Serial(this,"/dev/tty.usbserial-A40014iU",9600);
  }else{
    port.stop();
  }
}