Thanks @Eric-Katzfey ! Here is the pinout for the dev board "UART" port that includes i2C_SCL and I2C_SDA.

The dev board pins 1-6 matching to J19 pins 1-6
We will give the COMPASS_DISBLMSK parameter a shot and see if that works.
Thanks @Eric-Katzfey ! Here is the pinout for the dev board "UART" port that includes i2C_SCL and I2C_SDA.

The dev board pins 1-6 matching to J19 pins 1-6
We will give the COMPASS_DISBLMSK parameter a shot and see if that works.
We have a custom drone using VOXL2 as the flight controller and we are running Ardupilot. We are using the Here 4 Blue GPS connected to J19 over UART. We took off the cover of the Here4 and unplugged the CAN cable and we are using the dev board for now. We have the 10 pin connector on the dev board to the GPS, the dev board 6 pin UART goes to J19 on VOXL2 with pins 1-6 matching 1-6.
Mission Planner Parameters for Here 4 on VOXL2
gps_drv_options: 4
gps1_type: 2
gps_save_cfg: 1
GPS connection seems to be working fine but we are unable to get the Here4 compass/mag to work or be detected.
The Here4 has a RM3100 magnetic compass and ICM42688. What configuration changes do we need in order to get these sensors to work on the VOXL2?
Here are our versions:
voxl-version
────────────────────────────────────────────────────────────────────────────────
system-image: 1.8.04-M0054-14.1a-perf
kernel: #1 SMP PREEMPT Mon Mar 24 22:31:58 UTC 2025 4.19.125
────────────────────────────────────────────────────────────────────────────────
hw platform: M0054
mach.var: 1.0.1
SKU: MCCA-M0054-C11-T0-M0-X0
────────────────────────────────────────────────────────────────────────────────
voxl-suite: 1.5.1
────────────────────────────────────────────────────────────────────────────────
Packages:
Repo: http://voxl-packages.modalai.com/ qrb5165 dev
Last Updated: 2026-05-04 22:46:17
List:
libfc-sensor 1.0.7
libmodal-cv 0.5.18
libmodal-exposure 0.1.4
libmodal-journal 0.2.6
libmodal-json 0.4.7
libmodal-pipe 2.14.12-202603091236
libqrb5165-io 0.5.0
libvoxl-cci-direct 0.3.3
libvoxl-cutils 0.1.5
modalai-slpi 1.2.0
mv-voxl 0.1-r0
qrb5165-bind 0.1-r0
qrb5165-dfs-server 0.2.0
qrb5165-imu-server 1.1.3
qrb5165-mini-tof-server 0.2.2
qrb5165-rangefinder-server 0.1.5
qrb5165-slpi-test-sig 01-r0
qrb5165-system-tweaks 0.3.6
qrb5165-tflite 2.8.0-2
voxl-ardupilot 4.8.0-325875bb
voxl-bind-spektrum 0.1.1
voxl-camera-calibration 0.6.0
voxl-camera-server 2.2.4
voxl-ceres-solver 2:1.14.0-10
voxl-configurator 1.0.3
voxl-cpu-monitor 0.7.7-202601091810
voxl-docker-support 1.3.1
voxl-elrs 0.4.7
voxl-esc 1.5.4
voxl-feature-tracker 0.5.2
voxl-flow-server 0.3.6
voxl-gphoto2-server 0.0.10
voxl-joystick-server 0.0.6
voxl-jpeg-turbo 2.1.3-7
voxl-lepton-server 1.3.3
voxl-lepton-tracker 0.0.4
voxl-libgphoto2 0.0.4
voxl-libuvc 1.0.7
voxl-logger 0.5.3
voxl-mavcam-manager 0.6.0
voxl-mavlink 0.1.5
voxl-mavlink-server 1.4.15-202603130958
voxl-modem 1.1.8
voxl-mongoose 7.7.0-2
voxl-mpa-to-ros 0.3.9
voxl-mpa-tools 1.5.8
voxl-open-vins 0.4.19
voxl-open-vins-server 0.3.12
voxl-opencv 4.5.5-3
voxl-osd 0.1.8
voxl-portal 0.7.11
voxl-px4 1.14.0-2.0.105
voxl-px4-params 0.7.6
voxl-qvio-server 1.2.0
voxl-remote-id 0.0.9
voxl-reset-slpi 0.0.1
voxl-state-estimator 0.0.5
voxl-streamer 0.7.5
voxl-suite 1.5.1
voxl-tag-detector 0.0.5
voxl-tflite-server 0.4.1
voxl-utils 1.4.8
voxl-uvc-server 0.1.7
voxl-vision-hub 1.8.23
voxl-vtx 1.4.7
voxl-wavemux 0.0.1
voxl2-io 0.0.3
voxl2-system-image 1.8.04-r0
voxl2-wlan 1.0-r0
@Alex-Kushleyev I tried to configure for raw capture but am getting an error with camera-server:
existing instance of voxl-camera-server found, attempting to stop it
MISP awb str: auto
Setting MISP AWB to Auto
MISP channels enabled in defaults : 0
ERROR: object missing misp_channels
MISP awb str: auto
Setting MISP AWB to Auto
MISP channels enabled in defaults : 0
ERROR: object missing misp_channels
=================================================================
configuration for 2 cameras:
cam #0
name: boson
sensor type: boson
isEnabled: 1
camId: 0
camId2: -1
fps: 30
en_rotate: 0
en_rotate2: 0
en_preview: 1
pre_width: 640
pre_height: 512
en_raw_preview: 1
en_small_video: 0
small_video_width: 640
small_video_height: 480
en_large_video: 0
large_video_width: -1
large_video_height: -1
en_misp: 1
misp_width: -1
misp_height: -1
en_snapshot: 0
snap_width: -1
snap_height: -1
exif_focal_length: 0.000000
exif_focal_len_35mm_format:0
exif_fnumber: 0.000000
ae_mode: off
msv_exposure_min_us: 20
msv_exposure_max_us: 33000
gain_min : 54
gain_max : 8000
standby_enabled: 0
decimator: 1
independent_exposure:0
cam #1
name: hires
sensor type: ov64b
isEnabled: 1
camId: 1
camId2: -1
fps: 15
en_rotate: 0
en_rotate2: 0
en_preview: 1
pre_width: 9248
pre_height: 6944
en_raw_preview: 1
en_small_video: 0
small_video_width: 1024
small_video_height: 768
en_large_video: 0
large_video_width: 3840
large_video_height: 2160
en_misp: 1
misp_width: 1920
misp_height: 1080
en_snapshot: 0
snap_width: 9248
snap_height: 6944
exif_focal_length: 3.100000
exif_focal_len_35mm_format:17
exif_fnumber: 1.240000
ae_mode: lme_msv
msv_exposure_min_us: 20
msv_exposure_max_us: 33000
gain_min : 100
gain_max : 32000
standby_enabled: 0
decimator: 1
independent_exposure:0
fsync_en: 0
fsync_gpio: 109
=================================================================
thread is locked to cores: 4 5 6 7
connected to mavlink pipe
Connected to cpu-monitor
Starting Camera: boson (id #0)
gbm_create_device(156): Info: backend name is: msm_drm
MISP Initializing!!!
Detected 1 platform(s)
Detected 1 GPU device(s)
Starting Camera: hires (id #1)
ERROR: Configure streams failed for camera: 1
ERROR: Failed to configure streams for camera: hires
ERROR: Failed to start camera: hires
------ voxl-camera-server: Started 1 of 2 cameras
voxl-version:
system-image: 1.8.04-M0054-14.1a-perf
kernel: #1 SMP PREEMPT Mon Mar 24 22:31:58 UTC 2025 4.19.125
────────────────────────────────────────────────────────────────────────────────
hw platform: M0054
mach.var: 1.0.1
SKU: MCCA-M0054-C11-T0-M0-X0
────────────────────────────────────────────────────────────────────────────────
voxl-suite: 1.5.1
────────────────────────────────────────────────────────────────────────────────
Packages:
Repo: http://voxl-packages.modalai.com/ qrb5165 dev
Last Updated: 2026-03-18 19:55:21
List:
libfc-sensor 1.0.7
libmodal-cv 0.5.18
libmodal-exposure 0.1.4
libmodal-journal 0.2.6
libmodal-json 0.4.7
libmodal-pipe 2.13.2
libqrb5165-io 0.5.0
libvoxl-cci-direct 0.3.3
libvoxl-cutils 0.1.5
modalai-slpi 1.2.0
mv-voxl 0.1-r0
qrb5165-bind 0.1-r0
qrb5165-dfs-server 0.2.0
qrb5165-imu-server 1.1.3
qrb5165-mini-tof-server 0.2.2
qrb5165-rangefinder-server 0.1.5
qrb5165-slpi-test-sig 01-r0
qrb5165-system-tweaks 0.3.6
qrb5165-tflite 2.8.0-2
voxl-ardupilot 4.8.0-325875bb
voxl-bind-spektrum 0.1.1
voxl-camera-calibration 0.6.0
voxl-camera-server 2.2.4
voxl-ceres-solver 2:1.14.0-10
voxl-configurator 1.0.3
voxl-cpu-monitor 0.6.0
voxl-docker-support 1.3.1
voxl-elrs 0.4.7
voxl-esc 1.5.4
voxl-feature-tracker 0.5.2
voxl-flow-server 0.3.6
voxl-gphoto2-server 0.0.10
voxl-joystick-server 0.0.6
voxl-jpeg-turbo 2.1.3-7
voxl-lepton-server 1.3.3
voxl-lepton-tracker 0.0.4
voxl-libgphoto2 0.0.4
voxl-libuvc 1.0.7
voxl-logger 0.5.3
voxl-mavcam-manager 0.6.0
voxl-mavlink 0.1.5
voxl-mavlink-server 1.4.15-202603130958
voxl-modem 1.1.8
voxl-mongoose 7.7.0-2
voxl-mpa-to-ros 0.3.9
voxl-mpa-tools 1.4.0
voxl-open-vins 0.4.19
voxl-open-vins-server 0.3.12
voxl-opencv 4.5.5-3
voxl-osd 0.1.8
voxl-portal 0.7.11
voxl-px4 1.14.0-2.0.105
voxl-px4-params 0.7.6
voxl-qvio-server 1.2.0
voxl-remote-id 0.0.9
voxl-reset-slpi 0.0.1
voxl-state-estimator 0.0.5
voxl-streamer 0.7.5
voxl-suite 1.5.1
voxl-tag-detector 0.0.5
voxl-tflite-server 0.4.1
voxl-utils 1.4.8
voxl-uvc-server 0.1.7
voxl-vision-hub 1.8.23
voxl-vtx 1.4.7
voxl-wavemux 0.0.1
voxl2-io 0.0.3
voxl2-system-image 1.8.04-r0
voxl2-wlan 1.0-r0
@Alex-Kushleyev said in Hadron ov64b snapshots have a vertical image artifact:
before saving the raw bayer, start the misp output stream, so that AE can actually process
what do you mean by start the misp output stream?
@Alex-Kushleyev thanks for your response!
I will try these suggestions and let you know how it goes.
I tested jpeg quality at 75 and 95 and did not notice much of a difference in sharpness.
We have our VOXL2 with Hadron connected on J8. We have everything setup and can capture images successfully. After taking a bunch of images we noticed a vertical artifact in the hires_snapshot that consistently appears in the same column of pixels (~340).
Is this a data processing flaw? If so is there a way to diagnose / troubleshoot it? Here is my voxl-camera-server.conf and an example crop of the artifact.
{
"version": 0.1,
"fsync_en": false,
"fsync_gpio": 109,
"cameras": [{
"type": "boson",
"name": "boson",
"enabled": true,
"camera_id": 0,
"fps": 30,
"en_preview": true,
"en_misp": false,
"preview_width": 640,
"preview_height": 512,
"en_raw_preview": true,
"en_small_video": false,
"en_large_video": false,
"ae_mode": "off",
"en_rotate": false,
"small_video_width": 640,
"small_video_height": 480,
"small_venc_mode": "h264",
"small_venc_br_ctrl": "cqp",
"small_venc_Qfixed": 30,
"small_venc_Qmin": 15,
"small_venc_Qmax": 40,
"small_venc_nPframes": 9,
"small_venc_mbps": 2,
"small_venc_osd": false,
"large_video_width": -1,
"large_video_height": -1,
"large_venc_mode": "h264",
"large_venc_br_ctrl": "cqp",
"large_venc_Qfixed": 40,
"large_venc_Qmin": 15,
"large_venc_Qmax": 50,
"large_venc_nPframes": 29,
"large_venc_mbps": 40,
"large_venc_osd": false,
"misp_width": -1,
"misp_height": -1,
"misp_venc_enable": true,
"misp_venc_mode": "h264",
"misp_venc_br_ctrl": "cqp",
"misp_venc_Qfixed": 30,
"misp_venc_Qmin": 15,
"misp_venc_Qmax": 50,
"misp_venc_nPframes": 29,
"misp_venc_mbps": 2,
"misp_venc_osd": false,
"misp_awb": "auto",
"misp_gamma": 1,
"gain_min": 54,
"gain_max": 8000
}, {
"type": "ov64b",
"name": "hires",
"enabled": true,
"camera_id": 1,
"fps": 15,
"en_preview": true,
"en_misp": false,
"preview_width": 1920,
"preview_height": 1080,
"en_raw_preview": false,
"en_small_video": false,
"en_large_video": false,
"en_snapshot": true,
"ae_mode": "isp",
"gain_min": 100,
"gain_max": 32000,
"small_video_width": 1024,
"small_video_height": 768,
"small_venc_mode": "h264",
"small_venc_br_ctrl": "cqp",
"small_venc_Qfixed": 30,
"small_venc_Qmin": 15,
"small_venc_Qmax": 40,
"small_venc_nPframes": 9,
"small_venc_mbps": 2,
"small_venc_osd": false,
"large_video_width": 3840,
"large_video_height": 2160,
"large_venc_mode": "h264",
"large_venc_br_ctrl": "cqp",
"large_venc_Qfixed": 40,
"large_venc_Qmin": 15,
"large_venc_Qmax": 50,
"large_venc_nPframes": 29,
"large_venc_mbps": 40,
"large_venc_osd": false,
"en_snapshot_width": 9248,
"en_snapshot_height": 6944,
"exif_focal_length": 3.0999999046325684,
"exif_focal_length_in_35mm_format": 17,
"exif_fnumber": 1.2400000095367432,
"snapshot_jpeg_quality": 75,
"misp_width": -1,
"misp_height": -1,
"misp_venc_enable": true,
"misp_venc_mode": "h265",
"misp_venc_br_ctrl": "cqp",
"misp_venc_Qfixed": 38,
"misp_venc_Qmin": 15,
"misp_venc_Qmax": 50,
"misp_venc_nPframes": 29,
"misp_venc_mbps": 30,
"misp_venc_osd": false,
"misp_awb": "auto",
"misp_gamma": 1.6
}]
}

Additionally - we are noticing a soft focus on every image. Are there any camera-server parameters for the Hadron that could lead to this sort of effect? Image EXIF shows:
9248 x 6944
72 dpi
24 bit
3.1 mm
f/1.24
1/2500
ISO 54
EXP 0
Lastly - are we able to capture RAW images from the hadron at full resolution?
Thanks!
@Eric-Katzfey I configured the drone to have servo5 trigger the camera. When idle, servo 5 shows 1100. When triggered, it goes up to 1300. In the Mavlink messages I can now watch for SERVO_OUTPUT_RAW msg.servo5_raw and detect the rising edge which emulates the trigger.
msg = master.recv_match(type='SERVO_OUTPUT_RAW', blocking=True, timeout=2)
if not msg:
continue
pwm = msg.servo5_raw
I have done this on a ground station using pymavlink to listen for messages. What is the best way to listen for this mavlink message on the VOXL2? Reminder - I am using Ardupilot.
@Eric-Katzfey We have the Hadron configured with voxl-camera-server.conf
"type": "ov64b",
"name": "hires",
....
"en_snapshot": true,
...
so we can take images with voxl-send-command hires_snapshot snapshot
I would love to configure the camera in Ardupilot with CAM1_TYPE and set DO_SET_CAM_TRIGG_DIST to a distance interval that I will capture images at.
If that is not directly possible, could you help me with a way to create a sort of interface script that sits on VOXL2 that listens for GPIO relay triggers or something like that? Then I can just call the snapshot command when triggered.
I have a VOXL2 running ardupilot and have a Hadron camera connected and configured with voxl-camera-server. I can take snapshots successfully.
I am trying to configure our drone to capture images at a specific distance interval during flight with the DO_SET_CAM_TRIGG_DIST parameter. Is there a way to do this with VOXL2 and ardupilot?
Thanks!
Hi,
I'm working with a VOXL2 and the FLIR Hadron 640 camera, and I'm trying to stream video from the OV64B sensor while taking snapshots at the same time.
Initially, I attempted to use "en_preview": true along with "en_snapshot": true, but that configuration did not allow me to stream video. I assumed it might be a resolution constraint, so I modified the configuration to use "en_small_video": true and "en_snapshot": true instead.
Now I can stream video, and when I enter the following command:
voxl2:/data/snapshots$ voxl-send-command hires_snapshot
Successfully sent command to /run/mpa/hires_snapshot/control
In the voxl-camera-server terminal, I receive this error:
ERROR: Camera: hires got unknown Command:
However, when I enter:
voxl2:/data/snapshots$ voxl-send-command hires_snapshot snapshot-no-save
Successfully sent command to /run/mpa/hires_snapshot/control
The camera server shows:
------ voxl-camera-server: Camera server is now running
Camera: hires taking snapshot for pipe only (not saving it)
But I’m unable to access the snapshot data, even after running adb pull.
My Questions:
Is it possible to stream and take snapshots simultaneously on the OV64B?
What does the error message “Camera: hires got unknown Command” mean?
How can I access the output of snapshot-no-save if it's not being saved to disk?
Thanks in advance for your help!
Below is my camera config code:
{
"version": 0.1,
"fsync_en": false,
"fsync_gpio": 109,
"cameras": [
{
"type": "boson",
"name": "boson",
"enabled": true,
"camera_id": 0,
"fps": 30,
"en_preview": true,
"en_misp": false,
"preview_width": 640,
"preview_height": 512,
"en_raw_preview": true,
"en_small_video": false,
"en_large_video": false,
"ae_mode": "off"
},
{
"type": "ov64b",
"name": "hires",
"enabled": true,
"camera_id": 1,
"fps": 15,
"en_preview": false,
"en_misp": false,
"preview_width": 1920,
"preview_height": 1080,
"en_raw_preview": false,
"en_small_video": true,
"small_video_width": 1024,
"small_video_height": 768,
"small_venc_mode": "h265",
"en_large_video": false,
"small_venc_br_ctrl": "cqp",
"small_venc_Qfixed": 30,
"small_venc_Qmin": 15,
"small_venc_Qmax": 40,
"small_venc_nPframes": 9,
"small_venc_mbps": 2,
"en_snapshot": true,
"en_snapshot_width": 1920,
"en_snapshot_height": 1080,
"ae_mode": "isp",
"gain_min": 54,
"gain_max": 32000
}
]
}
I was wondering if there is a way to log altitude and/or barometer data similar to voxl-logger for imu data.
Thanks
@Alex-Kushleyev yes you can reference the log
We were attempting a tuning flight with a fresh rebuild and while checking stability all motors shut off, drone flipped and crashed inverted. Log attached, of note is in the logged messages "landing detected at 09:13 while it was approximately 27m in the air.
https://review.px4.io/plot_app?log=6ad22692-fe3f-4cce-b8f0-a812d91bfa16
Hardware:
VOXL2
FPV ESC
Tmotor MN5006 450kv (params tuned for low kv)
Doodle Meshrider radio
Control via Jeti RC connected to GCS
@Alex-Kushleyev I found that the parameters were just not used and once I set them with px4-param set PARAM_NAME param-value that they show up in QGC
One that I am still stuck on though. I am looking for a parameter TRIG_PINS that is not in the list of params in px4-param show -a
The default is 56 and I need to know how to map the pins to the PWM expansion board. From px4 documentation:
TRIGGER_INTERFACE = 2
"Enables the Seagull MAP2 interface. This allows the use of the Seagull MAP2 to interface to a multitude of supported cameras. Pin 1 of the MAP2 should be connected to the lower AUX pin of TRIG_PINS (therefore, pin 1 to AUX 5 and pin 2 to AUX 6 by default). In this mode, PX4 also supports automatic power control and keep-alive functionalities of Sony Multiport cameras like the QX-1."
@Alex-Kushleyev I am looking to enable the seagull trigger in camera interfaces as shown here , but I do not see that option. I see that the interface is in the modalai repo but how do I enable it to show up in QGC?
@Alex-Kushleyev Okay I can do some searching for how to setup the trigger.
For the camera trigger.
Neutral state is 1500 microseconds
To trigger the camera, change the duty cycle to yield 1200 microseconds and hold that for one second before switching back to 1500 microseconds
Is that something that can be done?
@Alex-Kushleyev okay I upgraded px4 and updated the px4-start script - now see 8 pwm channels.
I need to configure the camera trigger as shown in the image below (it is shown in mission planner and I am not sure how to do it in QGC)

Can you please explain how I can configure the PWM output to trigger a shutter "pushed".
Thanks!
@Alex-Kushleyev we are all good on the RC front. We have the PWM expansion board and are trying to understand how to configure QGC. In the actuators tab, the I/O board is recognized but in the VOXL2 IO output tab it only shows 4 pwm channels that are all set to motors (which we don’t need). How can we use one of the other channels or configure one of the first 4 to provide a standard PWM that we can use for our camera trigger interface?
@Alex-Kushleyev yes I am looking to output standard PWM signals. We have the VOXL2 I/O expander board (MDK-M0065). We originally got it for RC connection but we’re also hoping to use the PWM capability for camera triggering.
@Alex-Kushleyev I would like to use the IO board to output a PWM for this camera trigger adapter. I do not need it to control motors as we are using the FPV 4in1 ESC.
Can you please give me instructions on how to configure voxl and QGC to output the PWM? Do I need to upgrade the IO board firmware?
Thanks