아두이노프로세싱 프로그래밍

조립식 아두콥터에 GPS와 함께 장착된 지자기센서 성능 모니터링

coding art 2017. 2. 10. 15:47
728x90


지금 보유하고 있는 APM2.8 비행제어보드가 장착된 조립식 아두콥터의 GPS에 포함되어 있는 지자기 센서 값을 모니터링 해 보기로 한다.

사진에서처럼 크고 둥근 버튼형 하우징에 GPS 및 관련 회로 보드가 포함되어 있다. 현재 이 GPS는 잘 작동하고 있지만 GPS의 정확한 규격을 전혀 모르고 있는 상태이다. 가능한 한 이 GPS를 분해하지 않은 상태에서 GPS 의 사용법을 강구 즉 일종의 해킹(hacking)을 해보기로 한다.

비행제어보드는 APM2.6과 APM2.8이 외관상 배선 구조에 별 차이가 없는 것으로 이해한다.





우선 아두콥터의 GPS의 외부 배선 방법을 살펴보기로 한다. 배선도에 의하면 GPS에서 6개의 배선이 나온다. 즉 Vcc, Tx, Rx, GND 4선과 아울러 SCL,SDA 2선이 그것들이다.













이러한 정보를 바탕으로 실제 보유하고 있는 조립식 아두콥터의 GPS 배선구조를 비교적인 관점에서 관찰해 보기로 하자. 사지에 따르면 검은색 튜브로부터 6개의 배선이 나오고 있으며 두 그룹 즉 I2C에 2개의 배선 및 GPS 포트에 4개의 배선으로 나누어져 커넥터 배선이 이루어지고 있다.

일반적으로 GPS 의 배선 구조는 Vcc, Tx, Rx, GND 4선 구조로 이루어진다. 그럼에도 불구하고 추가되어 있는 2개의 배선이 I2C 인터페이스 포트에 커넥터 배선이 되었다는 점은 상식적으로 이 GPS 내부에 지자기 센서가 내장되어 있다는 것을 의미한다.
이미 인터넷 검색에 의하면 허니웰사의 HMC5883L 지자기 센서가 많이 보급되었고 아두이노에 의한 측정 프로그램도 많이 보급되어 있다.
 

이러한 전제를 바탕으로 2개 및 4개의 배선으로 이루어진 커넥터들을 조립식 아두콥터로부터 뽑은 다음 일차적으로 2개의 선은 아두이노의 SCL,SDA 에 배선 연결하고 나머지 4개 배선 커넥터의 빨간색 배선과 검은 색 배선을 5V와 접지(GND)로 간주하여 아두이노 우노 보드에 배선한다.




배선이 완료 되었으면 아래의 HMC5883L 센서의 지자기장 모니터링 프로그램을 준비하도록 한다.
I2C 인터페이스를 사용하는 센서 값 측정에는 반드시 Wire.h 라이브러리 지원이 필요하다. I2C 센서 인터페이스 방식은 항상 반드시 고유의 주소할당을 원칙으로 한다. 그래야만 하나의 I2C인터페이스에 2개 또는 그 이상의 각기 다른 종류의 센서들이 함께 배선 될 경우에도 혼동을 피할 수 있다.
아래 프로그램에서 할당된 주소 0x1E는 16진(헥사)데이터라는 의미로 파악한다. 여타의 센서들도 0x로 시작하며 그 다음의 두자리 16진수가 중요하다. 16진 수 1은 2진수로 001이며 16진수 E는 이진수로 1110 이된다. H5883L 데이터 시트에서 7비트만 주소로 할당함을 참고하도록 한다.


Compass_H5883L_01

#include <Wire.h> //I2C Arduino Library

#define address 0x1E //0011110, I2C 7bit address of HMC5883
double heading = 0;
float mag =0;

void setup(){

  //Initialize Serial and I2C communications

  Serial.begin(9600);
  Wire.begin();

  //Put the HMC5883 IC into the correct operating mode

  Wire.beginTransmission(address); //open communication with HMC5883
  Wire.write(0x02); //select mode register
  Wire.write(0x00); //continuous measurement mode
  Wire.endTransmission();

}

void loop(){

  int x,y,z; //triple axis data
  float w,a,b,c;

  //Tell the HMC5883L where to begin reading data
  Wire.beginTransmission(address);
  Wire.write(0x03); //select register 3, X MSB register
  Wire.endTransmission();
 
 //Read data from each axis, 2 registers per axis

  Wire.requestFrom(address, 6);
  if(6<=Wire.available()){

    x = Wire.read()<<8; //X msb
    x |= Wire.read(); //X lsb

    z = Wire.read()<<8; //Z msb
    z |= Wire.read(); //Z lsb

    y = Wire.read()<<8; //Y msb
    y |= Wire.read(); //Y lsb

    heading = atan2(y, x);
    a=abs(x);
    b=abs(y);
    c=abs(z);
    w=a*a+b*b+c*c;
    mag = sqrt( w);

  }

  //Print out values of each axis

  Serial.print("x: ");
  Serial.print(x);
  Serial.print("  y: ");
  Serial.print(y);
  Serial.print("  z: ");
  Serial.print(z);
 
  Serial.print(" Mag: "); 
  mag = sqrt(w);
  Serial.print(mag);
  Serial.print(" Heading: ");
  Serial.print(heading);
  Serial.print(" Heading(Deg): ");
  Serial.println(heading*180/3.14);

  delay(1000);

}//프로그램 끝




프로그램을 컴파일하고 업로딩하여 시리얼 모니터를 관찰하기로 한다.
관측 치에 의하면 면에 평행한 평면에서 자기장의 세기가 대략 270 uT 정도로 측정되고 있다.

아울러 높이 방향 즉 z 방향의 지자기장 세기는 540 uT 가량의 값을 주고 있다.

여기서 드론이 비행할 경우 방향을 파악하기 위해서는 평면 방향의 자기장 세기가 중요하다는 점을 지적한다. 이 점을 확인하기 위해서는 현재 지자기 센서를 내장한 GPS가 사진에서처럼 세워져 있기 때문에 드론을 평면에서 돌려보면 x,y 성분 값은 변동하드라도 크기 Mag의 값과 z방향의 값은 일정하게 유지됨을 알 수 있다. 반면에 수직 방향으로 상승하드라도 z방향의 자기장 세기는 그다지 변동이 없을 것으로 추정된다.

물론 GPS를 분해해 보기 전에는 구체적으로 어떤 센서를 사용하고 있는지 알 수 없으나 HMC5883L 과 유사한 센서가 사용되고 있음을 확인할 수 있었다.

지자기 센서는 충분히 검증을 마쳤고 그 다음은 GPS 포트에 커넥터로 연결되는 4개의 배선 중 남은 2개의 데이터 선 배선을 조사해 보기로 한다.