vl53lox_processing_rpi


SUBMITTED BY: Guest

DATE: May 23, 2019, 3:34 a.m.

FORMAT: Text only

SIZE: 10.2 kB

HITS: 433

  1. import processing.io.*;
  2. I2C i2c;
  3. // MCP4725 is a Digital-to-Analog converter using I2C
  4. // datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/22039d.pdf
  5. // also see DigitalAnalog_I2C_MCP4725 for how to write the
  6. // same sketch in an object-oriented way
  7. private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
  8. public static String bytesToHex(byte[] bytes) {
  9. char[] hexChars = new char[bytes.length * 2];
  10. for ( int j = 0; j < bytes.length; j++ ) {
  11. int v = bytes[j] & 0xFF;
  12. hexChars[j * 2] = hexArray[v >>> 4];
  13. hexChars[j * 2 + 1] = hexArray[v & 0x0F];
  14. }
  15. return new String(hexChars);
  16. }
  17. byte address=0x29;
  18. void writeReg(byte reg, byte val)
  19. {
  20. i2c.beginTransmission(0x29);
  21. i2c.write(reg);
  22. i2c.write(val);
  23. i2c.endTransmission();
  24. }
  25. byte [] readRegs(byte reg, int cnt)
  26. {
  27. i2c.beginTransmission(0x29);
  28. i2c.write(reg);
  29. byte[] in = i2c.read(cnt);
  30. i2c.endTransmission();
  31. return in;
  32. }
  33. byte [] readRegs(int reg, int cnt)
  34. {
  35. return readRegs((byte)reg, cnt);
  36. }
  37. byte readReg(byte reg)
  38. {
  39. return readRegs(reg,1)[0];
  40. }
  41. byte readReg(int reg)
  42. {
  43. return readReg((byte)reg);
  44. }
  45. void writeReg(int reg, int val)
  46. {
  47. writeReg((byte)reg, (byte)val);
  48. }
  49. void writeMulti(byte reg, byte [] src, int count)
  50. {
  51. i2c.beginTransmission(address);
  52. i2c.write(reg);
  53. for (int i = 0; i < count; i++)
  54. {
  55. i2c.write(src[i]);
  56. }
  57. i2c.endTransmission();
  58. }
  59. void writeReg16Bit(byte reg, short value)
  60. {
  61. i2c.beginTransmission(address);
  62. i2c.write(reg);
  63. i2c.write((value >> 8) & 0xFF); // value high byte
  64. i2c.write( value & 0xFF); // value low byte
  65. i2c.endTransmission();
  66. }
  67. void writeReg32Bit(byte reg, int value)
  68. {
  69. i2c.beginTransmission(address);
  70. i2c.write(reg);
  71. i2c.write((value >> 24) & 0xFF); // value highest byte
  72. i2c.write((value >> 16) & 0xFF);
  73. i2c.write((value >> 8) & 0xFF);
  74. i2c.write( value & 0xFF); // value lowest byte
  75. i2c.endTransmission();
  76. }
  77. byte stop_variable;
  78. byte MSRC_CONFIG_CONTROL = (byte)0x60;
  79. int measurement_timing_budget_us;
  80. int getMeasurementTimingBudget()
  81. {
  82. }
  83. boolean setMeasurementTimingBudget(int us)
  84. {
  85. }
  86. boolean setSignalRateLimit(float limit_Mcps)
  87. {
  88. if (limit_Mcps < 0 || limit_Mcps > 511.99) { return false; }
  89. // Q9.7 fixed point format (9 integer bits, 7 fractional bits)
  90. writeReg16Bit((byte)0x44, (short) (limit_Mcps * (1 << 7))); //FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT
  91. return true;
  92. }
  93. int count;
  94. boolean type_is_aperture;
  95. int timeout_start_ms;
  96. int io_timeout = 0;
  97. void startTimeout()
  98. {
  99. timeout_start_ms = millis();
  100. }
  101. boolean checkTimeoutExpired()
  102. {
  103. return (io_timeout > 0) && ((millis() - timeout_start_ms) > io_timeout);
  104. }
  105. boolean getSpadInfo()
  106. {
  107. byte tmp;
  108. writeReg(0x80, 0x01);
  109. writeReg(0xFF, 0x01);
  110. writeReg(0x00, 0x00);
  111. writeReg(0xFF, 0x06);
  112. writeReg(0x83, readReg(0x83) | 0x04);
  113. writeReg(0xFF, 0x07);
  114. writeReg(0x81, 0x01);
  115. writeReg(0x80, 0x01);
  116. writeReg(0x94, 0x6b);
  117. writeReg(0x83, 0x00);
  118. startTimeout();
  119. while (readReg(0x83) == 0x00)
  120. {
  121. if (checkTimeoutExpired()) { return false; }
  122. }
  123. writeReg(0x83, 0x01);
  124. tmp = readReg(0x92);
  125. count = tmp & (byte)0x7f;
  126. type_is_aperture = ((tmp >> (byte)7) & (byte)0x01) == (byte)0x1;
  127. writeReg(0x81, 0x00);
  128. writeReg(0xFF, 0x06);
  129. writeReg(0x83, readReg(0x83) & ~0x04);
  130. writeReg(0xFF, 0x01);
  131. writeReg(0x00, 0x01);
  132. writeReg(0xFF, 0x00);
  133. writeReg(0x80, 0x00);
  134. return true;
  135. }
  136. boolean initVL53LOX()
  137. {
  138. writeReg(0x88, 0x00);
  139. writeReg(0x80, 0x01);
  140. writeReg(0xFF, 0x01);
  141. writeReg(0x00, 0x00);
  142. stop_variable = readReg(0x91);
  143. writeReg(0x00, 0x01);
  144. writeReg(0xFF, 0x00);
  145. writeReg(0x80, 0x00);
  146. // disable SIGNAL_RATE_MSRC (bit 1) and SIGNAL_RATE_PRE_RANGE (bit 4) limit checks
  147. writeReg(MSRC_CONFIG_CONTROL, readReg(MSRC_CONFIG_CONTROL) | 0x12);
  148. // set final range signal rate limit to 0.25 MCPS (million counts per second)
  149. setSignalRateLimit(0.25);
  150. writeReg(0x01, 0xFF); //SYSTEM_SEQUENCE_CONFIG
  151. // VL53L0X_DataInit() end
  152. // VL53L0X_StaticInit() begin
  153. if (!getSpadInfo()) { return false; }
  154. byte spad_count = (byte)count;
  155. boolean spad_type_is_aperture = type_is_aperture;
  156. // The SPAD map (RefGoodSpadMap) is read by VL53L0X_get_info_from_device() in
  157. // the API, but the same data seems to be more easily readable from
  158. // GLOBAL_CONFIG_SPAD_ENABLES_REF_0 through _6, so read it from there
  159. byte [] ref_spad_map = readRegs((byte)0xB0, 6); //GLOBAL_CONFIG_SPAD_ENABLES_REF_0
  160. writeReg(0xFF, 0x01);
  161. writeReg(0x4F, 0x00); //DYNAMIC_SPAD_REF_EN_START_OFFSET
  162. writeReg(0x4E, 0x2C); //DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD
  163. writeReg(0xFF, 0x00);
  164. writeReg(0xB6, 0xB4); //GLOBAL_CONFIG_REF_EN_START_SELECT
  165. byte first_spad_to_enable = (byte)(spad_type_is_aperture ? 12 : 0); // 12 is the first aperture spad
  166. byte spads_enabled = 0;
  167. for (int i = 0; i < 48; i++)
  168. {
  169. if (i < first_spad_to_enable || spads_enabled == spad_count)
  170. {
  171. // This bit is lower than the first one that should be enabled, or
  172. // (reference_spad_count) bits have already been enabled, so zero this bit
  173. ref_spad_map[i / 8] &= ~(1 << (i % 8));
  174. }
  175. else if (((ref_spad_map[i / 8] >> (byte)(i % 8)) & (byte)0x1) == (byte)0x01)
  176. {
  177. spads_enabled++;
  178. }
  179. }
  180. writeMulti((byte)0xB0, ref_spad_map, 6);//GLOBAL_CONFIG_SPAD_ENABLES_REF_0
  181. // -- VL53L0X_set_reference_spads() end
  182. // -- VL53L0X_load_tuning_settings() begin
  183. // DefaultTuningSettings from vl53l0x_tuning.h
  184. writeReg(0xFF, 0x01);
  185. writeReg(0x00, 0x00);
  186. writeReg(0xFF, 0x00);
  187. writeReg(0x09, 0x00);
  188. writeReg(0x10, 0x00);
  189. writeReg(0x11, 0x00);
  190. writeReg(0x24, 0x01);
  191. writeReg(0x25, 0xFF);
  192. writeReg(0x75, 0x00);
  193. writeReg(0xFF, 0x01);
  194. writeReg(0x4E, 0x2C);
  195. writeReg(0x48, 0x00);
  196. writeReg(0x30, 0x20);
  197. writeReg(0xFF, 0x00);
  198. writeReg(0x30, 0x09);
  199. writeReg(0x54, 0x00);
  200. writeReg(0x31, 0x04);
  201. writeReg(0x32, 0x03);
  202. writeReg(0x40, 0x83);
  203. writeReg(0x46, 0x25);
  204. writeReg(0x60, 0x00);
  205. writeReg(0x27, 0x00);
  206. writeReg(0x50, 0x06);
  207. writeReg(0x51, 0x00);
  208. writeReg(0x52, 0x96);
  209. writeReg(0x56, 0x08);
  210. writeReg(0x57, 0x30);
  211. writeReg(0x61, 0x00);
  212. writeReg(0x62, 0x00);
  213. writeReg(0x64, 0x00);
  214. writeReg(0x65, 0x00);
  215. writeReg(0x66, 0xA0);
  216. writeReg(0xFF, 0x01);
  217. writeReg(0x22, 0x32);
  218. writeReg(0x47, 0x14);
  219. writeReg(0x49, 0xFF);
  220. writeReg(0x4A, 0x00);
  221. writeReg(0xFF, 0x00);
  222. writeReg(0x7A, 0x0A);
  223. writeReg(0x7B, 0x00);
  224. writeReg(0x78, 0x21);
  225. writeReg(0xFF, 0x01);
  226. writeReg(0x23, 0x34);
  227. writeReg(0x42, 0x00);
  228. writeReg(0x44, 0xFF);
  229. writeReg(0x45, 0x26);
  230. writeReg(0x46, 0x05);
  231. writeReg(0x40, 0x40);
  232. writeReg(0x0E, 0x06);
  233. writeReg(0x20, 0x1A);
  234. writeReg(0x43, 0x40);
  235. writeReg(0xFF, 0x00);
  236. writeReg(0x34, 0x03);
  237. writeReg(0x35, 0x44);
  238. writeReg(0xFF, 0x01);
  239. writeReg(0x31, 0x04);
  240. writeReg(0x4B, 0x09);
  241. writeReg(0x4C, 0x05);
  242. writeReg(0x4D, 0x04);
  243. writeReg(0xFF, 0x00);
  244. writeReg(0x44, 0x00);
  245. writeReg(0x45, 0x20);
  246. writeReg(0x47, 0x08);
  247. writeReg(0x48, 0x28);
  248. writeReg(0x67, 0x00);
  249. writeReg(0x70, 0x04);
  250. writeReg(0x71, 0x01);
  251. writeReg(0x72, 0xFE);
  252. writeReg(0x76, 0x00);
  253. writeReg(0x77, 0x00);
  254. writeReg(0xFF, 0x01);
  255. writeReg(0x0D, 0x01);
  256. writeReg(0xFF, 0x00);
  257. writeReg(0x80, 0x01);
  258. writeReg(0x01, 0xF8);
  259. writeReg(0xFF, 0x01);
  260. writeReg(0x8E, 0x01);
  261. writeReg(0x00, 0x01);
  262. writeReg(0xFF, 0x00);
  263. writeReg(0x80, 0x00);
  264. // -- VL53L0X_load_tuning_settings() end
  265. // "Set interrupt config to new sample ready"
  266. // -- VL53L0X_SetGpioConfig() begin
  267. writeReg(0x0A, 0x04);//SYSTEM_INTERRUPT_CONFIG_GPIO
  268. writeReg(0x84, readReg(0x84) & ~0x10); // active low GPIO_HV_MUX_ACTIVE_HIGH
  269. writeReg(0x0B, 0x01); //SYSTEM_INTERRUPT_CLEAR
  270. // -- VL53L0X_SetGpioConfig() end
  271. measurement_timing_budget_us = getMeasurementTimingBudget();
  272. // "Disable MSRC and TCC by default"
  273. // MSRC = Minimum Signal Rate Check
  274. // TCC = Target CentreCheck
  275. // -- VL53L0X_SetSequenceStepEnable() begin
  276. writeReg(0x01, 0xE8); //SYSTEM_SEQUENCE_CONFIG
  277. // -- VL53L0X_SetSequenceStepEnable() end
  278. // "Recalculate timing budget"
  279. setMeasurementTimingBudget(measurement_timing_budget_us);
  280. // VL53L0X_StaticInit() end
  281. // VL53L0X_PerformRefCalibration() begin (VL53L0X_perform_ref_calibration())
  282. // -- VL53L0X_perform_vhv_calibration() begin
  283. writeReg(0x01, 0x01); //SYSTEM_SEQUENCE_CONFIG
  284. if (!performSingleRefCalibration(0x40)) { return false; }
  285. // -- VL53L0X_perform_vhv_calibration() end
  286. // -- VL53L0X_perform_phase_calibration() begin
  287. writeReg(0x01, 0x02); //SYSTEM_SEQUENCE_CONFIG
  288. if (!performSingleRefCalibration(0x00)) { return false; }
  289. // -- VL53L0X_perform_phase_calibration() end
  290. // "restore the previous Sequence Config"
  291. writeReg(0x01, 0xE8); //SYSTEM_SEQUENCE_CONFIG
  292. // VL53L0X_PerformRefCalibration() end
  293. return true;
  294. }
  295. void setup() {
  296. //printArray(I2C.list());
  297. print("Hello World");
  298. i2c = new I2C(I2C.list()[0]);
  299. printArray(I2C.list());
  300. println("scanning");
  301. try
  302. {
  303. i2c.beginTransmission(0x29);
  304. i2c.write(0x00);
  305. byte[] in = i2c.read(256);
  306. i2c.endTransmission();
  307. println("found device: ");
  308. int i =0;
  309. print(" : ");
  310. for (i=0;i<16;i++)
  311. {
  312. print(bytesToHex(new byte[] {(byte)i}));
  313. print(" ");
  314. }
  315. for (i=0;i<=255;i++)
  316. {
  317. if (i % 16 == 0)
  318. {
  319. println(": ");
  320. print(bytesToHex(new byte[] {(byte)i}));
  321. print(" : ");
  322. }
  323. print( bytesToHex(new byte[] { in[i] }));
  324. print(" ");
  325. }
  326. println("!");
  327. }
  328. catch (RuntimeException e)
  329. {
  330. print("exception ");
  331. println(e);
  332. }
  333. initVL53LOX();
  334. print("Goodbye world");
  335. }
  336. void draw() {
  337. background(map(mouseX, 0, width, 0, 255));
  338. }

comments powered by Disqus