画像サイズは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