아두이노 프로젝트 4. 족저압 검사 깔창

From Arduwiki


개요

족저압 검사 깔창

압력 센서가 부착된 깔창에 올라서서 발바닥의 무게 중심을 확인하고 데이터를 수집하는 장치입니다.

고려사항

  • 압력센서 8개를 깔창에 부착하고, 각각의 데이터를 수집합니다.
  • 깔창 위에 가만히 올라서있는 정적 검사, 깔창 위에서 자연스럽게 걸어서 검사하는 동적 검사, 무게 중심을 확인하는 평발 검사 모드를 구현합니다.
  • 유저 인터페이스를 통해 실시간으로 압력 센서가 눌리는 세기를 보여줍니다.

사용 하드웨어


회로 구성

나노 파트 (같은 회로를 2개 구성해야 합니다.)

가운데|class=coders100

메가 파트

가운데|class=coders100

기능 구현

나노 파트

/*
시리얼 이름 : BTSerial
baudrate : 115200 -> (AT+BAUD4)

왼발 연결 블루투스 모듈
모듈 이름 : S_LEFT
핀번호 : 123456

오른발 연결 블루투스 모듈
모듈 이름 : S_RIGHT
핀번호 : 111111
*/
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3);                      //2(tx), 3(rx)
int Sensor[] = { A0, A1, A2, A3, A4, A5, A6, A7 };  //순서대로 1 ~ 8번 센서 사용 핀번호

unsigned char ValueSensor[9];
unsigned long ScanningTime = 30000;  //단위 [ms]
int dly = 100;                       //단위 [ms]

void sensing_func_inner(int dy) {
  for (int i = 0; i < 8; i++)
    ValueSensor[i] = map(analogRead(Sensor[i]), 0, 1024, 0, 254);
  BTSerial.write(ValueSensor, 9);
  delay(dy);
}

void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600);
  Serial.println("Serial start");
  ValueSensor[8] = 255;
}

void loop() {
  sensing_func_inner(dly);
}

void value_check(){
  for(int i=0;i<8;i++){
    Serial.print(ValueSensor[i]);
    Serial.print("\t");
  }
  Serial.println();
}

void sensing_func(unsigned long ScanTime, int dy) {
  unsigned long StartTime = millis();
  unsigned long EndTime = millis();
  while ((EndTime - StartTime) < ScanTime) {
    sensing_func_inner(dy);
    EndTime = millis();
  }
}

메가 파트

/*
공통사항
baudrate : 115200 -> (AT+BAUD4)

왼발 연결 블루투스 모듈
시리얼 번호 : Serial1
모듈 이름 : M_LEFT
핀번호 : 123456

오른발 연결 블루투스 모듈
시리얼 번호 : Serial2
모듈 이름 : M_RIGHT
핀번호 : 111111
*/

void setup() {
  Serial.begin(9600);     //pc 시리얼
  Serial1.begin(9600);  //블루투스 시리얼(왼발)
  Serial2.begin(9600);  //블루투스 시리얼(오른발)
  Serial.println("Serial start");
}

char idx1 = 0;
char idx2 = 0;

int left_val[100];
int right_val[100];
unsigned char t1; 
unsigned char t2;

void loop() {
  if (Serial1.available() > 0) {
    t1 = Serial1.read();
    if (t1 == 255) {
      idx1 = 0;
      for (int i = 0; i < 8; i++) {
        Serial.print(left_val[i]);
        Serial.print("\t");
      }
      Serial.println("0");
    } else {
      left_val[idx1] = t1;
      idx1++;
    }
  }

  if (Serial2.available() > 0) {
    t2 = Serial2.read();
    if (t2 == 255) {
      idx2 = 0;
      for (int i = 0; i < 8; i++) {
        Serial.print(right_val[i]);
        Serial.print("\t");
      }
      Serial.println("1");
    } else {
      right_val[idx2] = t2;
      idx2++;
    }
  }
}

블루투스 연결

HM-10 블루투스 모듈은 아두이노 나노 2개에 각각 하나씩, 메가에 2개까지 총 4개가 사용됩니다.

아두이노 나노 파트의 모듈들은 Slave 모드, 메가 파트의 모듈들은 Master 모드로 설정되어 통신합니다.

자세한 내용은 HM-10 블루투스 모듈 문서의 Master, Slave 모듈 연결 파트를 참고하세요.


Q. 압력센서 16개라면 굳이 블루투스 통신을 하지 않고 아두이노 메가 하나에서 작업해도 핀 개수가 충분하지 않나요?

A. 처리 속도의 차이를 고려해 메가, 나노로 나누어 수집과 데이터 처리를 따로 처리했습니다.

아두이노 메가 하나로 모든 작업을 실행했을 때 처리 속도의 지연으로 인해 이후 인터페이스에서 빨간 점으로 표시되는 부분의 적용이

늦어지는 듯한 느낌을 받을 수 있습니다.


데이터 수집

아두이노 나노 파트에서 RA30P 압력센서(각 8개)의 데이터를 수집합니다.

나노 파트에서 수집된 데이터들은 블루투스 통신을 통해 메가 파트로 전송되며, 데이터 시각화 및 정적, 동적, 평발 검사 모드의 결과 계산을 위해 사용됩니다.


데이터 시각화 및 검사 인터페이스 제작

Pygame 라이브러리를 활용해 압력센서 데이터 시각화 및 정적, 동적, 평발 검사 인터페이스를 제작합니다.

모습은 다음 사진과 같습니다.

가운데|class=coders100


압력센서 데이터에 따라 더 강한 압박을 받은 부분은 빨간 점이 더 크게, 약한 압박을 받은 부분은 더 작게 표현됩니다.

좌측 상단 정적, 동적, 평발 검사 시작 버튼을 누르면 각 검사에 대한 파트가 나오게 됩니다.

  • 정적 검사 : 일정 시간동안 깔창 위에 올라서서 가만히 서있는 사람의 압력센서 데이터를 수집하여 무게가 쏠리는 부위를 파악하고 이에 따른 결과(ex . 무게가 좌측, 우측, 전방, 후방으로 집중됩니다.)를 제공합니다.
  • 동적 검사 : 일정 시간동안 깔창 위에서 제자리 걸음을 하는 사람의 압력센서 데이터를 수집하여 결과를 제공합니다.
  • 평발 검사 : 일정 시간동안 깔창 위에 올라서서 가만히 서있는 사람의 압력센서 데이터를 수집하여 발의 아치 부분 압력을 파악하고 이에 따른 결과를 제공합니다.


결과

정적 검사

가운데|class=coders100


동적 검사

가운데|class=coders100


평발 검사

가운데|class=coders100


Comment

위에서부터 정적, 동적, 평발 검사 모습입니다.

손으로 압력센서를 누른 데이터를 기반으로 임의의 공식을 활용해 각 검사별 결과가 제공되는 모습입니다.


추신

공집사의 아두이노 프로젝트 결과물은 판매되는 제품이 아니며, 프로젝트 수준에서 간단하게 진행되었습니다.

문의 및 의뢰는 크몽 공집사로 연락주시면 감사하겠습니다.