单片机
返回首页

使用ATtiny85和MPU6050制作一个便携式计步器

2022-07-25 来源:yiboard

在本篇文章中,我们将使用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模块尺寸小、功耗低、重复率高、耐冲击性高、价格低。 MPU6050带有I2C总线和辅助I2C总线接口,可轻松连接如磁力计等其他传感器和微控制器。


Attiny85计步器电路图

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

上图显示了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.h和TinyOzOLED.h库。可以从Arduino IDE中的库管理器下载TinyWireM库,然后进行安装。因此,打开Arduino IDE并转到Sketch


也可以下载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上显示步数。有时,当设备振动非常快或非常慢时,它就会增加步数值。

以上就是使用ATtiny85和MPU6050自制计步器方法。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 双极性电源

  • LM350 3安培可调稳压器

  • 30V/10A可调式台式直流稳压电源

  • DIY USB 5V 太阳能电源包

  • 铃声发生器

  • 电容式传感器

    相关电子头条文章