Wonseok Kwak

update alpha 1.2

1 -#include <CoDrone.h> // 코드론 라이브러리
2 1
2 +#include <CoDrone.h> // 코드론 라이브러리
3 +#include <math.h>
3 #define ShockLed 12 // 충격 상태 확인을 위한 LED 핀번호 4 #define ShockLed 12 // 충격 상태 확인을 위한 LED 핀번호
4 #define buzzer 7 // 피에조 버저 핀번호 5 #define buzzer 7 // 피에조 버저 핀번호
5 #define LeftVib 27 // 왼쪽 진동자 핀번호 6 #define LeftVib 27 // 왼쪽 진동자 핀번호
6 #define RightVib 28 // 오른쪽 진동자 핀번호 7 #define RightVib 28 // 오른쪽 진동자 핀번호
7 8
8 // 변수 및 상수부 9 // 변수 및 상수부
9 -long ac_x, ac_y, ac_z, gy_x, gy_y, gy_z; //acc, gyro data (acc, gyro 계산 수식) 10 +long int ac_x, ac_y, ac_z;
10 -double angle = 0, deg; // angle, deg data (각도계산)
11 -double dgy_x; // double type acc data
12 long int normal_x, normal_y, normal_z, deltha_x[3], deltha_y[3], deltha_z[3], deltha; // 노말라이즈(정규화 데이터), 가속도 변화량 표시 11 long int normal_x, normal_y, normal_z, deltha_x[3], deltha_y[3], deltha_z[3], deltha; // 노말라이즈(정규화 데이터), 가속도 변화량 표시
13 -long int angle_value;
14 const int mapping_value = 5000; 12 const int mapping_value = 5000;
15 const int Emergency_value = 10000; // 충격상태로 판단하는 값 13 const int Emergency_value = 10000; // 충격상태로 판단하는 값
16 const int Emergency_angle = 25; // 충격상태로 판단하는 각도(기울기) 14 const int Emergency_angle = 25; // 충격상태로 판단하는 각도(기울기)
...@@ -30,12 +28,11 @@ void value_init() ...@@ -30,12 +28,11 @@ void value_init()
30 normal_y = 0; 28 normal_y = 0;
31 normal_z = 0; 29 normal_z = 0;
32 30
33 - for(int i = 0; i < 3; i++){ 31 + for(int i = 0; i < 3; i++)
32 + {
34 deltha_x[i] = 0; 33 deltha_x[i] = 0;
35 deltha_y[i] = 0; 34 deltha_y[i] = 0;
36 deltha_z[i] = 0; 35 deltha_z[i] = 0;
37 - angle = 0;
38 - angle_value = 0;
39 } 36 }
40 } 37 }
41 // 가속도 연산 함수 38 // 가속도 연산 함수
...@@ -44,39 +41,25 @@ void accel_calculate() ...@@ -44,39 +41,25 @@ void accel_calculate()
44 ac_x = 0; 41 ac_x = 0;
45 ac_y = 0; 42 ac_y = 0;
46 ac_z = 0; 43 ac_z = 0;
47 - normal_x = 0;
48 - normal_y = 0;
49 - normal_z = 0;
50 44
51 - /* MPU 6050 전용
52 - Wire.beginTransmission(mpu_add) ; // 번지수 찾기
53 - Wire.write(0x3B) ; // 가속도 데이터 보내달라고 컨트롤 신호 보내기
54 - Wire.endTransmission(false) ; // 기달리고,
55 - Wire.requestFrom(mpu_add, 6, true) ; // 데이터를 받아 처리
56 - */
57 -
58 // Data SHIFT From CoDrone Accelerometer 45 // Data SHIFT From CoDrone Accelerometer
59 - ac_x = CoDrone.ImuAccX / 2; 46 + acceldata accel;
60 - ac_y = CoDrone.ImuAccY / 2; 47 + accel = CoDrone.getAccelerometer();
61 - ac_z = CoDrone.ImuAccZ / 2; 48 + ac_x = accel.x;
62 - 49 + ac_y = accel.y;
63 - //맵핑화 시킨 것 - 즉 10000으로 맵핑시킴 50 + ac_z = accel.z;
64 - normal_x = map(int(ac_x), -16384, 16384, -5000, mapping_value); 51 +
65 - normal_y = map(int(ac_y), -16384, 16384, -5000, mapping_value); 52 + // 맵핑화 시킨 것 - 즉 10000으로 맵핑시킴
66 - normal_z = map(int(ac_z), -16384, 16384, -5000, mapping_value); 53 + normal_x = map(int(ac_x), -32768, 32767, -5000, 5000);
54 + normal_y = map(int(ac_y), -32768, 32767, -5000, 5000);
55 + normal_z = map(int(ac_z), -32768, 32767, -5000, 5000);
67 56
68 - //normal_z = map(int(ac_z), -16384, 16384, -1000, mapping_value);
69 -
70 - //각도계산 deg -> 각도
71 - deg = atan2(ac_x, ac_z) * 180 / PI ; //rad to deg
72 - dgy_x = gy_y / 131. ; //16-bit data to 250 deg/sec
73 - angle = (0.95 * (angle + (dgy_x * 0.001))) + (0.05 * deg) ;
74 } 57 }
75 58
76 // 충격상태함수 59 // 충격상태함수
77 void Emergency_state_() 60 void Emergency_state_()
78 { 61 {
79 - digitalWrite(ShockLed , HIGH); // 릴레이핀을 True값으로 바꿔 13번 핀의 LED를 ON시킨다. 62 + digitalWrite(ShockLed , HIGH); // 릴레이핀을 True값으로 바꿔 12번 핀의 LED를 ON시킨다.
80 } 63 }
81 64
82 // 충격 감지함수 65 // 충격 감지함수
...@@ -85,12 +68,12 @@ void Shock_Sensing() ...@@ -85,12 +68,12 @@ void Shock_Sensing()
85 State_Parameter = false; // 충격상태 초기화 68 State_Parameter = false; // 충격상태 초기화
86 shock_level = 0; // 충격정도 초기화 69 shock_level = 0; // 충격정도 초기화
87 //첫번째 센싱 70 //첫번째 센싱
88 - for (int i=0; i < sum_count; i++){ 71 + for (int i=0; i < sum_count; i++)
72 + {
89 accel_calculate(); 73 accel_calculate();
90 deltha_x[1] = deltha_x[1]+(normal_x); 74 deltha_x[1] = deltha_x[1]+(normal_x);
91 deltha_y[1] = deltha_y[1]+(normal_y); 75 deltha_y[1] = deltha_y[1]+(normal_y);
92 deltha_z[1] = deltha_z[1]+(normal_z); 76 deltha_z[1] = deltha_z[1]+(normal_z);
93 - angle_value = angle_value + angle;
94 } 77 }
95 deltha_x[1] = int(deltha_x[1]/sum_count); 78 deltha_x[1] = int(deltha_x[1]/sum_count);
96 deltha_y[1] = int(deltha_y[1]/sum_count); 79 deltha_y[1] = int(deltha_y[1]/sum_count);
...@@ -103,7 +86,6 @@ void Shock_Sensing() ...@@ -103,7 +86,6 @@ void Shock_Sensing()
103 deltha_x[2] = deltha_x[2]+(normal_x); 86 deltha_x[2] = deltha_x[2]+(normal_x);
104 deltha_y[2] = deltha_y[2]+(normal_y); 87 deltha_y[2] = deltha_y[2]+(normal_y);
105 deltha_z[2] = deltha_z[2]+(normal_z); 88 deltha_z[2] = deltha_z[2]+(normal_z);
106 - angle_value = angle_value + angle;
107 } 89 }
108 deltha_x[2] = int(deltha_x[2]/sum_count); 90 deltha_x[2] = int(deltha_x[2]/sum_count);
109 deltha_y[2] = int(deltha_y[2]/sum_count); 91 deltha_y[2] = int(deltha_y[2]/sum_count);
...@@ -114,35 +96,12 @@ void Shock_Sensing() ...@@ -114,35 +96,12 @@ void Shock_Sensing()
114 deltha_y[0] = abs(deltha_y[1]-deltha_y[2]); 96 deltha_y[0] = abs(deltha_y[1]-deltha_y[2]);
115 deltha_z[0] = abs(deltha_z[1]-deltha_z[2]); 97 deltha_z[0] = abs(deltha_z[1]-deltha_z[2]);
116 deltha = deltha_x[0] + deltha_y[0] + deltha_z[0]; 98 deltha = deltha_x[0] + deltha_y[0] + deltha_z[0];
117 - angle_value = abs(int(angle_value/(sum_count))); 99 +
118 -
119 // deltha : 가속도 변화량 100 // deltha : 가속도 변화량
120 - // angle_value : 각도 값(현재 각도 값)
121 if (deltha > Emergency_value){ 101 if (deltha > Emergency_value){
122 State_Parameter=true; 102 State_Parameter=true;
123 } 103 }
124 shock_level = deltha; // 추후 수정 예정 104 shock_level = deltha; // 추후 수정 예정
125 -
126 - /*
127 - if(deltha > 하){
128 - shock_level = 'a';
129 - if(deltha > 중){
130 - shock_level = 'b';
131 - if(deltha > 상){
132 - shock_level = 'c';
133 - }
134 - }
135 - }
136 -
137 - */
138 -
139 -
140 - /*if (angle_value > Emergency_angle){
141 - State_Parameter=true;
142 - }
143 - if ((deltha > Emergency_value2)&&(angle_value > Emergency_angle2)){
144 - State_Parameter=true;
145 - }*/
146 105
147 // 충격상태체크 106 // 충격상태체크
148 if( State_Parameter == true ) 107 if( State_Parameter == true )
...@@ -158,10 +117,8 @@ void Shock_Sensing() ...@@ -158,10 +117,8 @@ void Shock_Sensing()
158 // 진동함수 117 // 진동함수
159 void vibrate() 118 void vibrate()
160 { 119 {
161 - // if 충격값이 왼쪽인지 오른쪽인지 대소비교로 판단 120 + analogWrite(LeftVib ,map(int(deltha), -15000, 15000, 0, 255));
162 - // 판단되면 그위치에 나눈것만큼의 진동을 나눠서 크기별로 부여 121 + analogWrite(RightVib ,map(int(deltha), -15000, 15000, 0, 255));
163 - // analogWrite();
164 -
165 } 122 }
166 123
167 124
...@@ -200,17 +157,7 @@ void loop() ...@@ -200,17 +157,7 @@ void loop()
200 } 157 }
201 158
202 Shock_Sensing(); 159 Shock_Sensing();
203 - if(State_Parameter == true) 160 + vibrate();
204 - {
205 - shock_sum += deltha;
206 - //currentMillis = millis();
207 - }
208 -
209 - if(State_Parameter == false && shock_sum != 0)
210 - {
211 - //bluetooth.write(char_maker(shock_sum)); // 블루투스로 충격정도 전송 (shock_maker 라는 char 리턴함수를 통해 진동강도 전송)
212 - shock_sum = 0; // 충격의 지속이 끝났으니 원래값인 0으로 초기화
213 - }
214 161
215 162
216 if(PAIRING == true) // 연결(페어링)이 성공한 경우에만 실행 163 if(PAIRING == true) // 연결(페어링)이 성공한 경우에만 실행
......