Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Vl6180
Dependents: VL6180_MB2_1sensor_singleshot_poll VL6180_MB5_1sensor_singleshot_wait VL6180_MB2_4sensors_interrupts VL6180_MB515_4sensors_interrupts ... more
XNucleo6810.cpp@2:04a5cf34e1a9, 2020-11-10 (annotated)
- Committer:
- charlesmn
- Date:
- Tue Nov 10 10:19:14 2020 +0000
- Revision:
- 2:04a5cf34e1a9
- Child:
- 3:862286610dfd
A library for controlling a ST X-Nucleo-6180 expansion board and up to 3 satellite boards.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
charlesmn | 2:04a5cf34e1a9 | 1 | #include "XNucleo6810.h" |
charlesmn | 2:04a5cf34e1a9 | 2 | |
charlesmn | 2:04a5cf34e1a9 | 3 | #define theVL6180DevDefault 0x52 // sensor i2c addresss on powerup |
charlesmn | 2:04a5cf34e1a9 | 4 | |
charlesmn | 2:04a5cf34e1a9 | 5 | XNucleo53L1A1 *XNucleo53L1A1::_instance = NULL; |
charlesmn | 2:04a5cf34e1a9 | 6 | |
charlesmn | 2:04a5cf34e1a9 | 7 | |
charlesmn | 2:04a5cf34e1a9 | 8 | XNucleo53L1A1 *XNucleo53L1A1::instance(vl6180_DevI2C *ext_i2c) |
charlesmn | 2:04a5cf34e1a9 | 9 | { |
charlesmn | 2:04a5cf34e1a9 | 10 | if (_instance == NULL) { |
charlesmn | 2:04a5cf34e1a9 | 11 | _instance = new XNucleo53L1A1(ext_i2c); |
charlesmn | 2:04a5cf34e1a9 | 12 | } else { |
charlesmn | 2:04a5cf34e1a9 | 13 | printf("Failed to create XNucleo53L1A1 instance\n\r\r\n"); |
charlesmn | 2:04a5cf34e1a9 | 14 | } |
charlesmn | 2:04a5cf34e1a9 | 15 | return _instance; |
charlesmn | 2:04a5cf34e1a9 | 16 | } |
charlesmn | 2:04a5cf34e1a9 | 17 | |
charlesmn | 2:04a5cf34e1a9 | 18 | XNucleo53L1A1 *XNucleo53L1A1::instance(vl6180_DevI2C *ext_i2c, |
charlesmn | 2:04a5cf34e1a9 | 19 | PinName gpio1_centre, |
charlesmn | 2:04a5cf34e1a9 | 20 | PinName gpio1_left, PinName gpio1_right,PinName gpio1_bottom) |
charlesmn | 2:04a5cf34e1a9 | 21 | { |
charlesmn | 2:04a5cf34e1a9 | 22 | if (_instance == NULL) { |
charlesmn | 2:04a5cf34e1a9 | 23 | // printf("instance %d z\n",ext_i2c); |
charlesmn | 2:04a5cf34e1a9 | 24 | _instance = new XNucleo53L1A1(ext_i2c, gpio1_centre, gpio1_left, gpio1_right,gpio1_bottom); |
charlesmn | 2:04a5cf34e1a9 | 25 | } else { |
charlesmn | 2:04a5cf34e1a9 | 26 | printf("Failed to create XNucleo53L0A1 instance\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 27 | } |
charlesmn | 2:04a5cf34e1a9 | 28 | return _instance; |
charlesmn | 2:04a5cf34e1a9 | 29 | } |
charlesmn | 2:04a5cf34e1a9 | 30 | |
charlesmn | 2:04a5cf34e1a9 | 31 | |
charlesmn | 2:04a5cf34e1a9 | 32 | int XNucleo53L1A1::init_board() |
charlesmn | 2:04a5cf34e1a9 | 33 | { |
charlesmn | 2:04a5cf34e1a9 | 34 | printf("init_board \n"); |
charlesmn | 2:04a5cf34e1a9 | 35 | int status, n_dev = 0; |
charlesmn | 2:04a5cf34e1a9 | 36 | |
charlesmn | 2:04a5cf34e1a9 | 37 | sensor_centre->VL53L1_Off(); |
charlesmn | 2:04a5cf34e1a9 | 38 | sensor_left->VL53L1_Off(); |
charlesmn | 2:04a5cf34e1a9 | 39 | sensor_right->VL53L1_Off(); |
charlesmn | 2:04a5cf34e1a9 | 40 | sensor_bottom->VL53L1_Off(); |
charlesmn | 2:04a5cf34e1a9 | 41 | // int i = 0; |
charlesmn | 2:04a5cf34e1a9 | 42 | |
charlesmn | 2:04a5cf34e1a9 | 43 | // On startup or on the shutdown pin going high the VL53l1 devices have a i2c address of 0x52. |
charlesmn | 2:04a5cf34e1a9 | 44 | // To initialise then we have to bring up one device at a time This involves raising the shutdown pin for that device, |
charlesmn | 2:04a5cf34e1a9 | 45 | // initialising then setting the i2c address to a unique value. Once that is done the shutdown pins don't need to be touched. |
charlesmn | 2:04a5cf34e1a9 | 46 | |
charlesmn | 2:04a5cf34e1a9 | 47 | // set the shutdown pins to be outputs ( they are inputs on power up) |
charlesmn | 2:04a5cf34e1a9 | 48 | stmpe1600_exp0->set_gpio_dir(GPIO_0,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 49 | stmpe1600_exp0->set_gpio_dir(GPIO_1,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 50 | stmpe1600_exp0->set_gpio_dir(GPIO_2,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 51 | stmpe1600_exp0->set_gpio_dir(GPIO_3,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 52 | stmpe1600_exp0->set_gpio_dir(GPIO_4,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 53 | stmpe1600_exp0->set_gpio_dir(GPIO_5,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 54 | stmpe1600_exp0->set_gpio_dir(GPIO_6,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 55 | stmpe1600_exp0->set_gpio_dir(GPIO_7,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 56 | stmpe1600_exp0->set_gpio_dir(GPIO_8,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 57 | stmpe1600_exp0->set_gpio_dir(GPIO_9,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 58 | stmpe1600_exp0->set_gpio_dir(GPIO_10,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 59 | stmpe1600_exp0->set_gpio_dir(GPIO_11,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 60 | |
charlesmn | 2:04a5cf34e1a9 | 61 | stmpe1600_exp0->set_gpio_dir(GPIO_12,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 62 | stmpe1600_exp0->set_gpio_dir(GPIO_14,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 63 | stmpe1600_exp0->set_gpio_dir(GPIO_15,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 64 | stmpe1600_exp0->set_gpio_dir(GPIO_13,OUTPUT); |
charlesmn | 2:04a5cf34e1a9 | 65 | |
charlesmn | 2:04a5cf34e1a9 | 66 | // set the shutdown pins to low, this will reset the VL53l1s |
charlesmn | 2:04a5cf34e1a9 | 67 | |
charlesmn | 2:04a5cf34e1a9 | 68 | stmpe1600_exp0->set_gpio(GPIO_0); |
charlesmn | 2:04a5cf34e1a9 | 69 | stmpe1600_exp0->set_gpio(GPIO_1); |
charlesmn | 2:04a5cf34e1a9 | 70 | stmpe1600_exp0->set_gpio(GPIO_2); |
charlesmn | 2:04a5cf34e1a9 | 71 | stmpe1600_exp0->set_gpio(GPIO_3); |
charlesmn | 2:04a5cf34e1a9 | 72 | stmpe1600_exp0->set_gpio(GPIO_4); |
charlesmn | 2:04a5cf34e1a9 | 73 | stmpe1600_exp0->set_gpio(GPIO_5); |
charlesmn | 2:04a5cf34e1a9 | 74 | stmpe1600_exp0->set_gpio(GPIO_6); |
charlesmn | 2:04a5cf34e1a9 | 75 | |
charlesmn | 2:04a5cf34e1a9 | 76 | stmpe1600_exp0->set_gpio(GPIO_7); |
charlesmn | 2:04a5cf34e1a9 | 77 | stmpe1600_exp0->set_gpio(GPIO_8); |
charlesmn | 2:04a5cf34e1a9 | 78 | stmpe1600_exp0->set_gpio(GPIO_9); |
charlesmn | 2:04a5cf34e1a9 | 79 | stmpe1600_exp0->set_gpio(GPIO_10); |
charlesmn | 2:04a5cf34e1a9 | 80 | stmpe1600_exp0->set_gpio(GPIO_11); |
charlesmn | 2:04a5cf34e1a9 | 81 | |
charlesmn | 2:04a5cf34e1a9 | 82 | stmpe1600_exp0->clear_gpio(GPIO_12); |
charlesmn | 2:04a5cf34e1a9 | 83 | stmpe1600_exp0->clear_gpio(GPIO_14); |
charlesmn | 2:04a5cf34e1a9 | 84 | stmpe1600_exp0->clear_gpio(GPIO_15); |
charlesmn | 2:04a5cf34e1a9 | 85 | stmpe1600_exp0->clear_gpio(GPIO_13); |
charlesmn | 2:04a5cf34e1a9 | 86 | |
charlesmn | 2:04a5cf34e1a9 | 87 | // select the first VL53l1. It will have i2c address of 0x52. Set the i2c address to |
charlesmn | 2:04a5cf34e1a9 | 88 | //NEW_SENSOR_CENTRE_ADDRESS |
charlesmn | 2:04a5cf34e1a9 | 89 | printf("Sensor centre init \n\r"); |
charlesmn | 2:04a5cf34e1a9 | 90 | stmpe1600_exp0->set_gpio(GPIO_12); |
charlesmn | 2:04a5cf34e1a9 | 91 | sensor_centre->init_sensor(theVL6180DevDefault);//set id to default address |
charlesmn | 2:04a5cf34e1a9 | 92 | status = sensor_centre->InitSensor(NEW_SENSOR_CENTRE_ADDRESS); // now set id to unique address |
charlesmn | 2:04a5cf34e1a9 | 93 | if (status) { |
charlesmn | 2:04a5cf34e1a9 | 94 | delete sensor_centre; |
charlesmn | 2:04a5cf34e1a9 | 95 | delete xshutdown_centre; |
charlesmn | 2:04a5cf34e1a9 | 96 | sensor_centre = NULL; |
charlesmn | 2:04a5cf34e1a9 | 97 | xshutdown_centre = NULL; |
charlesmn | 2:04a5cf34e1a9 | 98 | printf("Sensor centre not present\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 99 | } else { |
charlesmn | 2:04a5cf34e1a9 | 100 | printf("Sensor centre present\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 101 | n_dev++; |
charlesmn | 2:04a5cf34e1a9 | 102 | } |
charlesmn | 2:04a5cf34e1a9 | 103 | wait_ms(50); // NEEDS A DELAY BETWEEN SENSORS |
charlesmn | 2:04a5cf34e1a9 | 104 | // select the second VL53l1. It will have i2c address of 0x52. Set the i2c address to |
charlesmn | 2:04a5cf34e1a9 | 105 | //NEW_SENSOR_LEFT_ADDRESS |
charlesmn | 2:04a5cf34e1a9 | 106 | |
charlesmn | 2:04a5cf34e1a9 | 107 | stmpe1600_exp0->set_gpio(GPIO_14); |
charlesmn | 2:04a5cf34e1a9 | 108 | printf("Sensor left init \n\r"); |
charlesmn | 2:04a5cf34e1a9 | 109 | sensor_left->init_sensor(theVL6180DevDefault);//set id to default address |
charlesmn | 2:04a5cf34e1a9 | 110 | status = sensor_left->InitSensor(NEW_SENSOR_LEFT_ADDRESS); // now set id to unique address |
charlesmn | 2:04a5cf34e1a9 | 111 | if (status) { |
charlesmn | 2:04a5cf34e1a9 | 112 | delete sensor_left; |
charlesmn | 2:04a5cf34e1a9 | 113 | delete xshutdown_left; |
charlesmn | 2:04a5cf34e1a9 | 114 | sensor_left = NULL; |
charlesmn | 2:04a5cf34e1a9 | 115 | xshutdown_left = NULL; |
charlesmn | 2:04a5cf34e1a9 | 116 | printf("Sensor left not present\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 117 | } else { |
charlesmn | 2:04a5cf34e1a9 | 118 | printf("Sensor left present\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 119 | n_dev++; |
charlesmn | 2:04a5cf34e1a9 | 120 | } |
charlesmn | 2:04a5cf34e1a9 | 121 | wait_ms(50); |
charlesmn | 2:04a5cf34e1a9 | 122 | // select the 3rd VL53l1. It will have i2c address of 0x52. Set the i2c address to |
charlesmn | 2:04a5cf34e1a9 | 123 | //NEW_SENSOR_RIGHT_ADDRESS |
charlesmn | 2:04a5cf34e1a9 | 124 | printf("Sensor right init \n\r"); |
charlesmn | 2:04a5cf34e1a9 | 125 | stmpe1600_exp0->set_gpio(GPIO_15); |
charlesmn | 2:04a5cf34e1a9 | 126 | sensor_right->init_sensor(theVL6180DevDefault);//set id to default address |
charlesmn | 2:04a5cf34e1a9 | 127 | printf("Sensor right init_sensor \n\r"); |
charlesmn | 2:04a5cf34e1a9 | 128 | status = sensor_right->InitSensor(NEW_SENSOR_RIGHT_ADDRESS); |
charlesmn | 2:04a5cf34e1a9 | 129 | printf("Sensor right InitSensor \n\r"); |
charlesmn | 2:04a5cf34e1a9 | 130 | if (status) { |
charlesmn | 2:04a5cf34e1a9 | 131 | delete sensor_right; |
charlesmn | 2:04a5cf34e1a9 | 132 | delete xshutdown_right; |
charlesmn | 2:04a5cf34e1a9 | 133 | sensor_right = NULL; |
charlesmn | 2:04a5cf34e1a9 | 134 | xshutdown_right = NULL; |
charlesmn | 2:04a5cf34e1a9 | 135 | printf("Sensor right not present\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 136 | } else { |
charlesmn | 2:04a5cf34e1a9 | 137 | printf("Sensor right present\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 138 | n_dev++; |
charlesmn | 2:04a5cf34e1a9 | 139 | } |
charlesmn | 2:04a5cf34e1a9 | 140 | wait_ms(50); |
charlesmn | 2:04a5cf34e1a9 | 141 | |
charlesmn | 2:04a5cf34e1a9 | 142 | // select the 4th VL53l1. It will have i2c address of 0x52. Set the i2c address to |
charlesmn | 2:04a5cf34e1a9 | 143 | //NEW_SENSOR_BOTTOM_ADDRESS |
charlesmn | 2:04a5cf34e1a9 | 144 | printf("Sensor bottom init \n\r"); |
charlesmn | 2:04a5cf34e1a9 | 145 | stmpe1600_exp0->set_gpio(GPIO_13); |
charlesmn | 2:04a5cf34e1a9 | 146 | sensor_bottom->init_sensor(theVL6180DevDefault);//set id to default address |
charlesmn | 2:04a5cf34e1a9 | 147 | status = sensor_bottom->InitSensor(NEW_SENSOR_BOTTOM_ADDRESS); |
charlesmn | 2:04a5cf34e1a9 | 148 | if (status) { |
charlesmn | 2:04a5cf34e1a9 | 149 | delete sensor_bottom; |
charlesmn | 2:04a5cf34e1a9 | 150 | delete xshutdown_bottom; |
charlesmn | 2:04a5cf34e1a9 | 151 | sensor_bottom = NULL; |
charlesmn | 2:04a5cf34e1a9 | 152 | xshutdown_bottom = NULL; |
charlesmn | 2:04a5cf34e1a9 | 153 | printf("Sensor bottom not present\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 154 | } else { |
charlesmn | 2:04a5cf34e1a9 | 155 | printf("Sensor bottom present\n\r"); |
charlesmn | 2:04a5cf34e1a9 | 156 | n_dev++; |
charlesmn | 2:04a5cf34e1a9 | 157 | } |
charlesmn | 2:04a5cf34e1a9 | 158 | wait_ms(50); |
charlesmn | 2:04a5cf34e1a9 | 159 | if (n_dev == 0) { |
charlesmn | 2:04a5cf34e1a9 | 160 | return 1; |
charlesmn | 2:04a5cf34e1a9 | 161 | } else { |
charlesmn | 2:04a5cf34e1a9 | 162 | return 0; |
charlesmn | 2:04a5cf34e1a9 | 163 | } |
charlesmn | 2:04a5cf34e1a9 | 164 | } |