# PMW3901-Based Flow Sensors
PMW3901 is an optical flow ASIC that computes the flow internally and provides a difference in pixels between each frame. It is basically a tracking sensor similar to what you would find in a computer mouse, but adapted to work between 80 mm and infinity. The PMW3901 is used in a number of products, including some from: Bitcraze, Tindie, Hex, Thone and Alientek.
This topic provides links to sensors that have been tested, along with information about mounting and PX4 configuration (this is common to all sensors of this type).
# Boards using PMW3901
The following table shows some of the boards that use this sensor, listing the number of interfaces, the number of sensors, the input voltage, and the size. The board name links to board-specific sections that include wiring and purchase information.
|Manufacture||Board||Interface||Flow||Range Finder||Gyro||Voltage (V)||Size (mm)||Max Height (m)|
|Bitcraze||Flow breakout||SPI||Y||Y||-||3 - 5||21x20||1|
|Tindie||PMW3901 Optical Flow Sensor||SPI||Y||-||-||3 - 5||AxB||-|
|Hex||HereFlow PMW3901 Optical Flow Sensor||CAN||Y||Y||Y||3 - 5||AxB||4|
|Thone||ThoneFlow-3901U||UART||Y||-||-||3 - 5||AxB||-|
|Alientek||ATK-PMW3901||SPI||Y||-||-||3.3 - 4.2||27.5x16.5||1|
# External Rangefinders
An external rangefinder/distance sensor is required for the sensors that don't have a rangefinder (e.g. Tindie or Thone) and recommended for the other boards (as their range is quite limited).
The range needed is dependent on the application:
- Indoor flight: ≈4 meters
- Outdoor flight: ≥10 metres (e.g. to support the position control in environments where GPS might have issues)
Any rangefinder/distance sensor supported by PX4 may be used. The sensor can be mounted anywhere but must point down, and should be connected/configured as usual.
Flow modules are typically mounted near the centre of the vehicle. If mounted off-centre you will need to set offsets: Optical Flow > EKF2.
The flow modules may be mounted with any yaw orientation relative to vehicle body frame, but you must set the value used in SENS_FLOW_ROT.
The "zero" rotation is when the sensor board and vehicle X-axes are aligned (i.e. the "front" of the vehicle and the board are in the same direction), with rotations increasing in a clockwise direction.
PMW3901 modules have a small notch indicating the direction of the back of the board.
The diagram shows the orientation of the Bitcraze board to the vehicle that corresponds to
SENS_FLOW_ROT=0 (note the notch at the back).
You can use the notch to find the orientation of the other boards in the same way:
|Tindie ||Hex Hereflow|
|Thone ||Alientek (also has an arrow indicating the front!)|
# PX4 Configuration
The PX4 configuration that is common to all boards:
- Optical Flow > EKF2 explains how to fuse optical flow data in the EKF2 estimator and set position offsets for the mounting position of the flow sensor.
- SENS_FLOW_ROT sets the orientation of the flow sensor relative to vehicle heading.
- The distance sensors should be enabled as described in their setup documentation (no flow-specific configuration is required).
- Individual flow sensors are setup/configured as described in the sections below.
# Bitcraze Flow breakout
The board also incorporates a distance sensor that can be wired to the Pixhawk I2C port. This distance sensor is the VL53L0x ToF sensor from STMicroelectronics. The range of the sensor is very limited (2 meters) and will be reduced when flying in the sunlight. We therefore highly recommend that you use an external distance sensor.
# SPI Wiring
The PMW3901 driver was written such that the board can be directly plugged into the SPI port on the Pixhawk 4 using the chip select 1. When plugged into the SPI port of the Pixhawk 4, the Bitcraze flow module will be automatically detected at bootup. No parameters will have to configured other than the orientation and position of the sensor.
The pinout mapping for the Pixhawk SPI port to Bitcraze Flow Board is shown below (the port mapping is the same for all Pixhawk FMU versions).
|Pixhawk SPI Port (from left to right)||Bitcraze flow board|
|5 (CS1)||Do not connect|
In order to connect the bitcraze flow board to the Pixhawk you will need to solder the wires of the Pixhawk SPI cable to the flow board. An SPI cable has 7 wires, from which you need to connect 6 to the flow board.
The following diagram shows how to wire the sensor to a Pixhawk 4.
# I2C Wiring
The I2C wiring is the same for any other distance sensor. Simply connect the SLA, SLC, GND and VCC to the corresponding (same) pins on the Pixhawk and the sensor.
# Tindie PMW3901 Optical Flow Sensor
The sensor doesn't have a distance sensor onboard so you will need to use an external distance sensor.
# AlienTek ATK-PMW3901
The board also incorporates a distance sensor (again, we recommend that you use an external distance sensor). You can wire the internal sensor to the Pixhawk I2C port in the same way as any other I2C peripheral A screenshot showing the I2C pins (SLA, SLC, GND and VCC) is provided below.
# Hex HereFlow PMW3901 Optical Flow Sensor
The Hex HereFlow PMW3901 Optical Flow Sensor (opens new window) is a very small board containing the PMW3901 flow module, the VL53L1X distance sensor and an IMU to better synchronize the flow data with the gyro data.
An onboard microcontroller samples the three sensors and publishes 2 UAVCAN messages containing all the information needed for the flow and distance sensor calculations.
The board can be connected to any CAN port on any Pixhawk board (see UAVCAN wiring).
As for the other optical flow boards, we recommend thatyou use an external distance sensor.
# UAVCAN Wiring/Setup
The diagram below shows how to connect the sensor to the Pixhawk 4 CAN bus.
In addition to any other configuration, you will need to set the parameter UAVCAN_ENABLE to either 2 or 3, depending on your system:
UAVCAN_ENABLE=2: UAVCAN sensors but no motor controllers.
UAVCAN_ENABLE=3: UAVCAN sensors and motor controllers.
# Thone ThoneFlow-3901U
The Thone ThoneFlow-3901U (opens new window) exposes a PMW3901 optical flow module via a UART interface.
The board doesn't include a distance sensor onboard so you will need to use an external distance sensor.