It is supposed to work
Dependencies: mbed ros_lib_kinetic
Diff: main.cpp
- Revision:
- 0:231de8959869
- Child:
- 1:b725652b9b42
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Oct 09 08:08:38 2019 +0000 @@ -0,0 +1,209 @@ +/* + * rosserial Publisher Example + * Prints "hello world!" + */ + +#include"mbed.h" +#include <ros.h> +#include <std_msgs/String.h> +#include <std_msgs/Int32.h> + +ros::NodeHandle nh; +std_msgs::Int32 int_msg; +std_msgs::String str_msg; +ros::Publisher chatter("chatter", &str_msg); +ros::Publisher range_pub("range", &int_msg); + +char hello[13] = "hello world!"; + +DigitalOut led = LED1; + +Serial pc(SERIAL_TX, SERIAL_RX); +// set-up serial to pc +I2C i2c(I2C_SDA, I2C_SCL); +// Set up I²C on the STM32 NUCLEO-401RE +#define addr (0x52) +// I²C address of VL6180 shifted by 1 bit +//(0x29 << 1) so the R/W command can be added + +/////////////////////////////////////////////////////////////////// +// Split 16-bit register address into two bytes and write +// the address + data via I²C +/////////////////////////////////////////////////////////////////// +void WriteByte(wchar_t reg,char data) { + char data_write[3]; + data_write[0] = (reg >> 8) & 0xFF;; + // MSB of register address + data_write[1] = reg & 0xFF; + // LSB of register address + data_write[2] = data & 0xFF; + i2c.write(addr, data_write, 3); +} + +/////////////////////////////////////////////////////////////////// +// Split 16-bit register address into two bytes and write +// required register address to VL6180 and read the data back +/////////////////////////////////////////////////////////////////// +char ReadByte(wchar_t reg) { + char data_write[2]; + char data_read[1]; + + data_write[0] = (reg >> 8) & 0xFF; // MSB of register address + data_write[1] = reg & 0xFF; // LSB of register address + + i2c.write(addr, data_write, 2); + i2c.read(addr, data_read, 1); + return data_read[0]; +} + +/////////////////////////////////////////////////////////////////// +// load settings +/////////////////////////////////////////////////////////////////// +int VL6180_Init() { + char reset; + reset = ReadByte(0x016); + if (reset==1) + { + // check to see has it be Initialised already + + /////////////////////////////////////////////////////////////////// + // Added latest settings here - see Section 9 + /////////////////////////////////////////////////////////////////// + // Mandatory : private registers + WriteByte(0x0207, 0x01); + WriteByte(0x0208, 0x01); + WriteByte(0x0096, 0x00); + WriteByte(0x0097, 0xfd); + WriteByte(0x00e3, 0x01); + WriteByte(0x00e4, 0x03); + WriteByte(0x00e5, 0x02); + WriteByte(0x00e6, 0x01); + WriteByte(0x00e7, 0x03); + WriteByte(0x00f5, 0x02); + WriteByte(0x00d9, 0x05); + WriteByte(0x00db, 0xce); + WriteByte(0x00dc, 0x03); + WriteByte(0x00dd, 0xf8); + WriteByte(0x009f, 0x00); + WriteByte(0x00a3, 0x3c); + WriteByte(0x00b7, 0x00); + WriteByte(0x00bb, 0x3c); + WriteByte(0x00b2, 0x09); + WriteByte(0x00ca, 0x09); + WriteByte(0x0198, 0x01); + WriteByte(0x01b0, 0x17); + WriteByte(0x01ad, 0x00); + WriteByte(0x00ff, 0x05); + WriteByte(0x0100, 0x05); + WriteByte(0x0199, 0x05); + WriteByte(0x01a6, 0x1b); + WriteByte(0x01ac, 0x3e); + WriteByte(0x01a7, 0x1f); + WriteByte(0x0030, 0x00); + + // Recommended : Public registers - See data sheet for more detail + //WriteByte(0x0011, 0x10); // Enables polling for ‘New Sample ready’ when measurement completes + //WriteByte(0x010a, 0x30); // Set the averaging sample period (compromise between lower noise and increased execution time) + //WriteByte(0x003f, 0x46); // Sets the light and dark gain (upper // nibble). Dark gain should not be // changed. + //WriteByte(0x0031, 0xFF); // sets the # of range measurements after // which auto calibration of system is // performed + //WriteByte(0x0041, 0x63); // Set ALS integration time to 100ms + //WriteByte(0x002e, 0x01); // perform a single temperature calibration // of the ranging sensor + + WriteByte(0x016, 0x00); //change fresh out of set status to 0 + } + return 0; +} + +/////////////////////////////////////////////////////////////////// +// Start a range measurement in single shot mode +/////////////////////////////////////////////////////////////////// +int VL6180_Start_Range() { + WriteByte(0x018,0x03); + return 0; +} + +/////////////////////////////////////////////////////////////////// +// poll for new sample ready ready +/////////////////////////////////////////////////////////////////// +int VL6180_Poll_Range() { + char status; + char range_status; + + // check the status + status = ReadByte(0x04f); + range_status = status & 0x07; + + printf("status en cours \n"); + + // wait for new measurement ready status + while (range_status != 0x00) + { + printf("status = %d\n", status); + status = ReadByte(0x04f); + range_status = status & 0x07; + wait_ms(1); // (can be removed) + } + + //printf("range polled \n"); + return 0; +} + +/////////////////////////////////////////////////////////////////// +// Read range result (mm) +/////////////////////////////////////////////////////////////////// +int VL6180_Read_Range() { + int range; + range=ReadByte(0x062); + return range; +} + +/////////////////////////////////////////////////////////////////// +// clear interrupts +/////////////////////////////////////////////////////////////////// +int VL6180_Clear_Interrupts() { + WriteByte(0x015,0x07); + return 0; +} + +/////////////////////////////////////////////////////////////////// +// Main Program loop +/////////////////////////////////////////////////////////////////// +int main() { + + nh.initNode(); + nh.advertise(chatter); + nh.advertise(range_pub); + int range; + // load settings onto VL6180X + VL6180_Init(); + + //char byte; + //byte = ReadByte(0x04d); + printf("RESULT_RANGE_STATUS %d\n ", byte); + + //wait(1); + + // start single range measurement + + + while (1) + { + led = !led; + str_msg.data = hello; + chatter.publish( &str_msg ); + VL6180_Start_Range(); + // poll the VL6180 till new sample ready + VL6180_Poll_Range(); + // read range result + range = VL6180_Read_Range(); + // clear the interrupt on VL6180 + VL6180_Clear_Interrupts(); + // send range to pc by serial + int_msg.data = range; + range_pub.publish(&int_msg); + pc.printf("%d\r\n", range); + wait(0.5); + nh.spinOnce(); + } +} +