你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果

[复制链接]
donatello1996 发布时间:2026-7-27 02:49
       LVGL应用的一大亮点就是极大简化了MCU存储和处理图片数据的难度,有专门一个结构体叫lv_image_dsc_t负责记录保存图片的RAW数据、长宽参数、占用空间和颜色格式,并且有专门的在线和离线工具负责生成lv_image_dsc_t,LVGL应用调用img或者img_btn控件时,直接指定lv_image_dsc_t结构体对象即可完成图像的填充,非常方便,本帖就使用MPU6050模块读取XY方向倾角数据,实现一个简单有趣的图片动画,并实现一个图片按钮(img_btn),按下和抬起分别显示两张图片。$ L3 o& q+ W- R5 ~2 X# g
      MPU6050模块接在另一组模拟I2C接口上(PD11和PD12),与之前的BME680模块错开:& d4 C. M0 R6 R, W8 a' J
#define FAKE_I2C_SCL_PD11_GPIO_PORT            GPIOD& M5 H6 l- ?- D: ~  N
#define FAKE_I2C_SCL_PD11_GPIO_PIN             GPIO_PIN_11) `7 g; R, g; x" W
#define FAKE_I2C_SCL_PD11_GPIO_CLK_ENABLE      __HAL_RCC_GPIOD_CLK_ENABLE();
5 \6 g# A; g3 e! f% S/ |! \. b4 Q
  C$ @4 `' O% {6 ?6 ?% l8 {) Q
#define FAKE_I2C_SCL_PD11_H                                                                                HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_SET);* y! R: u+ E# g2 x' l6 A
#define FAKE_I2C_SCL_PD11_L                                                                                HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_RESET);
# \. n6 U! w. e: [8 B6 p; T/ A* M: b1 b/ z
9 _% C. d# E( Z2 u* n/ e
#define FAKE_I2C_SDA_PD12_GPIO_PORT            GPIOD
4 [# ~! |$ `$ t2 n, F#define FAKE_I2C_SDA_PD12_GPIO_PIN             GPIO_PIN_12
' M  s0 y$ [! W$ [: n- }#define FAKE_I2C_SDA_PD12_GPIO_CLK_ENABLE      __HAL_RCC_GPIOD_CLK_ENABLE();+ r" B% D5 `3 m( _5 e7 T( v! @
" G, {# N' A) Z
3 l$ y: U% n9 F0 s6 f) Q
#define FAKE_I2C_SDA_PD12_H                                                                                HAL_GPIO_WritePin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN , GPIO_PIN_SET);
6 V& T% d0 \+ J# I& A$ i/ R4 M#define FAKE_I2C_SDA_PD12_L                                                                                HAL_GPIO_WritePin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN , GPIO_PIN_RESET);# w$ y( `0 u* f
9 G5 z" T5 u" F/ Z7 l8 C7 @6 ^/ `
3 E$ ]$ W) o1 K$ j. \, S
#define IIC_READ_SDA_PD12                                                                     HAL_GPIO_ReadPin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN)3 T7 K# C  f) z3 z

% |' k0 ~& ?! P# }$ u& \9 L
  O6 E8 A$ {! f# x
具体模拟I2C读写方式和BME680模块基本一致,只修改MPU6050初始化函数和倾角数据读写函数即可:+ ?) P9 z# S7 v! {$ g

9 n# V; `! t9 U% U
1 i0 P( v$ R* ?5 h) G
uint8_t MPU6050_Init()* b3 z6 ?4 j+ G7 I# B& x" x5 o5 }
{
5 ?1 j. T" j! m1 Z- y) W! U2 B9 a" ^        uint8_t data;
% |7 C% ?% x. x1 G0 H        uint8_t mpu9250_id;
% m, ]! p7 f5 Q* ?       
" V' d9 D6 ?% r7 x- h        data = 0x07;  F. T7 `0 g  L
        MPU_Write_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG , data);
. @4 V* D/ ?& V        data = MPU_Read_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG);
, r5 J) \% J' o  J: Z- P; h7 X) X        printf("MPU_SAMPLE_RATE_REG = 0x%x.\n" , data);        9 S& j! \9 G- w$ ]) M
        & {: u4 t8 U* t/ E: X# e7 C) A, I
        data = 0x01;
6 {6 B+ i6 L/ o* R+ w$ L7 E        MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG , data);4 y8 v3 a+ k; H+ y( \# @0 u
        data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG);) d1 I/ d0 H, W7 R* R* s
        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);        % `+ o* H" c1 v
       
/ w4 v* x  n9 j# ?        data = 0;
' k* ~" s$ v& d2 T5 L  P        MPU_Write_Reg(MPU6050_ADDR , MPU_CFG_REG , data);- _0 o' a% y/ G' A
        data = MPU_Read_Reg(MPU6050_ADDR , MPU_CFG_REG);
7 s$ }6 T8 `& ?$ I" S+ _        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);       
, p/ Y5 V$ o& p3 |# h* N: ^2 D* f       
& u* m! P) p' H        data = 0x18;' A* H1 x2 G, F7 e$ J
        MPU_Write_Reg(MPU6050_ADDR , MPU_GYRO_CFG_REG , data);
5 Y) s/ U& I# j# Z1 J4 v9 @        data = MPU_Read_Reg(MPU6050_ADDR , MPU_GYRO_CFG_REG);
1 o$ d9 s% @, f9 Z. c        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);        # F$ C  S" s+ b
5 i# B! ?1 s: E5 X. [6 B2 E, z8 v
8 f9 S' G; [, ^5 r, {5 c
       
4 y' H8 w7 z" h, N7 I. B        data = 0x01;& P/ f% J! J7 {0 J7 z. o
        MPU_Write_Reg(MPU6050_ADDR , MPU_INT_EN_REG , data);
% y, L+ |! H' T' U( s- {        data = MPU_Read_Reg(MPU6050_ADDR , MPU_INT_EN_REG);0 V6 n+ v8 @+ Y) l. {! r  \
        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);       
. v9 W3 V! L) H! R) O  r/ ?        * m3 `& V. z) W: A. i  [/ }5 i' Q
        data = 0;- \6 \5 Z4 Q  o
        MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG , data);, H" }6 o+ W- ?  O( Z
        data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG);0 U7 |/ {, i7 z; c/ V1 x; f9 _! m. j
        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);* C0 q5 L# y. o3 S" m, D
        8 H/ W9 _6 T( X8 c# h4 m
        return mpu9250_id;
$ C8 \5 x, G7 D' r1 T7 b}
& Z; [3 o" N/ \$ ?7 w" `7 H4 l$ k) D- B
0 U0 I6 |2 m+ x! d
初始化需要用作演示动画的img控件:4 T3 `' H: e5 K# [& L2 P" h
img_st_logo.jpg 3 \3 h: ^& [8 d
0 ^6 A, c5 B! r& X- D0 Y. Y# C
img_anim = lv_image_create(tile_3);
6 V1 {% }6 L4 E5 B1 Nlv_image_set_src(img_anim , &img_st_logo);
9 q* Q' U' i0 k. a0 w% y) y: Ylv_obj_align(img_anim , LV_ALIGN_TOP_LEFT , 100 , 100);2 m( ^1 l! Q9 {9 j, G' Q: j

; {1 W6 P: F" S: [' w4 I
4 ?2 F, i4 o5 W" F& L
读取MPU6050数据并修改图片位置:. R( A6 \  o; U2 o: m

- o! P* q( k5 G- w
8 u% y2 M. B& W2 k
static void my_timer1(lv_timer_t * timer)
' _) N( H  x* m  ?  e2 M{( J, X: B1 {5 C1 |
。。。+ d4 v. q- }  o$ h7 C; F3 i
        MPU_Read_Regs(MPU6050_ADDR , ACCEL_XOUT_H , mpu9250_read_data , 2);5 y  W) z; H% c$ B0 }- v
        acc_x = mpu9250_read_data[0] << 8 | mpu9250_read_data[1];3 z6 J' U# m: R% _
        MPU_Read_Regs(MPU6050_ADDR , ACCEL_YOUT_H , mpu9250_read_data + 2 , 2);
; r( S- f* M/ O: R  Z$ Z& _        acc_y = mpu9250_read_data[2] << 8 | mpu9250_read_data[3];
7 N% W1 w5 ^1 r: ^! m" C9 N        printf("acc_x = %d acc_y = %d %d.\n" , acc_x , acc_y);- \# b' g7 W" T0 N; F( e% P

/ Y1 B0 E0 m+ h+ i' ?& C! I! o1 ~
6 K+ t* {9 u0 C$ W! k
        acc_x = - acc_x;* [' D" Y: @$ I; j
       
5 G/ j( T  B! B+ _! q        acc_x_index =  acc_x / 100;
, u% A( k* v) O. \0 F        if(acc_x_index <= -80)
# k1 A& W: I0 z2 W5 y: n5 P, M                acc_x_index = -80;' h# F2 |" I; z: y6 K( P
        else if(acc_x_index >= 80)
5 Z  Q; K; `4 S4 g- v/ y5 [5 ]9 |                acc_x_index = 80;
" ?9 n/ v1 ?4 a# m: H6 k        / S5 ]9 ?* C8 R9 A9 |$ Q+ d; R' ^
        acc_y_index =  acc_y / 80;
5 D: a# `5 V4 m/ ~5 ^9 Y- g# w        if(acc_y_index <= -195)* W  |9 ~3 d" n" E0 S
                acc_y_index = -195;) M" `0 T! j+ Y
        else if(acc_y_index >= 195)
- n4 ~5 a/ v% J- W6 p% k# w: d                acc_y_index = 195;# q0 x. s7 }: E+ Y

2 V% [& O5 O) i7 {' V

  z- _6 M9 x1 Q  j        lv_obj_align(img_anim , LV_ALIGN_CENTER , acc_x_index , acc_y_index);( @8 B4 }0 \' ~! |% a
。。。
* T; J! O- J: N1 w# e7 ^! o  j}
- [0 G( t* q2 @: }% ~9 D  K" y1 T6 W1 K# _5 O- `
6 r1 e5 M3 Y# }. d: r  q! j
然后是添加img_btn在第四页(tile_4)并设置按下和释放的图像数据:
+ }4 a  I. K$ S img_st_poster1.JPG img_st_poster2.JPG ) n* R/ u+ ^/ L3 s+ E; Z: S; A
        imgbtn_st = lv_imagebutton_create(tile_4);) k; m6 [1 _/ [  v' l) t+ P' u
        lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_RELEASED , NULL , &img_st_poster1 , NULL);
/ t# p( g' [& L* D4 o8 d0 q        lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_PRESSED , NULL , &img_st_poster2 , NULL);. J/ d% P, B4 n8 ]6 A
  lv_obj_align(imgbtn_st , LV_ALIGN_TOP_LEFT , 0 , 0);
( w+ x) K5 p8 ]
- g9 ]  m; z7 N8 `4 a, M) c
% z+ M1 r9 ~8 E3 G9 `
演示效果:" c4 j& z7 F: y& r

; F. @6 i+ N* o) F7 d; H; B5 S7 |- N+ _! [6 {9 p* L, U
赞 收藏 评论0 发布时间:2026-7-27 02:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版