Library containing Crazyflie 2.0 sensors drivers: - LPS25H (barometer) - MPU9250 (IMU) - PMW3901 (optical flow) - VL53L0X (range)

Dependents:   Drones-Controlador controladoatitude_cteste Drone_Controlador_Atitude optical_test

Revision:
6:c7bc001826ba
Parent:
5:1ef8b91a0318
--- a/PMW3901/PMW3901.cpp	Fri May 04 23:03:00 2018 +0000
+++ b/PMW3901/PMW3901.cpp	Tue May 08 13:35:42 2018 +0000
@@ -6,7 +6,26 @@
 }
     
 /** Initialize optical flow */
-int PMW3901::init()
+bool PMW3901::init()
+{
+    setup_spi();
+    if (test_spi())
+    {
+        setup_flow();
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+void PMW3901::read()
+{
+    read_flow();
+}
+
+void PMW3901::setup_spi()
 {
     // Deselect the device by seting chip select high
     cs = 1;
@@ -15,27 +34,31 @@
     spi.format(8,3);
     // Setup the spi frequency to 2MHz
     spi.frequency(2000000);
- 
+}
+
+bool PMW3901::test_spi()
+{
+    // 
+    char id;
+     
     // Select the device by seting chip select low
     cs = 0;
- 
-    // Send 0x00, the command to read the WHOAMI register
-    spi.write(0x00);
- 
-    // Send a dummy byte to receive the contents of the WHOAMI register
-    int whoami = spi.write(0x00);
- 
+    // Write the register to read sensor ID (set MSB to 0 for read)
+    spi.write(PRODUCT_ID & 0b01111111); 
+    // Write a dummy byte 0x00 to receive the chip ID
+    id = spi.write(0x00);
     // Deselect the device by seting chip select high
-    cs = 1;
-    
-    //setup_flow();
+    cs = 1; 
     
-    return whoami;
-}
-
-void PMW3901::read()
-{
-    read_flow();
+    //
+    if (id == 0x49)
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }   
 }
 
 void PMW3901::setup_flow()
@@ -44,93 +67,93 @@
     cs = 0;
     
     //
-    spi.write(0x3A); spi.write(0x5A);
+    spi.write(0x3A | 0b10000000); spi.write(0x5A);
     
     // 
-    spi.write(0x02); spi.write(0x00);
+    spi.write(0x02 & 0b01111111); spi.write(0x00);
     // 
-    spi.write(0x03); spi.write(0x00);
-    spi.write(0x04); spi.write(0x00);
-    spi.write(0x05); spi.write(0x00);
-    spi.write(0x06); spi.write(0x00);
+    spi.write(0x03 & 0b01111111); spi.write(0x00);
+    spi.write(0x04 & 0b01111111); spi.write(0x00);
+    spi.write(0x05 & 0b01111111); spi.write(0x00);
+    spi.write(0x06 & 0b01111111); spi.write(0x00);
     
     //
-    spi.write(0x7F); spi.write(0x00);
-    spi.write(0x61); spi.write(0xAD);
-    spi.write(0x7F); spi.write(0x03);
-    spi.write(0x40); spi.write(0x00);
-    spi.write(0x7F); spi.write(0x05);
-    spi.write(0x41); spi.write(0xB3);
-    spi.write(0x43); spi.write(0xF1);
-    spi.write(0x45); spi.write(0x14);
-    spi.write(0x5B); spi.write(0x32);
-    spi.write(0x5F); spi.write(0x34);
-    spi.write(0x7B); spi.write(0x08);
-    spi.write(0x7F); spi.write(0x06);
-    spi.write(0x44); spi.write(0x1B);
-    spi.write(0x40); spi.write(0xBF);
-    spi.write(0x4E); spi.write(0x3F);
-    spi.write(0x7F); spi.write(0x08);
-    spi.write(0x65); spi.write(0x20);
-    spi.write(0x6A); spi.write(0x18);
-    spi.write(0x7F); spi.write(0x09);
-    spi.write(0x4F); spi.write(0xAF);
-    spi.write(0x5F); spi.write(0x40);
-    spi.write(0x48); spi.write(0x80);
-    spi.write(0x49); spi.write(0x80);
-    spi.write(0x57); spi.write(0x77);
-    spi.write(0x60); spi.write(0x78);
-    spi.write(0x61); spi.write(0x78);
-    spi.write(0x62); spi.write(0x08);
-    spi.write(0x63); spi.write(0x50);
-    spi.write(0x7F); spi.write(0x0A);
-    spi.write(0x45); spi.write(0x60);
-    spi.write(0x7F); spi.write(0x00);
-    spi.write(0x4D); spi.write(0x11);
-    spi.write(0x55); spi.write(0x80);
-    spi.write(0x74); spi.write(0x1F);
-    spi.write(0x75); spi.write(0x1F);
-    spi.write(0x4A); spi.write(0x78);
-    spi.write(0x4B); spi.write(0x78);
-    spi.write(0x44); spi.write(0x08);
-    spi.write(0x45); spi.write(0x50);
-    spi.write(0x64); spi.write(0xFF);
-    spi.write(0x65); spi.write(0x1F);
-    spi.write(0x7F); spi.write(0x14);
-    spi.write(0x65); spi.write(0x60);
-    spi.write(0x66); spi.write(0x08);
-    spi.write(0x63); spi.write(0x78);
-    spi.write(0x7F); spi.write(0x15);
-    spi.write(0x48); spi.write(0x58);
-    spi.write(0x7F); spi.write(0x07);
-    spi.write(0x41); spi.write(0x0D);
-    spi.write(0x43); spi.write(0x14);
-    spi.write(0x4B); spi.write(0x0E);
-    spi.write(0x45); spi.write(0x0F);
-    spi.write(0x44); spi.write(0x42);
-    spi.write(0x4C); spi.write(0x80);
-    spi.write(0x7F); spi.write(0x10);
-    spi.write(0x5B); spi.write(0x02);
-    spi.write(0x7F); spi.write(0x07);
-    spi.write(0x40); spi.write(0x41);
-    spi.write(0x70); spi.write(0x00);
+    spi.write(0x7F | 0b10000000); spi.write(0x00);
+    spi.write(0x61 | 0b10000000); spi.write(0xAD);
+    spi.write(0x7F | 0b10000000); spi.write(0x03);
+    spi.write(0x40 | 0b10000000); spi.write(0x00);
+    spi.write(0x7F | 0b10000000); spi.write(0x05);
+    spi.write(0x41 | 0b10000000); spi.write(0xB3);
+    spi.write(0x43 | 0b10000000); spi.write(0xF1);
+    spi.write(0x45 | 0b10000000); spi.write(0x14);
+    spi.write(0x5B | 0b10000000); spi.write(0x32);
+    spi.write(0x5F | 0b10000000); spi.write(0x34);
+    spi.write(0x7B | 0b10000000); spi.write(0x08);
+    spi.write(0x7F | 0b10000000); spi.write(0x06);
+    spi.write(0x44 | 0b10000000); spi.write(0x1B);
+    spi.write(0x40 | 0b10000000); spi.write(0xBF);
+    spi.write(0x4E | 0b10000000); spi.write(0x3F);
+    spi.write(0x7F | 0b10000000); spi.write(0x08);
+    spi.write(0x65 | 0b10000000); spi.write(0x20);
+    spi.write(0x6A | 0b10000000); spi.write(0x18);
+    spi.write(0x7F | 0b10000000); spi.write(0x09);
+    spi.write(0x4F | 0b10000000); spi.write(0xAF);
+    spi.write(0x5F | 0b10000000); spi.write(0x40);
+    spi.write(0x48 | 0b10000000); spi.write(0x80);
+    spi.write(0x49 | 0b10000000); spi.write(0x80);
+    spi.write(0x57 | 0b10000000); spi.write(0x77);
+    spi.write(0x60 | 0b10000000); spi.write(0x78);
+    spi.write(0x61 | 0b10000000); spi.write(0x78);
+    spi.write(0x62 | 0b10000000); spi.write(0x08);
+    spi.write(0x63 | 0b10000000); spi.write(0x50);
+    spi.write(0x7F | 0b10000000); spi.write(0x0A);
+    spi.write(0x45 | 0b10000000); spi.write(0x60);
+    spi.write(0x7F | 0b10000000); spi.write(0x00);
+    spi.write(0x4D | 0b10000000); spi.write(0x11);
+    spi.write(0x55 | 0b10000000); spi.write(0x80);
+    spi.write(0x74 | 0b10000000); spi.write(0x1F);
+    spi.write(0x75 | 0b10000000); spi.write(0x1F);
+    spi.write(0x4A | 0b10000000); spi.write(0x78);
+    spi.write(0x4B | 0b10000000); spi.write(0x78);
+    spi.write(0x44 | 0b10000000); spi.write(0x08);
+    spi.write(0x45 | 0b10000000); spi.write(0x50);
+    spi.write(0x64 | 0b10000000); spi.write(0xFF);
+    spi.write(0x65 | 0b10000000); spi.write(0x1F);
+    spi.write(0x7F | 0b10000000); spi.write(0x14);
+    spi.write(0x65 | 0b10000000); spi.write(0x60);
+    spi.write(0x66 | 0b10000000); spi.write(0x08);
+    spi.write(0x63 | 0b10000000); spi.write(0x78);
+    spi.write(0x7F | 0b10000000); spi.write(0x15);
+    spi.write(0x48 | 0b10000000); spi.write(0x58);
+    spi.write(0x7F | 0b10000000); spi.write(0x07);
+    spi.write(0x41 | 0b10000000); spi.write(0x0D);
+    spi.write(0x43 | 0b10000000); spi.write(0x14);
+    spi.write(0x4B | 0b10000000); spi.write(0x0E);
+    spi.write(0x45 | 0b10000000); spi.write(0x0F);
+    spi.write(0x44 | 0b10000000); spi.write(0x42);
+    spi.write(0x4C | 0b10000000); spi.write(0x80);
+    spi.write(0x7F | 0b10000000); spi.write(0x10);
+    spi.write(0x5B | 0b10000000); spi.write(0x02);
+    spi.write(0x7F | 0b10000000); spi.write(0x07);
+    spi.write(0x40 | 0b10000000); spi.write(0x41);
+    spi.write(0x70 | 0b10000000); spi.write(0x00);
     
     //
     wait(0.1);
-    spi.write(0x32); spi.write(0x44);
-    spi.write(0x7F); spi.write(0x07);
-    spi.write(0x40); spi.write(0x40);
-    spi.write(0x7F); spi.write(0x06);
-    spi.write(0x62); spi.write(0xf0);
-    spi.write(0x63); spi.write(0x00);
-    spi.write(0x7F); spi.write(0x0D);
-    spi.write(0x48); spi.write(0xC0);
-    spi.write(0x6F); spi.write(0xd5);
-    spi.write(0x7F); spi.write(0x00);
-    spi.write(0x5B); spi.write(0xa0);
-    spi.write(0x4E); spi.write(0xA8);
-    spi.write(0x5A); spi.write(0x50);
-    spi.write(0x40); spi.write(0x80);
+    spi.write(0x32 | 0b10000000); spi.write(0x44);
+    spi.write(0x7F | 0b10000000); spi.write(0x07);
+    spi.write(0x40 | 0b10000000); spi.write(0x40);
+    spi.write(0x7F | 0b10000000); spi.write(0x06);
+    spi.write(0x62 | 0b10000000); spi.write(0xf0);
+    spi.write(0x63 | 0b10000000); spi.write(0x00);
+    spi.write(0x7F | 0b10000000); spi.write(0x0D);
+    spi.write(0x48 | 0b10000000); spi.write(0xC0);
+    spi.write(0x6F | 0b10000000); spi.write(0xd5);
+    spi.write(0x7F | 0b10000000); spi.write(0x00);
+    spi.write(0x5B | 0b10000000); spi.write(0xa0);
+    spi.write(0x4E | 0b10000000); spi.write(0xA8);
+    spi.write(0x5A | 0b10000000); spi.write(0x50);
+    spi.write(0x40 | 0b10000000); spi.write(0x80);
     
     // Deselect the device by seting chip select high
     cs = 1;
@@ -143,24 +166,21 @@
     
     // Select the device by seting chip select low
     cs = 0; 
-    
+        
     //   
-    spi.write(0x02); wait(0.01); spi.write(0x00); wait(0.01);
-    // 
-    spi.write(0x03); wait(0.01); data[0] = spi.write(0x00); wait(0.01);
-    spi.write(0x04); wait(0.01); data[1] = spi.write(0x00); wait(0.01);
-    spi.write(0x05); wait(0.01); data[2] = spi.write(0x00); wait(0.01);
-    spi.write(0x06); wait(0.01); data[3] = spi.write(0x00); wait(0.01);
+    spi.write(MOTION & 0b01111111); spi.write(0x00); 
+    // Write the register to read sensor ID (set MSB to 0 for read) 
+    spi.write(DELTA_X_L & 0b01111111); data[0] = spi.write(0x00); 
+    spi.write(DELTA_X_H & 0b01111111); data[1] = spi.write(0x00); 
+    spi.write(DELTA_Y_L & 0b01111111); data[2] = spi.write(0x00); 
+    spi.write(DELTA_Y_H & 0b01111111); data[3] = spi.write(0x00); 
 
- /*   // Reassemble the data (two 8 bit data into one 16 bit data)
+    // Reassemble the data (two 8 bit data into one 16 bit data)
     int16_t x_raw = (data[1] << 8 ) | data[0];
     int16_t y_raw = (data[3] << 8 ) | data[2];
     // Convert to SI units [rad/s]
     x = x_raw * 1.0f;
-    y = y_raw * 1.0f; */
-    
-    x = (data[1] << 8 ) | data[0];
-    y = (data[3] << 8 ) | data[2];
+    y = y_raw * 1.0f; 
     
     // Deselect the device by seting chip select high
     cs = 1;