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

基于STM32CubeIDE+MPU6051做的动量轮平衡自行车(二)

[复制链接]
STMCU小助手 发布时间:2023-2-9 17:21
背景
2 P& Z0 p1 X% ^7 @* e- O
        本文用于记录平衡自行车的制作过程,及制作中遇到的问题;总体方案如下:采用采用STM32F103C8T6作为主控单元、MPU-6050作为位姿采集单元、0.96寸OLED显示位姿、无刷电机带动动量轮调节小车平衡、1S锂电池配合5V和12V升压模块作为电源、蓝牙模块用于和微信小程序进行无线通讯和PID调试、舵机用于控制行驶方向和支撑小车。

% X! E2 E$ [1 ~; qOLED规格及参数简介
我用的是四针脚IIC通讯的OLED,0.96寸,像素是128*64的,如下所示:
3 R9 m7 h! l5 }
QK78WJ[]K9IB[Q5E_UM`~JE.png
8 y' b" G7 Q7 ]$ e6 N# \
OLED显示MPU-6050位姿数据
    在上一篇专栏建立工程()的基础上,添加OLED驱动函数到iCode文件中,步骤参考上一篇专栏。

2 g8 {" {$ V7 z& _/ y% g
K4139BKYAAV6I4WV9892SNG.png

9 g6 X2 O$ }4 X1 Z( w7 y" C0 W
在main函数中添加OLED初始化函数,如下所示:
  1. /* USER CODE BEGIN 2 */1 P: t8 u: i1 R, f, p9 z

  2. 1 K' Q4 X; O/ j. A$ F) g% K
  3. /* ************0.96寸OLED初始化设置************* */
      w) b2 S5 H) g
  4. char buffer[16];//float转换成char[]
    + j% g9 {$ \& A
  5. OLED_Init();
    $ h# X6 e  f; `2 l
  6. OLED_ON();
    . [/ `& f, a/ t/ _& c
  7. OLED_Clear();
    / g% D/ H6 ~# l2 }
  8. OLED_ShowStr(25,0,"DIY",2);0 `# \4 b* c8 N( ~4 I
  9. OLED_ShowCN(49, 0, 0);//攻7 z$ @! i/ I8 i* @+ q
  10. OLED_ShowCN(65, 0, 1);//城" ^* b  o2 a# P5 m
  11. OLED_ShowCN(81, 0, 2);//狮
    & [& {7 O% _+ _4 v) ]
  12. OLED_ShowStr(10,2,"Temp:",2);- ^- _2 a# `& k8 W* [
  13. OLED_ShowStr(10,4,"Pitch:",2);, Z& Y) z# h6 K- L) k2 a( Y0 R+ v

  14. 5 O. ~2 m% g* a  D7 l
  15. /* ************MPU-6050初始化设置************* */
    0 C. G' }) q* t2 r  O
  16. while (MPU_Init()){                //如果初始化失败,继续初始�?9 R) H! Q: a$ J
  17.           printf("MPU_Init_Fail...");
    - E7 D6 C8 P) c) J7 D
  18. }! O. V1 s6 b. b, d' ?; ?
  19. 2 g' h' ~# l- A6 c1 L- G
  20. /* USER CODE END 2 */
    - D( V; Z, w0 T4 Y, }9 J

  21. # h7 W; y1 }" c$ p$ e
  22. /* Infinite loop */' c% G$ s* D& H5 ~
  23. /* USER CODE BEGIN WHILE */$ z: R; k) y6 x9 L, @' T) h0 C
  24. while (1)$ D  O; z+ s  r
  25. {
    4 Y$ N+ c# x  n5 f
  26.           /* ************获取和显示温度************* */$ e$ F$ D: ~0 M- N& J9 a
  27.           float temp = MPU_Get_Temperature()/100.0;/ L% `/ Z' k" Y! N
  28.           sprintf(buffer, "%.1f", temp);//float转换成char[]5 a. ]; T" D. B, }. f
  29.           OLED_ShowStr(68,2,buffer,2);7 S1 N& ]  c  C4 ?
  30. ; ~' J, l- a* z; u8 _+ D
  31.           /* **********获取和显示MPU-6050位姿*********** */
    3 `! o1 i. x) Z& t$ }7 h  u8 s' j
  32.           GetAngle();
    % m+ v  Y- O7 t; Z' u$ }
  33.           sprintf(buffer, "%.2f", Pitch);//float转换成char[]
    - X! A9 O" W# C  F* M8 c1 I+ `/ P
  34.           if (Pitch>=0){
    5 ]) v4 |9 b, r5 S% M
  35.                   OLED_ShowStr(60,4," ",2);  W2 ?" d) d  N+ y" K5 W. R
  36.                   OLED_ShowStr(100,4," ",2);' i8 p9 n9 h& T4 N0 N
  37.                   OLED_ShowStr(68,4,(unsigned char*)buffer,2);
    . P" i8 _. i$ c4 T1 S
  38.           }3 Z( P0 Z5 T3 V$ z
  39.           else
    , X, s5 a6 r6 y( c
  40.           {
    0 P( i; F. B9 x- _* {. T* G* N3 s
  41.                   OLED_ShowStr(100,4," ",2);
    2 O7 a. Z. g2 L( X4 O1 i* c: w
  42.                   OLED_ShowStr(60,4,(unsigned char*)buffer,2);$ T" E; P7 {1 ?! M, f2 _
  43.           }
    ( ?  Q' x7 X3 x$ S. d
  44.    /* USER CODE END WHILE */
    # r* _" ]5 H, e1 ~2 U- O0 p
  45. , r$ ^$ ]0 p# u) d
  46.    /* USER CODE BEGIN 3 */2 m. M& ^0 J4 c/ M
  47. }
复制代码

; ^7 t/ Q* T* Q+ z. f! r6 |

- r  L: {- f+ F* Y9 [% \" \, K
' w5 t. U: W/ W  F! E8 u3 {/* USER CODE BEGIN 2 */ /* ************0.96寸OLED初始化设置************* */ char buffer[16;//float转换成char[] OLED_Init(); OLED_ON(); OLED_Clear(); OLED_ShowStr(25,0,"DIY",2); OLED_ShowCN(49, 0, 0);//攻 OLED_ShowCN(65, 0, 1);//城 OLED_ShowCN(81, 0, 2);//狮 OLED_ShowStr(10,2,"Temp:",2); OLED_ShowStr(10,4,"Pitch:",2); /* ************MPU-6050初始化设置************* */ while (MPU_Init()){                //如果初始化失败,继续初始�?          printf("MPU_Init_Fail..."); } /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) {          /* ************获取和显示温度************* */          float temp = MPU_Get_Temperature()/100.0;          sprintf(buffer, "%.1f", temp);//float转换成char[]          OLED_ShowStr(68,2,buffer,2);          /* **********获取和显示MPU-6050位姿*********** */          GetAngle();          sprintf(buffer, "%.2f", Pitch);//float转换成char[]          if (Pitch>=0){                  OLED_ShowStr(60,4," ",2);                  OLED_ShowStr(100,4," ",2);                  OLED_ShowStr(68,4,(unsigned char*)buffer,2);          }          else          {                  OLED_ShowStr(100,4," ",2);                  OLED_ShowStr(60,4,(unsigned char*)buffer,2);          }   /* USER CODE END WHILE */   /* USER CODE BEGIN 3 */ }

: |2 Y( N% q1 x. B% m% x
显示效果如下:
; O" d, m) f2 U+ S6 C2 x
YWD9W3{EJ_7}J]3HE27S`6K.png

$ _# q- c- m7 k/ J8 d) i9 I  W
创建中文字库
        打开字体取模软件PCtoLCD2002.exe,点击【模式】,选择字符模式。

6 f4 X( M( V+ \; q7 ]- p3 g
SCRF~R`%RS3SETOY[IQO]3Q.png

1 C5 S# Q, V  ~
        点击【选项】进行如下设置,定义每个汉字的显示大小为16×16像素:

5 l# p: u0 ?) p) @
ESJU@J@OB)}R]2[N[LO6P68.png
$ \3 K. ^1 _) F. z; s5 u/ t6 }
        输入要取模的文字,点击【生成文字】。3 \* E- M9 O+ f4 B( N& v- y) k

) R: n! J* J+ g1 r' \' J! |
575T~%L31Y`O]@1XI_8J4$W.png
; ?; X6 a1 C" |# a
        将复制的内容粘贴到驱动函数库中 FONT.h 中 unsigned char F16x16[]数组中:
  1. unsigned char F16x16[] =. O1 N3 R- ^' \6 u! D4 ]
  2. {
    ( w, @2 {1 W; I) ~; T2 G. [9 N
  3. 0x08,0x08,0x08,0xF8,0x08,0x08,0x48,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00,                0x10,0x30,0x10,0x1F,0x08,0x08,0x88,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00,/*"攻",0*/& I2 o" i2 p) r, t. q4 c
  4. /* (16 X 16 , 宋体 )*/
    . f- ~! b4 c3 ?1 c) W3 j6 P% m
  5. 0x20,0x20,0xFF,0x20,0x20,0xF8,0x88,0x88,0x88,0x08,0xFF,0x08,0x09,0xCA,0x08,0x00,                        0x10,0x30,0x1F,0x88,0x68,0x1F,0x10,0x20,0x9F,0x40,0x27,0x18,0x26,0x41,0xF0,0x00,/*"城",1*/
    2 y* L5 `  T2 W9 V$ B
  6. /* (16 X 16 , 宋体 )*/% i: Y: A) Y  q1 M
  7. 0x22,0x14,0x08,0xF4,0x02,0xF8,0x00,0xFF,0x02,0xF2,0x12,0xFE,0x12,0xF2,0x02,0x00,
    " K8 X- i- O$ e, S) P$ u
  8. 0x44,0x82,0x41,0x3F,0x80,0x47,0x30,0x0F,0x00,0x1F,0x00,0xFF,0x10,0x1F,0x00,0x00,/*"狮",2*/
    , J, x- @* O+ Y+ q9 B9 |
  9. /* (16 X 16 , 宋体 )*/
    8 h; U. b8 j6 O, N, h
  10. };
复制代码

) H7 N# J  H: y* B/ n
OLED_ShowStr(25,0," DIY",2);
OLED_ShowCN(41,0,0);//攻
OLED_ShowCN(57,0,1);//城
OLED_ShowCN(73,0,2);//狮

/ M4 D9 P5 D; p
显示效果如下:
+ K- k* h8 g$ |1 G
QRXZ(HIB@)N1(@(`M~~CNC2.png
" W  I* a* L" c9 q9 z$ [6 L% ]

9 z# I6 ]# |6 M' i8 o* }作者:DIY攻城狮 & w% C+ j, ^& m( M( x

3 u9 m/ i& U' u1 o$ n% p
收藏 评论0 发布时间:2023-2-9 17:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

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