前回はOV7670からプロダクトIDを読むところを行いました. プロダクトIDはI2C通信で0x0aアドレスにアクセスすることで読み出すことができました.
今回はOV7670の初期設定の方法を書いていきます.
OV7670の出力フォーマット
OV7670はさまざまなフォーマットで画像を出力することができます. 初期設定で出力のフォーマットを設定します.
OV7670の出力フォーマットにはRGB565やRGB444,YUV等があります. また,VGAやQVGA等の解像度が設定できます.
例としてRGB565について説明します. RGB565は(R:赤,G:緑,B:青)を2バイトで表現します. 565はそれぞれの色のビット数を表しています. 通常RGBはそれぞれ1バイト(8ビット)で表すので足りないビットは0で埋めます.
次に解像度について説明します. VGAは640×480ピクセルです.QVGAは320×240ピクセルでVGAの4分の1のサイズです.
OV7670の設定
設定はI2C通信で任意のアドレスに設定したい値を書き込むことで行います. 例えば0x12アドレスには解像度のフォーマットをどれにするか書き込みます. また,0x12アドレスに0x80を書き込むと設定をリセットすることができます. 以下は0x12アドレスに0x80を書き込むプログラムです.
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <Wire.h>
#define OV7670_ADDR 0x21
void setup() {
// 省略
Wire.beginTransmission(OV7670_ADDR);
Wire.write(0x12);
Wire.write(0x80);
Wire.endTransmission();
}
void loop(){}
OV7670を適切に使うには多くの項目を設定する必要があります. OV7670を使用しているプログラムを検索してみると,上記の書き込むプログラムを関数にして,書き込み先のアドレスと書き込む値の2次元配列を用意し,for文で書き込むという処理をしています. 今回はここで書かれているプログラムを参考にしてみました.
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
#include <Wire.h>
#define OV7670_ADDR 0x21
#define REG_BATT 0xFF
const uint8_t OV7670_reg[][2] = {
// Color mode related
{0x12, 0x14}, // QVGA, RGB
{0x8c, 0x00}, // RGB444 Disable
{0x40, 0x10 + 0xc0}, // RGB565, 00 - FF
{0x3a, 0x04 + 0}, // UYVY
{0x3d, 0x80 + 0x00}, // gamma enable, UV auto adjust, UYVY
{0xb0, 0x84}, // important
// 省略
{REG_BATT, REG_BATT},
}
static void ov7670_write(uint8_t regAddr, uint8_t data) {
Wire.beginTransmission(OV7670_ADDR);
Wire.write(regAddr);
Wire.write(data);
Wire.endTransmission();
}
// 省略
void setup() {
// 省略
ov7670_write(0x12, 0x80); // RESET
delay(30);
// ov7670の設定を書き込む
for (int i = 0; OV7670_reg[i][0] != REG_BATT; i++)
{
ov7670_write(OV7670_reg[i][0], OV7670_reg[i][1]);
delay(1);
}
}
void loop(){}
まとめ
今回はOV7670に初期設定を書き込むところまでできました.