example of display BMI160 on oled

Dependencies:   BMI160 max32630fthr Adafruit_FeatherOLED USBDevice

Files at this revision

API Documentation at this revision

Comitter:
bangclever
Date:
Sun Jun 14 20:17:43 2020 +0000
Parent:
10:1f5e78dd4a7c
Commit message:
oled + BMI

Changed in this revision

BMI160.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 1f5e78dd4a7c -r 6fdec00dbb90 BMI160.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMI160.lib	Sun Jun 14 20:17:43 2020 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/MaximIntegrated/code/BMI160/#4949e9b15b6e
diff -r 1f5e78dd4a7c -r 6fdec00dbb90 main.cpp
--- a/main.cpp	Wed Feb 08 00:50:27 2017 +0000
+++ b/main.cpp	Sun Jun 14 20:17:43 2020 +0000
@@ -34,6 +34,8 @@
 #include "max32630fthr.h"
 #include "Adafruit_SSD1306.h"
 #include "USBSerial.h"
+#include "bmi160.h"
+
 
 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
 
@@ -48,6 +50,7 @@
 DigitalOut rLED(LED1);
 DigitalOut gLED(LED2);
 DigitalOut bLED(LED3);
+ 
 
 DigitalIn aButton(P5_3, PullUp);
 DigitalIn bButton(P3_3, PullUp);
@@ -62,10 +65,68 @@
 AnalogIn ain1(AIN_5); 
 AnalogIn ain2(AIN_2); 
 AnalogIn ain3(AIN_3);
+// main() runs in its own thread in the OS
+// (note the calls to Thread::wait below for delays)
+
+
+Timer t; 
+
+//*****************************************************************************
+
+void dumpImuRegisters(BMI160 &imu);
+void printRegister(BMI160 &imu, BMI160::Registers reg);
+void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg);
+
+
+
+void dumpImuRegisters(BMI160 &imu)
+{
+    printRegister(imu, BMI160::CHIP_ID);
+    printBlock(imu, BMI160::ERR_REG,BMI160::FIFO_DATA);
+    printBlock(imu, BMI160::ACC_CONF, BMI160::FIFO_CONFIG_1);
+    printBlock(imu, BMI160::MAG_IF_0, BMI160::SELF_TEST);
+    printBlock(imu, BMI160::NV_CONF, BMI160::STEP_CONF_1);
+    printRegister(imu, BMI160::CMD);
+    printf("\n");
+}
 
 
-// main() runs in its own thread in the OS
-// (note the calls to Thread::wait below for delays)
+//*****************************************************************************
+void printRegister(BMI160 &imu, BMI160::Registers reg)
+{
+    uint8_t data;
+    if(imu.readRegister(reg, &data) == BMI160::RTN_NO_ERROR)
+    {
+        printf("IMU Register 0x%02x = 0x%02x\n", reg, data);
+    }
+    else
+    {
+        printf("Failed to read register\n");
+    }
+}
+
+
+//*****************************************************************************
+void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg)
+{
+    uint8_t numBytes = ((stopReg - startReg) + 1);
+    uint8_t buff[numBytes];
+    uint8_t offset = static_cast<uint8_t>(startReg);
+    
+    if(imu.readBlock(startReg, stopReg, buff) == BMI160::RTN_NO_ERROR)
+    {
+        for(uint8_t idx = offset; idx < (numBytes + offset); idx++)
+        {
+            printf("IMU Register 0x%02x = 0x%02x\n", idx, buff[idx - offset]);
+        }
+    }
+    else
+    {
+        printf("Failed to read block\n");
+    }
+}
+
+
 int main()
 {
     int c;
@@ -80,10 +141,100 @@
 
     Thread::wait(50);  // Give the supplies time to settle before initializing the display
     Adafruit_SSD1306_I2c featherOLED(i2c);  
-    featherOLED.printf("%ux%u OLED Display\r\n", featherOLED.width(), featherOLED.height());
+   // featherOLED.printf("%ux%u OLED Display\r\n", featherOLED.width(), featherOLED.height());
     featherOLED.printf("HelloWorld \r");
     featherOLED.display();
-
+    wait (3.0); 
+    //=====================================================
+    
+    I2C i2cBus(P5_7, P6_0);
+    i2cBus.frequency(400000);
+    BMI160_I2C imu(i2cBus, BMI160_I2C::I2C_ADRS_SDO_LO);
+    
+    uint32_t failures = 0;
+    
+    if(imu.setSensorPowerMode(BMI160::GYRO, BMI160::NORMAL) != BMI160::RTN_NO_ERROR)
+    {
+        printf("Failed to set gyroscope power mode\n");
+        failures++;
+    }
+    wait_ms(100);
+    
+    if(imu.setSensorPowerMode(BMI160::ACC, BMI160::NORMAL) != BMI160::RTN_NO_ERROR)
+    {
+        printf("Failed to set accelerometer power mode\n");
+        failures++;
+    }
+    wait_ms(100);
+    
+    
+    BMI160::AccConfig accConfig;
+    //example of using getSensorConfig
+    if(imu.getSensorConfig(accConfig) == BMI160::RTN_NO_ERROR)
+    {
+        printf("ACC Range = %d\n", accConfig.range);
+        printf("ACC UnderSampling = %d\n", accConfig.us);
+        printf("ACC BandWidthParam = %d\n", accConfig.bwp);
+        printf("ACC OutputDataRate = %d\n\n", accConfig.odr);
+    }
+    else
+    {
+        printf("Failed to get accelerometer configuration\n");
+        failures++;
+    }
+    
+    //example of setting user defined configuration
+    accConfig.range = BMI160::SENS_4G;
+    accConfig.us = BMI160::ACC_US_OFF;
+    accConfig.bwp = BMI160::ACC_BWP_2;
+    accConfig.odr = BMI160::ACC_ODR_8;
+    if(imu.setSensorConfig(accConfig) == BMI160::RTN_NO_ERROR)
+    {
+       // printf("ACC Range = %d\n", accConfig.range);
+       // printf("ACC UnderSampling = %d\n", accConfig.us);
+      //  printf("ACC BandWidthParam = %d\n", accConfig.bwp);
+       // printf("ACC OutputDataRate = %d\n\n", accConfig.odr);
+    }
+    else
+    {
+        printf("Failed to set accelerometer configuration\n");
+        failures++;
+    }
+    
+    BMI160::GyroConfig gyroConfig;
+    if(imu.getSensorConfig(gyroConfig) == BMI160::RTN_NO_ERROR)
+    {
+        printf("GYRO Range = %d\n", gyroConfig.range);
+        printf("GYRO BandWidthParam = %d\n", gyroConfig.bwp);
+        printf("GYRO OutputDataRate = %d\n\n", gyroConfig.odr);
+    }
+    else
+    {
+        printf("Failed to get gyroscope configuration\n");
+        failures++;
+    }
+    
+    wait(1.0);
+    printf("\033[H");  //home
+    printf("\033[0J");  //erase from cursor to end of screen
+    
+    
+    //==========================================
+    
+    if(imu.setSensorPowerMode(BMI160::GYRO, BMI160::NORMAL) != BMI160::RTN_NO_ERROR)
+    {
+        printf("Failed to set gyroscope power mode\n");
+        failures++;
+    }
+    wait_ms(100);
+    
+    if(imu.setSensorPowerMode(BMI160::ACC, BMI160::NORMAL) != BMI160::RTN_NO_ERROR)
+    {
+        printf("Failed to set accelerometer power mode\n");
+        failures++;
+    }
+    wait_ms(100);
+    
 
     while(1) {
         Thread::wait(250);
@@ -97,15 +248,70 @@
             microUSB.putc(c);
             daplink.putc(c);
         }
+        
+        int high =1; 
+        int low =0; 
+        DigitalOut trigger (P5_2);
+        trigger = high;
+        wait_us(10);
+        trigger = low; 
+        
+        DigitalIn echo (P5_1); 
+        if ( echo == high ) 
+        {
+            
+        gLED = LED_ON;
+        wait(5);
+        gLED = LED_OFF;
+        
+        }
+        
+         
+        //if (echo == 1) 
+        //{
+          //  DigitalOut gLED(LED2, LED_ON);
+          //  wait(1);
+            //gLED = LED_OFF;
+       // }
+        
+        //*************************testing timeer *******************************************
+      /*  
+        t.start();
+        printf("Hello World!\n");
+        t.stop();
+        printf("The time taken was %f seconds\n", t.read());
+        
+        */
+        
+        // **********************************************************************************
+
+        
+        
+        
+        float imuTemperature; 
+        BMI160::SensorData accData;
+        BMI160::SensorData gyroData;
+        BMI160::SensorTime sensorTime;
+        
+        imu.getGyroAccXYZandSensorTime(accData, gyroData, sensorTime, accConfig.range, gyroConfig.range);
+        imu.getTemperature(&imuTemperature);
+        
+        
         rLED = aButton;
         gLED = bButton;
         bLED = cButton;
         featherOLED.clearDisplay();
         featherOLED.setTextCursor(0,0);
-        featherOLED.printf("MAX32630FTHR OLED\n");
+        featherOLED.printf("SensorTemp = %s%5.3f\n", "\033", imuTemperature);
+        featherOLED.printf("X%s%4.1f ", "\033", gyroData.xAxis.scaled);
+        featherOLED.printf("Y%s%4.1f ", "\033", gyroData.yAxis.scaled);
+        featherOLED.printf("Z%s%4.1f\n", "\033", gyroData.zAxis.scaled);
+        //printf("GYRO yAxis = %s%5.1f\n", "\033[K", gyroData.yAxis.scaled);
+       // printf("GYRO zAxis = %s%5.1f\n", "\033[K", gyroData.zAxis.scaled);
+        //featherOLED.printf("MAX32630FTHR OLED\n");
         featherOLED.printf("AIN0/1: %1.2f, %1.2f\n", (6.0f * ain0), (6.0f * ain1) );  // analog inputs 0,1
-        featherOLED.printf("AIN2/3: %1.2f, %1.2f\n", (1.2f * ain2), (1.2f * ain3) );  // analog inputs 2,3
-        featherOLED.printf("UART:%c  A:%d  B:%d  C:%d\n", c, aButton.read(), bButton.read(), cButton.read());  // UART and Buttons
+       // featherOLED.printf("AIN2/3: %1.2f, %1.2f\n", (1.2f * ain2), (1.2f * ain3) );  // analog inputs 2,3
+      //  featherOLED.printf("UART:%c  A:%d  B:%d  C:%d\n", c, aButton.read(), bButton.read(), cButton.read());  // UART and Buttons
         featherOLED.display();
 
     }