Toggle navigation
Toggle navigation
This project
Loading...
Sign in
2020-2-capstone-design1
/
JSH_project
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
FriedBob
2020-12-11 00:41:34 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
aa18f83cb6e457543ce70b576e73ecfc4f65d600
aa18f83c
1 parent
0684af5a
shock_detect code updated-누적 충격량을 계산하게 수정
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
105 additions
and
31 deletions
Project_source/temp/shock_detect.ino
Project_source/temp/shock_detect/shock_detect.ino
Project_source/temp/shock_detect.ino
View file @
aa18f83
// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
// 전처리부
#include <SoftwareSerial.h>
#include "I2Cdev.h"
#include "MPU6050.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
#define mpu_add 0x68
#define Pin_Relay 13
#define BT_RXD 7
#define BT_TXD 6
MPU6050
mpu
;
...
...
@@ -17,15 +22,17 @@ double angle = 0, deg; // angle, deg data (각도계산)
double
dgy_x
;
// double type acc data
long
int
normal_x
,
normal_y
,
normal_z
,
deltha_x
[
3
],
deltha_y
[
3
],
deltha_z
[
3
],
deltha
;
// 노말라이즈(정규화 데이터), 가속도 변화량 표시
long
int
angle_value
;
const
int
mapping_value
=
1
000
;
const
int
Emergency_value
=
1
3
00
;
// 충격상태로 판단하는 값
const
int
mapping_value
=
5
000
;
const
int
Emergency_value
=
1
00
00
;
// 충격상태로 판단하는 값
const
int
Emergency_angle
=
25
;
// 충격상태로 판단하는 각도(기울기)
const
int
Emergency_value2
=
1200
;
// 충격상태로 판단하는 값
const
int
Emergency_angle2
=
9
;
// 충격상태로 판단하는 각도(기울기)
boolean
State_Parameter
=
false
;
// 충격상태
const
long
int
sum_count
=
2
;
// 평균 내는 횟수
const
long
interval
=
1000
;
// 충격을 감지후 다음 충격을 감지하는 최소 간극 시간 (ms)
boolean
State_Parameter
=
false
;
// 충격상태 판단
unsigned
short
int
shock_level
;
// 충격정도 상,중,하 char로 받을 생각
const
long
int
sum_count
=
4
;
// 평균 내는 횟수
const
long
interval
=
50
;
// 충격을 감지후 다음 충격을 감지하는 최소 간극 시간 (ms)
unsigned
long
previousMillis
=
0
;
// 최초 시작시간
long
shock_sum
=
0
;
// 누적 충격값
/* 사용자지정함수부
...
...
@@ -74,9 +81,11 @@ void accel_calculate() {
ac_z
=
Wire
.
read
()
<<
8
|
Wire
.
read
()
;
//맵핑화 시킨 것 - 즉 10000으로 맵핑시킴
normal_x
=
map
(
int
(
ac_x
),
-
16384
,
16384
,
0
,
mapping_value
);
normal_y
=
map
(
int
(
ac_y
),
-
16384
,
16384
,
0
,
mapping_value
);
normal_z
=
map
(
int
(
ac_z
),
-
16384
,
16384
,
0
,
mapping_value
);
normal_x
=
map
(
int
(
ac_x
),
-
16384
,
16384
,
-
5000
,
mapping_value
);
normal_y
=
map
(
int
(
ac_y
),
-
16384
,
16384
,
-
5000
,
mapping_value
);
normal_z
=
map
(
int
(
ac_z
),
-
16384
,
16384
,
-
5000
,
mapping_value
);
//normal_z = map(int(ac_z), -16384, 16384, -1000, mapping_value);
//각도계산 deg -> 각도
deg
=
atan2
(
ac_x
,
ac_z
)
*
180
/
PI
;
//rad to deg
...
...
@@ -87,12 +96,22 @@ void accel_calculate() {
// 충격상태함수
void
Emergency_state_
(){
digitalWrite
(
Pin_Relay
,
HIGH
);
// 릴레이핀을 True값으로 바꿔 13번 핀의 LED를 ON시킨다.
Serial
.
println
(
"SHOCK!!!!!!!!!!!!!!!!!"
);
// Serial 모니터로 확인
Serial
.
print
(
"SHOCK level : "
);
Serial
.
println
(
shock_level
);
// Serial 모니터로 확인
Serial
.
print
(
" x: "
);
Serial
.
print
(
deltha_x
[
0
]);
Serial
.
print
(
" y: "
);
Serial
.
print
(
deltha_y
[
0
]);
Serial
.
print
(
" z: "
);
Serial
.
println
(
deltha_z
[
0
]);
/*Serial.print(" deltha_1 : "); Serial.print(deltha_x[1]);
Serial.print(" deltha_2 : "); Serial.println(deltha_x[2]);*/
}
void
Shock_Sensing
(){
State_Parameter
=
false
;
// 충격상태 초기화
shock_level
=
0
;
// 충격정도 초기화
//첫번째 센싱
for
(
int
i
=
0
;
i
<
sum_count
;
i
++
){
accel_calculate
();
...
...
@@ -129,6 +148,23 @@ void Shock_Sensing(){
if
(
deltha
>
Emergency_value
){
State_Parameter
=
true
;
}
shock_level
=
deltha
;
// 추후 수정 예정
/*
if(deltha > 하){
shock_level = 'a';
if(deltha > 중){
shock_level = 'b';
if(deltha > 상){
shock_level = 'c';
}
}
}
*/
/*if (angle_value > Emergency_angle){
State_Parameter=true;
}
...
...
@@ -145,26 +181,43 @@ void Shock_Sensing(){
}
}
// BLUETOOTH TRANSACTION
SoftwareSerial
bluetooth
(
BT_RXD
,
BT_TXD
);
// 블루투스 모듈
/*main 함수부*/
void
setup
()
{
Serial
.
begin
(
9600
);
// 시리얼 속도 설정
Serial
.
println
(
"Initializing I2C devices..."
);
bluetooth
.
begin
(
9600
);
// 블루투스 속도 설정
Serial
.
println
(
"Initializing Bluetooth devices..."
);
mpu6050_init
();
// 가속도 센서 초기화
Serial
.
println
(
"Testing device connections..."
);
Serial
.
println
(
mpu
.
testConnection
()
?
"MPU6050 connection successful"
:
"MPU6050 connection failed"
);
pinMode
(
Pin_Relay
,
OUTPUT
);
// 핀모드사용, led로 육안확인 가능하게끔
digitalWrite
(
Pin_Relay
,
LOW
);
// HIGH - LED on, LOW - LED off (DEFAULT : OFF)
}
void
loop
()
{
value_init
();
//가속도-각도 관련 초기값 선언
unsigned
long
currentMillis
=
millis
();
if
(
currentMillis
-
previousMillis
>=
interval
){
//---------dump--------------------do not erase yet-
//unsigned long currentMillis = 0;
//previousMillis = currentMillis;
//if(currentMillis - previousMillis >= interval){
//if(currentMillis - previousMillis >= interval){
//--------------------------------------------------
Shock_Sensing
();
if
(
State_Parameter
==
true
){
previousMillis
=
currentMillis
;
}
}
}
if
(
State_Parameter
==
true
){
shock_sum
+=
deltha
;
//currentMillis = millis();
}
if
(
State_Parameter
==
false
&&
shock_sum
!=
0
){
//bluetooth.write(char_maker(shock_sum)); // 블루투스로 충격정도 전송 (shock_maker 라는 char 리턴함수를 통해 진동강도 전송)
Serial
.
print
(
"누적 충격값 : "
);
Serial
.
println
(
shock_sum
);
// 충격 누적값 전송
shock_sum
=
0
;
// 충격의 지속이 끝났으니 원래값인 0으로 초기화
}
}
\ No newline at end of file
...
...
Project_source/temp/shock_detect/shock_detect.ino
View file @
aa18f83
...
...
@@ -12,7 +12,7 @@
#define mpu_add 0x68
#define Pin_Relay 13
#define BT_RXD 7
#define BT_TXD
8
#define BT_TXD
6
MPU6050
mpu
;
...
...
@@ -22,16 +22,17 @@ double angle = 0, deg; // angle, deg data (각도계산)
double
dgy_x
;
// double type acc data
long
int
normal_x
,
normal_y
,
normal_z
,
deltha_x
[
3
],
deltha_y
[
3
],
deltha_z
[
3
],
deltha
;
// 노말라이즈(정규화 데이터), 가속도 변화량 표시
long
int
angle_value
;
const
int
mapping_value
=
1
000
;
const
int
Emergency_value
=
1
3
00
;
// 충격상태로 판단하는 값
const
int
mapping_value
=
5
000
;
const
int
Emergency_value
=
1
00
00
;
// 충격상태로 판단하는 값
const
int
Emergency_angle
=
25
;
// 충격상태로 판단하는 각도(기울기)
const
int
Emergency_value2
=
1200
;
// 충격상태로 판단하는 값
const
int
Emergency_angle2
=
9
;
// 충격상태로 판단하는 각도(기울기)
boolean
State_Parameter
=
false
;
// 충격상태 판단
unsigned
short
int
shock_level
;
// 충격정도 상,중,하 char로 받을 생각
const
long
int
sum_count
=
2
;
// 평균 내는 횟수
const
long
interval
=
50
0
;
// 충격을 감지후 다음 충격을 감지하는 최소 간극 시간 (ms)
const
long
int
sum_count
=
4
;
// 평균 내는 횟수
const
long
interval
=
50
;
// 충격을 감지후 다음 충격을 감지하는 최소 간극 시간 (ms)
unsigned
long
previousMillis
=
0
;
// 최초 시작시간
long
shock_sum
=
0
;
// 누적 충격값
/* 사용자지정함수부
...
...
@@ -80,9 +81,11 @@ void accel_calculate() {
ac_z
=
Wire
.
read
()
<<
8
|
Wire
.
read
()
;
//맵핑화 시킨 것 - 즉 10000으로 맵핑시킴
normal_x
=
map
(
int
(
ac_x
),
-
16384
,
16384
,
0
,
mapping_value
);
normal_y
=
map
(
int
(
ac_y
),
-
16384
,
16384
,
0
,
mapping_value
);
normal_z
=
map
(
int
(
ac_z
),
-
16384
,
16384
,
0
,
mapping_value
);
normal_x
=
map
(
int
(
ac_x
),
-
16384
,
16384
,
-
5000
,
mapping_value
);
normal_y
=
map
(
int
(
ac_y
),
-
16384
,
16384
,
-
5000
,
mapping_value
);
normal_z
=
map
(
int
(
ac_z
),
-
16384
,
16384
,
-
5000
,
mapping_value
);
//normal_z = map(int(ac_z), -16384, 16384, -1000, mapping_value);
//각도계산 deg -> 각도
deg
=
atan2
(
ac_x
,
ac_z
)
*
180
/
PI
;
//rad to deg
...
...
@@ -95,6 +98,15 @@ void Emergency_state_(){
digitalWrite
(
Pin_Relay
,
HIGH
);
// 릴레이핀을 True값으로 바꿔 13번 핀의 LED를 ON시킨다.
Serial
.
print
(
"SHOCK level : "
);
Serial
.
println
(
shock_level
);
// Serial 모니터로 확인
Serial
.
print
(
" x: "
);
Serial
.
print
(
deltha_x
[
0
]);
Serial
.
print
(
" y: "
);
Serial
.
print
(
deltha_y
[
0
]);
Serial
.
print
(
" z: "
);
Serial
.
println
(
deltha_z
[
0
]);
/*Serial.print(" deltha_1 : "); Serial.print(deltha_x[1]);
Serial.print(" deltha_2 : "); Serial.println(deltha_x[2]);*/
}
void
Shock_Sensing
(){
...
...
@@ -190,13 +202,22 @@ void setup() {
void
loop
()
{
value_init
();
//가속도-각도 관련 초기값 선언
unsigned
long
currentMillis
=
millis
();
//---------dump--------------------do not erase yet-
//unsigned long currentMillis = 0;
//previousMillis = currentMillis;
//if(currentMillis - previousMillis >= interval){
//if(currentMillis - previousMillis >= interval){
//--------------------------------------------------
if
(
currentMillis
-
previousMillis
>=
interval
){
Shock_Sensing
();
if
(
State_Parameter
==
true
){
bluetooth
.
write
(
shock_level
);
// 블루투스로 충격정도 전송
previousMillis
=
currentMillis
;
}
}
shock_sum
+=
deltha
;
//currentMillis = millis();
}
if
(
State_Parameter
==
false
&&
shock_sum
!=
0
){
//bluetooth.write(char_maker(shock_sum)); // 블루투스로 충격정도 전송 (shock_maker 라는 char 리턴함수를 통해 진동강도 전송)
Serial
.
print
(
"누적 충격값 : "
);
Serial
.
println
(
shock_sum
);
// 충격 누적값 전송
shock_sum
=
0
;
// 충격의 지속이 끝났으니 원래값인 0으로 초기화
}
}
...
...
Please
register
or
login
to post a comment