|
总的来说,STM32F429i这块板子上的外围器件并不算多,主要的就是VGA TFT,另外,还有就是USB、SDRAM、按键以及今天要体验的陀螺仪。5 E. {; N* M @ MEMS是微机电系统的意思,这个东西可以说给我们的生活带来了很大的变化,就比如最常见的手机,现今的手机都离不开它,没有哪个智能手机敢不用它。 今天要介绍的陀螺仪在手机中也有他的身影,在手机中它一般用于拍照防抖功能,短时间的离线导航等。0 {: X9 R' l* R6 { 陀螺仪的作用可大了,小到你的手机,再到飞机、舰船,再到导弹、火箭,这些东西没一个离得开它,不对,有一个能不用,就是你的手机,除了你的手机没一个离得开它。, p9 r, x( H$ m0 ^4 {3 N5 ~; O 板子上的陀螺仪芯片型号为L3GD20,搜了一下,这是ST自家的一款传感器。这款传感器有spi和i2c两种接口可用,我们看看它在板子上的电路图不难发现,他的两种接口我们都能用,但显然ST的意图是让我们用SPI接口。
看看他的庐山真面目:
在官方的例程里,有个简单的小例子,我们来看看:其名字为“MEMS_Example”。% K. r& o% t5 U0 O6 @ 关于这款芯片的手册在ST的官网及其他许多网站都有,大家可自行下载。4 M$ X% k! }8 {
先大概浏览了一下程序,发现例程里边貌似只有两个轴的,先编译下载验证一下:1 [6 b9 b/ O3 s: I7 g9 {+ U 果然,程序少一个轴向的。 程序大概意思就是,把板子往前滚,则显示向前的箭头;往后滚,则显示向下的箭头;往左滚,则显示向左的箭头;往右滚,则显示向右的箭头。# T: a D' r7 S 如下图:
然而板子在板子所在的平面旋转却无反应,所用陀螺仪分明是三轴的,可是程序却只用了其中的两轴,略微有点缺憾吧,于是我把第三轴方向加了上去,及Z轴。 修改后,在原基础上,当板子绕板子顺时针和逆时针分别旋转时,用屏幕显示出来。如下图:
! ]. Z" {1 P% {* t 下面是部分代码: if(Xval>Yval)! M E, C. t1 j9 @% N! D2 J. |, l {' A4 j0 E+ w9 U- H- J# p if(Xval>Zval) max_of_xyz = 1;4 C/ ^8 i. d, p7 q# u else/ u3 {/ Z9 @. A4 ]( O8 [ max_of_xyz = 3;) L b; f! S- {: U* L# e& l } else { if(Yval>Zval): [5 s. m" q2 h/ `. ?# a max_of_xyz = 2;4 Q, l/ g' N: k ?9 t else max_of_xyz = 3; }" ?* Y$ M9 M+ x; ^2 |, S //max_of_xyz = 3; if(max_of_xyz==3)+ y, }2 n N4 E9 G* p$ W" K {: Z/ X% E% C# s6 ?9 w if ((int16_t)Buffer[2] > 40) {7 w: X4 u/ T0 d$ `3 \9 ^ LCD_Clear(LCD_COLOR_WHITE);$ [+ H; u- b5 X! B: j1 H y8 Y LCD_SetTextColor(LCD_COLOR_BLUE);4 f% h0 @3 p1 q$ k( o //LCD_DrawFullRect(100, 40, 40, 120); //LCD_FillTriangle(50, 190, 120, 160, 160, 310); j: f W2 e& N+ M5 o: m2 O4 G LCD_DrawCircle(120, 160, 90);' D( x/ P4 i" \2 F% n LCD_DrawCircle(120, 160, 91); LCD_DrawCircle(120, 160, 92); LCD_FillTriangle(120,105,105, 251, 241, 261); Delay(50); }$ {6 M z& F3 w6 o if ((int16_t)Buffer[2] < -40) {6 e( c# a u4 c4 s4 u LCD_Clear(LCD_COLOR_WHITE);+ K: C2 O. J. G9 }! z) Z o LCD_SetTextColor(LCD_COLOR_BLUE);2 {( w: w# o2 d+ E7 } //LCD_DrawFullRect(100, 40, 40, 120);8 E- W6 L1 S# D, o# T* O. W //LCD_FillTriangle(50, 190, 120, 160, 160, 310); LCD_DrawCircle(120, 160, 90);. D2 q* [% q" J8 A u LCD_DrawCircle(120, 160, 91); LCD_DrawCircle(120, 160, 92); LCD_FillTriangle(120,135,135, 251, 241, 261);; U" J9 J; m% d; h8 h1 { Delay(50); } } if (max_of_xyz == 1) {* z4 L$ D6 o5 H' H if ((int16_t)Buffer[0] > 40)$ s# m" x/ I. T; T, _ { /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE);" M6 U) U0 ]3 j LCD_SetTextColor(LCD_COLOR_MAGENTA);5 T$ d2 J1 } E# j/ M! E LCD_DrawFullRect(100, 40, 40, 120); LCD_FillTriangle(50, 190, 120, 160, 160, 310); V& Q" W8 {8 G% B, d: ^ Delay(50);9 ?8 L. j2 K' _8 k } if ((int16_t)Buffer[0] < -40) {& y' V7 g) u$ z /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); LCD_SetTextColor(LCD_COLOR_RED); LCD_DrawFullRect(100, 160, 40, 120); LCD_FillTriangle(50, 190, 120, 160, 160, 10); Delay(50);3 Q6 Z M" s9 F- Z+ u& ?$ w }! J1 f8 I# T3 j' G' p# W$ _- W } if(max_of_xyz == 2) q) W+ x' R [" C& f# J$ L { if ((int16_t)Buffer[1] < -40) q$ o) v: i+ q { /* Clear the LCD */. N+ ^" D- R) w1 L- u) D" n LCD_Clear(LCD_COLOR_WHITE);7 d j3 \8 D- g+ ?2 M9 S. t LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DrawFullRect(120, 140, 100, 40);/ g0 O. ~& p) X LCD_FillTriangle(120, 120, 5, 60, 260, 160); 5 }8 J3 A$ I0 T$ X Delay(50);# @+ w! D: R; {- @( n2 H( W5 L }/ ?2 g. r% b& p0 O! u1 j7 i if ((int16_t)Buffer[1] > 40)* s% F; X3 Z5 o, a { $ h; T$ M( R# y* F /* Clear the LCD */ ) S5 ^# X4 M# m1 E2 p) F3 d+ |( _ LCD_Clear(LCD_COLOR_WHITE); LCD_SetTextColor(LCD_COLOR_BLUE); LCD_DrawFullRect(20, 140, 100, 40);8 {2 E! G4 C# S: I! m- b ^ LCD_FillTriangle(120, 120, 235, 60, 260, 160);' i3 \& R) Z F6 R" T Delay(50);+ F! o4 S! q( Y6 I } ; e o3 {& ]6 w, O/ I5 | } : `& }0 C( j0 n( t! N: L5 z9 Z }& w' c J4 |. i: c7 R5 u 为了尽量减少改动,没有switch case ,不知道用了效率会不会更好。 当然,陀螺仪的作用可远不止如此。 |
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版