ArduinoでTreva(CMOSカメラ)

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

8年も前のPHS用のカメラユニットTrevaとArduinoをつなぎます。
参考サイト→http://www.paken.org/aaf/treva/

画像サイズは96x72。1画素2byteなので1枚の写真で96x72x2=13824byte.
115200bpsのシリアル通信で転送するとしても115200/8=14400なので1秒に1枚が限界か。

#define TREVA_CLK  12
#define TREVA_DATA 11
#define LED        13
#define DEBUGPIN   14

#define TREVA_DELAY()  __asm("nop");
//#define TREVA_DELAY()  __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");
//#define TREVA_DELAY()  delayMicroseconds(3)

unsigned char treva_state = 0;
unsigned char treva_count = 0;
#define TREVA_COLSx2 (96*2)
#define TREVA_ROWS    72
unsigned char treva_row   = 0;
unsigned char treva_col   = 0;
unsigned char treva_bit   = 0;
char          treva_byte  = 0;

void setup()
{
 pinMode(LED,        OUTPUT);
 pinMode(TREVA_CLK,  OUTPUT);
 pinMode(TREVA_DATA, INPUT);
 Serial.begin(115200);
}

// http://www.paken.org/aaf/treva/
void treva_loop()
{
 digitalWrite(TREVA_CLK, HIGH);
 TREVA_DELAY();
 char treva_data = digitalRead(TREVA_DATA);
 digitalWrite(TREVA_CLK, LOW);
 TREVA_DELAY();

 switch(treva_state){
 case 0: // wait "1" 100 bits.
   if(treva_data==1){
     treva_count++;
     if(treva_count==100){
       treva_count = 0;
       treva_state = 1;
     }
   }else{
     treva_count = 0;
   }
   break;
 case 1: // wait "0" 65 bits.
   if(treva_data==0){
     treva_count++;
     if(treva_count==65){
       treva_count = 0;
       treva_state = 2;
     }
   }else{
     treva_count = 0;
   }
   break;
 case 2: // skip 16 bits.
   treva_count++;
   if(treva_count==16){
     treva_count = 0;
     treva_byte  = 0x00;
     treva_row   = 0;
     treva_col   = 0;
     treva_bit   = 0;
     treva_state = 3;
   }
   break;
 case 3: // read 96*72*16bit = 110592bit = 13824bytes
   treva_byte |= (treva_data<<(7-treva_bit));
   treva_bit++;
   if(treva_bit==8){
     send_treva_byte(treva_row, treva_col, treva_byte);
     treva_byte = 0x00;
     treva_bit = 0;
     treva_col++;
     if(treva_col==TREVA_COLSx2){
       treva_col = 0;
       treva_row++;
       if(treva_row==TREVA_ROWS){
         treva_state = 0;
       }
     }
   }
   break;
 }
}

void send_treva_byte(unsigned char row, unsigned char col, char b)
{
 if(col==0){
   Serial.print("line:");
   Serial.print((int)row);
   Serial.print(" ");
 }
 unsigned char v = b;
 if(v<0x10){ Serial.print("0"); }
 Serial.print(v, HEX);
 Serial.print(" ");
 if(col==TREVA_COLSx2-1){
   Serial.println();
   digitalWrite(LED, row%2);
   if(row==TREVA_ROWS-1){
     Serial.println("*******************************************");
   }
 }
}

void loop()
{
 treva_loop();
}

treva.rb
printf( "P6\n" );
cols = 96
rows = 72
printf( "#{cols} #{rows} 255 " );

img = []
$stdin.each do |line|
 if line =~ /^line:(\d+) ((.. ){192})$/
   index = $1.to_i
   data = $2.split(" ")
   data.each do |d|
     img << d.to_i(16)
   end
 end
end

rows.times do |i|
 cols.times do |j|
   p = (i*cols+j)*2;
   y = img[p+1];
   if j%2==0
     v =  img[p];
     u =  img[p+2];
   else
     v =  img[p-2];
     u =  img[p];
   end
   u = u - 128.0;
   v = v - 128.0;
   red = u + y;
   green = 0.98*y - 0.53*u - 0.19*v;
   blue = v + y;
   if red>255
     red = 255
   end
   if red < 0
     red = 0
   end
   if green > 255
     green = 255
   end
   if green < 0
     green = 0
   end
   if blue > 255
     blue = 255
   end
   if blue < 0
     blue = 0
   end
   printf("%c", red)
   printf("%c", green)
   printf("%c", blue)
 end
end
最終更新:2009年05月07日 03:35
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。