2025-03-21 4:22 AM
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();
}
2025-03-21 4:33 AM
@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?
2025-03-21 4:48 AM
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