Arducam B0429 dark, green, out-of-focus images on Jetson Nano; Raspberry Pi 4 compatibility?

Hi all,

I’ve been trying to get an Arducam B0429 (2.3MP AR0234 Color Global Shutter) working on a Jetson Nano 4GB and I’m running into several issues I can’t sort out.

The images come out noticeably dark at the default exposure, with a strong green tint, and they’re out of focus too. For comparison, I have an Arducam B0348 on a Raspberry Pi and that one looks fine with no adjustments at all. Here’s a side-by-side — left is an e-con system camera, right is the B0429:

If I raise the exposure to brighten things up, the FPS drops a lot. The B0429 also doesn’t seem to work at all on an unofficial Jetson Nano carrier board I have (J01). The B0429 costs more than the B0348 too, and the Jetson’s GPU should be more capable, so it feels like the software just needs tuning.

Two questions: does the B0429 have any auto-exposure, and can this camera be used on a Raspberry Pi 4 at all?

Thanks for the details. To narrow this down, can you share the full environment you’re testing on? Specifically the JetPack/L4T version, kernel version, Python and OpenCV versions, and how you’re capturing (v4l2 vs the Arducam example scripts). Also, which driver/guide did you install from, and is the camera showing up as /dev/video0?

Here’s my setup:

  • Camera: Arducam 2.3MP AR0234 Color Global Shutter (B0429)
  • Platform: NVIDIA Jetson Nano 4GB
  • JetPack 4.6.1, L4T 32.7.1
  • Kernel: 4.9.253-tegra
  • Python 3.6, OpenCV 4.1.1

I installed the drivers from the Jetvariety Quick Start Guide (the Software section). The camera is detected at /dev/video0 and v4l2 sees it.

I’ve actually got 3 of these boards. I did manage to get it working on the official carrier board, but only after tweaking the example code. The commands I’ve been running are:

python3 arducam_displayer.py -d 0
v4l2-ctl --list-ctrls

I also searched through the available v4l2 controls for brightness/contrast/color and only found the ones I’ll paste next. I was wondering if OpenCV post-processing could be used to fine-tune the color output, and whether there’s any tested sample code or a guide that actually gets this camera looking right.

Can you paste the full output of v4l2-ctl --list-ctrls and also v4l2-ctl --list-formats-ext? And when you run python3 arducam_displayer.py -d 0, what exactly happens — do you get an error, a blank window, or a timeout?

Sure. Formats first:

ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'Y16 '
        Name        : 16-bit Greyscale
                Size: Discrete 1920x1200
                Size: Discrete 1920x1080
                Size: Discrete 1280x720

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'BA10'
        Name        : 10-bit Bayer GRGR/BGBG
                Size: Discrete 1920x1200
                Size: Discrete 1920x1080
                Size: Discrete 1280x720

And the controls:

nano@nano-4gb:~$ v4l2-ctl --list-ctrls
User Controls
  exposure 0x00980911 (int) : min=2 max=65535 step=1 default=700 value=2000
  horizontal_flip 0x00980914 (bool) : default=0 value=0
  vertical_flip 0x00980915 (bool) : default=0 value=0
  trigger_mode 0x00981901 (bool) : default=0 value=0
  disable_frame_timeout 0x00981902 (bool) : default=0 value=0
  frame_timeout 0x00981903 (int) : min=100 max=12000 step=1 default=2000 value=2000
  frame_rate 0x00981906 (int) : min=5 max=120 step=1 default=120 value=120
Camera Controls
  bypass_mode 0x009a2064 (intmenu): min=0 max=1 default=0 value=0
  override_enable 0x009a2065 (intmenu): min=0 max=1 default=0 value=0
  height_align 0x009a2066 (int) : min=1 max=16 step=1 default=1 value=1
  size_align 0x009a2067 (intmenu): min=0 max=2 default=0 value=0
  write_isp_format 0x009a2068 (bool) : default=0 value=0
  sensor_signal_properties 0x009a2069 (u32) : min=0 max=4294967295 step=1 default=0 [30][18] flags=read-only, has-payload
  sensor_image_properties 0x009a206a (u32) : min=0 max=4294967295 step=1 default=0 [30][16] flags=read-only, has-payload
  sensor_control_properties 0x009a206b (u32) : min=0 max=4294967295 step=1 default=0 [30][36] flags=read-only, has-payload
  sensor_dv_timings 0x009a206c (u32) : min=0 max=4294967295 step=1 default=0 [30][16] flags=read-only, has-payload
  low_latency_mode 0x009a206d (bool) : default=0 value=0
  preferred_stride 0x009a206e (int) : min=0 max=65535 step=1 default=0 value=0
  sensor_modes 0x009a2082 (int) : min=0 max=30 step=1 default=30 value=1 flags=read-only
Image Source Controls
  vertical_blanking 0x009e0901 (int) : min=15 max=16927 step=1 default=16 value=16
  horizontal_blanking 0x009e0902 (int) : min=1168 max=1168 step=1 default=1168 value=1168
  analogue_gain 0x009e0903 (int) : min=100 max=1200 step=1 default=100 value=100
Image Processing Controls
  pixel_rate 0x009f0902 (int64) : min=216000000 max=216000000 step=1 default=216000000 value=216000000 flags=read-only

That’s everything v4l2 exposes on my setup.

Thanks, that’s helpful. A couple of things stand out: there’s no brightness/contrast/saturation control exposed here, and exposure is currently at 2000 (default 700), which lines up with why you’re seeing the FPS drop — longer exposure per frame means fewer frames per second.

Now about the display script — you mentioned an error earlier. Can you paste the exact terminal output from python3 arducam_displayer.py -d 0? I want to see whether it’s failing on the QBUF/DQBUF path or later in the reshape.

Right, earlier I was also getting VIDIOC_QBUF: Invalid argument, but here’s the full output from the latest run:

nano@nano-desktop:~$ ls /dev/video*
/dev/video0
nano@nano-desktop:~$ cd MIPI_Camera/Jetson/Jetvariety/example
nano@nano-desktop:~/MIPI_Camera/Jetson/Jetvariety/example$ python3 arducam_displayer.py -d 0
Hardware is: NVIDIA Jetson Nano (4 GB ram)
Firmware Version: 65539
Sensor ID: 0x0A56
Serial Number: 0xADF1E5E5
select timeout
VIDIOC_DQBUF: Resource temporarily unavailable
Traceback (most recent call last):
  File "arducam_displayer.py", line 143, in <module>
    display(cap, arducam_utils, args.fps)
  File "arducam_displayer.py", line 53, in display
    frame = frame.reshape(int(h), int(w))
AttributeError: 'NoneType' object has no attribute 'reshape'

So it initializes, gets the sensor ID, then times out waiting for a frame.

Okay, thanks — that paints a clearer picture. A few findings from our side:

  • The green/dark/color issues are mostly a platform limitation, not a broken sensor. Raspberry Pi has a fairly strong ISP pipeline that Jetson devices don’t expose the same way, and the Jetvariety ISP algorithm support on Jetson is limited, so you won’t get the same tuned color/brightness out of the box as the B0348 does on the Pi.
  • The B0429 uses an M12 lens, so focus is manual — you need to screw the lens barrel to get a sharp image. Out-of-focus won’t be fixed by any software setting.
  • The exposure/FPS trade-off you’re seeing is expected: raising exposure increases the per-frame exposure time, which lowers the achievable frame rate.
  • The brightness/contrast/color controls you were looking for are applied after the image has already gone through the ISP, so they can’t fix the original capture — and in your case they aren’t even exposed.

The VIDIOC_DQBUF: Resource temporarily unavailable + NoneType reshape means the script isn’t receiving a frame before the timeout, which is why the earlier QBUF error and the blank frame happen. That’s separate from the image quality issues and is worth testing on another unit/board if you can.

Thanks for the explanation. So there’s nothing in OpenCV that can improve the color output? And do you have any tested sample code or a guide that gets the B0429 looking correct on the Jetson?

Also coming back to my original question — will the B0429 work on a Raspberry Pi 4, since the B0348 works there without any tweaking?

To answer directly: no, OpenCV won’t fix the color rendering. OpenCV is a library for image manipulation and analysis, not color enhancement, and the color problems here happen before you ever get pixels into OpenCV.

For Raspberry Pi: I can’t guarantee the B0429 works on the Pi — you’d want to try the Pivariety camera Quick Start Guide and see if it enumerates. For the Jetson side, we tested the B0429 on L4T 32.7.3 and it worked, while you’re on 32.7.1, so if you can, try re-flashing to 32.7.3. Also worth connecting the camera to a different Jetson Nano if you have one, to rule out a hardware/carrier board issue — the unofficial J01 board may not be fully supported. And physically screw the M12 lens to set focus manually.

So to summarize where we are: the dark/green output is expected behavior on Jetson given the limited ISP, focus needs manual M12 adjustment, and the exposure/FPS trade-off is inherent. The frame timeout in the display script is still an open issue I’d tackle next by testing 32.7.3 and/or another board.