Sweep a servo according to Proximity sensor measure

Dependencies:   Servo X_NUCLEO_6180XA1 mbed

Fork of HelloWorld_6180XA1 by ST

Committer:
mapellil
Date:
Tue Nov 10 10:55:34 2015 +0000
Revision:
31:1aaf6b8b066e
Parent:
30:c8efec21544f
Child:
32:724d2afb0ca2
Added timer to 4digit display func

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gallonm 0:83c628a58feb 1 #include "mbed.h"
gallonm 8:4c05f7a5bb60 2 #include "x_nucleo_6180xa1.h"
gallonm 4:ccd62fd7e137 3 #include <string.h>
gallonm 4:ccd62fd7e137 4 #include <stdlib.h>
gallonm 4:ccd62fd7e137 5 #include <stdio.h>
gallonm 8:4c05f7a5bb60 6 #include <assert.h>
gallonm 8:4c05f7a5bb60 7
mapellil 30:c8efec21544f 8 /* This VL6180X Expansion board test application performs a range measurement and an als measurement in interrupt mode
mapellil 30:c8efec21544f 9 on the onboard embedded top sensor.
mapellil 30:c8efec21544f 10 The board red slider select on the flight the measurement type as ALS or RANGE; the measured data is diplayed on the
mapellil 30:c8efec21544f 11 on bord 4digits display.
mapellil 30:c8efec21544f 12
mapellil 30:c8efec21544f 13 User Blue button allows to stop current measurement and the entire program releasing all the resources.
gallonm 20:b2e0b41a0e6b 14 Reset button is used to restart the program. */
gallonm 20:b2e0b41a0e6b 15
gallonm 14:946e62f44f4f 16 /* Polling operating modes don`t require callback function that handles IRQ
gallonm 14:946e62f44f4f 17 Callback functions are used only for measure that require interrupt */
gallonm 14:946e62f44f4f 18
gallonm 20:b2e0b41a0e6b 19 /* GetMeasurement is asynchronous! It returns NOT_READY if the measurement value
gallonm 20:b2e0b41a0e6b 20 is not ready to be read from the corresponding register. So you need to wait
gallonm 20:b2e0b41a0e6b 21 for the result to be ready */
gallonm 20:b2e0b41a0e6b 22
gallonm 5:fa65d931bd96 23 #define VL6180X_I2C_SDA I2C_SDA
gallonm 5:fa65d931bd96 24 #define VL6180X_I2C_SCL I2C_SCL
gallonm 5:fa65d931bd96 25
gallonm 19:394c9a4a3046 26 #define RANGE 0
gallonm 19:394c9a4a3046 27 #define ALS 1
gallonm 10:5319abadb31e 28
gallonm 14:946e62f44f4f 29 /* timer and digital out pin used for debugging */
gallonm 14:946e62f44f4f 30 //Timer timer;
gallonm 14:946e62f44f4f 31 //int start, end;
gallonm 14:946e62f44f4f 32 //DigitalOut pin(PA_15);
gallonm 5:fa65d931bd96 33
gallonm 27:2afb9baf718f 34 static X_NUCLEO_6180XA1 *board=NULL;
gallonm 19:394c9a4a3046 35 MeasureData_t data_sensor_top;
gallonm 27:2afb9baf718f 36 OperatingMode operating_mode, prev_operating_mode;
gallonm 11:657dbe7bf245 37
gallonm 15:b94bc967fecd 38 /* flags that handle interrupt request */
mapellil 30:c8efec21544f 39 bool int_sensor_top=false, int_stop_measure=false;
gallonm 15:b94bc967fecd 40
mapellil 30:c8efec21544f 41 /* ISR callback function of the sensor_top */
gallonm 15:b94bc967fecd 42 void SensorTopIRQ(void)
gallonm 9:1d0e839edee8 43 {
mapellil 30:c8efec21544f 44 int_sensor_top=true;
gallonm 14:946e62f44f4f 45 board->sensor_top->DisableInterruptMeasureDetectionIRQ();
gallonm 9:1d0e839edee8 46 }
gallonm 9:1d0e839edee8 47
mapellil 30:c8efec21544f 48 /* ISR callback function of the user blue button to stop program */
gallonm 15:b94bc967fecd 49 void StopMeasureIRQ(void)
gallonm 15:b94bc967fecd 50 {
mapellil 30:c8efec21544f 51 int_stop_measure=true;
gallonm 15:b94bc967fecd 52 }
gallonm 14:946e62f44f4f 53
mapellil 30:c8efec21544f 54 /* On board 4 digit local display refresh */
gallonm 19:394c9a4a3046 55 void DisplayRefresh(OperatingMode op_mode)
gallonm 27:2afb9baf718f 56 {
gallonm 25:2c4710283e02 57 char str[5];
gallonm 19:394c9a4a3046 58
gallonm 19:394c9a4a3046 59 if(op_mode==range_continuous_interrupt)
gallonm 19:394c9a4a3046 60 {
gallonm 19:394c9a4a3046 61 if(data_sensor_top.range_mm!=0xFFFFFFFF)
gallonm 19:394c9a4a3046 62 {
gallonm 19:394c9a4a3046 63 sprintf(str,"%d",data_sensor_top.range_mm);
gallonm 19:394c9a4a3046 64 }
gallonm 24:018a59122fe3 65 else
gallonm 22:bb440c864489 66 {
gallonm 25:2c4710283e02 67 sprintf(str,"%s","----");
gallonm 24:018a59122fe3 68 }
gallonm 19:394c9a4a3046 69 }
gallonm 19:394c9a4a3046 70 else if(op_mode==als_continuous_interrupt)
gallonm 19:394c9a4a3046 71 {
gallonm 19:394c9a4a3046 72 if(data_sensor_top.lux!=0xFFFFFFFF)
gallonm 19:394c9a4a3046 73 {
gallonm 19:394c9a4a3046 74 sprintf(str,"%d",data_sensor_top.lux);
gallonm 19:394c9a4a3046 75 }
gallonm 24:018a59122fe3 76 else
gallonm 22:bb440c864489 77 {
gallonm 25:2c4710283e02 78 sprintf(str,"%s","----");
gallonm 24:018a59122fe3 79 }
mapellil 30:c8efec21544f 80 }
mapellil 30:c8efec21544f 81 board->display->DisplayString(str, strlen(str));
gallonm 19:394c9a4a3046 82 }
gallonm 19:394c9a4a3046 83
mapellil 30:c8efec21544f 84 /* On board red slider position check */
mapellil 30:c8efec21544f 85 OperatingMode CheckSlider(STMPE1600DigiIn measure_type)
gallonm 27:2afb9baf718f 86 {
mapellil 30:c8efec21544f 87 int measure=measure_type;
gallonm 27:2afb9baf718f 88 if(measure==RANGE)
gallonm 27:2afb9baf718f 89 return range_continuous_interrupt;
gallonm 27:2afb9baf718f 90 else if(measure==ALS)
gallonm 27:2afb9baf718f 91 return als_continuous_interrupt;
gallonm 27:2afb9baf718f 92 }
gallonm 27:2afb9baf718f 93
mapellil 30:c8efec21544f 94 /* Print on USB Serial the started OperatingMode */
mapellil 30:c8efec21544f 95 void PrintStartMessage(OperatingMode op_mode)
gallonm 27:2afb9baf718f 96 {
gallonm 27:2afb9baf718f 97 if(op_mode==range_continuous_interrupt)
gallonm 27:2afb9baf718f 98 printf("\nStarted range continuous interrupt measure\n\r");
gallonm 27:2afb9baf718f 99 else if(prev_operating_mode==als_continuous_interrupt)
gallonm 27:2afb9baf718f 100 printf("\nStarted als continuous interrupt measure\n\r");
gallonm 27:2afb9baf718f 101 }
gallonm 27:2afb9baf718f 102
mapellil 30:c8efec21544f 103 /* Print on USB Serial the stopped OperatingMode */
mapellil 30:c8efec21544f 104 void PrintStopMessage(OperatingMode op_mode)
gallonm 27:2afb9baf718f 105 {
gallonm 27:2afb9baf718f 106 if(op_mode==range_continuous_interrupt)
gallonm 27:2afb9baf718f 107 printf("Stopped range continuous interrupt measure\n\r");
gallonm 27:2afb9baf718f 108 else if(prev_operating_mode==als_continuous_interrupt)
gallonm 27:2afb9baf718f 109 printf("Stopped als continuous interrupt measure\n\r");
gallonm 27:2afb9baf718f 110 }
gallonm 27:2afb9baf718f 111
mapellil 30:c8efec21544f 112 /* Print on board 4 Digit display the app exiting BYE message */
mapellil 31:1aaf6b8b066e 113 #define DELAY 2000 // 2Sec
gallonm 27:2afb9baf718f 114 void Bye()
gallonm 27:2afb9baf718f 115 {
mapellil 30:c8efec21544f 116 Timer timer;
gallonm 27:2afb9baf718f 117 char str[5];
gallonm 27:2afb9baf718f 118
mapellil 30:c8efec21544f 119 timer.start();
mapellil 30:c8efec21544f 120 for(int i=0; i<DELAY; i=timer.read_ms())
gallonm 27:2afb9baf718f 121 {
gallonm 27:2afb9baf718f 122 sprintf(str,"%s","BYE");
gallonm 27:2afb9baf718f 123 board->display->DisplayString(str, strlen(str));
gallonm 27:2afb9baf718f 124 }
mapellil 30:c8efec21544f 125 timer.stop();
gallonm 27:2afb9baf718f 126 }
gallonm 27:2afb9baf718f 127
gallonm 4:ccd62fd7e137 128 int main()
gallonm 5:fa65d931bd96 129 {
gallonm 27:2afb9baf718f 130 DevI2C device_i2c(VL6180X_I2C_SDA, VL6180X_I2C_SCL);
gallonm 27:2afb9baf718f 131 board=X_NUCLEO_6180XA1::Instance(&device_i2c);
gallonm 19:394c9a4a3046 132 /* user button used to stop measurements in interrupt mode */
gallonm 19:394c9a4a3046 133 InterruptIn stop_button(USER_BUTTON);
gallonm 19:394c9a4a3046 134 STMPE1600DigiIn measure_type(device_i2c, GPIO_11);
mapellil 30:c8efec21544f 135 int status;
gallonm 19:394c9a4a3046 136
gallonm 24:018a59122fe3 137 //device_i2c.frequency(400000); //change i2c frequncy from 100kHz to 400kHz
mapellil 31:1aaf6b8b066e 138 //pc.baud(115200); //change the printf baudrate if faster printf is needed
gallonm 14:946e62f44f4f 139
gallonm 10:5319abadb31e 140 status=board->InitBoard();
gallonm 14:946e62f44f4f 141 if(status)
gallonm 27:2afb9baf718f 142 printf("Failed to init board!\n\r");
gallonm 19:394c9a4a3046 143
gallonm 15:b94bc967fecd 144 stop_button.rise(&StopMeasureIRQ);
mapellil 30:c8efec21544f 145 operating_mode=CheckSlider(measure_type);
gallonm 20:b2e0b41a0e6b 146 status=board->sensor_top->StartMeasurement(operating_mode, SensorTopIRQ, NULL, NULL);
gallonm 14:946e62f44f4f 147 if(!status)
gallonm 14:946e62f44f4f 148 {
gallonm 27:2afb9baf718f 149 prev_operating_mode=operating_mode;
mapellil 30:c8efec21544f 150 PrintStartMessage(operating_mode);
gallonm 14:946e62f44f4f 151 while(1)
gallonm 14:946e62f44f4f 152 {
mapellil 30:c8efec21544f 153 if(int_sensor_top)
gallonm 14:946e62f44f4f 154 {
mapellil 30:c8efec21544f 155 int_sensor_top=false;
gallonm 19:394c9a4a3046 156 status=board->sensor_top->HandleIRQ(operating_mode, &data_sensor_top);
gallonm 22:bb440c864489 157 DisplayRefresh(operating_mode);
gallonm 14:946e62f44f4f 158 }
mapellil 30:c8efec21544f 159 if(int_stop_measure)
gallonm 19:394c9a4a3046 160 {
gallonm 19:394c9a4a3046 161 status=board->sensor_top->StopMeasurement(prev_operating_mode);
gallonm 27:2afb9baf718f 162 if(!status)
mapellil 30:c8efec21544f 163 PrintStopMessage(prev_operating_mode);
gallonm 19:394c9a4a3046 164 printf("\nProgram stopped!\n\n\r");
gallonm 19:394c9a4a3046 165 break;
gallonm 19:394c9a4a3046 166 }
mapellil 30:c8efec21544f 167 operating_mode=CheckSlider(measure_type);
gallonm 19:394c9a4a3046 168 if(operating_mode!=prev_operating_mode)
gallonm 14:946e62f44f4f 169 {
gallonm 19:394c9a4a3046 170 DisplayRefresh(prev_operating_mode);
gallonm 19:394c9a4a3046 171 status=board->sensor_top->StopMeasurement(prev_operating_mode);
gallonm 27:2afb9baf718f 172 if(!status)
mapellil 30:c8efec21544f 173 PrintStopMessage(prev_operating_mode);
gallonm 19:394c9a4a3046 174 prev_operating_mode=operating_mode;
gallonm 20:b2e0b41a0e6b 175 status=board->sensor_top->StartMeasurement(operating_mode, SensorTopIRQ, NULL, NULL);
gallonm 27:2afb9baf718f 176 if(!status)
mapellil 30:c8efec21544f 177 PrintStartMessage(operating_mode);
gallonm 19:394c9a4a3046 178 }
gallonm 19:394c9a4a3046 179 else
gallonm 19:394c9a4a3046 180 DisplayRefresh(operating_mode);
gallonm 14:946e62f44f4f 181 }
gallonm 14:946e62f44f4f 182 }
gallonm 27:2afb9baf718f 183 Bye();
gallonm 20:b2e0b41a0e6b 184 delete board;
gallonm 4:ccd62fd7e137 185 }
gallonm 5:fa65d931bd96 186