Trevaカメラを使ってみよう

Treva.h



Treva.h
#include "mbed.h"
class Treva
{
private:
  DigitalOut *clock;
  DigitalIn  *data;
  int width;
  int height;
public:
  Treva()
  {
    clock = new DigitalOut(p5); // pink, orange
    data  = new DigitalIn(p6);  // yellow
    width =96;
    height=72;
  }

  Treva(PinName clk, PinName dat)
  {
    clock = new DigitalOut(clk); // pink, orange
    data  = new DigitalIn(dat);  // yellow
    width =96;
    height=72;
  }

  void getImage(unsigned char* buffer);

  // 1bit読み出し処理
  unsigned char read_bit(void);
};
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 


Treva.cpp



Treva.cpp
#include "Treva.h"

void Treva::getImage(unsigned char* buffer)
{
  int magic, i, j, k, n;
  unsigned char d;

  magic = 0;
  while((magic & 0xffffff) != 0xaa55ff){
    magic <<=1;
    if( read_bit() == 1) magic |= 1;
  };
  magic=0;
  // 連続29byte分を無視
    for(i=0; i<29*8; i++) if( read_bit() == 0);
  // 続く16bit分のデータは無視
    for( i=0; i<16; i++ ) read_bit();
  // ここから画像データ取得開始
    int line=0;
    for( k=0; k < height; k++){
      for(n=0; n<width*2; n++){
        d = 0;
        for (i=0; i<8; i++){
          d <<= 1;
          if(read_bit()) d |= 1;
        }
        *buffer++= d;
       }
    }
}

// 1bit読み出し処理
unsigned char Treva::read_bit(void)
{
  unsigned char a;
  for(int i=0; i<6; i++) *clock=1;;
  a = *data;
  for(int i=0; i<18; i++) *clock=0;
  return a;
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 


main.cpp



main.cpp
#include "mbed.h"
#include "NokiaLCD.h"
#include "Treva.h"
typedef unsigned char BYTE;

void Treva16(unsigned char* img);

NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::PCF8833); // mosi, sclk, cs, rst, type
Treva camera(p29,p30);      // clk(pink), data(yellow)

unsigned char buffer[72*96*2];

int main()
{
  while(true)
  {
    camera.getImage(buffer);
    Treva16(buffer);
  }
}

void Treva16(BYTE* img)
{
  BYTE x=96, y=72;
  int Height=72, Width=96;
  BYTE ch;
  int  Y, U, V, red, green, blue;
  int errCount=0;
  const float AmpCoef=1.5;

  int p;
  for(int i=0; i<Height; i++){
    for(int j=0; j<Width; j++){
      p=(i*Width + j)*2;
      Y= img[p+1];
      if(j % 2 == 0){
        V = img[p];
        U = img[p+2];
      }else{
        V;
        U = img[p];
      }
      U -= 128;
      V -= 128;
      blue= U + Y;
      green= (int)(Y*0.98- U*0.53 - V*0.19);
      red= (V + Y)*AmpCoef*AmpCoef;
      green *= AmpCoef;
      blue*=AmpCoef;

      if(255 < red) red = 255;
      if(red < 0) red = 0;
      if(255 < green) green = 255;
      if(green < 0) green = 0;
      if(255 < blue) blue = 255;
      if(blue < 0) blue = 0;
      x = (red & 0xf8) | (green>>5);
      y = ((green&7)<<5) | (blue>>3);
      int color = red<<16 | green <<8 | blue;
      lcd.pixel(j+20, i+20, color);
    }
  }
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63