背景
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 }
8 y' b" G7 Q7 ]$ e6 N# \
 OLED显示MPU-6050位姿数据 在上一篇专栏建立工程()的基础上,添加OLED驱动函数到iCode文件中,步骤参考上一篇专栏。
2 g8 {" {$ V7 z& _/ y% g
9 g6 X2 O$ }4 X1 Z( w7 y" C0 W 在main函数中添加OLED初始化函数,如下所示: - /* USER CODE BEGIN 2 */1 P: t8 u: i1 R, f, p9 z
1 K' Q4 X; O/ j. A$ F) g% K- /* ************0.96寸OLED初始化设置************* */
w) b2 S5 H) g - char buffer[16];//float转换成char[]
+ j% g9 {$ \& A - OLED_Init();
$ h# X6 e f; `2 l - OLED_ON();
. [/ `& f, a/ t/ _& c - OLED_Clear();
/ g% D/ H6 ~# l2 } - OLED_ShowStr(25,0,"DIY",2);0 `# \4 b* c8 N( ~4 I
- OLED_ShowCN(49, 0, 0);//攻7 z$ @! i/ I8 i* @+ q
- OLED_ShowCN(65, 0, 1);//城" ^* b o2 a# P5 m
- OLED_ShowCN(81, 0, 2);//狮
& [& {7 O% _+ _4 v) ] - OLED_ShowStr(10,2,"Temp:",2);- ^- _2 a# `& k8 W* [
- OLED_ShowStr(10,4,"Pitch:",2);, Z& Y) z# h6 K- L) k2 a( Y0 R+ v
5 O. ~2 m% g* a D7 l- /* ************MPU-6050初始化设置************* */
0 C. G' }) q* t2 r O - while (MPU_Init()){ //如果初始化失败,继续初始�?9 R) H! Q: a$ J
- printf("MPU_Init_Fail...");
- E7 D6 C8 P) c) J7 D - }! O. V1 s6 b. b, d' ?; ?
- 2 g' h' ~# l- A6 c1 L- G
- /* USER CODE END 2 */
- D( V; Z, w0 T4 Y, }9 J
# h7 W; y1 }" c$ p$ e- /* Infinite loop */' c% G$ s* D& H5 ~
- /* USER CODE BEGIN WHILE */$ z: R; k) y6 x9 L, @' T) h0 C
- while (1)$ D O; z+ s r
- {
4 Y$ N+ c# x n5 f - /* ************获取和显示温度************* */$ e$ F$ D: ~0 M- N& J9 a
- float temp = MPU_Get_Temperature()/100.0;/ L% `/ Z' k" Y! N
- sprintf(buffer, "%.1f", temp);//float转换成char[]5 a. ]; T" D. B, }. f
- OLED_ShowStr(68,2,buffer,2);7 S1 N& ] c C4 ?
- ; ~' J, l- a* z; u8 _+ D
- /* **********获取和显示MPU-6050位姿*********** */
3 `! o1 i. x) Z& t$ }7 h u8 s' j - GetAngle();
% m+ v Y- O7 t; Z' u$ } - sprintf(buffer, "%.2f", Pitch);//float转换成char[]
- X! A9 O" W# C F* M8 c1 I+ `/ P - if (Pitch>=0){
5 ]) v4 |9 b, r5 S% M - OLED_ShowStr(60,4," ",2); W2 ?" d) d N+ y" K5 W. R
- OLED_ShowStr(100,4," ",2);' i8 p9 n9 h& T4 N0 N
- OLED_ShowStr(68,4,(unsigned char*)buffer,2);
. P" i8 _. i$ c4 T1 S - }3 Z( P0 Z5 T3 V$ z
- else
, X, s5 a6 r6 y( c - {
0 P( i; F. B9 x- _* {. T* G* N3 s - OLED_ShowStr(100,4," ",2);
2 O7 a. Z. g2 L( X4 O1 i* c: w - OLED_ShowStr(60,4,(unsigned char*)buffer,2);$ T" E; P7 {1 ?! M, f2 _
- }
( ? Q' x7 X3 x$ S. d - /* USER CODE END WHILE */
# r* _" ]5 H, e1 ~2 U- O0 p - , r$ ^$ ]0 p# u) d
- /* USER CODE BEGIN 3 */2 m. M& ^0 J4 c/ M
- }
复制代码
; ^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
$ _# q- c- m7 k/ J8 d) i9 I W 创建中文字库 打开字体取模软件PCtoLCD2002.exe,点击【模式】,选择字符模式。
6 f4 X( M( V+ \; q7 ]- p3 g
1 C5 S# Q, V ~ 点击【选项】进行如下设置,定义每个汉字的显示大小为16×16像素:
5 l# p: u0 ?) p) @$ \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! |; ?; X6 a1 C" |# a
 将复制的内容粘贴到驱动函数库中 FONT.h 中 unsigned char F16x16[]数组中: - unsigned char F16x16[] =. O1 N3 R- ^' \6 u! D4 ]
- {
( w, @2 {1 W; I) ~; T2 G. [9 N - 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
- /* (16 X 16 , 宋体 )*/
. f- ~! b4 c3 ?1 c) W3 j6 P% m - 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 - /* (16 X 16 , 宋体 )*/% i: Y: A) Y q1 M
- 0x22,0x14,0x08,0xF4,0x02,0xF8,0x00,0xFF,0x02,0xF2,0x12,0xFE,0x12,0xF2,0x02,0x00,
" K8 X- i- O$ e, S) P$ u - 0x44,0x82,0x41,0x3F,0x80,0x47,0x30,0x0F,0x00,0x1F,0x00,0xFF,0x10,0x1F,0x00,0x00,/*"狮",2*/
, J, x- @* O+ Y+ q9 B9 | - /* (16 X 16 , 宋体 )*/
8 h; U. b8 j6 O, N, h - };
复制代码
) H7 N# J H: y* B/ nOLED_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
" 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 |