I'd like to use Arducam's MT9V022/34 cameras for my project. However, the API they provide is quite limited, and also makes me buy their USB shield module(s).

Important part of my project is to change exposure manually, and perhaps capture images synchronously with multiple cameras. There are some examples that say users can modify exposure manually, but it feels very limited (in the sense of what you can do). Their API is closed sourced (and feels very bloated). Also, it's only for a RPi or a full-blown PC.

I'd like to use smaller microcontrollers (perhaps stm32, esp32) to control the camera.

  • Has anyone tried these cameras without Arducam's provided libraries?
  • Also, if you know things/sources where I could learn about this cam's interface, I'd be happy too.

1 Answer 1


I successfully read gray scale (luminance channel only) still images out of a 640 x 480 pixels OV camera which is a 0.3 Mega pixels like the one you mention, with an LPC1778 microntroller.

I was able to achieve a frame rate of 2 images per second at 48 MHz CPU clock.

That microcontroller doesn't have a DVP interface so I designed my software using interrupts.

I could have used DMA but didn't want to.

The main problem I faced was that I couldn't store an entire image in RAM because that microcontroller has 64 Kbytes only and I had to write the image out to an SPI interface and then to a PC.

I found an open source gray scale image codec on GitHub and converted all floating point numbers, multiplications and divisions into integer numbers, multiplications and divisions.

It was too slow using floating point numbers.

I then compared the results of my integer-operations algorithm, with the results achieved by a PC running the floating-operations algorithm and found no differences.

The only difference is that the jpeg stream in case of integer math is 10% longer because some const floating point matrix coefficients, optimized by the JPEG group back in the '90s, were rounded off to integers.

I remember that I debugged my integer-math algorithm on a PC using OpenCV to convert jpeg images into UV data.

The gray scale jpeg encoder repository is here:


My integer math algorithm is not yet on Github because I'm a bit busy.

The DVP Interface is very easy to learn.

It's just a parallel interface clocked by the external microcontroller and with 2 synchronization signals: end of pixels row and end of frame.

There's actually a third synchronization signal called E that is high for all the duration of the frame.

I don't remember if used E or not.

  • \$\begingroup\$ Thanks for the reply, (Now I'm exploring Arducam's Arduino Library to understand how they do DVP with other cams & mcu) Do you have some another place (or websites) that looked a beginner could start from? \$\endgroup\$
    – Garid
    Commented Nov 26, 2021 at 7:06
  • \$\begingroup\$ The DVP interface is the same across many cmos sensors. What changes are the internal hardware registers that the microcontroller programs. \$\endgroup\$ Commented Nov 26, 2021 at 7:15
  • \$\begingroup\$ There’s plenty of examples of cameras interfaced to esp32 on the web. The maixbit k210 is an interesting device. The board supports a camera and is very fast. Actually the second fastest board that has Arduino support I’ve played with. Has an AI engine as well. Has micropython with opencv. \$\endgroup\$
    – Kartman
    Commented Nov 26, 2021 at 10:07

Not the answer you're looking for? Browse other questions tagged or ask your own question.