使用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之后,首先在代码中包含所需的库文件。 #include 'TinyWireM.h' #include 'TinyOzOLED.h' 复制代码 包含库之后,定义变量以存储加速度计读数。 在setup()函数中,初始化wire库并通过电源管理寄存器复位传感器,然后初始化用于OLED显示屏的I2C通信。然后在接下来的几行代码中设置显示方向,以及输入加速度计和陀螺仪值的寄存器地址。 TinyWireM.begin(); OzOled.init(); OzOled.clearDisplay(); OzOled.setNormalDisplay(); OzOled.sendCommand(0xA1); OzOled.sendCommand(0xC8); TinyWireM.beginTransmission(mpu); TinyWireM.write(0x6B); TinyWireM.write(0b00000000); TinyWireM.write(0x1B); 在getAccel()函数中,首先读取加速度计数据。每个轴的数据存储在两个字节或寄存器中。为了读取所有内容,从第一个寄存器开始,并使用requiestFrom()函数,我们请求读取X、Y和Z轴的所有6个寄存器。然后,我们从每个寄存器读取数据,并且由于输出是两个补码,因此请将它们适当组合以获取完整的加速度计值。 voidgetAccel() { TinyWireM.beginTransmission(mpu); TinyWireM.write(0x3B); TinyWireM.endTransmission(); TinyWireM.requestFrom(mpu, 6); accelX = TinyWireM.read() << 8|TinyWireM.read(); accelY = TinyWireM.read() << 8|TinyWireM.read(); accelZ = TinyWireM.read() << 8|TinyWireM.read(); } 现在,在loop()函数中,首先读取X、Y和Z轴值,并在获取3轴值后,通过取X、Y和Z轴值的平方根来计算总加速度矢量。然后计算当前向量与先前向量之间的差,如果该差大于6,则增加步数。 getAccel(); vector = sqrt( (accelX * accelX) + (accelY * accelY) + (accelZ * accelZ) ); totalvector = vector - vectorprevious; if (totalvector> 6){ Steps++; } OzOled.printString('Steps', 0, 4); OzOled.printNumber(Steps, 0, 8, 4); vectorprevious = vector; delay(600); 让我们带着Arduino计步器散步 完成PCB的组装后,将ATtiny85连接到编程器板上,然后上传代码。现在,您可以手握着计步器,然后一步步走,这时它应该在OLED上显示步数。有时,当设备振动非常快或非常慢时,它就会增加步数值。 以上就是使用ATtiny85和MPU6050自制计步器方法。

- 【回帖赢50元京东卡】模拟电子与储能解决方案大讨论(4月新活动)
- 这蜂鸣片电路要怎么改才能将声音加到最大? 升压电感的参数怎么求得?
- 现在还有哪些电子产品没被 AI 占领?
- 🤯15块钱捡的游戏手柄拆完我傻了:成本居然100+?这成色居然是垃圾!
- 【产品众创计划】诚邀社区开发者共创下一代开发板
- 分享一本经典的电子教程,Electronics Principles and Applications, 9th Edition
- 外围电阻计算问题
- ARM嵌入式学习资源分享——《ARM嵌入式体系结构与接口技术》.pdf
- PCB十年精髓,嘉立创《PCB设计与制造》应用教材完整版!
- 树莓派4新增3GB内存版本




