E2BOX 2025. 1. 10. 16:10

아두이노 연결도

 

아두이노UNO의 하드웨어 시리얼포트는 1개 이고 프로그램 업로드시 시리얼포트(TX,RX)가 사용됩니다. 

따라서 아두이노에 스케치 업로드시 DATA(EBIMU TX)를 연결하지 않은 상태로 업로드해야 합니다.

업로드 완료후 DATA(EBIMU TX)를 연결해야 합니다.

 

라이브러리

////////////////////////////////////////////////////////////////////
/////////////////////// EBIMU FUNCTION /////////////////////////////
#define SBUF_SIZE 64
 
char sbuf[SBUF_SIZE];
signed int sbuf_cnt=0;
 
int EBimuAsciiParser(float *item, int number_of_item)
{
  int n,i;
  int rbytes;
  char *addr; 
  int result = 0;
  
  rbytes = Serial.available();
  for(n=0;n<rbytes;n++)
  {
    sbuf[sbuf_cnt] = Serial.read();
    if(sbuf[sbuf_cnt]==0x0a)
       {
           addr = strtok(sbuf,",");
           for(i=0;i<number_of_item;i++)
           {
              item[i] = atof(addr);
              addr = strtok(NULL,",");
           }
 
           result = 1;
       }
     else if(sbuf[sbuf_cnt]=='*')
       {   sbuf_cnt=-1;
       }
 
     sbuf_cnt++;
     if(sbuf_cnt>=SBUF_SIZE) sbuf_cnt=0;
  }
  
  return result;
}
/////////////////////// EBIMU FUNCTION /////////////////////////////
////////////////////////////////////////////////////////////////////
cs

 

int EBimuAsciiParser(float *item, int number_of_item) 함수설명 

[parameter]

item : 수신된 데이터를 저장할 주소를 입력합니다.

number_of_item : EBIMU의 1PACEKT 당 수신 항목 수를 입력합니다. 

                       예) euler3축 출력 : 3

                       예) euler3축,가속도3축 출력 : 6

[return값]

리턴값은 0 또는 1입니다. 데이터를 수신하여 item내용이 갱신되었을 경우 1을 리턴합니다. 

갱신된 내용이 없을 경우 0을 리턴합니다.

 

#define SBUF_SIZE 64

센서로 부터 수신된 1packet(1줄)을 저장하는 버퍼의 크기를 지정합니다.

1packet(1줄)당 수신되는 최대 바이트수 보다 크게 설정해야 합니다.

 

예제1. roll,pitch,yaw각을 수신하여 시리얼모니터 또는 시리얼플로터에 출력하기

imu_test.ino
다운로드

void setup() {
  Serial.begin(115200);
}
 
void loop() {
  float euler[3];
  
  if(EBimuAsciiParser(euler, 3))
  {
     Serial.print("\n\r");
     Serial.print(euler[0]);   Serial.print(" ");
     Serial.print(euler[1]);   Serial.print(" ");
     Serial.print(euler[2]);   Serial.print(" ");
  }
}
 
cs

euler angle 3항목을 수신 후 ' '로 구분하여 화면에 출력하는 예제입니다. 

아두이노툴의 시리얼모니터 또는 시리얼플로터에 출력하여 볼수 있습니다.

 

예제2. roll과 pitch가 -5도에서 +5도 이내일 경우 아두이노 보드의 LED 켜기

imu_test2.ino
다운로드

 

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}
 
void loop() {
  float euler[3];
  
  EBimuAsciiParser(euler, 3);
  
  if((euler[0]<5)&&(euler[0]>-5)&&(euler[1]<5)&&(euler[1]>-5)) digitalWrite(LED_BUILTIN, HIGH);
  else digitalWrite(LED_BUILTIN, LOW);
   
}
 
cs

euler angle 3항목을 수신 후 roll과 pitch가 -5도에서 +5도 이내일 경우 아두이노 보드의 LED가 켜지도록 하는 예제 입니다.