ST Expansion SW Team / X_NUCLEO_6180

Dependencies:   Vl6180

Dependents:   VL6180_MB2_1sensor_singleshot_poll VL6180_MB5_1sensor_singleshot_wait VL6180_MB2_4sensors_interrupts VL6180_MB515_4sensors_interrupts ... more

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?

UserRevisionLine numberNew 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 }