VL53L5CX ToF 센서 시작하기

VL53L5CX는 거리측정 데이터를 4 x 4 또는 8 x 8의 개별 구역에 생성할 수 있는 다구역 거리측정 ToF(Time-of-Flight) 센서입니다. 각 구역은 최대 네 개의 대상을 감지하며 최대 4m의 거리 측정이 가능합니다. 최대 거리측정 주파수는 4 x 4 분해능으로 설정된 경우 60Hz, 8 x 8 분해능으로 설정된 경우 15Hz입니다. 드라이버는 커버 유리 사용 시 혼선 보정, 저전력 동작을 위한 객체 경계 검출 그리고 움직임 검출과 같은 많은 추가 기능을 지원합니다

demo_animation

VL53L5CX용 드라이버에는 두 종류가 있습니다. ULD API는 기본 기능에 필요한 단 세 개의 파일만 포함하는 최적화된 C 함수 모음을 골자로 하고 있습니다. 반면, X-CUBE-TOF1 소프트웨어 확장 패키지는 HAL(Hardware Abstraction Layer, 하드웨어 추상화 레이어)와 여러 응용 예제를 포함하고 있어서, X-NUCLEO-53L5A1 확장 기판 및/또는 VL53L5CX-SATEL 브레이크아웃 기판으로 시제품을 제작하기에 이상적입니다. X-CUBE-TOF1 패키지는 STM32CubeMX 코드 설정 소프트웨어에 잘 통합되어 있으며, UM2853에 자세한 시작 관련 설명이 포함되어 있습니다. 따라서 프로젝트에 드라이버를 추가하기 위해서는 약간의 수작업이 필요하기 때문에, 이 게시글은 ULD API에 초점을 맞출 것입니다. 마지막 부분에서는 위의 동영상 속 예제 프로젝트를 재현하기 위한 리소스 또한 제공합니다.

요구 사항

시작하기 전 다음 펌웨어, 소프트웨어 및 하드웨어 항목들이 구비되어 있어야 합니다.

  • STSW-IMG023 (본 튜토리얼에는 버전 1.3.6이 사용됨)
    • 이 패키지는 플랫폼에 독립적인 (C로 작성된) VL53L5CX ULD 드라이버 파일을 포함하고 있으며, 여기에서 다운로드 할 수 있습니다.
  • Nucleo 기판
    • 본 튜토리얼에는 NUCLEO-F401RE 기판을 사용했지만 아무 Nucleo 기판을 사용해도 될 것입니다(설명은 약간 변경해야 하겠지만). USB 케이블은 포함되어 있지 않습니다.
  • X-NUCLEO-53L1A1
    • VL53L5CX 모듈을 평가하기 위한 확장 기판. 여기에서 구매할 수 있습니다.
  • STM32CubeIDE (본 튜토리얼에는 버전 1.11.2이 사용됨)
    • 원하는 경우 다른 IDE(예를 들어 Keil, IAR 등)를 사용하셔도 괜찮습니다. 그렇지만 STM32CubeIDE를 사용하시는 것을 진심으로 추천합니다. 특히 STM32 개발이 처음이라면 더욱 그렇습니다. 여기에서 다운로드 할 수 있습니다.)

STM32 장치 설정

  1. 아직 하지 않았다면, 새로운 STM32CubeIDE 프로젝트를 생성합니다(File > New > STM32 Project). MCU/MPU Selector 또는 Board Selector 탭 중 하나를 사용하여 대상 장치를 선택합니다. 이 튜토리얼에서는, NUCLEO-F401RE를 선택했는데 이는 P-NUCLEO-53L5A1 평가 키트에 포함되어 있기 때문입니다. 프로젝트 이름을 정하고 Finish를 클릭합니다.

  2. Device Configurator Tool을 사용하여(자동으로 실행되지 않으면 Project Explorer에서 .ioc 파일을 더블 클릭해서 실행), VL53L5CX 센서와 인터페이스하도록 장치를 설정합니다. Pinout view에서 I2C 인스턴스, 외부 인터럽트 신호 및 인에이블/리셋 신호에 대한 장치의 GPIO 핀들을 설정하는 것부터 시작합니다. 이 예제에서는 X-NUCLEO-53L5A1 확장 기판의 VL53L5CX 모듈을 사용했기 때문에, UM2889의 그림 2에 제공된 회로도에 기반하여 장치를 설정하였습니다(아래 표 1 참조). 최종 핀아웃 설정은 그림 1에 나와 있습니다.

표 1: X-NUCLEO-53L5A1 확장 기판의 VL53L5CX 모듈을 위한 GPIO 설정

X-NUCLEO-53L5CX 신호 명칭 아두이노 핀 NUCLEO-F401RE 핀 핀 설정
I2C_RST_C D3 PB3 GPIO_Output
LPn_C D5 PB4 GPIO_Output
PWR_EN_C A3 PB0 GPIO_Output
INT_C A2 PA4 GPIO_EXTIx
SCL D15 PB8 I2Cx_SCL
SDA D14 PB9 I2Cx_SDA


그림 1: 표 1의 신호에 상응하는 핀아웃 설정 변경

  1. 왼쪽의 Components List로부터 이전 단계에서 설정한 SDA 및 SCL 핀에 해당하는 I2C 주변 장치를 선택합니다. 저는 I2C1을 선택하였습니다. I2C 설정을 위해 Mode 패널의 드롭다운 목록에서 "I2C"를 선택합니다. 이렇게 하면, Pinout view에서 SDA 및 SCL 핀은 노란색에서 녹색으로 변경되어야 합니다. I2C Speed Mode 설정을 위해 Configuration 패널의 드롭다운 목록에서 "Fast Mode"를 선택합니다. 최종 I2C 설정은 그림 2와 유사해야 합니다.


그림 2: VL53L5CX 센서의 I2C 설정

  1. Components List로부터 GPIO 주변 장치를 선택하고 PWR_EN_C 및 LPn_C 핀의 GPIO output level을 "High"로 변경합니다. INT_C 핀의 경우, GPIO mode를 “External Interrupt Mode with Falling edge trigger detection”로 변경합니다. 그리고 GPIO Pull-up/Pull-down은 X-NUCLEO-53L5A1 기판에 47kΩ 풀업 저항(R5)이 실장되어 있기 때문에 기본 설정인 "No pull-up and no pull-down"을 그대로 두었습니다. 선택사항으로, 명확하게 하기 위해 해당하는 VL53L5CX 인터페이스 핀의 신호 명칭을 User Label에 추가합니다. GPIO 설정에 대한 이러한 변경 사항들은 그림 3에 표시되어 있습니다.


그림 3: VL53L5CX 센서의 GPIO 설정

  1. NVIC 탭에서, 그림 4와 같이 INT_C 핀에 해당하는 EXTI line4 interrupt 옆의 상자를 체크합니다.


그림 4: VL53L5CX INT 신호에 해당하는 외부 인터럽트의 활성화

  1. .ioc 파일을 저장하여 프로젝트에 대한 코드를 생성합니다.

드라이버 추가

다시 한번, 이 튜토리얼은 VL53L5CX용 ULD API를 추가하고 활용하는 방법에 대해 설명합니다. X-CUBE-TOF1 패키지를 사용하고 싶다면, UM2853에 제공된 설명을 따라해 보시기 바랍니다.

  1. ULD API를 다운로드한 후 원하는 위치에 파일의 압축을 풉니다. 이 게시글의 작성 시점에는 버전 1.3.6이 가장 최근의 릴리스입니다.

  2. STM32CubeIDE의 Project Explorer에서 Drivers 폴더를 마우스 오른쪽 클릭해서 Import를 선택합니다. Import Wizard를 사용하여 General 카테고리로부터 File system을 선택합니다. Next를 클릭합니다.

  3. “From directory:” 란에 ULD 드라이버 경로를 입력합니다: <extraction_location>/VL53L5CX_ULD_driver_1.3.6. 그림 5에서와 같이 VL53L5CX_ULD_API 디렉토리의 모든 리소스를 선택합니다. Finish를 클릭합니다.


그림 5: VL53L5CX ULD 드라이버 가져오기

  1. Project Explorer에서 Drivers/VL53L5CX_ULD_API/inc 디렉토리를 마우스 오른쪽 클릭합니다. Add/remove include path… 를 선택하고 OK를 클릭합니다.

  2. 예제 플랫폼 파일을 복사하여 프로젝트에 붙여넣습니다.

  • <extraction_location>/VL53L5CX_ULD_driver_1.3.6/CubeIDE_F401RE_Example/Core/Inc/platform.h를 복사하여 Core/Inc에 붙여넣습니다.
  • <extraction_location>/VL53L5CX_ULD_driver_1.3.6/CubeIDE_F401RE_Example/Core/Src/platform.c를 복사하여 Core/Src에 붙여넣습니다.

디렉토리 구조의 변경 사항은 아래 그림 6에 나와 있습니다. 드라이버 사용을 시작하려면, main.c 파일의 Private includes 부분에 #include "vl53l5cx_api.h" 라인을 추가합니다. 프로젝트는 성공적으로 빌드 되어야 합니다.


그림 6: 플랫폼 파일

응용 예제

이 게시글의 처음에 나와 있는 애니메이션은 Adafruit의 8 x 8 NeoPixel 매트릭스인 2872를 사용한 간단한 응용 예제를 보여줍니다. 하드웨어 구성을 보여주는 정지 이미지가 아래 그림 7에 나와 있습니다. 외부 5V(2A) 전원 공급 장치가 Nucleo 기판의 E5V에 연결되어 +5V 핀이 NeoPixel 매트릭스에 전원을 공급합니다. 아두이노 헤더의 D6인 PB10 핀이 NeoPixel에 제어 신호를 제공하므로, 이 핀은 NeoPixel 매트릭스의 DIN에 연결됩니다. NeoPixel 제어 신호 생성에 대한 자세한 정보는 STM32로 NeoPixel 제어하기를 참고하십시오.


Figure 7: 응용 예제 사진

Nucleo 기판을 동작 시키기 위해서는 올바른 시작 순서를 따라해야 합니다!

  1. JP5가 E5V 위치(핀 2와 3 사이)에 있는지 확인합니다.
  2. JP1이 제거되었는지 확인합니다.
  3. 외부 5V 전원을 연결하고 전원을 켭니다.
  4. LD3가 켜져 있는지 확인합니다.
  5. PC를 ST-LINK USB 커넥터(CN1)에 연결합니다.

기판이 손상되지 않도록 외부 전원을 사용하기 전에 UM1724의 6.3 부분을 꼭 읽어 보시기 바랍니다!

이 응용 예제에 사용할 ‘main.c’ 파일은 프로젝트의 GitHub 리포지토리에서 찾을 수 있습니다. printf 문의 활성화는 STM32에서 printf 간편하게 사용하기에서 설명된 방법을 사용하였습니다.



영문 원본: Getting Started with the VL53L5CX ToF Sensor