如今,健身手環(huán)越來越流行,它不僅可以計算腳步聲,還可以跟蹤您燃燒的卡路里、顯示心跳率、放映時間等等。這些物聯(lián)網(wǎng)設備與云同步,因此您可以在智能手機上輕松獲取所有身體活動的歷史記錄。
計步器是僅用于計算腳步的設備。因此,在本教程中,我們將使用 Arduino 和加速度計構建一個簡單且便宜的 DIY 計步器。該計步器將計算腳步的數(shù)量并將其顯示在16x2 LCD 模塊上。這款計步器可以與這款Arduino 智能手表集成。
所需組件
Arduino納米
ADXL 335 加速度計
16*2液晶
液晶 I2C 模塊
電池
ADXL335 加速度計
ADXL335 是一款完整的 3 軸模擬加速度計,它基于電容感應原理工作。它是一種小型、薄型、低功耗模塊,帶有多晶硅表面微加工傳感器和信號調理電路。ADXL335 加速度計可以測量靜態(tài)和動態(tài)加速度。在這個 Arduino 計步器項目中,ADXL335 加速度計將充當計步器傳感器。
加速度計是一種可以將任何方向的加速度轉換為其各自的可變電壓的設備。這是通過使用電容器來實現(xiàn)的(參見圖片),當 Accel 移動時,其內部的電容器也會根據(jù)運動發(fā)生變化(參見圖片),因為電容是變化的,因此也可以獲得可變電壓。
下面是加速度計的正面和背面圖像以及引腳說明-
加速度計引腳說明:
Vcc- 5 伏電源應連接到此引腳。
X-OUT- 該引腳在 x 方向提供模擬輸出
Y-OUT- 該引腳在 y 方向提供模擬輸出
Z-OUT- 此引腳在 z 方向提供模擬輸出
GND-地
ST- 此引腳用于設置傳感器的靈敏度
電路原理圖
下面給出了Arduino 加速度計步數(shù)計數(shù)器的電路圖。
在這個電路中,我們使用 ADXL335 Accelerometer 與 Arduino Nano 連接。加速度計的 X、Y 和 Z 引腳與 Arduino Nano 的模擬引腳(A1、A2 和 A3)連接。要將 16x2 LCD 模塊與 Arduino 連接,我們使用的是 I2C 模塊。I2C 模塊的 SCL 和 SDA 引腳分別連接到 Arduino Nano 的 A5 和 A4 引腳。下表給出了完整的連接:
我們首先在面包板上使用 Arduino設置構建了這個計步器
在成功測試后,我們通過將所有組件焊接到 Perfboard 上來在 Perfboard 上復制它,如下所示:
計步器如何工作?
計步器使用向前、垂直和側面的三個運動分量來計算一個人所采取的總步數(shù)。計步器系統(tǒng)使用加速度計來獲取這些值。加速度計在每個定義的編號后不斷更新 3 軸加速度的最大值和最小值。的樣品。這3個軸的平均值(Max + Min)/2,稱為動態(tài)閾值水平,該閾值用于決定是否邁步。
跑步時,計步器可以在任何方向,因此計步器使用加速度變化最大的軸計算步數(shù)。
現(xiàn)在讓我快速了解一下這個 Arduino 計步器的工作原理:
首先,計步器一通電就開始校準。
然后在void循環(huán)函數(shù)中,不斷的從X、Y、Z軸獲取數(shù)據(jù)。
之后,它計算從起點開始的總加速度矢量。
加速度矢量是 X、Y 和 Z 軸值的平方根 (x^2+y^2+z^2)。
然后將平均加速度值與閾值進行比較以計算步數(shù)。
如果加速度矢量超過閾值,則增加步數(shù);否則,它會丟棄無效的振動。
對 Arduino 計步器進行編程
本文檔末尾提供了完整的Arduino 計步器代碼。在這里,我們將解釋此代碼的一些重要片段。
像往常一樣,通過包含所有必需的庫來啟動代碼。ADXL335 加速度計不需要任何庫,因為它提供模擬輸出。
#include
之后,定義連接加速度計的 Arduino 引腳。
常量 int xpin = A1; 常量 int ypin = A2; 常量 int zpin = A3;
定義加速度計的閾值。該閾值將與加速度矢量進行比較以計算步數(shù)。
浮動閾值 = 6;
在void setup內部,函數(shù)會在系統(tǒng)通電時校準系統(tǒng)。
校準();
在void 循環(huán)函數(shù)內部,它將讀取 100 個樣本的 X、Y 和 Z 軸值。
for (int a = 0; a < 100; a++) { xaccl[a] = float(analogRead(xpin) - 345); 延遲(1); yaccl[a] = float(analogRead(ypin) - 346); 延遲(1); zaccl[a] = float(analogRead(zpin) - 416); 延遲(1);
獲得 3 軸值后,通過取 X、Y 和 Z 軸值的平方根來計算總加速度矢量。
totvect[a] = sqrt(((xaccl[a] - xavg) * (xaccl[a] - xavg)) + ((yaccl[a] - yavg) * (yaccl[a] - yavg)) + ((zval [a] - zavg) * (zval[a] - zavg)));
然后計算最大和最小加速度矢量值的平均值。
totave[a] = (totvect[a] + totvect[a - 1]) / 2 ;
現(xiàn)在將平均加速度與閾值進行比較。如果平均值大于閾值,則增加步數(shù)并提高標志。
if (totave[a] > 閾值 && flag == 0) { 步數(shù) = 步數(shù) + 1; 標志 = 1; }
如果平均值大于閾值但標志已升起,則什么也不做。
else if (totave[a] > threshold && flag == 1) { // 不計算 }
如果總平均值小于閾值并且標志被升起,則將標志放下。
if (totave[a] < 閾值 && flag == 1) { 標志 = 0; }
在串行監(jiān)視器和 LCD 上打印步數(shù)。
Serial.println(步驟); lcd.print("步驟:"); lcd.print(步驟);
測試 Arduino 計步器
準備好硬件和代碼后,將 Arduino 連接到筆記本電腦并上傳代碼。現(xiàn)在拿起你手中的計步器,開始一步一步地走,它應該會在 LCD 上顯示步數(shù)。有時,當計步器振動非??旎蚍浅B龝r,它會增加步數(shù)。
#include
LiquidCrystal_I2C lcd(0x27, 16, 2);
常量 int xpin = A1;
常量 int ypin = A2;
常量 int zpin = A3;
字節(jié) p[8] = {
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F
};
浮動xavg,yavg,zavg;
整數(shù)步,標志 = 0;
無效設置()
{
序列.開始(9600);
液晶顯示器開始();
液晶背光();
lcd.clear();
校準();
無效循環(huán)(
)
{
for (int w = 0; w < 16; w++) {
lcd.write(byte(0));
延遲(500);
}
int acc = 0;
浮動 totvect?= {0};
浮點數(shù)?= {0};
浮動 xaccl?= {0};
浮動 yaccl?= {0};
浮動 zaccl?= {0};
for (int a = 0; a < 100; a++)
{
xaccl[a] = float(analogRead(xpin) - 345);
延遲(1);
yaccl[a] = float(analogRead(ypin) - 346);
延遲(1);
zaccl[a] = float(analogRead(zpin) - 416);
延遲(1);
totvect[a] = sqrt(((xaccl[a] - xavg) * (xaccl[a] - xavg)) + ((yaccl[a] - yavg) * (yaccl[a] - yavg)) + ((zval [a] - zavg) * (zval[a] - zavg)));
totave[a] = (totvect[a] + totvect[a - 1]) / 2 ;
Serial.println("totave[a]");
Serial.println(totave[a]);
延遲(100);
if (totave[a] > threshold && flag == 0)
{
步數(shù) = 步數(shù) + 1;
標志 = 1;
}
else if (totave[a] > threshold && flag == 1)
{
// 不要計算
}
if (totave[a] < threshold && flag == 1)
{
flag = 0;
}
如果(步數(shù) < 0){
步數(shù) = 0;
}
Serial.println('\n');
Serial.print("步驟:");
Serial.println(步驟);
lcd.print(步驟);
延遲(1000);
lcd.clear();
}
延遲(1000);
}
void calibrate()
{
float sum = 0;
浮動總和1 = 0;
浮動總和2 = 0;
for (int i = 0; i < 100; i++) {
xval[i] = float(analogRead(xpin) - 345);
總和 = xval[i] + 總和;
}
延遲(100);
xavg =總和/ 100.0;
序列號.println(xavg);
for (int j = 0; j < 100; j++)
{
yval[j] = float(analogRead(ypin) - 346);
sum1 = yval[j] + sum1;
}
yavg = sum1 / 100.0;
Serial.println(yavg);
延遲(100);
for (int q = 0; q < 100; q++)
{
zval[q] = float(analogRead(zpin) - 416);
sum2 = zval[q] + sum2;
}
zavg = sum2 / 100.0;
延遲(100);
Serial.println(zavg);
}
-
加速度計
+關注
關注
6文章
700瀏覽量
45891 -
計步器
+關注
關注
4文章
76瀏覽量
19912 -
Arduino
+關注
關注
188文章
6468瀏覽量
186952
發(fā)布評論請先 登錄
相關推薦
評論