kopia lustrzana https://github.com/pimoroni/pimoroni-pico
VL53L5CX: Initial bringup
rodzic
7dd1c60861
commit
6028bc16b6
|
@ -17,3 +17,7 @@
|
|||
[submodule "micropython/modules/qrcode"]
|
||||
path = micropython/modules/qrcode
|
||||
url = https://github.com/pimoroni/QR-Code-Generator
|
||||
[submodule "drivers/vl53l5cx/src"]
|
||||
path = drivers/vl53l5cx/src
|
||||
url = https://github.com/ST-mirror/VL53L5CX_ULD_driver
|
||||
branch = lite/en
|
||||
|
|
|
@ -29,3 +29,4 @@ add_subdirectory(hub75)
|
|||
add_subdirectory(uc8151)
|
||||
add_subdirectory(pwm)
|
||||
add_subdirectory(servo)
|
||||
add_subdirectory(vl53l5cx)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
include(${CMAKE_CURRENT_LIST_DIR}/vl53l5cx.cmake)
|
|
@ -0,0 +1,188 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
|
||||
*
|
||||
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
|
||||
* either 'STMicroelectronics Proprietary license'
|
||||
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
|
||||
*
|
||||
********************************************************************************
|
||||
*
|
||||
* 'STMicroelectronics Proprietary license'
|
||||
*
|
||||
********************************************************************************
|
||||
*
|
||||
* License terms: STMicroelectronics Proprietary in accordance with licensing
|
||||
* terms at www.st.com/sla0081
|
||||
*
|
||||
* STMicroelectronics confidential
|
||||
* Reproduction and Communication of this document is strictly prohibited unless
|
||||
* specifically authorized in writing by STMicroelectronics.
|
||||
*
|
||||
*
|
||||
********************************************************************************
|
||||
*
|
||||
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
|
||||
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
|
||||
* following provisions apply instead of the ones mentioned above :
|
||||
*
|
||||
********************************************************************************
|
||||
*
|
||||
* License terms: BSD 3-clause "New" or "Revised" License.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
#include "platform.h"
|
||||
#include "pico/stdlib.h"
|
||||
|
||||
uint8_t RdByte(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint16_t RegisterAdress,
|
||||
uint8_t *p_value)
|
||||
{
|
||||
const uint8_t buf[2] = {
|
||||
RegisterAdress >> 8,
|
||||
RegisterAdress & 0xff
|
||||
};
|
||||
i2c_write_blocking(p_platform->i2c, p_platform->address, buf, sizeof(buf), true);
|
||||
if(i2c_read_blocking(p_platform->i2c, p_platform->address, p_value, 1, false) != PICO_ERROR_GENERIC){
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 255;
|
||||
}
|
||||
|
||||
uint8_t WrByte(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint16_t RegisterAdress,
|
||||
uint8_t value)
|
||||
{
|
||||
const uint8_t buf[3] = {
|
||||
RegisterAdress >> 8,
|
||||
RegisterAdress & 0xff,
|
||||
value,
|
||||
};
|
||||
if(i2c_write_blocking(p_platform->i2c, p_platform->address, buf, sizeof(buf), false) != PICO_ERROR_GENERIC) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 255;
|
||||
}
|
||||
|
||||
uint8_t WrMulti(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint16_t RegisterAdress,
|
||||
uint8_t *p_values,
|
||||
uint32_t size)
|
||||
{
|
||||
uint8_t buf[size + 2];
|
||||
buf[0] = RegisterAdress >> 8;
|
||||
buf[1] = RegisterAdress & 0xff;
|
||||
|
||||
memcpy(buf + 2, p_values, size);
|
||||
|
||||
if(i2c_write_blocking(p_platform->i2c, p_platform->address, buf, size + 2, false) != PICO_ERROR_GENERIC) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 255;
|
||||
}
|
||||
|
||||
uint8_t RdMulti(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint16_t RegisterAdress,
|
||||
uint8_t *p_values,
|
||||
uint32_t size)
|
||||
{
|
||||
const uint8_t buf[2] = {
|
||||
RegisterAdress >> 8,
|
||||
RegisterAdress & 0xff
|
||||
};
|
||||
i2c_write_blocking(p_platform->i2c, p_platform->address, buf, sizeof(buf), true);
|
||||
if(i2c_read_blocking(p_platform->i2c, p_platform->address, p_values, size, false) != PICO_ERROR_GENERIC){
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 255;
|
||||
}
|
||||
|
||||
uint8_t Reset_Sensor(
|
||||
VL53L5CX_Platform *p_platform)
|
||||
{
|
||||
uint8_t status = 0;
|
||||
|
||||
/* (Optional) Need to be implemented by customer. This function returns 0 if OK */
|
||||
|
||||
/* Set pin LPN to LOW */
|
||||
/* Set pin AVDD to LOW */
|
||||
/* Set pin VDDIO to LOW */
|
||||
WaitMs(p_platform, 100);
|
||||
|
||||
/* Set pin LPN of to HIGH */
|
||||
/* Set pin AVDD of to HIGH */
|
||||
/* Set pin VDDIO of to HIGH */
|
||||
WaitMs(p_platform, 100);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void SwapBuffer(
|
||||
uint8_t *buffer,
|
||||
uint16_t size)
|
||||
{
|
||||
uint32_t i, tmp;
|
||||
|
||||
/*for(auto i = 0u; i < size / 4u; i++) {
|
||||
uint32_t *dword = &((uint32_t *)buffer)[i];
|
||||
*dword = __builtin_bswap32(*dword);
|
||||
}*/
|
||||
|
||||
/* Example of possible implementation using <string.h> */
|
||||
for(i = 0; i < size; i = i + 4)
|
||||
{
|
||||
tmp = (
|
||||
buffer[i]<<24)
|
||||
|(buffer[i+1]<<16)
|
||||
|(buffer[i+2]<<8)
|
||||
|(buffer[i+3]);
|
||||
|
||||
memcpy(&(buffer[i]), &tmp, 4);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t WaitMs(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint32_t TimeMs)
|
||||
{
|
||||
sleep_ms(TimeMs);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,219 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
|
||||
*
|
||||
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
|
||||
* either 'STMicroelectronics Proprietary license'
|
||||
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
|
||||
*
|
||||
********************************************************************************
|
||||
*
|
||||
* 'STMicroelectronics Proprietary license'
|
||||
*
|
||||
********************************************************************************
|
||||
*
|
||||
* License terms: STMicroelectronics Proprietary in accordance with licensing
|
||||
* terms at www.st.com/sla0081
|
||||
*
|
||||
* STMicroelectronics confidential
|
||||
* Reproduction and Communication of this document is strictly prohibited unless
|
||||
* specifically authorized in writing by STMicroelectronics.
|
||||
*
|
||||
*
|
||||
********************************************************************************
|
||||
*
|
||||
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
|
||||
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
|
||||
* following provisions apply instead of the ones mentioned above :
|
||||
*
|
||||
********************************************************************************
|
||||
*
|
||||
* License terms: BSD 3-clause "New" or "Revised" License.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _PLATFORM_H_
|
||||
#define _PLATFORM_H_
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hardware/i2c.h"
|
||||
|
||||
/**
|
||||
* @brief Structure VL53L5CX_Platform needs to be filled by the customer,
|
||||
* depending on his platform. At least, it contains the VL53L5CX I2C address.
|
||||
* Some additional fields can be added, as descriptors, or platform
|
||||
* dependencies. Anything added into this structure is visible into the platform
|
||||
* layer.
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* To be filled with customer's platform. At least an I2C address/descriptor
|
||||
* needs to be added */
|
||||
/* Example for most standard platform : I2C address of sensor */
|
||||
uint16_t address;
|
||||
i2c_inst_t *i2c;
|
||||
|
||||
} VL53L5CX_Platform;
|
||||
|
||||
/*
|
||||
* @brief The macro below is used to define the number of target per zone sent
|
||||
* through I2C. This value can be changed by user, in order to tune I2C
|
||||
* transaction, and also the total memory size (a lower number of target per
|
||||
* zone means a lower RAM). The value must be between 1 and 4.
|
||||
*/
|
||||
|
||||
#define VL53L5CX_NB_TARGET_PER_ZONE 1U
|
||||
|
||||
/*
|
||||
* @brief The macro below can be used to avoid data conversion into the driver.
|
||||
* By default there is a conversion between firmware and user data. Using this macro
|
||||
* allows to use the firmware format instead of user format. The firmware format allows
|
||||
* an increased precision.
|
||||
*/
|
||||
|
||||
// #define VL53L5CX_USE_RAW_FORMAT
|
||||
|
||||
/*
|
||||
* @brief All macro below are used to configure the sensor output. User can
|
||||
* define some macros if he wants to disable selected output, in order to reduce
|
||||
* I2C access.
|
||||
*/
|
||||
|
||||
// #define VL53L5CX_DISABLE_AMBIENT_PER_SPAD
|
||||
// #define VL53L5CX_DISABLE_NB_SPADS_ENABLED
|
||||
// #define VL53L5CX_DISABLE_NB_TARGET_DETECTED
|
||||
// #define VL53L5CX_DISABLE_SIGNAL_PER_SPAD
|
||||
// #define VL53L5CX_DISABLE_RANGE_SIGMA_MM
|
||||
// #define VL53L5CX_DISABLE_DISTANCE_MM
|
||||
// #define VL53L5CX_DISABLE_REFLECTANCE_PERCENT
|
||||
// #define VL53L5CX_DISABLE_TARGET_STATUS
|
||||
// #define VL53L5CX_DISABLE_MOTION_INDICATOR
|
||||
|
||||
/**
|
||||
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
|
||||
* structure.
|
||||
* @param (uint16_t) Address : I2C location of value to read.
|
||||
* @param (uint8_t) *p_values : Pointer of value to read.
|
||||
* @return (uint8_t) status : 0 if OK
|
||||
*/
|
||||
|
||||
uint8_t RdByte(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint16_t RegisterAdress,
|
||||
uint8_t *p_value);
|
||||
|
||||
/**
|
||||
* @brief Mandatory function used to write one single byte.
|
||||
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
|
||||
* structure.
|
||||
* @param (uint16_t) Address : I2C location of value to read.
|
||||
* @param (uint8_t) value : Pointer of value to write.
|
||||
* @return (uint8_t) status : 0 if OK
|
||||
*/
|
||||
|
||||
uint8_t WrByte(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint16_t RegisterAdress,
|
||||
uint8_t value);
|
||||
|
||||
/**
|
||||
* @brief Mandatory function used to read multiples bytes.
|
||||
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
|
||||
* structure.
|
||||
* @param (uint16_t) Address : I2C location of values to read.
|
||||
* @param (uint8_t) *p_values : Buffer of bytes to read.
|
||||
* @param (uint32_t) size : Size of *p_values buffer.
|
||||
* @return (uint8_t) status : 0 if OK
|
||||
*/
|
||||
|
||||
uint8_t RdMulti(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint16_t RegisterAdress,
|
||||
uint8_t *p_values,
|
||||
uint32_t size);
|
||||
|
||||
/**
|
||||
* @brief Mandatory function used to write multiples bytes.
|
||||
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
|
||||
* structure.
|
||||
* @param (uint16_t) Address : I2C location of values to write.
|
||||
* @param (uint8_t) *p_values : Buffer of bytes to write.
|
||||
* @param (uint32_t) size : Size of *p_values buffer.
|
||||
* @return (uint8_t) status : 0 if OK
|
||||
*/
|
||||
|
||||
uint8_t WrMulti(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint16_t RegisterAdress,
|
||||
uint8_t *p_values,
|
||||
uint32_t size);
|
||||
|
||||
/**
|
||||
* @brief Optional function, only used to perform an hardware reset of the
|
||||
* sensor. This function is not used in the API, but it can be used by the host.
|
||||
* This function is not mandatory to fill if user don't want to reset the
|
||||
* sensor.
|
||||
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
|
||||
* structure.
|
||||
* @return (uint8_t) status : 0 if OK
|
||||
*/
|
||||
|
||||
uint8_t Reset_Sensor(
|
||||
VL53L5CX_Platform *p_platform);
|
||||
|
||||
/**
|
||||
* @brief Mandatory function, used to swap a buffer. The buffer size is always a
|
||||
* multiple of 4 (4, 8, 12, 16, ...).
|
||||
* @param (uint8_t*) buffer : Buffer to swap, generally uint32_t
|
||||
* @param (uint16_t) size : Buffer size to swap
|
||||
*/
|
||||
|
||||
void SwapBuffer(
|
||||
uint8_t *buffer,
|
||||
uint16_t size);
|
||||
/**
|
||||
* @brief Mandatory function, used to wait during an amount of time. It must be
|
||||
* filled as it's used into the API.
|
||||
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
|
||||
* structure.
|
||||
* @param (uint32_t) TimeMs : Time to wait in ms.
|
||||
* @return (uint8_t) status : 0 if wait is finished.
|
||||
*/
|
||||
|
||||
uint8_t WaitMs(
|
||||
VL53L5CX_Platform *p_platform,
|
||||
uint32_t TimeMs);
|
||||
|
||||
#endif // _PLATFORM_H_
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 834fa4e53119b987ae9357afc9dfacc6ef8261f8
|
|
@ -0,0 +1,16 @@
|
|||
add_library(vl53l5cx INTERFACE)
|
||||
|
||||
target_sources(vl53l5cx INTERFACE
|
||||
${CMAKE_CURRENT_LIST_DIR}/vl53l5cx.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/platform.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/VL53L5CX_ULD_API/src/vl53l5cx_api.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/VL53L5CX_ULD_API/src/vl53l5cx_plugin_detection_thresholds.c
|
||||
)
|
||||
|
||||
target_include_directories(vl53l5cx INTERFACE
|
||||
${CMAKE_CURRENT_LIST_DIR}
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/VL53L5CX_ULD_API/inc
|
||||
)
|
||||
|
||||
# Pull in pico libraries that we need
|
||||
target_link_libraries(vl53l5cx INTERFACE pico_stdlib hardware_i2c)
|
|
@ -0,0 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
extern "C" {
|
||||
#include "drivers/vl53l5cx/src/VL53L5CX_ULD_API/inc/vl53l5cx_api.h"
|
||||
}
|
|
@ -21,6 +21,7 @@ add_subdirectory(breakout_as7262)
|
|||
add_subdirectory(breakout_bh1745)
|
||||
add_subdirectory(breakout_icp10125)
|
||||
add_subdirectory(breakout_scd41)
|
||||
add_subdirectory(breakout_vl53l5cx)
|
||||
|
||||
add_subdirectory(pico_display)
|
||||
add_subdirectory(pico_display_2)
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
set(OUTPUT_NAME vl53l5cx_demo)
|
||||
|
||||
add_executable(
|
||||
${OUTPUT_NAME}
|
||||
vl53l5cx_demo.cpp
|
||||
)
|
||||
|
||||
# Pull in pico libraries that we need
|
||||
target_link_libraries(${OUTPUT_NAME} pico_stdlib hardware_i2c vl53l5cx pimoroni_i2c)
|
||||
|
||||
# create map/bin/hex file etc.
|
||||
pico_add_extra_outputs(${OUTPUT_NAME})
|
|
@ -0,0 +1,41 @@
|
|||
#include <stdio.h>
|
||||
#include "pico/stdlib.h"
|
||||
#include "hardware/i2c.h"
|
||||
#include "drivers/vl53l5cx/vl53l5cx.hpp"
|
||||
|
||||
#include "common/pimoroni_i2c.hpp"
|
||||
|
||||
//using namespace pimoroni;
|
||||
|
||||
pimoroni::I2C i2c(4, 5);
|
||||
|
||||
VL53L5CX_Configuration configuration {
|
||||
.platform = VL53L5CX_Platform{
|
||||
.address = 0x29,
|
||||
.i2c = i2c0
|
||||
},
|
||||
};
|
||||
|
||||
int main() {
|
||||
stdio_init_all();
|
||||
|
||||
vl53l5cx_init(&configuration);
|
||||
vl53l5cx_set_ranging_mode(&configuration, VL53L5CX_RANGING_MODE_AUTONOMOUS);
|
||||
vl53l5cx_set_resolution(&configuration, VL53L5CX_RESOLUTION_4X4);
|
||||
vl53l5cx_start_ranging(&configuration);
|
||||
|
||||
while(true) {
|
||||
uint8_t is_ready;
|
||||
if(vl53l5cx_check_data_ready(&configuration, &is_ready) == VL53L5CX_STATUS_OK) {
|
||||
if(is_ready){
|
||||
VL53L5CX_ResultsData result;
|
||||
if(vl53l5cx_get_ranging_data(&configuration, &result) == VL53L5CX_STATUS_OK) {
|
||||
printf("Distance: %dmm\n", result.distance_mm[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
sleep_ms(20);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Ładowanie…
Reference in New Issue