Seeed_vl53l0x.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. /*
  2. * Seeed_vl53l0x.cpp
  3. * Driver for DIGITAL I2C HUMIDITY AND TEMPERATURE SENSOR
  4. *
  5. * Copyright (c) 2018 Seeed Technology Co., Ltd.
  6. * Website : www.seeed.cc
  7. * Author : downey
  8. * Create Time: April 2018
  9. * Change Log :
  10. *
  11. * The MIT License (MIT)
  12. *
  13. * Permission is hereby granted, free of charge, to any person obtaining a copy
  14. * of this software and associated documentation files (the "Software"), to deal
  15. * in the Software without restriction, including without limitation the rights
  16. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  17. * copies of the Software, and to permit persons to whom the Software is
  18. * furnished to do so, subject to the following conditions:
  19. *
  20. * The above copyright notice and this permission notice shall be included in
  21. * all copies or substantial portions of the Software.
  22. *
  23. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  24. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  25. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  26. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  27. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  28. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  29. * THE SOFTWARE.
  30. */
  31. #include "Seeed_vl53l0x.h"
  32. /** @brief Print corresponding string of error code.
  33. * @param error code.
  34. * */
  35. void Seeed_vl53l0x::print_pal_error(VL53L0X_Error Status)
  36. {
  37. char buf[VL53L0X_MAX_STRING_LENGTH];
  38. VL53L0X_GetPalErrorString(Status, buf);
  39. Serial.print("API Status:");
  40. Serial.print(Status);
  41. Serial.print("API error string:");
  42. Serial.println(buf);
  43. }
  44. /**@brief Print ranging status through param:pRangingMeasurementData
  45. * @param The struct contains ranging status.
  46. * */
  47. void print_range_status(VL53L0X_RangingMeasurementData_t* pRangingMeasurementData){
  48. char buf[VL53L0X_MAX_STRING_LENGTH];
  49. uint8_t RangeStatus;
  50. /*
  51. * New Range Status: data is valid when pRangingMeasurementData->RangeStatus = 0
  52. */
  53. RangeStatus = pRangingMeasurementData->RangeStatus;
  54. VL53L0X_GetRangeStatusString(RangeStatus, buf);
  55. // Serial.print("Range Status:");
  56. // Serial.print(RangeStatus);
  57. // Serial.println(buf);
  58. }
  59. /**@brief IIC init
  60. * @param IIC address.default address is 0x29.
  61. * */
  62. void Seeed_vl53l0x::VL53L0X_IIC_init(u8 IIC_ADDRESS)
  63. {
  64. Wire.begin();
  65. pMyDevice->I2cDevAddr = IIC_ADDRESS;
  66. pMyDevice->comms_type = 1;
  67. pMyDevice->comms_speed_khz = 400;
  68. }
  69. /**@brief The module need to calibrated after power-on.
  70. *
  71. * @return Error code, error if not equal to zero
  72. * */
  73. VL53L0X_Error Seeed_vl53l0x::VL53L0X_calibration_oprt()
  74. {
  75. uint32_t refSpadCount;
  76. uint8_t isApertureSpads;
  77. uint8_t VhvSettings;
  78. uint8_t PhaseCal;
  79. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  80. //Serial.println("Call of VL53L0X_PerformRefSpadManagement\n");
  81. Status = VL53L0X_PerformRefSpadManagement(pMyDevice,
  82. &refSpadCount, &isApertureSpads); // Device Initialization
  83. if(VL53L0X_ERROR_NONE!=Status) return Status;
  84. //Serial.println("Call of VL53L0X_PerformRefCalibration\n");
  85. Status = VL53L0X_PerformRefCalibration(pMyDevice,
  86. &VhvSettings, &PhaseCal); // Device Initialization
  87. if(VL53L0X_ERROR_NONE!=Status) return Status;
  88. return Status;
  89. }
  90. /**@brief Called when module need to calibrated. retain.
  91. *
  92. * */
  93. VL53L0X_Error Seeed_vl53l0x::VL53L0X_calibration_set()
  94. {
  95. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  96. }
  97. /**@brief Set limitation factor.
  98. *
  99. * @return Error code, error if not equal to zero
  100. * */
  101. VL53L0X_Error Seeed_vl53l0x::VL53L0X_set_limit_param()
  102. {
  103. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  104. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  105. VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
  106. if(VL53L0X_ERROR_NONE!=Status) return Status;
  107. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  108. VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
  109. if(VL53L0X_ERROR_NONE!=Status) return Status;
  110. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  111. VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 1);
  112. if(VL53L0X_ERROR_NONE!=Status) return Status;
  113. Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  114. VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
  115. (FixPoint1616_t)(1.5*0.023*65536));
  116. if(VL53L0X_ERROR_NONE!=Status) return Status;
  117. return Status;
  118. }
  119. /**@brief As function name.
  120. *
  121. * @return Error code, error if not equal to zero
  122. * */
  123. VL53L0X_Error Seeed_vl53l0x::check_version()
  124. {
  125. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  126. int32_t status_int;
  127. status_int = VL53L0X_GetVersion(pVersion);
  128. if (status_int != 0)
  129. {
  130. Status = VL53L0X_ERROR_CONTROL_INTERFACE;
  131. return Status;
  132. }
  133. if( pVersion->major != VERSION_REQUIRED_MAJOR ||
  134. pVersion->minor != VERSION_REQUIRED_MINOR ||
  135. pVersion->build != VERSION_REQUIRED_BUILD )
  136. {
  137. Serial.println("VL53L0X API Version Error");
  138. }
  139. return Status;
  140. }
  141. /**@brief The common init part with different mode.
  142. *
  143. * @return Error code, error if not equal to zero
  144. * */
  145. VL53L0X_Error Seeed_vl53l0x::VL53L0X_common_init()
  146. {
  147. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  148. FixPoint1616_t LimitCheckCurrent;
  149. VL53L0X_IIC_init();
  150. Status=check_version();
  151. if(VL53L0X_ERROR_NONE!=Status) return Status;
  152. //Serial.println("Call of VL53L0X_DataInit\n");
  153. Status = VL53L0X_DataInit(&MyDevice);
  154. if(VL53L0X_ERROR_NONE!=Status) return Status;
  155. //Serial.println("Call of VL53L0X_StaticInit\n");
  156. Status = VL53L0X_StaticInit(pMyDevice);
  157. if(VL53L0X_ERROR_NONE!=Status) return Status;
  158. //Serial.println("Call of VL53L0X_calibration\n");
  159. Status=VL53L0X_calibration_oprt();
  160. //print_pal_error(Status);
  161. if(VL53L0X_ERROR_NONE!=Status) return Status;
  162. //Serial.println("Call of VL53L0X_SetDeviceMode\n");
  163. Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode
  164. if(VL53L0X_ERROR_NONE!=Status) return Status;
  165. //Serial.println("Call of VL53L0X_set_limit_param\n");
  166. Status = VL53L0X_set_limit_param();
  167. if(VL53L0X_ERROR_NONE!=Status) return Status;
  168. return Status;
  169. }
  170. /**@brief The single ranging mode init.
  171. *
  172. * @return Error code, error if not equal to zero
  173. * */
  174. VL53L0X_Error Seeed_vl53l0x::VL53L0X_single_ranging_init()
  175. {
  176. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  177. //Serial.println("Call of VL53L0X_SetDeviceMode\n");
  178. Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode
  179. if(VL53L0X_ERROR_NONE!=Status) return Status;
  180. //Serial.println("Call of VL53L0X_set_limit_param\n");
  181. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  182. VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
  183. if(VL53L0X_ERROR_NONE!=Status) return Status;
  184. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  185. VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
  186. if(VL53L0X_ERROR_NONE!=Status) return Status;
  187. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  188. VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 1);
  189. if(VL53L0X_ERROR_NONE!=Status) return Status;
  190. Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  191. VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
  192. (FixPoint1616_t)(1.5*0.023*65536));
  193. if(VL53L0X_ERROR_NONE!=Status) return Status;
  194. return Status;
  195. }
  196. /**@brief The single&high speed ranging ranging mode init.Reduce excute time.
  197. *
  198. * @return Error code, error if not equal to zero
  199. * */
  200. VL53L0X_Error Seeed_vl53l0x::VL53L0X_high_speed_ranging_init()
  201. {
  202. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  203. //Serial.println("Call of VL53L0X_SetDeviceMode\n");
  204. Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode
  205. if(VL53L0X_ERROR_NONE!=Status) return Status;
  206. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  207. VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
  208. if(VL53L0X_ERROR_NONE!=Status) return Status;
  209. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  210. VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
  211. if(VL53L0X_ERROR_NONE!=Status) return Status;
  212. Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  213. VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
  214. (FixPoint1616_t)(0.25*65536));
  215. if(VL53L0X_ERROR_NONE!=Status) return Status;
  216. Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  217. VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
  218. (FixPoint1616_t)(32*65536));
  219. if(VL53L0X_ERROR_NONE!=Status) return Status;
  220. Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(pMyDevice,
  221. 30000);
  222. if(VL53L0X_ERROR_NONE!=Status) return Status;
  223. return Status;
  224. }
  225. /**@brief The single&high accuracy ranging ranging mode init.It will cost much more time
  226. *
  227. * @return Error code, error if not equal to zero
  228. * */
  229. VL53L0X_Error Seeed_vl53l0x::VL53L0X_high_accuracy_ranging_init()
  230. {
  231. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  232. //Serial.println("Call of VL53L0X_SetDeviceMode\n");
  233. Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode
  234. if(VL53L0X_ERROR_NONE!=Status) return Status;
  235. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  236. VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
  237. if(VL53L0X_ERROR_NONE!=Status) return Status;
  238. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  239. VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
  240. if(VL53L0X_ERROR_NONE!=Status) return Status;
  241. Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  242. VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
  243. (FixPoint1616_t)(0.25*65536));
  244. if(VL53L0X_ERROR_NONE!=Status) return Status;
  245. Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  246. VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
  247. (FixPoint1616_t)(18*65536));
  248. if(VL53L0X_ERROR_NONE!=Status) return Status;
  249. Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(pMyDevice,
  250. 200000);
  251. if(VL53L0X_ERROR_NONE!=Status) return Status;
  252. return Status;
  253. }
  254. /**@brief The single&long distance ranging ranging mode init.
  255. *
  256. * @return Error code, error if not equal to zero
  257. * */
  258. VL53L0X_Error Seeed_vl53l0x::VL53L0X_long_distance_ranging_init()
  259. {
  260. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  261. //Serial.println("Call of VL53L0X_SetDeviceMode\n");
  262. Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode
  263. if(VL53L0X_ERROR_NONE!=Status) return Status;
  264. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  265. VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
  266. if(VL53L0X_ERROR_NONE!=Status) return Status;
  267. Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  268. VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
  269. if(VL53L0X_ERROR_NONE!=Status) return Status;
  270. Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  271. VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
  272. (FixPoint1616_t)(0.1*65536));
  273. if(VL53L0X_ERROR_NONE!=Status) return Status;
  274. Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  275. VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
  276. (FixPoint1616_t)(60*65536));
  277. if(VL53L0X_ERROR_NONE!=Status) return Status;
  278. Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(pMyDevice,
  279. 33000);
  280. if(VL53L0X_ERROR_NONE!=Status) return Status;
  281. Status = VL53L0X_SetVcselPulsePeriod(pMyDevice,
  282. VL53L0X_VCSEL_PERIOD_PRE_RANGE, 18);
  283. if(VL53L0X_ERROR_NONE!=Status) return Status;
  284. Status = VL53L0X_SetVcselPulsePeriod(pMyDevice,
  285. VL53L0X_VCSEL_PERIOD_FINAL_RANGE, 14);
  286. if(VL53L0X_ERROR_NONE!=Status) return Status;
  287. return Status;
  288. }
  289. /**@brief The continuous ranging ranging mode init.Excute without interval.
  290. *
  291. * @return Error code, error if not equal to zero
  292. * */
  293. VL53L0X_Error Seeed_vl53l0x::VL53L0X_continuous_ranging_init()
  294. {
  295. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  296. Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING);
  297. if(VL53L0X_ERROR_NONE!=Status) return Status;
  298. return Status;
  299. }
  300. /**@brief start mesurement and get result.
  301. * @param The result.
  302. * @return Error code, error if not equal to zero
  303. * */
  304. VL53L0X_Error Seeed_vl53l0x::PerformContinuousRangingMeasurement(VL53L0X_RangingMeasurementData_t *RangingMeasurementData)
  305. {
  306. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  307. u8 stat=0;
  308. u32 stop_stat=0;
  309. Status = VL53L0X_StartMeasurement(pMyDevice);
  310. if(VL53L0X_ERROR_NONE!=Status) return Status;
  311. while(1)
  312. {
  313. while(1)
  314. {
  315. Status = VL53L0X_GetMeasurementDataReady(pMyDevice,&stat);
  316. if(VL53L0X_ERROR_NONE!=Status) return Status;
  317. if(1==stat) break;
  318. }
  319. Status = VL53L0X_GetRangingMeasurementData(pMyDevice, RangingMeasurementData);
  320. if(VL53L0X_ERROR_NONE!=Status) return Status;
  321. if(RangingMeasurementData->RangeMilliMeter>=2000)
  322. {
  323. Serial.println("out of ranger");
  324. }
  325. else
  326. {
  327. Serial.print("distance::");
  328. Serial.println(RangingMeasurementData->RangeMilliMeter);
  329. }
  330. VL53L0X_ClearInterruptMask(pMyDevice, VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY);
  331. VL53L0X_PollingDelay(pMyDevice);
  332. }
  333. /***************************************************stop_part************************/
  334. // Status = VL53L0X_StopMeasurement(pMyDevice);
  335. // if(VL53L0X_ERROR_NONE!=Status) return Status;
  336. // while(1)
  337. // {
  338. // Status = VL53L0X_GetStopCompletedStatus(pMyDevice,(uint32_t*)&stop_stat);
  339. // if(VL53L0X_ERROR_NONE!=Status) return Status;
  340. // if(1==stop_stat) break;
  341. // }
  342. return Status;
  343. }
  344. /**@brief start mesurement and get result.
  345. * @param The result.
  346. * @return Error code, error if not equal to zero
  347. * */
  348. VL53L0X_Error Seeed_vl53l0x::PerformSingleRangingMeasurement(VL53L0X_RangingMeasurementData_t* RangingMeasurementData)
  349. {
  350. FixPoint1616_t LimitCheckCurrent;
  351. VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  352. u32 milli_value_start=0,milli_value_stop=0;
  353. //VL53L0X_RangingMeasurementData_t RangingMeasurementData;
  354. int i=0;
  355. if(Status == VL53L0X_ERROR_NONE)
  356. {
  357. milli_value_start=millis();
  358. Status = VL53L0X_PerformSingleRangingMeasurement(pMyDevice,
  359. RangingMeasurementData);
  360. milli_value_stop=millis();
  361. Serial.print("time of mesurement: ");
  362. Serial.println(milli_value_stop-milli_value_start);
  363. return Status;
  364. }
  365. }