cancel
Showing results for 
Search instead for 
Did you mean: 

Integrate BNO055 sensor code to Touchgfx compass UI

Prajyot1
Associate II

Prajyot1_0-1742555144172.png

Hello , 
i am using STM32h750B-dk . i took compass image (PNG file) as texture mapper and i want to rotate the compass image according to BNO055 sensor which is magnetometer. this is connected through I2C4 (for I2C4 , STmod+ is used). i have share the codes. Thank you!
#Model.cpp:

#include <gui/model/Model.hpp>
#include <gui/model/ModelListener.hpp>
#include <cstdint>
#include "stm32h7xx_hal.h"
#include <math.h>


#define BNO055_I2C_ADDR (0x28 << 1)  // Shifted for STM32 HAL
#define BNO055_MAG_DATA_X_LSB_ADDR  0x0E


extern I2C_HandleTypeDef hi2c4;

Model::Model() : modelListener(0)
{

}

void Model::tick()
{
	static uint32_t lastUpdateTime = 0;
	uint32_t currentTime = HAL_GetTick();
	if ((currentTime - lastUpdateTime) >= 1000)  // Check if 1 second has passed
	    {
	        lastUpdateTime = currentTime;

	 if (modelListener)
	    {
	        int heading = getHeading();
	        modelListener->updateHeading(heading);
	    }
	   }
}
int Model::getHeading()
{
    uint8_t buffer[6];
    int16_t mag_data[3];

    // Read magnetometer data
    HAL_I2C_Mem_Read(&hi2c4, BNO055_I2C_ADDR, BNO055_MAG_DATA_X_LSB_ADDR, I2C_MEMADD_SIZE_8BIT, buffer, 6, HAL_MAX_DELAY);

    // Convert to signed 16-bit values
    mag_data[0] = (int16_t)((buffer[1] << 8) | buffer[0]);  // X-axis
    mag_data[1] = (int16_t)((buffer[3] << 8) | buffer[2]);  // Y-axis
    mag_data[2] = (int16_t)((buffer[5] << 8) | buffer[4]);  // Z-axis

    // Calculate heading angle (in degrees)
    float heading = atan2((float)mag_data[1], (float)mag_data[0]) * (180.0f / 3.14159265359f);

    if (heading < 0)
        heading += 360;  // Normalize to 0-360°

    return (int)heading;
}

#Screen1Presenter.cpp:

#include <gui/screen1_screen/Screen1View.hpp>
#include <gui/screen1_screen/Screen1Presenter.hpp>

Screen1Presenter::Screen1Presenter(Screen1View& v)
    : view(v)
{

}

void Screen1Presenter::activate()
{

}

void Screen1Presenter::deactivate()
{

}
void Screen1Presenter::updateHeading(int heading)
{
    view.updateCompass(heading); // Send heading to the UI for display

}

#Screen1View.cpp:

#include <gui/screen1_screen/Screen1View.hpp>

Screen1View::Screen1View()
{

}

void Screen1View::setupScreen()
{
    Screen1ViewBase::setupScreen();
}

void Screen1View::tearDownScreen()
{
    Screen1ViewBase::tearDownScreen();
}

void Screen1View::updateCompass(int heading)
{
    float angleRadians = heading * 3.14159265359f / 180.0f;
    textureMapper1.setAngles(0,0,angleRadians);
    textureMapper1.invalidate();
}

 

 

2 REPLIES 2

@Prajyot1 wrote:

i have share the codes.


Is there a problem with it, or are you just sharing it for  the benefit of anyone who might be interested?

Actually there is problem with rotation . the image is not rotating according to the sensor value.. i am not getting the  how can i resolve this issue.. video of testing