Hacking the OV7670 camera module (SCCB cheat sheet inside)An in-depth  การแปล - Hacking the OV7670 camera module (SCCB cheat sheet inside)An in-depth  ไทย วิธีการพูด

Hacking the OV7670 camera module (S

Hacking the OV7670 camera module (SCCB cheat sheet inside)
An in-depth look of the OV7670 camera module

The OV7670 is a low cost image sensor + DSP that can operate at a maximum of 30 fps and 640 x 480 ("VGA") resolutions, equivalent to 0.3 Megapixels. The captured image can be pre-processed by the DSP before sending it out. This preprocessing can be configured via the Serial Camera Control Bus (SCCB). You can see the full datasheet here.

There are many camera modules, that come with standard 0.1" spaced headers, in eBay with prices under $10. I'll be using the one shown below, it comes WITHOUT a FIFO buffer.




HARDWARE

The camera module comes with a 9x2 header, the pin diagram is shown below:

VDD GND
SDIOC SDIOD
VSYNC HREF
PCLK XCLK
D7 D6
D5 D4
D3 D2
D1 D0
RESET PWDN

Now, I'll cover the meaning of these pins.

Pin Type Description
VDD** Supply Power supply
GND Supply Ground level
SDIOC Input SCCB clock
SDIOD Input/Output SCCB data
VSYNC Output Vertical synchronization
HREF Output Horizontal synchronization
PCLK Output Pixel clock
XCLK Input System clock
D0-D7 Output Video parallel output
RESET Input Reset (Active low)
PWDN Input Power down (Active high)

**A note about supply voltage and I/O voltage.

As stated in the datasheet:

VDDA can range from 2.45V to 3.00V.
VDDC can range from 1.62V to 1.98V.
VDDIO can range from 1.7V to 3.00V.

You can (hopefully) see here (sorry, it's buried among other files) the schematic of the model I'm using in this post. As you can see U1 and U2 are LDO regulators, one is a 2.8V regulator for VDDA and VDDIO and the other is a 1.8V regulator for VDDC. The actual regulator that gets soldered on the module seems to vary between modules.

In conclusion, for the same model I'm using:

You can safely supply 3.3V (3.0V - 3.6V) to the OV7670 VDD. (I used this configuration)
You can safely use a maximum of 3.0V for the I/O pins. However the module I/O pins will work at 2.8V.
A 5V supply for the OV7670 VDD might work (try at your own risk), it depends on the maximum input voltage of the LDO regulators your module has.
You can use 3.3V on the I/O pins, the internal I/O protection diodes will clamp the I/O voltage to 2.8V. However, this may degrade the OV7670 faster and/or cause more power loss. (I used this configuration)


STRUCTURE OF AN IMAGE

Before going into the signaling, it's necessary to understand how video and images are representend in digital format.

A video is a succession of frames, a frame is a still image taken at an instant of time. A frame is compromised of lines, and a line is compromised of pixels. A pixel is the smallest part of a digital image, and it looks like a colored dot.

P0 P1 P2 P3 P4
L0
L1
L2
L3
L4
A 5x5 image

For example, the image above has 5 lines, and each line has 5 pixels. This means the image has a resolution of 5x5 pixels. This image is monochrome, there are also color image. This color can be encoded in various formats, in the next section we'll cover the most relevant formats for the OV7670.

PIXEL FORMATS

Monochrome

In monochromes images, each pixel is stored as 8 bits, representing gray scale levels from 0 to 255. Where 0 is black, 255 is white and the intermediate values are grays.

RGB

Is a fact that any color can be decomposed in red, green and blue light at different intensities. This approach is known as the RGB color model. Using this model, each pixel must be stored as three intensities of these red, green and blue lights.


RGB color model. Image from wikipedia.


The most common format is RGB888, in this format each pixel is stored in 24 bits, the red, green and blue channels are stored in 8 bits each. This means that the intensity of each light can go from 0 to 255, where 0 is the absence of light, and 255 is the maximum intensity.

The formats used by the OV7670 are the RGB565, RGB555 and RGB444. The difference with the RGB888 format, is the number of bits assigned to each channel. For example, in the RGB565 format, the red channel is stored as 5 bits, the green channel as 6 bits and the blue channel as 5 bits. These formats take less memory when stored but in exchange sacrifice the number of colors available.

YCbCr

YCbCr is a format in which a RGB color can be encoded. The Y or luminance component is the amount of white light of a color, and the Cb and Cr are the chroma components, which respectly encode the blue and red levels relative to the luminance component.


Decomposition of an image into its Y, Cb and Cr components. Image from wikipedia.

As you can see the Y channel encodes the gray scale levels of the image. Therefore, the easiest way to get a monochrome image from the OV7670 is to extract the Y channel of the YCbCr format.

As the RGB format, the YCbCr also stores each channel as 8 bits (from 0 to 255) and we can convert from YCbCr to RGB using the following expression.



The OV7670 uses the YCbCr422 format, this format is stored as follows:


Byte 0 Byte 1 Byte 2 Byte 3
Word 0
Cb0
Y0
Cr0
Y1
Word 1
Cb2
Y2
Cr2
Y3
Word 2
Cb4
Y4
Cr4
Y5
Data stored as words (4 bytes)

Or equivalently, the data arrives in the following order:

N
Byte
1st
Cb0
2nd
Y0
3rd
Cr0
4th
Y1
5th
Cb2
6th
Y2
7th
Cr2
8th
Y3
...
...

And the actual pixels are the following:

Pixel 0 Y0 Cb0 Cr0
Pixel 1 Y1 Cb0 Cr0
Pixel 2 Y2 Cb2 Cr2
Pixel 3 Y3 Cb2 Cr2
Pixel 4 Y4 Cb4 Cr4
Pixel 5 Y5 Cb4 Cr4
Notice each pixel is 3 byte long (e.g. Y0, Cb0 and Cr0), as in the RGB format. But, in the YCbCr422 format, the Cb and Cr channels are shared between two consecutive pixels (e.g. pixels 0 and 1 share Cb0 and Cr0). Therefore two pixels are "compressed" into 4 bytes or 32 bits, this means that in average each pixel is stored as 2 bytes or 16 bits. From the example above, 3 words (12 bytes) store 6 pixels.

The extra advantage of YCbCr is that the Y channel is the grayscale image, whereas in RGB you'll need to average the 3 channels to get the grayscale image.

SIGNALING

The OV7670 sends the data in a parallel synchronous format. First of all, to get any data out of the OV7670, is necessary to supply a clock signal on the XCLK pin. According to the datasheet, this clock must have a frequency between 10 and 48 MHz. However, I have successfully used a 8 MHz clock with some configuration via the SCCB.

If you are using a microcontroller that has clock output, you can use that to clock the OV7670, these can generally output their inner system clock prescaled by some factor. If your microcontroller doesn't have clock output capability, but you're using an external crystal, then you can connect the OSC_OUT pin to the OV7670.

After a clock signal has been applied to the XCLK pin, the OV7670 will start driving its VSYNC, HREF and D0-D7 pins. Let's take a look at these signals.


Horizontal Synchronization

First thing to notice, the D0-D7 must be sampled at the rising edge of the PCLK signal. Number two, D0-D7 must be sampled only when HREF is high. Also, the rising edge of HREF signals the start of a line, and the falling edge of HREF signals the end of the line.

All these bytes sampled when HREF was high, correspond to the pixels in one line. Note that one byte is not a pixel, it depends on the format chosen. By default, the format is YCbCr422, this means that in average two bytes correspond to a pixel.


VGA timing

The image above shows the signals for a "VGA" (640 x 480) frame. During HSYNC high state, we must capture 640 pixels, equivalent to a line. The 480 lines, equivalent to a frame, are captured during the low state of VSYNC. This means that the falling edge of VSYNC signals the start of a frame, and its rising edge signals the end of a frame.

That covers all the process of obtaining one frame, the remaining question is how fast are frames sent. By default, the PCLK will have the same frequency of XCLK, however prescalers and PPLs can be configured using the SCCB, to produce a PCLK of different frequency.

A PCLK of 24 MHz will produce 30 fps, a PCLK of 12 MHz will produce 15 fps and so on. All this is independent of the format of the image (VGA, CIF, QCIF, etc).

SCCB (Serial Camera Control Bus)

What makes the OV7670 so versatile is its inner DSP, that can pre-process the image before its sent. This DSP can be accessed via a SCCB interface. This SCCB protocol is very similar to the I2C protocol. You can see the SCCB specification here.

I couldn't get my STM32 microcontroller's I2C module to work with the OV7670's SCCB interface, so I implemented a bit bang version of the SCCB specification. This implementation is my peripheral library libstm32pp.

After making sure the SCCB is working, we can tweak the OV7670.

Changing the FPS

To change the frames per second (fps), we need to change the frequency of PCLK. And for that we need to modify the following registers via the SCCB.

Register Address Default Description
CLKRC 0x11 0x80
Bit[6]:

0: Apply prescaler on input clock
1: Use external clock directly
Bit[0-5]:


Clock prescaler
F(internal clock) = F(input clock) / (Bit[0-5] + 1)
Range [0 0000] to [1 1111]
DBLV 0x6B 0x0A
Bit[7-6]:




PLL control
00: Bypass PLL
01: Input clock x4
10: Input clock x6
11: Input clock x8
Bit[4]:


Regulator control
0: Enable internal regulator
1: Bypass internal regulator

Now that you know the involved registers, the process is straightforward. For example, say we have a 8 MHz input clock and we want a 24 MHz PCLK. The only possible configuration is prescaler by 2, and PLL x6.
CLKRC Bit[6] must be 0, to enable prescaler.
CLKRC Bit[0-5] must be 1, to enable prescaler by 2.
DBLV Bit[7-6] must be 10, to enable PLL x6
Pseudocode:
?
1
2
3
4
5
6
7
8
9
10
11
unsigned char tmp;

/* Configuration for 30 FPS */

// CLKRC register: Prescaler = 2
tmp = readOV7670(0x11);
writeOV7670(0x11, (tmp & 0b10000000) | 0b00000001);

// DBLV register: PLL = 6
tmp = readOV7670(0x6B);
writeOV7670(0x6B, (tmp & 0b00111111) | 0b10000000);

Changing the frame format/resolution

The OV7670 can use various frame format
0/5000
จาก: -
เป็น: -
ผลลัพธ์ (ไทย) 1: [สำเนา]
คัดลอก!
Hacking the OV7670 camera module (SCCB cheat sheet inside)
An in-depth look of the OV7670 camera module

The OV7670 is a low cost image sensor + DSP that can operate at a maximum of 30 fps and 640 x 480 ("VGA") resolutions, equivalent to 0.3 Megapixels. The captured image can be pre-processed by the DSP before sending it out. This preprocessing can be configured via the Serial Camera Control Bus (SCCB). You can see the full datasheet here.

There are many camera modules, that come with standard 0.1" spaced headers, in eBay with prices under $10. I'll be using the one shown below, it comes WITHOUT a FIFO buffer.




HARDWARE

The camera module comes with a 9x2 header, the pin diagram is shown below:

VDD GND
SDIOC SDIOD
VSYNC HREF
PCLK XCLK
D7 D6
D5 D4
D3 D2
D1 D0
RESET PWDN

Now, I'll cover the meaning of these pins.

Pin Type Description
VDD** Supply Power supply
GND Supply Ground level
SDIOC Input SCCB clock
SDIOD Input/Output SCCB data
VSYNC Output Vertical synchronization
HREF Output Horizontal synchronization
PCLK Output Pixel clock
XCLK Input System clock
D0-D7 Output Video parallel output
RESET Input Reset (Active low)
PWDN Input Power down (Active high)

**A note about supply voltage and I/O voltage.

As stated in the datasheet:

VDDA can range from 2.45V to 3.00V.
VDDC can range from 1.62V to 1.98V.
VDDIO can range from 1.7V to 3.00V.

You can (hopefully) see here (sorry, it's buried among other files) the schematic of the model I'm using in this post. As you can see U1 and U2 are LDO regulators, one is a 2.8V regulator for VDDA and VDDIO and the other is a 1.8V regulator for VDDC. The actual regulator that gets soldered on the module seems to vary between modules.

In conclusion, for the same model I'm using:

You can safely supply 3.3V (3.0V - 3.6V) to the OV7670 VDD. (I used this configuration)
You can safely use a maximum of 3.0V for the I/O pins. However the module I/O pins will work at 2.8V.
A 5V supply for the OV7670 VDD might work (try at your own risk), it depends on the maximum input voltage of the LDO regulators your module has.
You can use 3.3V on the I/O pins, the internal I/O protection diodes will clamp the I/O voltage to 2.8V. However, this may degrade the OV7670 faster and/or cause more power loss. (I used this configuration)


STRUCTURE OF AN IMAGE

Before going into the signaling, it's necessary to understand how video and images are representend in digital format.

A video is a succession of frames, a frame is a still image taken at an instant of time. A frame is compromised of lines, and a line is compromised of pixels. A pixel is the smallest part of a digital image, and it looks like a colored dot.

P0 P1 P2 P3 P4
L0
L1
L2
L3
L4
A 5x5 image

For example, the image above has 5 lines, and each line has 5 pixels. This means the image has a resolution of 5x5 pixels. This image is monochrome, there are also color image. This color can be encoded in various formats, in the next section we'll cover the most relevant formats for the OV7670.

PIXEL FORMATS

Monochrome

In monochromes images, each pixel is stored as 8 bits, representing gray scale levels from 0 to 255. Where 0 is black, 255 is white and the intermediate values are grays.

RGB

Is a fact that any color can be decomposed in red, green and blue light at different intensities. This approach is known as the RGB color model. Using this model, each pixel must be stored as three intensities of these red, green and blue lights.


RGB color model. Image from wikipedia.


The most common format is RGB888, in this format each pixel is stored in 24 bits, the red, green and blue channels are stored in 8 bits each. This means that the intensity of each light can go from 0 to 255, where 0 is the absence of light, and 255 is the maximum intensity.

The formats used by the OV7670 are the RGB565, RGB555 and RGB444. The difference with the RGB888 format, is the number of bits assigned to each channel. For example, in the RGB565 format, the red channel is stored as 5 bits, the green channel as 6 bits and the blue channel as 5 bits. These formats take less memory when stored but in exchange sacrifice the number of colors available.

YCbCr

YCbCr is a format in which a RGB color can be encoded. The Y or luminance component is the amount of white light of a color, and the Cb and Cr are the chroma components, which respectly encode the blue and red levels relative to the luminance component.


Decomposition of an image into its Y, Cb and Cr components. Image from wikipedia.

As you can see the Y channel encodes the gray scale levels of the image. Therefore, the easiest way to get a monochrome image from the OV7670 is to extract the Y channel of the YCbCr format.

As the RGB format, the YCbCr also stores each channel as 8 bits (from 0 to 255) and we can convert from YCbCr to RGB using the following expression.



The OV7670 uses the YCbCr422 format, this format is stored as follows:


Byte 0 Byte 1 Byte 2 Byte 3
Word 0
Cb0
Y0
Cr0
Y1
Word 1
Cb2
Y2
Cr2
Y3
Word 2
Cb4
Y4
Cr4
Y5
Data stored as words (4 bytes)

Or equivalently, the data arrives in the following order:

N
Byte
1st
Cb0
2nd
Y0
3rd
Cr0
4th
Y1
5th
Cb2
6th
Y2
7th
Cr2
8th
Y3
...
...

And the actual pixels are the following:

Pixel 0 Y0 Cb0 Cr0
Pixel 1 Y1 Cb0 Cr0
Pixel 2 Y2 Cb2 Cr2
Pixel 3 Y3 Cb2 Cr2
Pixel 4 Y4 Cb4 Cr4
Pixel 5 Y5 Cb4 Cr4
Notice each pixel is 3 byte long (e.g. Y0, Cb0 and Cr0), as in the RGB format. But, in the YCbCr422 format, the Cb and Cr channels are shared between two consecutive pixels (e.g. pixels 0 and 1 share Cb0 and Cr0). Therefore two pixels are "compressed" into 4 bytes or 32 bits, this means that in average each pixel is stored as 2 bytes or 16 bits. From the example above, 3 words (12 bytes) store 6 pixels.

The extra advantage of YCbCr is that the Y channel is the grayscale image, whereas in RGB you'll need to average the 3 channels to get the grayscale image.

SIGNALING

The OV7670 sends the data in a parallel synchronous format. First of all, to get any data out of the OV7670, is necessary to supply a clock signal on the XCLK pin. According to the datasheet, this clock must have a frequency between 10 and 48 MHz. However, I have successfully used a 8 MHz clock with some configuration via the SCCB.

If you are using a microcontroller that has clock output, you can use that to clock the OV7670, these can generally output their inner system clock prescaled by some factor. If your microcontroller doesn't have clock output capability, but you're using an external crystal, then you can connect the OSC_OUT pin to the OV7670.

After a clock signal has been applied to the XCLK pin, the OV7670 will start driving its VSYNC, HREF and D0-D7 pins. Let's take a look at these signals.


Horizontal Synchronization

First thing to notice, the D0-D7 must be sampled at the rising edge of the PCLK signal. Number two, D0-D7 must be sampled only when HREF is high. Also, the rising edge of HREF signals the start of a line, and the falling edge of HREF signals the end of the line.

All these bytes sampled when HREF was high, correspond to the pixels in one line. Note that one byte is not a pixel, it depends on the format chosen. By default, the format is YCbCr422, this means that in average two bytes correspond to a pixel.


VGA timing

The image above shows the signals for a "VGA" (640 x 480) frame. During HSYNC high state, we must capture 640 pixels, equivalent to a line. The 480 lines, equivalent to a frame, are captured during the low state of VSYNC. This means that the falling edge of VSYNC signals the start of a frame, and its rising edge signals the end of a frame.

That covers all the process of obtaining one frame, the remaining question is how fast are frames sent. By default, the PCLK will have the same frequency of XCLK, however prescalers and PPLs can be configured using the SCCB, to produce a PCLK of different frequency.

A PCLK of 24 MHz will produce 30 fps, a PCLK of 12 MHz will produce 15 fps and so on. All this is independent of the format of the image (VGA, CIF, QCIF, etc).

SCCB (Serial Camera Control Bus)

What makes the OV7670 so versatile is its inner DSP, that can pre-process the image before its sent. This DSP can be accessed via a SCCB interface. This SCCB protocol is very similar to the I2C protocol. You can see the SCCB specification here.

I couldn't get my STM32 microcontroller's I2C module to work with the OV7670's SCCB interface, so I implemented a bit bang version of the SCCB specification. This implementation is my peripheral library libstm32pp.

After making sure the SCCB is working, we can tweak the OV7670.

Changing the FPS

To change the frames per second (fps), we need to change the frequency of PCLK. And for that we need to modify the following registers via the SCCB.

Register Address Default Description
CLKRC 0x11 0x80
Bit[6]:

0: Apply prescaler on input clock
1: Use external clock directly
Bit[0-5]:


Clock prescaler
F(internal clock) = F(input clock) / (Bit[0-5] + 1)
Range [0 0000] to [1 1111]
DBLV 0x6B 0x0A
Bit[7-6]:




PLL control
00: Bypass PLL
01: Input clock x4
10: Input clock x6
11: Input clock x8
Bit[4]:


Regulator control
0: Enable internal regulator
1: Bypass internal regulator

Now that you know the involved registers, the process is straightforward. For example, say we have a 8 MHz input clock and we want a 24 MHz PCLK. The only possible configuration is prescaler by 2, and PLL x6.
CLKRC Bit[6] must be 0, to enable prescaler.
CLKRC Bit[0-5] must be 1, to enable prescaler by 2.
DBLV Bit[7-6] must be 10, to enable PLL x6
Pseudocode:
?
1
2
3
4
5
6
7
8
9
10
11
unsigned char tmp;

/* Configuration for 30 FPS */

// CLKRC register: Prescaler = 2
tmp = readOV7670(0x11);
writeOV7670(0x11, (tmp & 0b10000000) | 0b00000001);

// DBLV register: PLL = 6
tmp = readOV7670(0x6B);
writeOV7670(0x6B, (tmp & 0b00111111) | 0b10000000);

Changing the frame format/resolution

The OV7670 can use various frame format
การแปล กรุณารอสักครู่..
ผลลัพธ์ (ไทย) 2:[สำเนา]
คัดลอก!
Hacking the OV7670 camera module (SCCB cheat sheet inside)
An in-depth look of the OV7670 camera module

The OV7670 is a low cost image sensor + DSP that can operate at a maximum of 30 fps and 640 x 480 ("VGA") resolutions, equivalent to 0.3 Megapixels. The captured image can be pre-processed by the DSP before sending it out. This preprocessing can be configured via the Serial Camera Control Bus (SCCB). You can see the full datasheet here.

There are many camera modules, that come with standard 0.1" spaced headers, in eBay with prices under $10. I'll be using the one shown below, it comes WITHOUT a FIFO buffer.




HARDWARE

The camera module comes with a 9x2 header, the pin diagram is shown below:

VDD GND
SDIOC SDIOD
VSYNC HREF
PCLK XCLK
D7 D6
D5 D4
D3 D2
D1 D0
RESET PWDN

Now, I'll cover the meaning of these pins.

Pin Type Description
VDD** Supply Power supply
GND Supply Ground level
SDIOC Input SCCB clock
SDIOD Input/Output SCCB data
VSYNC Output Vertical synchronization
HREF Output Horizontal synchronization
PCLK Output Pixel clock
XCLK Input System clock
D0-D7 Output Video parallel output
RESET Input Reset (Active low)
PWDN Input Power down (Active high)

**A note about supply voltage and I/O voltage.

As stated in the datasheet:

VDDA can range from 2.45V to 3.00V.
VDDC can range from 1.62V to 1.98V.
VDDIO can range from 1.7V to 3.00V.

You can (hopefully) see here (sorry, it's buried among other files) the schematic of the model I'm using in this post. As you can see U1 and U2 are LDO regulators, one is a 2.8V regulator for VDDA and VDDIO and the other is a 1.8V regulator for VDDC. The actual regulator that gets soldered on the module seems to vary between modules.

In conclusion, for the same model I'm using:

You can safely supply 3.3V (3.0V - 3.6V) to the OV7670 VDD. (I used this configuration)
You can safely use a maximum of 3.0V for the I/O pins. However the module I/O pins will work at 2.8V.
A 5V supply for the OV7670 VDD might work (try at your own risk), it depends on the maximum input voltage of the LDO regulators your module has.
You can use 3.3V on the I/O pins, the internal I/O protection diodes will clamp the I/O voltage to 2.8V. However, this may degrade the OV7670 faster and/or cause more power loss. (I used this configuration)


STRUCTURE OF AN IMAGE

Before going into the signaling, it's necessary to understand how video and images are representend in digital format.

A video is a succession of frames, a frame is a still image taken at an instant of time. A frame is compromised of lines, and a line is compromised of pixels. A pixel is the smallest part of a digital image, and it looks like a colored dot.

P0 P1 P2 P3 P4
L0
L1
L2
L3
L4
A 5x5 image

For example, the image above has 5 lines, and each line has 5 pixels. This means the image has a resolution of 5x5 pixels. This image is monochrome, there are also color image. This color can be encoded in various formats, in the next section we'll cover the most relevant formats for the OV7670.

PIXEL FORMATS

Monochrome

In monochromes images, each pixel is stored as 8 bits, representing gray scale levels from 0 to 255. Where 0 is black, 255 is white and the intermediate values are grays.

RGB

Is a fact that any color can be decomposed in red, green and blue light at different intensities. This approach is known as the RGB color model. Using this model, each pixel must be stored as three intensities of these red, green and blue lights.


RGB color model. Image from wikipedia.


The most common format is RGB888, in this format each pixel is stored in 24 bits, the red, green and blue channels are stored in 8 bits each. This means that the intensity of each light can go from 0 to 255, where 0 is the absence of light, and 255 is the maximum intensity.

The formats used by the OV7670 are the RGB565, RGB555 and RGB444. The difference with the RGB888 format, is the number of bits assigned to each channel. For example, in the RGB565 format, the red channel is stored as 5 bits, the green channel as 6 bits and the blue channel as 5 bits. These formats take less memory when stored but in exchange sacrifice the number of colors available.

YCbCr

YCbCr is a format in which a RGB color can be encoded. The Y or luminance component is the amount of white light of a color, and the Cb and Cr are the chroma components, which respectly encode the blue and red levels relative to the luminance component.


Decomposition of an image into its Y, Cb and Cr components. Image from wikipedia.

As you can see the Y channel encodes the gray scale levels of the image. Therefore, the easiest way to get a monochrome image from the OV7670 is to extract the Y channel of the YCbCr format.

As the RGB format, the YCbCr also stores each channel as 8 bits (from 0 to 255) and we can convert from YCbCr to RGB using the following expression.



The OV7670 uses the YCbCr422 format, this format is stored as follows:


Byte 0 Byte 1 Byte 2 Byte 3
Word 0
Cb0
Y0
Cr0
Y1
Word 1
Cb2
Y2
Cr2
Y3
Word 2
Cb4
Y4
Cr4
Y5
Data stored as words (4 bytes)

Or equivalently, the data arrives in the following order:

N
Byte
1st
Cb0
2nd
Y0
3rd
Cr0
4th
Y1
5th
Cb2
6th
Y2
7th
Cr2
8th
Y3
...
...

And the actual pixels are the following:

Pixel 0 Y0 Cb0 Cr0
Pixel 1 Y1 Cb0 Cr0
Pixel 2 Y2 Cb2 Cr2
Pixel 3 Y3 Cb2 Cr2
Pixel 4 Y4 Cb4 Cr4
Pixel 5 Y5 Cb4 Cr4
Notice each pixel is 3 byte long (e.g. Y0, Cb0 and Cr0), as in the RGB format. But, in the YCbCr422 format, the Cb and Cr channels are shared between two consecutive pixels (e.g. pixels 0 and 1 share Cb0 and Cr0). Therefore two pixels are "compressed" into 4 bytes or 32 bits, this means that in average each pixel is stored as 2 bytes or 16 bits. From the example above, 3 words (12 bytes) store 6 pixels.

The extra advantage of YCbCr is that the Y channel is the grayscale image, whereas in RGB you'll need to average the 3 channels to get the grayscale image.

SIGNALING

The OV7670 sends the data in a parallel synchronous format. First of all, to get any data out of the OV7670, is necessary to supply a clock signal on the XCLK pin. According to the datasheet, this clock must have a frequency between 10 and 48 MHz. However, I have successfully used a 8 MHz clock with some configuration via the SCCB.

If you are using a microcontroller that has clock output, you can use that to clock the OV7670, these can generally output their inner system clock prescaled by some factor. If your microcontroller doesn't have clock output capability, but you're using an external crystal, then you can connect the OSC_OUT pin to the OV7670.

After a clock signal has been applied to the XCLK pin, the OV7670 will start driving its VSYNC, HREF and D0-D7 pins. Let's take a look at these signals.


Horizontal Synchronization

First thing to notice, the D0-D7 must be sampled at the rising edge of the PCLK signal. Number two, D0-D7 must be sampled only when HREF is high. Also, the rising edge of HREF signals the start of a line, and the falling edge of HREF signals the end of the line.

All these bytes sampled when HREF was high, correspond to the pixels in one line. Note that one byte is not a pixel, it depends on the format chosen. By default, the format is YCbCr422, this means that in average two bytes correspond to a pixel.


VGA timing

The image above shows the signals for a "VGA" (640 x 480) frame. During HSYNC high state, we must capture 640 pixels, equivalent to a line. The 480 lines, equivalent to a frame, are captured during the low state of VSYNC. This means that the falling edge of VSYNC signals the start of a frame, and its rising edge signals the end of a frame.

That covers all the process of obtaining one frame, the remaining question is how fast are frames sent. By default, the PCLK will have the same frequency of XCLK, however prescalers and PPLs can be configured using the SCCB, to produce a PCLK of different frequency.

A PCLK of 24 MHz will produce 30 fps, a PCLK of 12 MHz will produce 15 fps and so on. All this is independent of the format of the image (VGA, CIF, QCIF, etc).

SCCB (Serial Camera Control Bus)

What makes the OV7670 so versatile is its inner DSP, that can pre-process the image before its sent. This DSP can be accessed via a SCCB interface. This SCCB protocol is very similar to the I2C protocol. You can see the SCCB specification here.

I couldn't get my STM32 microcontroller's I2C module to work with the OV7670's SCCB interface, so I implemented a bit bang version of the SCCB specification. This implementation is my peripheral library libstm32pp.

After making sure the SCCB is working, we can tweak the OV7670.

Changing the FPS

To change the frames per second (fps), we need to change the frequency of PCLK. And for that we need to modify the following registers via the SCCB.

Register Address Default Description
CLKRC 0x11 0x80
Bit[6]:

0: Apply prescaler on input clock
1: Use external clock directly
Bit[0-5]:


Clock prescaler
F(internal clock) = F(input clock) / (Bit[0-5] + 1)
Range [0 0000] to [1 1111]
DBLV 0x6B 0x0A
Bit[7-6]:




PLL control
00: Bypass PLL
01: Input clock x4
10: Input clock x6
11: Input clock x8
Bit[4]:


Regulator control
0: Enable internal regulator
1: Bypass internal regulator

Now that you know the involved registers, the process is straightforward. For example, say we have a 8 MHz input clock and we want a 24 MHz PCLK. The only possible configuration is prescaler by 2, and PLL x6.
CLKRC Bit[6] must be 0, to enable prescaler.
CLKRC Bit[0-5] must be 1, to enable prescaler by 2.
DBLV Bit[7-6] must be 10, to enable PLL x6
Pseudocode:
?
1
2
3
4
5
6
7
8
9
10
11
unsigned char tmp;

/* Configuration for 30 FPS */

// CLKRC register: Prescaler = 2
tmp = readOV7670(0x11);
writeOV7670(0x11, (tmp & 0b10000000) | 0b00000001);

// DBLV register: PLL = 6
tmp = readOV7670(0x6B);
writeOV7670(0x6B, (tmp & 0b00111111) | 0b10000000);

Changing the frame format/resolution

The OV7670 can use various frame format
การแปล กรุณารอสักครู่..
ผลลัพธ์ (ไทย) 3:[สำเนา]
คัดลอก!
แฮ็ค ov7670 โมดูลกล้อง ( sccb โกงแผ่นภายใน )
เบื้องลึกของ ov7670 โมดูลกล้อง

ov7670 เป็นค่าใช้จ่ายต่ำ เซ็นเซอร์ภาพแบบที่สามารถทํางานได้สูงสุด 30 เฟรมต่อวินาทีและ 640 x 480 ( VGA ) ความละเอียดเท่ากับ 0.3 megapixels ภาพที่จับได้ถูกประมวลผลด้วย DSP ก่อน ก่อนที่จะส่งมันออกไปการเตรียมนี้สามารถกำหนดค่าผ่านทาง serial กล้องควบคุมรถบัส ( sccb ) คุณสามารถดูแผ่นเต็มนะ

มีโมดูลกล้องมากมาย ที่มาพร้อมกับมาตรฐาน 0.1 " ระยะห่างส่วนหัวในอีเบย์ ด้วยราคาต่ำกว่า $ 10 ผมจะใช้ที่แสดงด้านล่าง มันมาโดยไม่ FIFO buffer




ฮาร์ดแวร์

โมดูลกล้องมาพร้อมกับ 9x2 ส่วนหัว , รหัสแผนภาพที่แสดงอยู่ด้านล่าง :

VDD GND
sdioc sdiod

pclk VSync href xclk


D3 D4 D5 D6 แอร์เอเชียเอ็กซ์ D1 D2
+
pwdn ใหม่

ตอนนี้ฉันจะครอบคลุมความหมายของพินเหล่านี้

pin ประเภทรายละเอียด
VDD * * จ่ายไฟฟ้า

sdioc ใส่ GND จัดหาพื้น sccb นาฬิกา
sdiod อินพุต / เอาต์พุต sccb ข้อมูล
VSync ออกแนวตั้งแนวนอนให้ตรงกัน

ชื่อตรงกันออก pclk ออกนาฬิกาใส่นาฬิกาพิกเซล
xclk ระบบวิดีโอออกคู่ขนานออก

d0-d7รีเซ็ตการตั้งค่า ( ใช้งานน้อย )
pwdn ใส่พลังลงไป ( ใช้งานมาก )

* * หมายเหตุเกี่ยวกับแรงดัน และแรงดันของ I / O .

ตามที่ระบุไว้ในดาต้าชีท :

vdda สามารถช่วงจาก 2.45v เพื่อ 3.00v .
vddc สามารถช่วงจาก 1.62v เพื่อ 1.98v .
vddio สามารถช่วงจาก 1.7v เพื่อ 3.00v

( หวังว่า ) คุณสามารถดูที่นี่ ( ขออภัย มันฝังอยู่ในไฟล์อื่น ๆ ) แผนผังของแบบจำลองที่ผมใช้ในบทความนี้ในขณะที่คุณสามารถมองเห็นและควบคุม ldo U1 U2 เป็นหนึ่งเป็นผู้ควบคุมและ 2.8v สำหรับ vdda vddio และอื่น ๆ ที่เป็นผู้ควบคุม 1.8v สำหรับ vddc . จริงควบคุมที่ได้รับบัดกรีบนโมดูลจะแตกต่างกันระหว่างโมดูล .

สรุป ในรูปแบบเดียวกันที่ฉันใช้ :

คุณได้อย่างปลอดภัยสามารถจัดหา 3.3v ( 3.0v - 3.6v ) เพื่อ ov7670 VDD . ( ผมใช้แบบนี้ )
คุณได้อย่างปลอดภัยสามารถใช้สูงสุดของ 30 สำหรับหมุด I / O ได้ แต่พินโมดูล I / O จะทำงานที่ 2.8v .
เป็น 5V จ่ายสำหรับ ov7670 VDD อาจทำงาน ( ลองเสี่ยงของคุณเอง ) มันขึ้นอยู่กับแรงดันสูงสุดของ ldo ควบคุมโมดูลของคุณ .
คุณสามารถใช้ 3.3v บนหมุด I / O , I / O ไดโอดป้องกันภายใน จะยึดระบบ I / O เพื่อ 2.8v . อย่างไรก็ตาม , นี้อาจทำให้ ov7670 เร็วและ / หรือก่อให้เกิดพลังงานสูญเสีย( ผมใช้แบบนี้ )


โครงสร้างของภาพ

ก่อนเข้าสัญญาณ มันจำเป็นที่จะเข้าใจวิธีการวิดีโอและภาพ representend ในรูปแบบดิจิตอล .

วิดีโอเป็นบัลลังก์ของเฟรม เฟรมเป็นภาพนิ่งถ่ายในทันที ของเวลา กรอบเป็นละเมิดของเส้นและเส้นเป็นละเมิดของพิกเซล พิกเซลเป็นส่วนที่เล็กที่สุดของภาพดิจิตอลและดูเหมือนว่าจุดสี . P0 P1 P2 P3 P4





l0 L1 L2 L3
L4


เป็น 5x5 ภาพตัวอย่างภาพข้างบน มี 5 บรรทัด แต่ละบรรทัดมี 5 พิกเซล หมายถึง ภาพมีความละเอียดของพิกเซล 5x5 . ภาพนี้เป็นภาพขาวดำ ยังมีภาพสี สีนี้สามารถเข้ารหัสในรูปแบบต่าง ๆ ในส่วนถัดไปเราจะครอบคลุมรูปแบบที่เกี่ยวข้องมากที่สุดสำหรับ ov7670 .



รูปแบบพิกเซลขาวดำ

ใน monochromes ภาพแต่ละพิกเซลจะถูกเก็บไว้เป็น 8 บิต แทนสีเทาขนาดระดับจาก 0 ถึง 255 . ที่ 0 เป็นสีดำ , 255 มีสีขาวและสีเทากลางเป็นค่า RGB .



เป็นข้อเท็จจริงว่า สีใดที่สามารถย่อยสลายในสีแดง , สีเขียวและสีฟ้าเข้มของแสงที่แตกต่างกัน วิธีการนี้เรียกว่าโมเดลสี RGB . โดยใช้รูปแบบนี้แต่ละพิกเซลจะถูกเก็บเป็น 3 ความเข้มของสีแดงนี่ ไฟสีเขียวและสีฟ้า


สีแบบ . ภาพจากวิกิพีเดีย


รูปแบบที่พบมากที่สุด คือ rgb888 ในรูปแบบนี้แต่ละพิกเซลจะถูกเก็บไว้ใน 24 บิต , สีแดง , สีเขียวและสีฟ้าจะถูกเก็บไว้ในช่อง 8 บิต แต่ละ ซึ่งหมายความ ว่า ความเข้มของแสงแต่ละสามารถไปจาก 0 ถึง 255 ที่ 0 คือการขาดแสงสว่างและ 255 มีความเข้มสูงสุด

รูปแบบที่ใช้โดย ov7670 เป็น rgb565 rgb555 rgb444 , และ . ความแตกต่างกับ rgb888 รูปแบบ คือจำนวนของบิตที่ได้รับมอบหมายในแต่ละช่อง ตัวอย่างเช่น ใน rgb565 รูปแบบช่องสีแดงจะถูกเก็บไว้เป็น 5 บิต ช่องสีเขียวและสีฟ้าเป็นช่อง 6 บิต 5 บิตรูปแบบเหล่านี้ใช้หน่วยความจำน้อยลง เมื่อเก็บไว้แต่ในตราสละจำนวนสี

เพิ่ม

เพิ่มเป็นรูปแบบซึ่งเป็นสีที่สามารถเข้ารหัส Y หรือความส่องสว่างคือปริมาณของแสง ส่วนสีขาวเป็นสี และ CB และโครเมียมเป็นส่วนประกอบ Chroma ซึ่ง respectly เข้ารหัสสีฟ้าและสีแดงเมื่อเทียบกับระดับความสว่าง

ส่วนประกอบการสลายตัวของภาพเป็น Y , CB และส่วนประกอบโครเมียม . ภาพจากวิกิพีเดีย

เท่าที่คุณสามารถเห็น Y ช่อง encodes ระดับสีเทา ขนาดของภาพ ดังนั้น วิธีที่ง่ายที่สุดที่จะได้รับภาพขาวดำจาก ov7670 คือแยก Y ช่องของเพิ่มรูปแบบ

เป็น RGB รูปแบบการเพิ่มยังร้านค้าแต่ละช่องเป็น 8 บิต ( จาก 0 ถึง 255 ) และเราสามารถแปลงจาก YCbCr เพื่อ RGB โดยใช้การแสดงออกดังต่อไปนี้ .



ov7670 ใช้ ycbcr422 รูปแบบ รูปแบบนี้จะถูกเก็บไว้ดังนี้


0 ไบต์ไบต์ไบต์ไบต์ 1 2 3
0

y0 cb0 คำ cr0 y1





CB2 คำ 1 y2 Y3

cr2 คำ 2
cb4



y4 cr4 y5 ข้อมูลเก็บเป็นคำ ( 4 ไบต์ )

หรือก้อง , ข้อมูลมาถึงในลำดับต่อไปนี้ :



n ไบต์1
cb0
2
y0
3
cr0
4
y1
5
6

7 Y2 CB2

cr2 8 Y3





. . . . . . . . . . . . . . และแท้จริงพิกเซลมีดังต่อไปนี้ :
0
พิกเซลพิกเซล y0 cb0 cr0 1 y1 cb0 cr0
2 Y2 CB2 cr2 พิกเซล

พิกเซลพิกเซล 3 Y3 CB2 cr2 4 y4 cb4 cr4
พิกเซล 5 y5 cb4 cr4
สังเกตแต่ละพิกเซล 3 ไบต์ยาว ( เช่น y0 cb0 , และ cr0 ) ในรูปแบบ RGB . แต่ใน ycbcr422 รูปแบบตลาดและช่องทาง CR จะใช้ร่วมกันระหว่างสองติดต่อกัน ( เช่นพิกเซลพิกเซล 0 และ 1 cb0 แบ่งปันและ cr0 ) ดังนั้นสองพิกเซล " อัด " เป็น 4 ไบต์ หรือ 32 บิต ซึ่งหมายความ ว่า โดยเฉลี่ยแต่ละพิกเซลจะถูกเก็บไว้เป็น 2 ไบต์ หรือ 16 บิต จากตัวอย่างข้างต้น 3 คำ ( 12 ไบต์ ) เก็บ 6 พิกเซล

ประโยชน์เสริมเพิ่มคือว่า Y ช่องภาพระดับสีเทา ,ในขณะที่ในงานคุณจะต้องเฉลี่ย 3 ช่องรับภาพระดับสีเทา .



ov7670 การส่งข้อมูลในแบบคู่ขนานในรูปแบบ แรกของทั้งหมดที่จะได้รับข้อมูลใด ๆจาก ov7670 จําเป็นต้องจัดหาสัญญาณ นาฬิกาบน xclk พิน ไปตามแผ่น , นาฬิกานี้จะต้องมีความถี่ระหว่าง 10 และ 48 MHz อย่างไรก็ตามฉันได้ใช้ 8 MHz นาฬิกากับการตั้งค่าผ่านทาง sccb

ถ้าคุณใช้ไมโครคอนโทรลเลอร์ที่มีนาฬิกาออกคุณสามารถใช้กับนาฬิกา ov7670 เหล่านี้โดยทั่วไปผลผลิตของระบบภายในนาฬิกา prescaled โดยบางปัจจัย ถ้าโทรของคุณไม่มีความสามารถในการส่งออกนาฬิกา แต่แกใช้ผลึกภายนอกจากนั้นคุณสามารถเชื่อมต่อ osc_out พินไป ov7670

หลังจากสัญญาณ นาฬิกาได้ถูกประยุกต์ใช้กับ xclk พิน , ov7670 จะเริ่มขับรถของ VSync href และหมุด , d0-d7 . มาดูสัญญาณเหล่านี้




แนวประสานสิ่งแรกที่สังเกตเห็นได้ d0-d7 ต้องเก็บตัวอย่างที่ขอบที่เพิ่มขึ้นของสัญญาณ pclk . ข้อสอง d0-d7 ต้องเก็บเฉพาะเมื่อชื่อสูง นอกจากนี้ขอบที่เพิ่มขึ้นของชื่อสัญญาณเริ่มต้นของบรรทัดและลงขอบของชื่อสัญญาณการสิ้นสุดของบรรทัด

ทั้งหมดนี้ในตอนที่ชื่อไบต์สูง สอดคล้องกับพิกเซลในบรรทัดเดียว โปรดทราบว่าหนึ่งไบต์เป็นพิกเซล มันขึ้นอยู่กับรูปแบบที่เลือก โดยค่าเริ่มต้น , รูปแบบ ycbcr422 นี้หมายความว่าโดยเฉลี่ยสองไบต์สอดคล้องกับพิกเซล VGA .




เวลาภาพข้างต้นแสดงให้เห็นสัญญาณ " VGA ( 640 x 480 ) กรอบ ในช่วง hsync รัฐสูง เราต้องจับ 640 พิกเซล เทียบเท่ากับสาย 480 เส้น เท่ากับกรอบ ถูกจับระหว่างรัฐน้อย VSync . นี่หมายความว่า ตกขอบ VSync สัญญาณเริ่มต้นของกรอบและขอบที่เพิ่มขึ้นเป็นสัญญาณสิ้นสุดของเฟรม

ที่ครอบคลุมทุกกระบวนการของการได้รับหนึ่งเฟรมคำถามที่เหลือคือวิธีการที่รวดเร็วเป็นเฟรมที่ส่ง โดยค่าเริ่มต้น pclk จะมีความถี่เดียวกัน xclk อย่างไรก็ตาม prescalers ppls และสามารถปรับแต่งได้โดยใช้ sccb เพื่อผลิต pclk ความถี่แตกต่างกัน

pclk 24 MHz จะผลิต 30 fps , pclk 12 MHz จะผลิต 15 fps และ ทั้งหมดนี้เป็นอิสระในรูปแบบของภาพ ( VGA , CIF , ภาพเคลื่อนไหว , ฯลฯ ) .

sccb ( รถบัสควบคุมกล้องแบบอนุกรม )

ที่ทำให้ ov7670 เอนกประสงค์ดังนั้นเป็น DSP ภายในของมันที่สามารถก่อนกระบวนการภาพก่อนส่ง DSP นี้สามารถเข้าถึงได้ผ่านทาง sccb อินเตอร์เฟซ sccb พิธีสารนี้จะคล้ายกันมากกับ i2c โปรโตคอล คุณสามารถดู sccb สเปคครับ

ผมไม่ได้ i2c โมดูลไมโครคอนโทรลเลอร์ stm32 ของฉันทำงานกับของ ov7670 sccb เฟสผมใช้บิตบางรุ่นของ sccb สเปค งานนี้ libstm32pp ห้องสมุดต่อพ่วงของฉัน

หลังจากแน่ใจว่า sccb ทำงาน เราสามารถปรับแต่ง ov7670

เปลี่ยนเฟรม

เปลี่ยนเฟรมต่อวินาที ( FPS ) เราต้องเปลี่ยนความถี่ของ pclk . แล้วที่เราต้องเปลี่ยนแปลงการลงทะเบียนต่อไปนี้ผ่าน sccb


เริ่มต้นลงทะเบียนที่อยู่ รายละเอียดclkrc 0x11 0x80
บิต [ 6 ] :

0 : ใช้ปรีสเกลเลอร์ในใส่นาฬิกา
1 : ใช้ภายนอกนาฬิกาตรง
บิต [ 0-5 ] :


นาฬิกาพรีสเกลเลอร์
F ( นาฬิกาภายใน ) = f ( นาฬิกานำเข้า ) / ( บิต [ 1 ] 1 )
[ 0 0000 ] [ ช่วง 1 dblv 1111 ]

0x6b 0x0a บิต [ 7-6 ] :




PLL การควบคุม

01 : 00 : ข้าม PLL นาฬิกาใส่ x4
10 : นาฬิกาใส่ X6
11 : ใส่นาฬิกา X8
บิต [ 4 ] :



0 : ช่วยควบคุมการควบคุมการควบคุมภายใน
1
: ข้ามการควบคุมภายใน
ตอนนี้คุณรู้เกี่ยวข้องลงทะเบียนขั้นตอนตรงไปตรงมา ยกตัวอย่างเช่น เรามี 8 MHz ใส่นาฬิกา และเราต้องการ pclk 24 MHz เพียงตั้งค่าเป็นไปได้คือปรีสเกลเลอร์ 2 และ PLL x6
clkrc บิต [ 6 ] ต้องเป็น 0 เพื่อให้ปรีสเกลเลอร์ .
clkrc บิต [ 1 ] ต้องเป็น 1 เพื่อเปิดใช้งานปรีสเกลเลอร์ 2 .
dblv บิต [ 7-6 ] ต้องเป็น 10 เพื่อให้การเชื่อมต่อดาบปลายปืน : X6

?
1
2
3
4
5
6
7
8
9

10
11ราคา : ไม่ระบุ / tmp ; ค่า

/ * 30 FPS * /

/ / clkrc ลงทะเบียน : ปรีสเกลเลอร์ = 2
tmp = readov7670 ( 0x11 ) ;
writeov7670 ( 0x11 ( TMP & 0b10000000 ) | 0b00000001 ) ;

/ / dblv ลงทะเบียนกำลัง = 6
tmp = readov7670 ( 0x6b )
writeov7670 ( 0x6b ( TMP & 0b00111111 ) | 0b10000000 ) ;

เปลี่ยนกรอบรูปแบบ / ความละเอียด

ov7670 สามารถใช้รูปแบบกรอบต่าง ๆ
การแปล กรุณารอสักครู่..
 
ภาษาอื่น ๆ
การสนับสนุนเครื่องมือแปลภาษา: กรีก, กันนาดา, กาลิเชียน, คลิงออน, คอร์สิกา, คาซัค, คาตาลัน, คินยารวันดา, คีร์กิซ, คุชราต, จอร์เจีย, จีน, จีนดั้งเดิม, ชวา, ชิเชวา, ซามัว, ซีบัวโน, ซุนดา, ซูลู, ญี่ปุ่น, ดัตช์, ตรวจหาภาษา, ตุรกี, ทมิฬ, ทาจิก, ทาทาร์, นอร์เวย์, บอสเนีย, บัลแกเรีย, บาสก์, ปัญจาป, ฝรั่งเศส, พาชตู, ฟริเชียน, ฟินแลนด์, ฟิลิปปินส์, ภาษาอินโดนีเซี, มองโกเลีย, มัลทีส, มาซีโดเนีย, มาราฐี, มาลากาซี, มาลายาลัม, มาเลย์, ม้ง, ยิดดิช, ยูเครน, รัสเซีย, ละติน, ลักเซมเบิร์ก, ลัตเวีย, ลาว, ลิทัวเนีย, สวาฮิลี, สวีเดน, สิงหล, สินธี, สเปน, สโลวัก, สโลวีเนีย, อังกฤษ, อัมฮาริก, อาร์เซอร์ไบจัน, อาร์เมเนีย, อาหรับ, อิกโบ, อิตาลี, อุยกูร์, อุสเบกิสถาน, อูรดู, ฮังการี, ฮัวซา, ฮาวาย, ฮินดี, ฮีบรู, เกลิกสกอต, เกาหลี, เขมร, เคิร์ด, เช็ก, เซอร์เบียน, เซโซโท, เดนมาร์ก, เตลูกู, เติร์กเมน, เนปาล, เบงกอล, เบลารุส, เปอร์เซีย, เมารี, เมียนมา (พม่า), เยอรมัน, เวลส์, เวียดนาม, เอสเปอแรนโต, เอสโทเนีย, เฮติครีโอล, แอฟริกา, แอลเบเนีย, โคซา, โครเอเชีย, โชนา, โซมาลี, โปรตุเกส, โปแลนด์, โยรูบา, โรมาเนีย, โอเดีย (โอริยา), ไทย, ไอซ์แลนด์, ไอร์แลนด์, การแปลภาษา.

Copyright ©2025 I Love Translation. All reserved.

E-mail: