정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 센서값을 이용한 컴퓨터 제어 가능여부에 대한 질문입니다..
조인오 | 2016-08-28

 안녕하세요. 이번에 아두이노를 처음 접하게 되면서 자기장과 홀전류센서(WCS1600)를 이용해 공중제어라는 주제로 프로젝트를 진행 중인 고등학생입니다.

 홀전류센서가 홀효과를 이용한다는 점을 생각해, 자기장의 변화가 일어나게 되면 유도전류가 생기고 홀전류센서(WCS1600)에 흐르는 전류가 바뀌게 되기 때문에 센서값이 변화한다는 것을 이용했는데요..

 결과적으로는 우노보드 2개의 아날로그 핀에 WCS1600을 꽂고, 총 12개의 센서값을 얻을 수 있었습니다. 자기장이 변하는 것으로 센서값이 변화하는 것도 확인했구요.

 이제 남은 건 이러한 12개의 센서값을 이용해 컴퓨터나 안드로이드의 간단한 동작을 제어해보는 것인데, 컴퓨터를 제어하게 된다면 마우스와 같은 역할을 제어해보고자 합니다.

 그런데 아두이노 관련 서적을 읽다보니 컴퓨터로 아두이노를 제어하는 것은 가능한데, 아두이노만으로 컴퓨터를 제어하는 것은 검색 능력이 부족한 탓인지, 잘 나오지 않습니다.

 혹, 아두이노로 컴퓨터를 제어하기 위해서는 따로 프로그램을 개발해야하 할까요?

 

다음은 제가 사용한 전류센서 스케치입니다.

int pin = A1;             // pin이라는 정수형 변수를 선언하고 아날로그 1번 포트를 할당(저장). 주로 const int pin = A1; 형태로 더 많이 사용
double value = 0;         // value라는 더블형(실수) 변수를 선언하고 0을 저장(※ 아두이노 우노에서는 float와 동일하게 4바이트)
int rmsArray[50];         // rmsArray라는 정수형 배열 선언. rmsArray[0]~rmsArray[49]까지 50개의 정수형 자료 저장 가능
double result;            // result라는 더블형 변수 선언
int N = 50;               // N이라는 정수형 변수를 선언하고 50을 저장
int counter = 0;          // counter라는 정수형 변수를 선언하고 0을 저장
 
void setup() {
  Serial.begin(9600);     // 직렬(시리얼) 데이터 통신을 시작하고 전송속도를 9600baud로 설정
}
 
void loop() {
  value = analogRead(pin);  // 아날로그 1번 핀에서 값을 읽어와 value 변수에 저장
  if (counter++ < N) {      // 만약 counter 변수를 1증가시켜(카운터 개념) 50회 미만이면. 즉, 아날로그 1번 핀에서 데이터를 읽은 횟수가 50회 미만이면
    rmsArray[counter] = value - 487.70;     //아날로그1번핀에서읽은값에서487.70을빼서rmsArray배열에차례로저장.487.70을뺀이유는A1번핀으로읽은값과실제아두이노의입력범위와인식단계등을고려하여재계산해야함(센서마다각각다름)
    delay(1);               // 1msec 지연
  }
  else {                    // 아날로그 1번 핀에서 값을 50번 읽었으면
    counter = 0;            // counter 변수를 다시 0으로 초기화해서 다시 50번 읽을 수 있도록 준비
    result = 0;             // result 변수 초기화
    for (int i = 0; i < N; i++) {       // 50번 반복(50개의 자료를 읽었으므로)
      result += pow(rmsArray[i], 2);    // result 변수에 앞서 읽어 저장해 놓은 A1 핀의 값을 제곱하여 계속 누적 시킴(rms 계산 공식에 의해 먼저 각 값의 제곱의 합을 구함)
    }
    result /= N;            // 다시 그 값을 횟수(50번)로 나눔(rms 계산 공식에 의해 횟수로 나눔)
    result = sqrt(result);  // 마지막으로 그 값에 제곱근을 계산(rms 계산 공식에 의해 제곱근 계산)
    delay(5);               // 5msec 지연
 
    Serial.print("A1 = ");    // 시리얼 모니터에 A1 = 출력
    Serial.println(result);   // 시리얼 모니터에 계산한 rms 값을 출력
  }
}

  

 

이전글   |    플렉스 제어에 대해서 질문할게요 2016-08-28
다음글   |    아두이노 와이파이 쉴드에서의 sd카드 읽고 쓰기 문제입니다.... 2016-08-30