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

【福利三:逢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),按下和抬起分别显示两张图片。- y( _3 I7 B% A0 \
      MPU6050模块接在另一组模拟I2C接口上(PD11和PD12),与之前的BME680模块错开:
2 g, |' \  e. }* y3 E9 j4 h#define FAKE_I2C_SCL_PD11_GPIO_PORT            GPIOD6 i/ S; y2 ~  m2 V) d% z' K/ u' t* i
#define FAKE_I2C_SCL_PD11_GPIO_PIN             GPIO_PIN_11' U5 H# W9 h7 S: N, _
#define FAKE_I2C_SCL_PD11_GPIO_CLK_ENABLE      __HAL_RCC_GPIOD_CLK_ENABLE();
4 m! ~5 d1 M# U4 e8 a( F  ?/ V! O5 o+ r4 |+ s

$ J6 m5 u8 L0 \. H# R& ^: R#define FAKE_I2C_SCL_PD11_H                                                                                HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_SET);9 }) V  s. Q. L% ~
#define FAKE_I2C_SCL_PD11_L                                                                                HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_RESET);" e7 c  z6 B) `5 a' J4 B$ U" ~2 T8 W
: n2 n$ x) Z  _

7 Z8 W! G' }6 C8 b#define FAKE_I2C_SDA_PD12_GPIO_PORT            GPIOD
9 D. N& H, o) P' e5 i#define FAKE_I2C_SDA_PD12_GPIO_PIN             GPIO_PIN_12
9 T4 W! {! x8 ^2 B) B' v- b! ^5 T/ V#define FAKE_I2C_SDA_PD12_GPIO_CLK_ENABLE      __HAL_RCC_GPIOD_CLK_ENABLE();
1 f1 n# {" H) V) n. O  V" X" b; I$ \: N$ @
) |! [+ v) x' |, i0 K
#define FAKE_I2C_SDA_PD12_H                                                                                HAL_GPIO_WritePin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN , GPIO_PIN_SET);
: W% K% ^/ i) D) Q# @. Z2 G#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: L, a$ H1 B. w3 B% R
% h* N2 p  V  k1 K- [& N* L5 `: R
& V4 h2 p1 X2 ~( ?; t; Z
#define IIC_READ_SDA_PD12                                                                     HAL_GPIO_ReadPin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN)
' ^$ A0 s) }  h
9 A) a, s& K4 m  w2 ^

4 e, B( D) @3 {7 t具体模拟I2C读写方式和BME680模块基本一致,只修改MPU6050初始化函数和倾角数据读写函数即可:: d7 b0 e% `7 P6 Y: E" h8 B
1 j2 i7 t7 o) K7 W/ S

5 _) O- g( C" o. t4 m9 P- vuint8_t MPU6050_Init()
' o& l: Y2 ]  C3 W/ g, N{& O. q* L3 C" N% r0 {: {
        uint8_t data;5 f* S: K/ O. j2 @# ^3 ~" r& g3 Q" r
        uint8_t mpu9250_id;
$ y( h/ L" g" M- m        ; ]5 O0 d" J! N
        data = 0x07;& R1 i6 n5 f0 S. P
        MPU_Write_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG , data);
1 m! i6 D9 N7 h6 \" f7 x        data = MPU_Read_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG);9 A* n* E" g& ?
        printf("MPU_SAMPLE_RATE_REG = 0x%x.\n" , data);       
1 J0 O2 Q/ t- L8 _        1 m  d  {, f4 A6 F/ D
        data = 0x01;( |2 u( c) e5 h/ f7 Y3 R
        MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG , data);8 z+ B* b" V& r/ A" e2 h1 D6 Y
        data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG);
+ k3 `3 v: S) H; Y        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);        + }: f2 t) o4 ?# H1 O% w  r5 X2 \
       
2 B/ ^  R: p: g, ^! g6 o) @        data = 0;
2 H. E8 R3 [6 p% h$ r; g        MPU_Write_Reg(MPU6050_ADDR , MPU_CFG_REG , data);
% p4 _, E6 }0 t. w: V: x+ w        data = MPU_Read_Reg(MPU6050_ADDR , MPU_CFG_REG);: D. P* X0 f- x8 b; [
        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);       
/ _  l! J. _0 _9 K( @: x! }: |       
% Q8 `9 u1 U* Q5 K# ~/ i- h        data = 0x18;
3 i6 n+ s5 l- J, `        MPU_Write_Reg(MPU6050_ADDR , MPU_GYRO_CFG_REG , data);5 S' h  E, g6 ]' b
        data = MPU_Read_Reg(MPU6050_ADDR , MPU_GYRO_CFG_REG);2 ^" y( X9 U- \) v0 _4 A3 x# h5 x( y
        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);       
+ L4 D3 e3 c& u( Z. n) I, x* o; g% h4 c0 U) v
6 L; z8 k1 R( b( p
       
2 l3 G7 z: }2 J8 u; B7 `        data = 0x01;* I7 |. E5 ^/ f, U$ H
        MPU_Write_Reg(MPU6050_ADDR , MPU_INT_EN_REG , data);% m- t% L3 Q( m; K
        data = MPU_Read_Reg(MPU6050_ADDR , MPU_INT_EN_REG);+ `8 ^& h) ^% m- z8 E0 a. t
        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);       
& U. C: ^: e+ M2 W+ G& J5 ~       
3 n# |4 ^5 L: W" e  E9 _" a        data = 0;
; w4 Q/ N' m- B- u0 |; u        MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG , data);
& r5 W5 F& w0 O+ @& a        data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG);: V/ `9 s! x# O, }/ O- j- e" \5 @! Y# u7 V
        printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);+ d: \! o/ E; Q% D
        5 S1 r$ H' @' w, W3 t
        return mpu9250_id;
2 q' z9 b) G5 ~- Y}+ ~. g8 ^- l; @' q

2 l; l0 N; `7 ]

# X3 c2 j3 D4 i3 p1 Y$ u初始化需要用作演示动画的img控件:( H; _, X. Z3 G  [. B$ P, h6 K. _
img_st_logo.jpg 5 A4 K+ I. u; e( X1 E; g

7 r; o# \& Q  O' y8 Ximg_anim = lv_image_create(tile_3);
9 ]3 A; a* j1 L% u" z$ ]& q. Nlv_image_set_src(img_anim , &img_st_logo);
  ^7 q. \* ^* `" v+ }9 Nlv_obj_align(img_anim , LV_ALIGN_TOP_LEFT , 100 , 100);
$ Z& b. m: U  Y% |% n# D
6 A4 {; i" U! B& `

; B1 q3 R1 D/ V/ l$ N( w2 A读取MPU6050数据并修改图片位置:
0 s, }- w* K+ Q$ H+ _! f8 `0 q* m3 j7 y. @
- w8 O' ?% {0 a/ h$ s! M9 J
static void my_timer1(lv_timer_t * timer)7 w$ @) }+ U1 h+ H0 {8 t$ o+ \
{6 a9 w3 {7 \) E, G& ]+ A6 c0 a
。。。( U' @* h! K0 ~2 }3 U8 u" Z* \
        MPU_Read_Regs(MPU6050_ADDR , ACCEL_XOUT_H , mpu9250_read_data , 2);
3 [: V# w* ]! m3 ?" z        acc_x = mpu9250_read_data[0] << 8 | mpu9250_read_data[1];, p+ N$ S/ I0 j& p9 q2 \5 P, v
        MPU_Read_Regs(MPU6050_ADDR , ACCEL_YOUT_H , mpu9250_read_data + 2 , 2);
/ a, E& g0 z3 X5 i        acc_y = mpu9250_read_data[2] << 8 | mpu9250_read_data[3];3 B! p, a# V  ~$ M# y
        printf("acc_x = %d acc_y = %d %d.\n" , acc_x , acc_y);. Y, ^0 L2 Y- E; a# A9 F; Z

8 P6 C/ T: u+ m# t! i
5 ?$ i4 ~% e) N7 W* T; u2 k
        acc_x = - acc_x;
: I! `2 {0 s+ @" Y- _        9 [5 y% O4 F% R# r. }9 q  \
        acc_x_index =  acc_x / 100;8 M" [' M. O* u, ^8 X
        if(acc_x_index <= -80)
5 S4 Q" g: {  \- A                acc_x_index = -80;
1 x* I( I8 [* c3 K. H: P2 U        else if(acc_x_index >= 80)( M: }6 i$ a; }/ w2 c8 p
                acc_x_index = 80;
  W/ |, K# y7 H, [2 R  c        0 G6 B- Z- ~- c( A$ d9 C
        acc_y_index =  acc_y / 80;) q* @) I! A- z* d: h1 K) }2 }" G
        if(acc_y_index <= -195)7 I6 ~  N' i" K
                acc_y_index = -195;
9 ~" P- P5 P! E! A9 p6 c        else if(acc_y_index >= 195)
/ w0 E4 w8 d$ S                acc_y_index = 195;
4 m7 X+ Y! r, f+ G8 n6 S, q4 z! v% M
( g- m. ~, g, |9 i, `. z

  i5 s: G, P. N' @        lv_obj_align(img_anim , LV_ALIGN_CENTER , acc_x_index , acc_y_index);
$ D. t' J/ u" o( r( J" `。。。
+ p  ~/ v  ^8 y2 d/ L. g9 l}3 A, T, S9 V- W* O
, i: \5 l1 f: Z

; T$ @/ U# W% D, ^  M3 m9 W( h然后是添加img_btn在第四页(tile_4)并设置按下和释放的图像数据:( n! O8 r- D9 U
img_st_poster1.JPG img_st_poster2.JPG
* u# ~) E! p# Z* ]9 i4 b        imgbtn_st = lv_imagebutton_create(tile_4);
5 j7 K; L" O4 q8 a0 m* |( P7 C        lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_RELEASED , NULL , &img_st_poster1 , NULL);* g- h  s, D! e- I  n! ~# X! ?
        lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_PRESSED , NULL , &img_st_poster2 , NULL);
8 H) S9 \  G# x  lv_obj_align(imgbtn_st , LV_ALIGN_TOP_LEFT , 0 , 0);/ d0 O& D: o, i7 L& T3 U" |9 d4 m

6 Z' ~! H; H1 ^; u$ y3 y
! D8 H+ q/ U4 q* x, J* d9 h4 q
演示效果:) u6 c  S/ U' x

0 K; m$ M9 @# y6 v
2 D0 N& c0 C6 s8 r& v9 {
收藏 评论0 发布时间:2026-7-27 02:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版