VL53L5CX는 거리측정 데이터를 4 x 4 또는 8 x 8의 개별 구역에 생성할 수 있는 다구역 거리측정 ToF(Time-of-Flight) 센서입니다. 각 구역은 최대 네 개의 대상을 감지하며 최대 4m의 거리 측정이 가능합니다. 최대 거리측정 주파수는 4 x 4 분해능으로 설정된 경우 60Hz, 8 x 8 분해능으로 설정된 경우 15Hz입니다. 드라이버는 커버 유리 사용 시 혼선 보정, 저전력 동작을 위한 객체 경계 검출 그리고 움직임 검출과 같은 많은 추가 기능을 지원합니다
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 장치 설정
-
아직 하지 않았다면, 새로운 STM32CubeIDE 프로젝트를 생성합니다(File > New > STM32 Project). MCU/MPU Selector 또는 Board Selector 탭 중 하나를 사용하여 대상 장치를 선택합니다. 이 튜토리얼에서는, NUCLEO-F401RE를 선택했는데 이는 P-NUCLEO-53L5A1 평가 키트에 포함되어 있기 때문입니다. 프로젝트 이름을 정하고 Finish를 클릭합니다.
-
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 |
- 왼쪽의 Components List로부터 이전 단계에서 설정한 SDA 및 SCL 핀에 해당하는 I2C 주변 장치를 선택합니다. 저는 I2C1을 선택하였습니다. I2C 설정을 위해 Mode 패널의 드롭다운 목록에서 "I2C"를 선택합니다. 이렇게 하면, Pinout view에서 SDA 및 SCL 핀은 노란색에서 녹색으로 변경되어야 합니다. I2C Speed Mode 설정을 위해 Configuration 패널의 드롭다운 목록에서 "Fast Mode"를 선택합니다. 최종 I2C 설정은 그림 2와 유사해야 합니다.
- 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에 표시되어 있습니다.
- NVIC 탭에서, 그림 4와 같이 INT_C 핀에 해당하는 EXTI line4 interrupt 옆의 상자를 체크합니다.
.ioc
파일을 저장하여 프로젝트에 대한 코드를 생성합니다.
드라이버 추가
다시 한번, 이 튜토리얼은 VL53L5CX용 ULD API를 추가하고 활용하는 방법에 대해 설명합니다. X-CUBE-TOF1 패키지를 사용하고 싶다면, UM2853에 제공된 설명을 따라해 보시기 바랍니다.
-
ULD API를 다운로드한 후 원하는 위치에 파일의 압축을 풉니다. 이 게시글의 작성 시점에는 버전 1.3.6이 가장 최근의 릴리스입니다.
-
STM32CubeIDE의 Project Explorer에서 Drivers 폴더를 마우스 오른쪽 클릭해서 Import를 선택합니다. Import Wizard를 사용하여 General 카테고리로부터 File system을 선택합니다. Next를 클릭합니다.
-
“From directory:” 란에 ULD 드라이버 경로를 입력합니다:
<extraction_location>/VL53L5CX_ULD_driver_1.3.6
. 그림 5에서와 같이 VL53L5CX_ULD_API 디렉토리의 모든 리소스를 선택합니다. Finish를 클릭합니다.
-
Project Explorer에서
Drivers/VL53L5CX_ULD_API/inc
디렉토리를 마우스 오른쪽 클릭합니다. Add/remove include path… 를 선택하고 OK를 클릭합니다. -
예제 플랫폼 파일을 복사하여 프로젝트에 붙여넣습니다.
<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"
라인을 추가합니다. 프로젝트는 성공적으로 빌드 되어야 합니다.
응용 예제
이 게시글의 처음에 나와 있는 애니메이션은 Adafruit의 8 x 8 NeoPixel 매트릭스인 2872를 사용한 간단한 응용 예제를 보여줍니다. 하드웨어 구성을 보여주는 정지 이미지가 아래 그림 7에 나와 있습니다. 외부 5V(2A) 전원 공급 장치가 Nucleo 기판의 E5V에 연결되어 +5V 핀이 NeoPixel 매트릭스에 전원을 공급합니다. 아두이노 헤더의 D6인 PB10 핀이 NeoPixel에 제어 신호를 제공하므로, 이 핀은 NeoPixel 매트릭스의 DIN에 연결됩니다. NeoPixel 제어 신호 생성에 대한 자세한 정보는 STM32로 NeoPixel 제어하기를 참고하십시오.
Nucleo 기판을 동작 시키기 위해서는 올바른 시작 순서를 따라해야 합니다!
- JP5가 E5V 위치(핀 2와 3 사이)에 있는지 확인합니다.
- JP1이 제거되었는지 확인합니다.
- 외부 5V 전원을 연결하고 전원을 켭니다.
- LD3가 켜져 있는지 확인합니다.
- PC를 ST-LINK USB 커넥터(CN1)에 연결합니다.
기판이 손상되지 않도록 외부 전원을 사용하기 전에 UM1724의 6.3 부분을 꼭 읽어 보시기 바랍니다!
이 응용 예제에 사용할 ‘main.c’ 파일은 프로젝트의 GitHub 리포지토리에서 찾을 수 있습니다. printf 문의 활성화는 STM32에서 printf 간편하게 사용하기에서 설명된 방법을 사용하였습니다.