?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

레트로밴드 스케치 코드 관련 질문입니다.

페이지 정보

작성자 레트로 이름으로 검색 작성일15-05-10 20:31 조회2,050회 댓글2건

본문

안녕하세요~ 제가 이번에 하려는 프로젝트와 레트로밴드가 비슷하여 레트로밴드 스케치 코드를 분석

해보려는데 아직 코딩초보라 이해가 안가는 부분들이 몇군데 있어서 질문드립니다.

1. 우선

#define ACCEL_BUFFER_COUNT 125
byte aAccelBuffer[ACCEL_BUFFER_COUNT];
int iAccelIndex = 2;

여기를 보면 블루투스로 넘겨주는 버퍼의 인덱스는 왜 2에서 시작하고 사이즈는 121이 아니라 125인가요?

그리고 뒤쪽에 버퍼 초기화 함수를 보면

void initBuffer() {
  iAccelIndex = 2;
  for(int i=iAccelIndex; i<ACCEL_BUFFER_COUNT; i++) {
    aAccelBuffer[i] = 0x00;
  }
  aAccelBuffer[0] = 0xfe;
  aAccelBuffer[1] = 0xfd;
  aAccelBuffer[122] = 0xfd;
  aAccelBuffer[123] = 0xfe;
  aAccelBuffer[124] = 0x00;
}

이렇게 되어있던데 저 값들이 무엇을 의미하길래 일부러 인덱스와 사이즈를 이렇게 하고 저 위치에 저 값들을 집어넣나요?

 

2.

if(curSensoredTime - prevSensoredTime > SENSOR_READ_INTERVAL) {
    readFromSensor();  // Read from sensor
    prevSensoredTime = curSensoredTime;

요 부분을 보면 센서 측정 간격인 50ms 에 맞춰 총 20회 측정후 값을 넘기려는건 알겠는데 왜 굳이 = 가 아닌 > 를 써서 딱 50ms마다 측정하지않고 51ms,102ms,153ms 이런식으로 측정하게 하신건가요? 별 의미가 없이 그냥 하신건지 아니면 이유가 있는건지 궁금합니다.

 

3.

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은 왜 하는건가요? 주석을 보면

// 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.

라고 적혀있는데 주석을 봐도 잘 모르겠습니다.

 

4. 마지막으로

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++;

버퍼에 가속도값을 넣는 부분이 잘 이해가 가지않습니다. 처음에 왜 굳이 시프트연산을 해서 집어 넣는것인지, 0x00일 경우 널 문자로 인식해 뒷부분이 인식이 안된다고 어디선가 얼핏 들은거같은데 0x00대신 넣어주는 문자가 0x7f,0x01 두가지던데 저 두 문자에 특별한 의미가 있는것인지 궁금합니다.

 

나름 열심히 여기저기 찾아봐서 다른 부분들은 대략적으로 이해가 가는데 질문 올린 네가지는 도저히 모르겠어서 염치 불구하고 장문의 질문글을 올립니다.

 

 

댓글목록

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

1. 전송할 문자열의 시작과 끝을 나타내기 위해 각각 2byte씩 4byte를 사용합니다.
그리고 전송할 때 BTSerial.print(aAccelBuffer) 함수를 이용해서 버퍼를 한번에 넘겨주려고 의도했습니다.
이 경우 print 함수는 aAccelBuffer 를 문자열(char 배열)로 취급합니다. 그래서 마지막에 null 문자가 필요합니다.
그래서 1byte가 더해져서 총 5byte 가 덧붙여진겁니다.
시작 2byte와 마지막 3byte는 값이 변하지 않기 때문에 버퍼를 조작할 때 인덱스가 이 사이에서 움직이며 기록합니다.

2. 아두이노 loop()가 빠르게 반복되긴 하지만 루프가 반복되는 정확한 시간을 알 수 없기 때문에 밀리초 단위로 작업 시간을 딱 맞추기 힘듭니다.
정확한 시간을 원하시면 타이머를 사용하는 것이 좋습니다.

3. SWAP 은 MPU6050 센서가 원래 사용하는 코드입니다. 센서에서 값을 읽었을 때 바이트 순서가 우리가 원하는 순서는 아닌가봅니다.

4. 시프트 연산을 하는 이유는 아두이노의 2byte 정수를 1byte 씩 버퍼에 쓰기 위해서 입니다. 아래와 같이 사용하는 겁니다.
int temp = xxx;
aAccelBuffer[n] = (char)(temp >> 8); // 첫 8비트를 기록
aAccelBuffer[n+1] = (char)(temp);    // 이후 8비트를 기록

그외 복잡하게 값을 치환하는 과정은 말씀하신 대로입니다. aAccelBuffer 를 문자열로 취급해서 0x00(널문자)를 사용할 수 없습니다.
그래서 0x00인 경우 다른 문자로 치환한 겁니다.
치환할때 정수의 상위 1byte, 하위 1byte 중 어디냐에 따라 가장 사용되지 않을 법한 값(0x7f), 혹은 치환되어도 별 상관 없는 값(0x01)으로 치환했습니다.
(이건 받는 쪽에서도 같은 과정을 거칩니다;;;;)

이 부분은 순전히 BTSerial.print() 함수를 이용해 문자열 형태로 한꺼번에 전송하려다 보니 복잡해진 겁니다.
BTSerial.write() 함수를 이용해 1byte씩 쓰면 null(0x00)을 사용해도 상관없으므로 치환이나 null 문자 처리가 불필요합니다.

레트로님의 댓글

레트로 이름으로 검색 댓글의 댓글 작성일

친절한 답변 감사드립니다! 질문글마다 일일이 답변해주시기 쉽지않으실텐데 성심성의껏 답변 달아주시고 지식을 공유해주시는 모습이 존경스럽습니다. 기회가 된다면 강좌나 워크샵에 찾아뵙겠습니다. 감사합니다.