BASIC4MCU | 질문게시판 | 아두이노 블루투스센서 질문입니다.
페이지 정보
작성자 mnbg02 작성일2020-09-11 17:38 조회6,596회 댓글1건본문
근전도 센서로 값을 계산하는 코드를 짰는데요
블루투스센서를 사용안하면 Serial.println(cal_rms(sensor_data)); 값이 시리얼 모니터에 잘 나오는데
블루투스센서를 사용하니까 계산이 안되고 0이라고 뜹니다ㅠㅠ 코드가 잘못된걸까요..?
#define EMG_PIN A0
#include <SoftwareSerial.h>
SoftwareSerial bts(3, 2); // 블루투스 센서
float RED_VALUE = 0; // RED값이 되는 변수
float GREEN_VALUE = 0; // GREEN값이 되는 변수
float BLUE_VALUE = 0; // BLUE값이 되는 변수
float mvic = 0;
float sensor_data = 0; // 근전도 센서값을 받을 변수
int num = 0;
void setup() {
Serial.begin(9600);
bts.begin(9600);
pinMode(EMG_PIN, INPUT);
}
void loop() {
if(bts.available()){
num = bts.read();
if(num > 0){
read_mode(num);
sensor_data = analogRead(EMG_PIN);
cal_rms(sensor_data);
Serial.println(cal_rms(sensor_data));
color_bts();
delay(1000);
}
}
}
void read_mode(int num){ // App에서 선택한 옵션의 값을 5가지로 나눔
if(num==1){ // 회전근개파열 - 어깨 으쓱 (부착위치: 견갑근)
mvic = 400.0; // 매트랩으로 계산한 MVIC값
RED_VALUE = 92.4; // +5%의 오차 범위 88+(88*0.5)
GREEN_VALUE = 88; // 정상 %MVIC 값
BLUE_VALUE = 83.6; // -5%의 오차 범위 88-(88*0.5)
}
if(num==2){ // 회전근개파열 - 수평외전운동 (부착위치: 견갑근)
mvic = 400.0;
RED_VALUE= 91.35;
GREEN_VALUE= 87;
BLUE_VALUE= 82.65;
}
if(num==3){ // 회전근개파열 - 스캡션 (부착위치 : 승모근)
mvic = 400.0;
RED_VALUE = 95.66;
GREEN_VALUE = 91.1;
BLUE_VALUE= 86.54;
}
if(num==4){ // 능형근손상 - 외회전운동 (부착위치: 능형근)
mvic = 400.0; // 매트랩으로 계산한 MVIC값
RED_VALUE= 81.27;
GREEN_VALUE= 77.4;
BLUE_VALUE= 73.53;
}
if(num==5){ // 능형근손상 - 어깨신전운동 (부착위치: 능형근)
mvic = 400.0; // 매트랩으로 계산한 MVIC값
RED_VALUE = 68.78;
GREEN_VALUE = 65.5;
}
}
int cal_rms(int sensor_data){
int n = 100.0; // 근전도 센서값의 범위
float emg[100]; // N값의 범위=10, V제곱값을 저장
float sumemg; // V2값들의 합
float rms; // RMS값
float per_MVIC; // %MVIC값
for(int i = 0; i < n; i++)
{
emg[i] = pow(sensor_data,2); // emg 배열에 V제곱값 저장
sumemg += emg[i]; // V2값들의 합
}
rms = sqrt(1.0/n * sumemg); // RMS값 구함
per_MVIC = rms / mvic * 100; // %MVIC값 구함
return per_MVIC;
}
void color_bts(){ // 구한 %MVIC값과 표준기준이 되는 %MVIC값을 비교해 블루투스 센서로 색을 전송
if(cal_rms(sensor_data)>= RED_VALUE){ // 해당 근육에 힘을 기준보다 많이 줬을 때
bts.print("RED"); delay(1000);
Serial.println("color : RED");
}
else if( (cal_rms(sensor_data) > BLUE_VALUE) && (sensor_data < RED_VALUE) ){// 해당 근육에 정확한 힘을 줬을 때
bts.print("GREEN"); delay(1000);
Serial.println("color : GREEN");
}
else if( cal_rms(sensor_data) <= BLUE_VALUE ){ // 해당 근육에 힘을 기준보다 적게 줬을 때
bts.print("BLUE"); delay(1000);
Serial.println("color : BLUE");
}
}
댓글 1
조회수 6,596master님의 댓글
master 작성일
if(num==1){
블루투스에서 정수값으로 1~5를 전송하는 것이 맞나요?
if(num=='1'){
문자값을 보내는 것은 아닌지 체크해보세요