아두이노 코딩 배우기 : IOT 장치 만들기 발자국계산기 Arduino kit
피트니스 밴드는 요즘 매우 인기를 얻고 있는데, 발소리뿐만 아니라 칼로리 소모량, 심장 박동수, 쇼타임 등을 추적합니다. 또한 이러한 IoT 기기는 클라우드와 동기화되므로 스마트폰에서 모든 물리적 활동의 기록을 쉽게 확인할 수 있습니다. 또한 중요한 데이터를 ThingSpeak에 전송하여 어디에서나 모니터링할 수 있는 IoT 기반 환자 모니터링 시스템을 구축했습니다.
보행계는 발소리만 세던 장치이다. 이 튜토리얼에서는 Arduino와 가속도계를 사용하여 쉽고 저렴한 DIY 페도계를 만들 것입니다. 이 페달은 발걸음 수를 세어 16x2 LCD 모듈에 표시합니다. 이 페도계는 이 Arduino 스마트 워치와 통합될 수 있습니다.
필요한 구성 요소
아르뒤노나노
ADXL 335 가속도계
16*2 LCD
LCD I2C 모듈
건전지
ADXL 335 가속도계입니다.
ADXL335는 완전한 3축 아날로그 가속도계이며, 정전식 감지 원리에 따라 작동합니다. 이 모듈은 폴리실리콘 표면 마이크로 가공 센서와 신호 조절 회로가 있는 작고 얇은 저전력 모듈입니다. ADXL335 가속도계는 정적 및 동적 가속도를 측정할 수 있습니다. 이 Arduino Pedometer 프로젝트에서는 ADXL335 가속도계가 페달 센서로 작동합니다.
가속도계는 가속도를 임의의 방향으로 각 가변 전압으로 변환할 수 있는 장치입니다. 이 작업은 캐패시터(Refer image)를 사용하여 수행됩니다. 액셀에 있는 캐패시터가 이동함에 따라 캐패시턴스가 변화하므로 가변 전압도 얻을 수 있습니다.
아래에는 핀 설명과 함께 전면 및 후면 가속도계 이미지가 나와 있습니다.
핀 가속도계에 대한 설명입니다.
Vcc- 5V 공급 장치가 이 핀에 연결되어야 합니다.
X-이 핀은 아날로그 출력을 x 방향으로 제공합니다.
Y-OUT- 이 핀은 아날로그 출력을 y 방향으로 제공합니다.
Z-OUT- 이 핀은 z 방향으로 아날로그 출력을 제공합니다.
GND-접지입니다.
ST- 이 핀은 센서의 감도를 설정하는 데 사용됩니다.
우리는 가속도계 ADXL335를 이용하여 Gesture 제어 로봇, 지진 감지 장치 경보, Ping Pong Game 등을 포함한 많은 프로젝트를 구축하고 있습니다.
회로 다이어그램.
Arduino 가속도계 스텝 카운터에 대한 회로 다이어그램이 아래에 나와 있습니다.
이 회로에서는 ADXL335 가속도계로 Arduino Nano와 인터페이스하고 있으며, 가속도계의 X, Y, Z 핀은 Arduino Nano의 Analog 핀(A1, A2 & A3)으로 연결되어 있습니다. 16x2 LCD 모듈을 Arduino와 인터페이스하기 위해 I2C 모듈을 사용하고 있습니다. I2C 모듈의 SCL 및 SDA 핀은 각각 Arduino Nano의 A5 및 A4 핀에 연결됩니다. 전체 연결은 아래 표에 나와 있습니다.
테스트에 성공한 후 아래와 같이 Perfboard의 모든 구성 요소를 납땜하여 Perfboard에서 복제했습니다.
페달 답량은 어떻게 됩니까?
혈도계는 전진, 수직 및 측면의 세 가지 운동 구성 요소를 사용하여 사람이 취한 총 스텝 수를 계산합니다. 페도계 시스템은 가속도계를 사용하여 이러한 값을 얻습니다. 가속도계는 정의된 샘플 번호마다 3축 가속도의 최대값과 최소값을 지속적으로 업데이트합니다. 이러한 3축(최대 + 최소)/2의 평균값을 동적 임계값 레벨이라고 하며, 이 임계값을 사용하여 스텝의 실행 여부를 결정합니다.
주행 중에는 페달계가 어느 방향으로든 있을 수 있으므로 가속도가 가장 큰 축을 사용하여 단계를 계산합니다.
이제 이 Arduino 페도계의 작업에 대해 간략하게 설명하겠습니다.
먼저, 페도계에 전원이 공급되는 즉시 보정이 시작됩니다.
그런 다음 Void 루프 기능에서 X, Y, Z축으로부터 데이터를 지속적으로 가져옵니다.
그런 다음 시작점에서 총 가속 벡터를 계산합니다.
가속 벡터는 X, Y, Z축 값의 제곱근(x^2+y^2+z^2)입니다.
그런 다음 평균 가속도 값을 임계값과 비교하여 스텝 번호를 계산합니다.
가속 벡터가 임계값과 교차하는 경우 스텝 카운트가 증가합니다. 그렇지 않으면 잘못된 진동이 사라집니다.
Arduino 스텝 카운터를 프로그래밍합니다.
전체 Arduino 단계 카운터 코드는 이 문서 끝에 제공됩니다. 여기서는 이 코드의 몇 가지 중요한 요약에 대해 설명합니다.
일반적으로 필요한 라이브러리를 모두 포함하여 코드를 시작합니다. ADXL335 가속도계는 아날로그 출력을 제공하므로 라이브러리가 필요하지 않습니다.
#include <LiquidCrystal_I2C.h>
그런 다음 가속도계가 연결되는 Arduino 핀을 정의합니다.
const int xpin = A1;
const int ypin = A2;
const int zpin = A3;
가속도계의 임계값을 정의합니다. 이 임계값을 가속 벡터와 비교하여 스텝 수를 계산합니다.
float threshold = 6;
Void 설정 내에서 기능은 전원이 공급될 때 시스템을 보정합니다.
calibrate();
Void 루프 기능 내에서 샘플 100개에 대한 X, Y 및 Z 축 값을 읽습니다.
for (int a = 0; a < 100; a++)
{
xaccl[a] = float(analogRead(xpin) - 345);
delay(1);
yaccl[a] = float(analogRead(ypin) - 346);
delay(1);
zaccl[a] = float(analogRead(zpin) - 416);
delay(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 ;
이제 평균 가속도를 임계값과 비교합니다. 평균이 임계값보다 크면 스텝 수를 늘리고 플래그를 올립니다.
if (totave[a] > threshold && flag == 0)
{
steps = steps + 1;
flag = 1; }
평균이 임계값보다 크지만 플래그가 상승하는 경우 아무것도 수행하지 않습니다.
else if (totave[a] > threshold && flag == 1)
{
// Don’t Count
}
총 평균이 임계값 미만이고 플래그가 상승하는 경우 플래그를 아래로 둡니다.
if (totave[a] < threshold && flag == 1)
{
flag = 0;
}
시리얼 모니터와 LCD의 단계 수를 인쇄합니다.
Serial.println(steps );
lcd.print("Steps: ");
lcd.print(steps);
Arduino 페달계를 테스트합니다.
하드웨어와 코드가 준비되면 Arduino를 노트북에 연결하고 코드를 업로드합니다. 이제 페도계 설정을 손에 들고 단계별로 걷기 시작합니다. 그러면 LCD에 단계 수가 표시됩니다. 때로는 매우 빠르게 또는 매우 느리게 진동을 할 때 스텝 수를 증가시킵니다.
ADXL335 페도계 Arduino에 대한 전체 작동 비디오 및 코드가 아래에 나와 있습니다.
Code
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int xpin = A1;
const int ypin = A2;
const int zpin = A3;
byte p[8] = {
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F
};
float threshold = 6;
float xval[100] = {0};
float yval[100] = {0};
float zval[100] = {0};
float xavg, yavg, zavg;
int steps, flag = 0;
void setup()
{
Serial.begin(9600);
lcd.begin();
lcd.backlight();
lcd.clear();
calibrate();
}
void loop()
{
for (int w = 0; w < 16; w++) {
lcd.write(byte(0));
delay(500);
}
int acc = 0;
float totvect[100] = {0};
float totave[100] = {0};
float xaccl[100] = {0};
float yaccl[100] = {0};
float zaccl[100] = {0};
for (int a = 0; a < 100; a++)
{
xaccl[a] = float(analogRead(xpin) - 345);
delay(1);
yaccl[a] = float(analogRead(ypin) - 346);
delay(1);
zaccl[a] = float(analogRead(zpin) - 416);
delay(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]);
delay(100);
if (totave[a] > threshold && flag == 0)
{
steps = steps + 1;
flag = 1;
}
else if (totave[a] > threshold && flag == 1)
{
// Don't Count
}
if (totave[a] < threshold && flag == 1)
{
flag = 0;
}
if (steps < 0) {
steps = 0;
}
Serial.println('\n');
Serial.print("steps: ");
Serial.println(steps);
lcd.print("Steps: ");
lcd.print(steps);
delay(1000);
lcd.clear();
}
delay(1000);
}
void calibrate()
{
float sum = 0;
float sum1 = 0;
float sum2 = 0;
for (int i = 0; i < 100; i++) {
xval[i] = float(analogRead(xpin) - 345);
sum = xval[i] + sum;
}
delay(100);
xavg = sum / 100.0;
Serial.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);
delay(100);
for (int q = 0; q < 100; q++)
{
zval[q] = float(analogRead(zpin) - 416);
sum2 = zval[q] + sum2;
}
zavg = sum2 / 100.0;
delay(100);
Serial.println(zavg);
}
'아두이노 코딩' 카테고리의 다른 글
아두이노 코딩 배우기 : Arduino Rain Sensor를 사용한 비 감지 시스템 키트 (0) | 2020.02.22 |
---|---|
아두이노 코딩 코드 : Arduino IDE를 사용한 ESP32 듀얼 코어 프로그래밍 소스 (0) | 2020.02.22 |
아두이노 코딩 : TRIAC을 사용한 AC 팬 속도 제어 (0) | 2020.02.22 |
댓글