天天看點

[13]ESP32+光流傳感器PMW3901移植與調試

文章目錄

    • 一、PMW3901傳感器介紹
      • 1. 主要特性
      • 2. 主要參數
      • 3. 封裝和引腳圖
      • 4. Power States & Sequence
    • 二、ATK-PMW3901子產品說明
      • 1. 主要特性&參數
      • 2. 硬體連接配接圖
      • 3. 原理圖
    • 三、與飛控程式通信
      • 1. 關鍵結構體
      • 2. 程式設計注意事項

ESPlane 項目更名為 ESP-Drone 現已公開代碼倉庫和文檔

代碼倉庫:https://github.com/espressif/esp-drone

中文文檔:https://docs.espressif.com/projects/espressif-esp-drone/zh_CN/latest/index.html

一、PMW3901傳感器介紹

PMW3901 是 PixArt 公司最新的高精度低功耗光學追蹤模組,可直接擷取 xy 方向運動

信 息 , 對地高度 8cm 以 上實作有效測量 , 工 作 電 流 < 9mA , 工 作 電 壓 VDD(1.8~2.1VDC) 和 VDDIO(1.8~3.6VDC),使用 4 線 SPI 接口通信。

1. 主要特性

  • Wide working range from 80 mm to infinity
  • No lens focusing required during lens mounting process
  • Power consumption of < 9 mA @ run mode
  • 16-bits motion data registers
  • Motion detect pin output
  • Internal oscillator – no clock input needed

2. 主要參數

Parameter Value
Supply Voltage (V) VDD: 1.8 – 2.1 VDDIO: 1.8 – 3.6
Working Range (mm) 80 to infinity
Interface 4-Wire SPI @ 2 Mhz
Package Type 28-pin COB Package with Lens Assembly:6 x 6 x 2.28 mm

3. 封裝和引腳圖

[13]ESP32+光流傳感器PMW3901移植與調試
[13]ESP32+光流傳感器PMW3901移植與調試
傳感器工作電壓較低,與3.3V的ESP32通信,需要VDD和VDDIO提供不同的電壓

4. Power States & Sequence

Power-Up Sequence

Although PMW3901MB performs an internal power up self-reset, it is still recommended that the Power_Up_Reset register is written every time power is applied. The appropriate sequence is as follows:

  1. Apply power to VDDIO first and followed by VDD, with a delay of no more than 100ms in between each supply. Ensure all supplies are stable.
  2. Wait for at least 40 ms.
  3. Drive NCS high, and then low to reset the SPI port.
  4. Write 0x5A to Power_Up_Reset register (or alternatively, toggle the NRESET pin).
  5. Wait for at least 1 ms.
  6. Read from registers 0x02, 0x03, 0x04, 0x05 and 0x06 one time regardless of the motion pin state.
  7. Refer Section 8.2 Performance Optimization Registers to configure the needed registers in order to achieve optimum performance of the chip.

Power-Down Sequence

PMW3901MB can be set to Shutdown mode by writing to Shutdown register. The SPI port should not be accessed when Shutdown mode is asserted, except the power-up command (writing 0x5A to register 0x3A). Other ICs on the same SPI bus can be accessed, as long as the chip’s NCS pin is not asserted.

To de-assert Shutdown mode:

8. Drive NCS high, and then low to reset the SPI port.

9. Write 0x5A to Power_Up_Reset register (or alternatively, toggle the NRESET pin).

10. Wait for at least 1 ms.

11. Read from registers 0x02, 0x03, 0x04, 0x05 and 0x06 one time regardless of the motion pin state.

12. Refer Section 8.2 Performance Optimization Registers to configure the needed registers in order to achieve optimum performance of the chip.

pixart其他産品助力IOT

二、ATK-PMW3901子產品說明

1. 主要特性&參數

該例程使用ATK-PMW3901子產品(闆載PMW3901與VL53L0X),PMW3901光流傳感器用于測量水準移動,VL53L0X用于測量對地高度(最大兩米)。

  • 注意該雷射傳感器适合室内飛行,室外強光下容易受到幹擾,導緻測量精度急劇下降。
  • 光流傳感器需要在一定的光照條件下飛行(>60Lux),光線強度過低會影響效果。
[13]ESP32+光流傳感器PMW3901移植與調試

2. 硬體連接配接圖

[13]ESP32+光流傳感器PMW3901移植與調試
[13]ESP32+光流傳感器PMW3901移植與調試

3. 原理圖

[13]ESP32+光流傳感器PMW3901移植與調試

原理圖分析:

  • vl53l0x工作電壓 AVDD 由 3.0V 的 LDO 經過一個 10R 電阻得到,大概是 2.8V,也恰好是 VL53LXX 工作最佳電壓
  • LED1 為紅外 LED,預設沒有焊接,由PMW3901晶片LEN_N引腳控制

三、與飛控程式通信

1. 關鍵結構體

typedef struct opFlow_s 
{
	float pixSum[2]; /*累積像素*/
	float pixComp[2]; /*像素補償*/
	float pixValid[2]; /*有效像素*/
	float pixValidLast[2]; /*上一次有效像素*/
	float deltaPos[2]; /*2 幀之間的位移 機關 cm*/
	float deltaVel[2]; /*速度 機關 cm/s*/
	float posSum[2]; /*累積位移 機關 cm*/
	float velLpf[2]; /*速度低通 機關 cm/s*/
	bool isOpFlowOk; /*光流狀态*/
	bool isDataValid; /*資料有效*/
} opFlow_t;

           
  • 累積像素,就是自四軸起飛後的累積像素;
  • 像素補償,就是補償由于飛機傾斜導緻的像素誤差;
  • 有效像素,指經過補償的實際像素;
  • 2 幀之間的位移,這個就是由像素轉換出來的實際位移,機關 cm;
  • 速度,這個速度是瞬時速度,由位移變化量微分得到,機關 cm/s;
  • 累積位移,實際位移,機關 cm速度低通,對速度進行低通,增加資料平滑性;
  • 光流狀态,光流是否正常工作;
  • 資料有效,在一定高度範圍内,資料有效;
typedef struct motionBurst_s {
  union {
    uint8_t motion;
    struct {
      uint8_t frameFrom0    : 1;
      uint8_t runMode       : 2;
      uint8_t reserved1     : 1;
      uint8_t rawFrom0      : 1;
      uint8_t reserved2     : 2;
      uint8_t motionOccured : 1;
    };
  };

  uint8_t observation;
  int16_t deltaX;
  int16_t deltaY;

  uint8_t squal;

  uint8_t rawDataSum;
  uint8_t maxRawData;
  uint8_t minRawData;

  uint16_t shutter;
} __attribute__((packed)) motionBurst_t;
           
  • motion :運動資訊,可以根據不同的位去判斷運動資訊,包括幀判别,運作模式和運動資訊檢測等。
  • observation:這個是用于檢測 IC 是否出現 EFT/B 或者 ESD 問題,傳感器正常工作時,讀取出來的值為0xBF。
  • deltaX, deltaY :光流檢測到圖像的 X 和 Y 方向的運動資訊。
  • squal :指運動資訊品質,簡單說就是運動資訊的可信度。
  • rawDataSum :這個是原資料求和,可用作對一幀資料求平均值;maxRawData 和 minRawData ,是最大和最小原始資料;
  • shutter:是一個實時自動調整的值,目的是保證平均運動資料在正常可操作範圍以内,這個值可以搭配 squal,用來判斷運動資訊是否可用。

2. 程式設計注意事項

  1. 如果連續 1s 内光流資料都為 0,說明出現故障,需要做挂起光流任務等處理。
  2. 可以設定pitch為x,roll方向為y,需要注意因為傳感器向下安裝,且地面不動,飛機向前走,圖像是向後的。
  3. 需要測量準确的高度,同于确定圖像像素和實際距離的對應關系,這個高度會作為一個計算的參數(是以隻有在定高模式穩定才能定點)光流手冊 42 頁計算關系。
補充計算關系與代碼實作
           
  1. 需要手動測試傾角補償,效果是,能夠通過補償,使飛行器有一定的傾角時,傳感器輸出基本不變化
補充測試過程
           
  1. 有了傾角補償和運動累積像素,我們就可以得到實際累積像素,減去上次的實際像素,就可以得到 2 幀之間的變化像素,再乘以系數就可以得到 2 幀之間的位移變化,可以看到還有對系數的限制,當高度小于 5cm,光流就無法工作了,是以系數設定為 0。接着對這個位移積分得到四軸到起飛點的位移,對這個位移微分得到瞬時速度,對速度進行低通增加資料的平滑性,對速度進行限幅處理,增加資料安全性。
  2. 通過光流就得到了四軸的位置資訊和速度資訊,把這些位置資訊和速度資訊融合加速計(state_estimator.c),得到估測位置和速度,将估測位置和速度參與 PID 運算,即可用于水準方向位置控制,這部分内容請看 position_pid.c,源碼裡面可以直接看到位置環和速度環 PID 的處理過程,這樣就可以實作水準定點控制了。