?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

스마트밴드 소스에서 궁금한 부분이 있습니다.

페이지 정보

작성자 정9 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일15-11-27 16:07 조회1,495회 댓글1건

본문

안녕하세요. 레트로밴드 소스를 계속해서 분석해보고 있습니다.

 

부분부분 얕은 지식만으로 소스를 분석하려고 하다보니 막히는 부분이 많습니다.

 

1.

 

void readFromSensor() {
  int error;
  double dT;
  accel_t_gyro_union accel_t_gyro;
 
  error = MPU6050_read (MPU6050_ACCEL_XOUT_H, (uint8_t *) &accel_t_gyro, sizeof(accel_t_gyro));
  if(error != 0) {
    Serial.print(F("Read accel, temp and gyro, error = "));
    Serial.println(error,DEC);
  }
 
  // Swap all high and low bytes.
  // After this, the registers values are swapped,
  // so the structure name like x_accel_l does no
  // longer contain the lower byte.
  uint8_t swap;
  #define SWAP(x,y) swap = x; x = y; y = swap
  SWAP (accel_t_gyro.reg.x_accel_h, accel_t_gyro.reg.x_accel_l);
  SWAP (accel_t_gyro.reg.y_accel_h, accel_t_gyro.reg.y_accel_l);
  SWAP (accel_t_gyro.reg.z_accel_h, accel_t_gyro.reg.z_accel_l);
  SWAP (accel_t_gyro.reg.t_h, accel_t_gyro.reg.t_l);
  SWAP (accel_t_gyro.reg.x_gyro_h, accel_t_gyro.reg.x_gyro_l);
  SWAP (accel_t_gyro.reg.y_gyro_h, accel_t_gyro.reg.y_gyro_l);
  SWAP (accel_t_gyro.reg.z_gyro_h, accel_t_gyro.reg.z_gyro_l);
 
  // Print the raw acceleration values
  Serial.print(F("accel x,y,z: "));
  Serial.print(accel_t_gyro.value.x_accel, DEC);
  Serial.print(F(", "));
  Serial.print(accel_t_gyro.value.y_accel, DEC);
  Serial.print(F(", "));
  Serial.print(accel_t_gyro.value.z_accel, DEC);
  Serial.print(F(", at "));
  Serial.print(iAccelIndex);
  Serial.println(F(""));
 
  if(iAccelIndex < ACCEL_BUFFER_COUNT && iAccelIndex > 1) {
    int tempX = accel_t_gyro.value.x_accel;
    int tempY = accel_t_gyro.value.y_accel;
    int tempZ = accel_t_gyro.value.z_accel;
  
    char temp = (char)(tempX >> 8);
    if(temp == 0x00)
      temp = 0x7f;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
    temp = (char)(tempX);
    if(temp == 0x00)
      temp = 0x01;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
   
    temp = (char)(tempY >> 8);
    if(temp == 0x00)
      temp = 0x7f;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
    temp = (char)(tempY);
    if(temp == 0x00)
      temp = 0x01;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
   
    temp = (char)(tempZ >> 8);
    if(temp == 0x00)
      temp = 0x7f;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
    temp = (char)(tempZ);
    if(temp == 0x00)
      temp = 0x01;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
  }
 

이 부분이 센서로부터 값을 읽어오고 저장하는 함수인데요.

 

우선 가장 궁금한 것은 값을 저장하는데 리턴 값을 주지 않는데 어떻게 main 함수에서 이 함수를 통해 처리한 값을 출력하나요?

 

그리고

 

temp를 이동시켜(클리어하여) 0x00으로 만든 값을 Buffer에 넣는 과정으로 흘러가는 것은 알겠는데 이 과정을 따져보면 aAccelBuffer[2]=0x7f, aAccelBuffer[3]=0x00, aAccelBuffer[4]=0x7f, aAccelBuffer[5]=0x00, aAccelBuffer[6]=0x7f, aAccelBuffer[7]=0x00 이런 식으로 계속 버퍼는 두 개의 값만 반복되는 것이 아닌가요? 그럼 저 16진수의 첫 비트와 마지막 비트가 가지는 값이 센서의 측정 값이 되는건가요?

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

1. aAccelBuffer 이 버퍼가 전역으로 선언되어 있습니다. 그래서 이 버퍼에 값을 써두면 소스 어디서든 접근해서 값을 읽을 수 있습니다.
2. 아두이노에서 int(정수형)는 2byte 입니다. 그래서 센서에서 읽은 값을 아래와 같이 2byte 써줍니다.
temp = (char)(tempZ >> 8);
temp = (char)(tempZ);
그리고 센서값 2byte 의 각 byte 값이 0x00 일 경우는 다른 값으로 치환해 줍니다. 왜냐면 0x00 값은 특수 목적으로 사용되거든요. 이건 휴대폰쪽 앱에서도 고려되어 있습니다. 그래서 휴대폰에서 받을 때는 원래 값인 0x00으로 복원합니다.
if(temp == 0x00)
      temp = 0x7f;
if(temp == 0x00)
      temp = 0x01;

사실 이 부분은 불필요한 부분인데... 어찌 하다보니 이리됐네요. 이런 치환작업은 빼셔도 됩니다. 대신 BTserial.write() 함수를 잘 이용하시면 됩니다.