Library to handle the X-NUCLEO-6180XA1 Proximity and ambient light sensor expansion board based on VL6180X.
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: HelloWorld_6180XA1 SunTracker_BLE Servo_6180XA1 BLE_HR_Light ... more
Fork of X_NUCLEO_6180XA1 by
X-NUCLEO-6180XA1 Proximity and Ambient Light Sensor Expansion Board Firmware Package
Introduction
This firmware package includes Components Device Drivers and Board Support Package for STMicroelectronics' X-NUCLEO-6180XA1 Proximity and ambient light sensor expansion board based on VL6180X.
Firmware Library
Class X_NUCLEO_6180XA1 is intended to represent the Proximity and ambient light sensor expansion board with the same name.
The expansion board is providing the support of the following components:
- on-board VL6180X proximity and ambient light sensor,
- up to three additional VL6180X Satellites,
- on-board 4-digit display
It is intentionally implemented as a singleton because only one X-NUCLEO-VL6180XA1 at a time might be deployed in a HW component stack. In order to get the singleton instance you have to call class method `Instance()`, e.g.:
// Sensors expansion board singleton instance static X_NUCLEO_6180XA1 *6180X_expansion_board = X_NUCLEO_6180XA1::Instance();
Arduino Connector Compatibility Warning
Using the X-NUCLEO-6180XA1 expansion board with the NUCLEO-F429ZI requires adopting the following patch:
- to remove R46 resistor connected to
A3pin; - to solder R47 resistor connected to
A5pin.
Alternatively, you can route the Nucleo board’s A5 pin directly to the expansion board’s A3 pin with a wire.
In case you patch your expansion board or route the pin, the interrupt signal for the front sensor will be driven on A5 pin rather than on A3 pin.
Example Applications
Revision 20:dd8390d615bf, committed 2015-10-28
- Comitter:
- gallonm
- Date:
- Wed Oct 28 13:07:59 2015 +0000
- Parent:
- 19:39ea6bab0e5b
- Child:
- 21:5fb360508b6e
- Commit message:
- Removed PollDelay and introduced simply wait_ms function.; Updated file platform.h.; Fixed all FIXME.; Fixed error printing.; Updated x_nucleo_6180xa1.cpp file.
Changed in this revision
--- a/Components/Display/Display_class.h Wed Oct 28 09:28:52 2015 +0000
+++ b/Components/Display/Display_class.h Wed Oct 28 13:07:59 2015 +0000
@@ -163,194 +163,189 @@
#ifndef FAST_DISPLAY
Display(DevI2C &i2c, STMPE1600DigiOut &D1, STMPE1600DigiOut &D2, STMPE1600DigiOut &D3, STMPE1600DigiOut &D4,
- STMPE1600DigiOut &D_A, STMPE1600DigiOut &D_B, STMPE1600DigiOut &D_C, STMPE1600DigiOut &D_D,
- STMPE1600DigiOut &D_E, STMPE1600DigiOut &D_F, STMPE1600DigiOut &D_G)
- : Display_D1(D1), Display_D2(D2), Display_D3(D3), Display_D4(D4),
- Display_A(D_A), Display_B(D_B), Display_C(D_C), Display_D(D_D),
- Display_E(D_E), Display_F(D_F), Display_G(D_G), dev_i2c(i2c)
- {
- pDisplay_DGT[0] = &Display_D1;
- pDisplay_DGT[1] = &Display_D2;
- pDisplay_DGT[2] = &Display_D3;
- pDisplay_DGT[3] = &Display_D4;
- pDisplay_SEG[0] = &Display_A;
- pDisplay_SEG[1] = &Display_B;
- pDisplay_SEG[2] = &Display_C;
- pDisplay_SEG[3] = &Display_D;
- pDisplay_SEG[4] = &Display_E;
- pDisplay_SEG[5] = &Display_F;
- pDisplay_SEG[6] = &Display_G;
+ STMPE1600DigiOut &D_A, STMPE1600DigiOut &D_B, STMPE1600DigiOut &D_C, STMPE1600DigiOut &D_D,
+ STMPE1600DigiOut &D_E, STMPE1600DigiOut &D_F, STMPE1600DigiOut &D_G)
+ : Display_D1(D1), Display_D2(D2), Display_D3(D3), Display_D4(D4),
+ Display_A(D_A), Display_B(D_B), Display_C(D_C), Display_D(D_D),
+ Display_E(D_E), Display_F(D_F), Display_G(D_G), dev_i2c(i2c)
+ {
+ pDisplay_DGT[0] = &Display_D1;
+ pDisplay_DGT[1] = &Display_D2;
+ pDisplay_DGT[2] = &Display_D3;
+ pDisplay_DGT[3] = &Display_D4;
+ pDisplay_SEG[0] = &Display_A;
+ pDisplay_SEG[1] = &Display_B;
+ pDisplay_SEG[2] = &Display_C;
+ pDisplay_SEG[3] = &Display_D;
+ pDisplay_SEG[4] = &Display_E;
+ pDisplay_SEG[5] = &Display_F;
+ pDisplay_SEG[6] = &Display_G;
- for (int i=0; i<4; i++) { *pDisplay_DGT[i]=1; }
- for (int i=0; i<7; i++) { *pDisplay_SEG[i]=1; }
- }
+ for (int i=0; i<4; i++) { *pDisplay_DGT[i]=1; }
+ for (int i=0; i<7; i++) { *pDisplay_SEG[i]=1; }
+ }
#else
Display(DevI2C &i2c) : dev_i2c(i2c) {}
#endif
- virtual ~Display()
- {
- //nella classe board ci sara' un puntatore ad un oggetto di tipo Display che verra' creato con una new
- //qui devo fare il delete[] del new
- }
#ifndef FAST_DISPLAY
- void Digits_off (void) // all 4 digits off
- {
- Display_D1=1;
- Display_D2=1;
- Display_D3=1;
- Display_D4=1;
- }
+ void Digits_off (void) // all 4 digits off
+ {
+ Display_D1=1;
+ Display_D2=1;
+ Display_D3=1;
+ Display_D4=1;
+ }
- void Digits_on (void) // all 4 digits on
- {
- Display_D1=0;
- Display_D2=0;
- Display_D3=0;
- Display_D4=0;
- }
+ void Digits_on (void) // all 4 digits on
+ {
+ Display_D1=0;
+ Display_D2=0;
+ Display_D3=0;
+ Display_D4=0;
+ }
- void Digit_on (int digit) // digits on
- {
- *pDisplay_DGT[digit] = 0;
- }
+ void Digit_on (int digit) // digits on
+ {
+ *pDisplay_DGT[digit] = 0;
+ }
- void Digit_off (int digit) // digits on
- {
- *pDisplay_DGT[digit] = 1;
- }
+ void Digit_off (int digit) // digits on
+ {
+ *pDisplay_DGT[digit] = 1;
+ }
- void Segments_off () // all 7 segments off
- {
- Display_A=1;
- Display_B=1;
- Display_C=1;
- Display_D=1;
- Display_E=1;
- Display_F=1;
- Display_G=1;
- }
+ void Segments_off () // all 7 segments off
+ {
+ Display_A=1;
+ Display_B=1;
+ Display_C=1;
+ Display_D=1;
+ Display_E=1;
+ Display_F=1;
+ Display_G=1;
+ }
- void Segment_off (int seg) // segment off
- {
- *pDisplay_SEG[seg] = 1;
- }
+ void Segment_off (int seg) // segment off
+ {
+ *pDisplay_SEG[seg] = 1;
+ }
- void Segment_on (int seg) // segment on
- {
- *pDisplay_SEG[seg] = 0;
- }
+ void Segment_on (int seg) // segment on
+ {
+ *pDisplay_SEG[seg] = 0;
+ }
- void DisplayString (char str[4])
- {
- int i;
- const char *pc;
+ void DisplayString (char str[4])
+ {
+ int i;
+ const char *pc;
- for( i=0, pc=str; i<4 && *pc!=0 ; i++, pc++){
- _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], i);
- if( *(pc+1)== '.'){
+ for( i=0, pc=str; i<4 && *pc!=0 ; i++, pc++){
+ _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], i);
+ if( *(pc+1)== '.'){
pc++;
- }
- wait_ms(DISPLAY_DELAY);
- Digits_off();
- }
- }
+ }
+ wait_ms(DISPLAY_DELAY);
+ Digits_off();
+ }
+ }
- void _V2_Set7Segment( int Leds, int digit ){
- //Digits_off();
- Segments_off(); // 7 seg off */
- int mask=1;
- for (int i=0; i<7; i++) {
- if (Leds & mask) Segment_on(i);
- mask = mask<<1;
- }
- Digit_on(digit);
- }
+ void _V2_Set7Segment( int Leds, int digit ){
+ //Digits_off();
+ Segments_off(); // 7 seg off */
+ int mask=1;
+ for (int i=0; i<7; i++) {
+ if (Leds & mask) Segment_on(i);
+ mask = mask<<1;
+ }
+ Digit_on(digit);
+ }
#else
- void DisplayDigit (char *val, char dgt)
- {
- uint8_t data[2];
- uint16_t *pdata = (uint16_t*)data;
- dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
- *pdata = *pdata | (uint16_t)0x0780; // all digits off
- dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+ void DisplayDigit (char *val, char dgt)
+ {
+ uint8_t data[2];
+ uint16_t *pdata = (uint16_t*)data;
+ dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+ *pdata = *pdata | (uint16_t)0x0780; // all digits off
+ dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
- _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*val], dgt);
- }
+ _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*val], dgt);
+ }
- void DisplayString (char str[4], char strlen)
- {
- int i, dgt;
- const char *pc;
- uint8_t data[2];
- uint16_t *pdata = (uint16_t*)data;
+ void DisplayString (char str[4], char strlen)
+ {
+ int i, dgt;
+ const char *pc;
+ uint8_t data[2];
+ uint16_t *pdata = (uint16_t*)data;
- // dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
-// *pdata = *pdata | (uint16_t)0x0780; // all digits off
-// dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+// dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+// *pdata = *pdata | (uint16_t)0x0780; // all digits off
+// dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
- for(i=0, dgt=4-strlen, pc=str; i<strlen && *pc!=0; i++, pc++, dgt++){
- _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], dgt);
- if( *(pc+1)== '.'){
- pc++;
- }
- wait_ms(DISPLAY_DELAY);
- dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
- *pdata = *pdata | (uint16_t)0x0780; // all digits off
- dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
- }
- }
+ for(i=0, dgt=4-strlen, pc=str; i<strlen && *pc!=0; i++, pc++, dgt++){
+ _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], dgt);
+ if( *(pc+1)== '.'){
+ pc++;
+ }
+ wait_ms(DISPLAY_DELAY);
+ dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+ *pdata = *pdata | (uint16_t)0x0780; // all digits off
+ dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+ }
+ }
- void _V2_Set7Segment( int Leds, int digit ){
- //Digits_off();
+ void _V2_Set7Segment( int Leds, int digit ){
+ //Digits_off();
- uint16_t dgt;
- dgt = 1<<digit;
- dgt = ((uint16_t)dgt)<<7;
- dgt = ~dgt;
- uint8_t data[2];
- uint16_t *pdata = (uint16_t*)data;
+ uint16_t dgt;
+ dgt = 1<<digit;
+ dgt = ((uint16_t)dgt)<<7;
+ dgt = ~dgt;
+ uint8_t data[2];
+ uint16_t *pdata = (uint16_t*)data;
- /* set the exppinname state to lvl */
- dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
- *pdata = *pdata | (uint16_t)0x007F; // 7 segments off
- dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+ /* set the exppinname state to lvl */
+ dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+ *pdata = *pdata | (uint16_t)0x007F; // 7 segments off
+ dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
- int mask=1;
- for (int i=0; i<7; i++) {
- if (Leds & mask) *pdata = *pdata & ~(uint16_t)mask;
- mask = mask<<1;
- }
- *pdata = *pdata & dgt;
- dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
- }
+ int mask=1;
+ for (int i=0; i<7; i++) {
+ if (Leds & mask) *pdata = *pdata & ~(uint16_t)mask;
+ mask = mask<<1;
+ }
+ *pdata = *pdata & dgt;
+ dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7
+ }
#endif
private:
#ifndef FAST_DISPLAY
- STMPE1600DigiOut &Display_D1;
- STMPE1600DigiOut &Display_D2;
- STMPE1600DigiOut &Display_D3;
- STMPE1600DigiOut &Display_D4;
- STMPE1600DigiOut *pDisplay_DGT[4]; // the 4 display digits
+ STMPE1600DigiOut &Display_D1;
+ STMPE1600DigiOut &Display_D2;
+ STMPE1600DigiOut &Display_D3;
+ STMPE1600DigiOut &Display_D4;
+ STMPE1600DigiOut *pDisplay_DGT[4]; // the 4 display digits
- STMPE1600DigiOut &Display_A;
- STMPE1600DigiOut &Display_B;
- STMPE1600DigiOut &Display_C;
- STMPE1600DigiOut &Display_D;
- STMPE1600DigiOut &Display_E;
- STMPE1600DigiOut &Display_F;
- STMPE1600DigiOut &Display_G;
- STMPE1600DigiOut *pDisplay_SEG[7]; // the 7 digit segmments
+ STMPE1600DigiOut &Display_A;
+ STMPE1600DigiOut &Display_B;
+ STMPE1600DigiOut &Display_C;
+ STMPE1600DigiOut &Display_D;
+ STMPE1600DigiOut &Display_E;
+ STMPE1600DigiOut &Display_F;
+ STMPE1600DigiOut &Display_G;
+ STMPE1600DigiOut *pDisplay_SEG[7]; // the 7 digit segmments
#endif
DevI2C &dev_i2c;
};
--- a/Components/VL6180X/vl6180x_class.cpp Wed Oct 28 09:28:52 2015 +0000
+++ b/Components/VL6180X/vl6180x_class.cpp Wed Oct 28 13:07:59 2015 +0000
@@ -65,7 +65,7 @@
*/
#define VL6180X_LOG_ENABLE 0
#endif
-
+
#ifdef MY_LOG
Serial pc(USBTX, USBRX);
#endif
@@ -2678,15 +2678,15 @@
}
-int VL6180X::InitSensor(uint8_t NewAddr) //FIXME printf da sostituire con VL6180x_ErrLog e poi specificare il contenuto di questa funzione
+int VL6180X::InitSensor(uint8_t NewAddr)
{
int status;
VL6180x_Off();
VL6180x_On();
- /*status=VL6180x_WaitDeviceBooted(Device);
- if(status)
- printf("WaitDeviceBooted fail\n\r");*/
+ status=VL6180x_WaitDeviceBooted(Device);
+ if(status)
+ printf("WaitDeviceBooted fail\n\r");
status=IsPresent();
if(!status)
{
@@ -2719,8 +2719,6 @@
}
Device->Ready=1;
}
- VL6180x_RangeSetMaxConvergenceTime(Device,10); //FIXME temporaneo, capire se devo fissare questi valori di default oppure impostarli solo quando faccio la hand gesture
- VL6180x_RangeSetInterMeasPeriod(Device,10); //FIXME
return status;
}
@@ -3155,7 +3153,7 @@
if(status)
{
VL6180x_ErrLog("Failed to write SYSALS_INTERMEASUREMENT_PERIOD!\n\r");
- return status;
+ return status;
}
return AlsStartContinuousMode();
}
--- a/Components/VL6180X/vl6180x_class.h Wed Oct 28 09:28:52 2015 +0000
+++ b/Components/VL6180X/vl6180x_class.h Wed Oct 28 13:07:59 2015 +0000
@@ -534,7 +534,7 @@
status=ReadID();
if(status)
- printf("Failed to read ID device! Device not present!\n\r"); //FIXME da sistemare la funzione di stampa errore ErrLog da platform.h
+ printf("Failed to read ID device. Device not present!\n\r");
return status;
}
int StopRangeMeasurement(OperatingMode operating_mode);
--- a/Components/VL6180X/vl6180x_platform.h Wed Oct 28 09:28:52 2015 +0000
+++ b/Components/VL6180X/vl6180x_platform.h Wed Oct 28 13:07:59 2015 +0000
@@ -33,7 +33,7 @@
#define VL6180x_RANGE_STATUS_ERRSTRING 1
#define VL6180X_SAFE_POLLING_ENTER 0
#define VL6180X_LOG_ENABLE 0
-#define MY_LOG 1
+#define MY_LOG 1
#define VL6180x_DEV_DATA_ATTR
#define ROMABLE_DATA
@@ -70,14 +70,14 @@
#else /* VL6180X_LOG_ENABLE no logging */
//void OnErrLog(void);
- #define LOG_FUNCTION_START(...) //(void)0
- #define LOG_FUNCTION_END(...) //(void)0
- #define LOG_FUNCTION_END_FMT(...) //(void)0
+ #define LOG_FUNCTION_START(...) (void)0
+ #define LOG_FUNCTION_END(...) (void)0
+ #define LOG_FUNCTION_END_FMT(...) (void)0
#define VL6180x_ErrLog(... ) //OnErrLog() //(void)0
#endif
-#ifdef MY_LOG
+#ifdef MY_LOG /* define printf as pc.printf in order to change the baudrate */
extern Serial pc;
#define printf(...) pc.printf(__VA_ARGS__)
#endif
@@ -88,11 +88,11 @@
#endif
struct MyVL6180Dev_t {
- struct VL6180xDevData_t Data;
- uint8_t I2cAddr;
- //uint8_t DevID;
+ struct VL6180xDevData_t Data;
+ uint8_t I2cAddr;
+ //uint8_t DevID;
- //misc flags for application
+ //misc flags for application
unsigned Present:1;
unsigned Ready:1;
};
--- a/x_nucleo_6180xa1.cpp Wed Oct 28 09:28:52 2015 +0000
+++ b/x_nucleo_6180xa1.cpp Wed Oct 28 13:07:59 2015 +0000
@@ -48,12 +48,12 @@
if(_instance==NULL)
_instance=new X_NUCLEO_6180XA1(ext_i2c);
else
- VL6180x_ErrLog("Failed to init X_NUCLEO_6180XA1 board!\n");
+ printf("Failed to init X_NUCLEO_6180XA1 board!\n");
return _instance;
}
-int X_NUCLEO_6180XA1::InitBoard() //FIXME sistemare le stampe degli errori
+int X_NUCLEO_6180XA1::InitBoard()
{
int status, n_dev=0;
@@ -68,7 +68,6 @@
delete gpio0_top;
sensor_top=NULL;
gpio0_top=NULL;
- //VL6180x_ErrLog("Failed to init sensor_top\n\r");
printf("Failed to init sensor_top\n\r");
}
else
@@ -82,7 +81,6 @@
delete gpio0_bottom;
sensor_bottom=NULL;
gpio0_bottom=NULL;
- //VL6180x_ErrLog("Failed to init sensor_bottom\n\r");
printf("Failed to init sensor_bottom\n\r");
}
else
@@ -96,7 +94,6 @@
delete gpio0_left;
sensor_left=NULL;
gpio0_left=NULL;
- //VL6180x_ErrLog("Failed to init sensor_left\n\r");
printf("Failed to init sensor_left\n\r");
}
else
@@ -109,8 +106,7 @@
delete sensor_right;
delete gpio0_right;
sensor_right=NULL;
- gpio0_right=NULL;
- //VL6180x_ErrLog("Failed to init sensor_right\n\r");
+ gpio0_right=NULL;
printf("Failed to init sensor_right\n\r");
}
else

X-NUCLEO-6180XA1 Proximity and Ambient Light Sensor