风筝
发表于: 2020-12-18 14:09:07 | 显示全部楼层

在本篇文章中,我们将使用ATtiny85微控制器、MPU6050加速度计和陀螺仪以及OLED显示屏模块制作一个简单而便宜的计步器(Pedometer)。该计步器基于Arduino开发板,由3V纽扣电池供电,外出散步或慢跑时很容易携带。它还需要的组件很少,并且代码也相对简单。该项目中的程序使用MPU6050测量沿3轴(X、Y和Z)的加速度的大小。然后,它计算先前值和当前值之间的加速度大小之差。如果差异大于某个阈值(步行大于6的和奔跑大于10),则会相应地增加步数。然后将执行的全部步数显示在OLED显示屏上。


所需组件

要使用Arduino制作此计步器,您将需要以下组件。

●    Attiny85微控制器

●    MPU6050

●    OLED显示模块

●    2个按钮

●    5×10KΩ电阻


MPU6050传感器模块简介

MPU6050基于微机械系统(MEMS)技术。该传感器具有3轴加速度计、3轴陀螺仪和内置温度传感器。它可以用于测量诸如加速度、速度、方向、位移等参数。

MPU6050-Sensor-Module.jpg


MPU6050模块尺寸小、功耗低、重复率高、耐冲击性高、价格低。 MPU6050带有I2C总线和辅助I2C总线接口,可轻松连接如磁力计等其他传感器和微控制器。


Attiny85计步器电路图

使用Attiny85和MPU6050制作的计步器的原理图如下:

Attiny85-Step-Counter-Circuit-Diagram.png

上图显示了MPU6050、OLED显示屏与Attiny85相连的电路图。 MPU6050、OLED Display和Arduino之间的连接必须使用I2C协议实现。因此,ATtiny85的SCL引脚(PB2)分别连接到MPU6050和OLED显示屏的SCL引脚。同样,ATtiny85的SDA引脚(PB0)连接到MPU6050和OLED显示屏y的SDA引脚。两个按钮也连接到ATtiny85的PB3和PB4引脚。这些按钮可用于滚动文本或更改显示的文本。


ATtiny85计步器代码说明

文档末尾提供了完整的Arduino计步器代码。这里,我们解释了代码的一些重要部分。


代码使用了TinyWireM.hTinyOzOLED.h库。可以从Arduino IDE中的库管理器下载TinyWireM库,然后进行安装。因此,打开Arduino IDE并转到Sketch <Include Library <Manage Libraries。现在搜索TinyWireM.h并安装Adafruit的TinyWireM库。

TinyWireM-library-by-Adafruit.jpg


也可以从以下链接下载TinyOzOLED.h库


将库安装到Arduino IDE之后,首先在代码中包含所需的库文件。

  1. #include "TinyWireM.h"
  2. #include "TinyOzOLED.h"
复制代码

包含库之后,定义变量以存储加速度计读数。


setup()函数中,初始化wire库并通过电源管理寄存器复位传感器,然后初始化用于OLED显示屏的I2C通信。然后在接下来的几行代码中设置显示方向,以及输入加速度计和陀螺仪值的寄存器地址。

  1. TinyWireM.begin();
  2. OzOled.init();
  3. OzOled.clearDisplay();
  4. OzOled.setNormalDisplay();
  5. OzOled.sendCommand(0xA1);      
  6. OzOled.sendCommand(0xC8);
  7. TinyWireM.beginTransmission(mpu);
  8. TinyWireM.write(0x6B);
  9. TinyWireM.write(0b00000000);
  10. TinyWireM.write(0x1B);
复制代码

getAccel()函数中,首先读取加速度计数据。每个轴的数据存储在两个字节或寄存器中。为了读取所有内容,从第一个寄存器开始,并使用requiestFrom()函数,我们请求读取X、Y和Z轴的所有6个寄存器。然后,我们从每个寄存器读取数据,并且由于输出是两个补码,因此请将它们适当组合以获取完整的加速度计值。

  1. voidgetAccel() {
  2. TinyWireM.beginTransmission(mpu);
  3. TinyWireM.write(0x3B);
  4. TinyWireM.endTransmission();
  5. TinyWireM.requestFrom(mpu, 6);
  6. accelX = TinyWireM.read() << 8|TinyWireM.read();
  7. accelY = TinyWireM.read() << 8|TinyWireM.read();
  8. accelZ = TinyWireM.read() << 8|TinyWireM.read();
  9. }
复制代码

现在,在loop()函数中,首先读取X、Y和Z轴值,并在获取3轴值后,通过取X、Y和Z轴值的平方根来计算总加速度矢量。然后计算当前向量与先前向量之间的差,如果该差大于6,则增加步数。

  1. getAccel();
  2. vector = sqrt( (accelX * accelX) + (accelY * accelY) + (accelZ * accelZ) );
  3. totalvector = vector - vectorprevious;
  4. if (totalvector> 6){
  5.   Steps++;
  6. }
  7. OzOled.printString("Steps", 0, 4);
  8. OzOled.printNumber(Steps, 0, 8, 4);
  9. vectorprevious = vector;
  10. delay(600);
复制代码

让我们带着Arduino计步器散步

完成PCB的组装后,将ATtiny85连接到编程器板上,然后上传代码。现在,您可以手握着计步器,然后一步步走,这时它应该在OLED上显示步数。有时,当设备振动非常快或非常慢时,它就会增加步数值。

Step-Counter-Using-ATtiny85.jpg


以上就是使用ATtiny85和MPU6050自制计步器方法。如果您有任何疑问,请随时在本文下面进行回复。


代码

本文使用的完整代码: main.zip (898 Bytes, 下载次数: 22)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 32 | 回复: 41



手机版|

GMT+8, 2024-12-21 21:22 , Processed in 0.066284 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表