使用板 Nucleo-f401re 从 Lepton FLIR 相机获取连续流

Posted

技术标签:

【中文标题】使用板 Nucleo-f401re 从 Lepton FLIR 相机获取连续流【英文标题】:Getting continuous stream from Lepton FLIR Camera with board Nucleo-f401re 【发布时间】:2017-05-18 22:39:08 【问题描述】:

我将我的 Flir Lepton 相机连接到我的电路板上,并且我正在尝试获得连续的图像流,这要归功于程序 ThermalView(此处的源代码:https://github.com/groupgets/LeptonModule/tree/master/software/ThermalView) 我在我的板上编译并下载了以下代码:

    int main(void)


  //HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  SystemClock_Config();

  leptonEnd();
  // LEPTON VDD OFF
  HAL_Delay(1000);
  // LEPTON VDD ON
  HAL_Delay(185);

  LeptonConfigure_I2C(); 

  while(1)
  
    LeptonReadFrame();
    frameToPc(); 
  


// Output image buffer to USART2
void frameToPc()

  static uint8_t frameSkipper = 0;

  uint8_t timeStamp = (HAL_GetTick() - last_frame_millis); // calculate time passed since last been here

  last_frame_millis = HAL_GetTick();



  if(frameSkipper==4)
  
    //PSEDO//
    //IMGtoRGB();

    ////////
    uint8_t thermalView_header[] = 0xDE,0xAD,0xBE,0xEF; // 4-byte header for ThermalView application
    HAL_Delay(1000);
    HAL_UART_Transmit_DMA(&huart2, &thermalView_header[0], 4); // print header

    while(huart2.gState != HAL_UART_STATE_READY); // wait for transmission to complete

    HAL_UART_Transmit_DMA(&huart2, &IMG[0], LEPTON_IMG_SIZE_BYTES);

    frameSkipper = 0;
  

  frameSkipper++;
uint8_t LeptonReadFrame()
  
  uint8_t i, frame_number, frame_complete=0;
  uint16_t bad_frame_counter=0;

  while(!frame_complete)
  
    leptonBegin();

    HAL_SPI_Receive(&hspi1, &FramePacket[0], LEPTON_PACKET_LENGTH, 1000);  // READ LINE    

    leptonEnd();

    //HAL_UART_Transmit(&huart2,  &FramePacket[0], LEPTON_PACKET_LENGTH, 1000); // PRINT LINE

    if( (FramePacket[0] & 0x0f) != 0x0f ) // not discard frame
    
       frame_number = FramePacket[1];

       if(frame_number < 60) // valid frame
       
         bad_frame_counter = 0; 

         for(i= 0; i<LEPTON_PACKET_CONTENT_LENGTH; i++)
         
           IMG[frame_number*LEPTON_PACKET_CONTENT_LENGTH+i] = FramePacket[i+4]; // copy line into IMG buffer, ignoring ID and CRC
         
       
       else
       
         bad_frame_counter++;
       

       if(frame_number == 59)
       
          frame_complete = 1;
       

       if(bad_frame_counter>1000) // 800 lines = 5 bad frames = resync needed
       
          bad_frame_counter = 0;
          HAL_Delay(185);  // CS is already disabled so the delay is enougth
       
    
  
  return 1;

我已成功获取流,但我必须在每帧之间延迟 1 秒,并且必须在发送到计算机的 2 帧之间跳过帧。如果您注意到代码中存在阻止提高帧速率的错误,请告诉我。

【问题讨论】:

所以我假设您添加了if (frameSkipper==4) ... frameSkipper=0; 延迟代码?为什么必须在每帧之间放置 1 秒的延迟?如果你不这样做,你没有照片会发生什么? 你还有什么问题? 如果我不这样做,程序 ThermalView 没有按预期获取数据包,也没有成功读取帧。 Magaret,我想提高帧率 【参考方案1】:

您使用的是 Lepton 2 还是 Lepton 3? Lepton 3 不仅需要获取“帧”,还需要获取 4 个“段”。 Lepton 模块还输出 2 个空白屏幕。本文档中的更多详细信息:

http://www.flir.com/uploadedFiles/OEM/Products/LWIR-Cameras/Lepton/Lepton-vs-Lepton-3-App-Note.pdf

比较 Lepton 2X 系列 (80x60) 分辨率和 Lepton 3 (160x120) 分辨率。 Lepton 和 Lepton 3 VoSPI 接口之间最显着的四个区别是: 1) 在 Lepton 上,从单个数据包重建视频帧需要主机从每个数据包头中解码数据包编号。在 Lepton 3 上,主机必须同时解码数据包号和段号。 2) Lepton 3 的每帧总比特数是 Lepton 的 4 倍。因此,最小 SPI 时钟速率快 4 倍。两个模块的最大 SPI 时钟速率为 20 MHz。 3) Lepton 和 Lepton 3 都提供了在 GPIO3 上输出同步脉冲的选项。 Lepton 3 上的脉冲频率是 Lepton 上的 4 倍。对于 Lepton 3,同步脉冲表示下一个可用段何时可用,而对于 Lepton,它指示下一个可用帧何时可用。 4) 在 Lepton 中启用遥测时,会产生三个额外的视频行(每帧总共 63 个数据包)。在 Lepton 3 中启用遥测后,每段会产生 1 个额外的数据包,总共有 2 个额外的视频行。

我试图让轻子 3 在我的 stm32f746g-discovery 板上工作。

【讨论】:

以上是关于使用板 Nucleo-f401re 从 Lepton FLIR 相机获取连续流的主要内容,如果未能解决你的问题,请参考以下文章

在 IAR Workbench 上加载闪存加载程序失败

在STM32 Nucleo上多次触发上升沿中断

在 STM32CubeIDE 上打印(用 C 语言)到 IDE 控制台

在 Nucleo-F446RE 上通过 CANBUS 进行引导加载程序访问

从 STM32 Nucleo-F767ZI [Ubuntu] 中的 USB 虚拟 COM 读取数据

开源电路STM32F401RCT6开发板