?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

아두이노 GPS모듈,RF모듈 관련 질문입니다!

페이지 정보

작성자 깜비 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-05-22 19:37 조회1,073회 댓글2건

본문

안녕하세요.

현재 아두이노 메가에 GPS모듈(Neo-6m)과 RF모듈(nRf24l01)을 연결하여

받아온 GPS정보를 RF통신 할려고합니다.

현재 아래의 GPS 소스로 정보를 받아오는것은 가능하지만

RF통신을 위한 송신부와 수신부의 코딩작업이 막막하여 이렇게 QnA를 남깁니다.

RF예제소스는 통신하는 data가 int형으로 간단하게 되어있어서 감이 오질 않습니다..ㅠㅠ

송신부와 수신부 둘다 GPS코드가 들어가야합니까?

//GPS 소스입니다.

#define powerpin 4
#define BYTE 1

// GPS parser for 406a
#define BUFFSIZ 90 // plenty big
char buffer[BUFFSIZ];
char *parseptr;
char buffidx;
uint8_t hour, minute, second, year, month, date;
uint32_t latitude, longitude;
uint8_t groundspeed, trackangle;
char latdir, longdir;
char status;

const uint64_t pipe = 0xE8E8F0F0E1LL;
int data_value[1];

void setup() 

  if (powerpin) {
    pinMode(powerpin, OUTPUT);
  }
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  Serial1.begin(9600);
   digitalWrite(powerpin, LOW);         // pull low to turn on!

 
 
void loop() 

  uint32_t tmp;
  
  readline();
  
  // check if $GPRMC (global positioning fixed data)
  if (strncmp(buffer, "$GPRMC",6) == 0) {
    
    // hhmmss time data
    parseptr = buffer+7;
    tmp = parsedecimal(parseptr); 
    hour = (tmp / 10000)+9; //한국시간
    minute = (tmp / 100) % 100;
    second = tmp % 100;
    
    parseptr = strchr(parseptr, ',') + 1;
    status = parseptr[0];
    parseptr += 2;
    
    // grab latitude & long data
    // latitude
    latitude = parsedecimal(parseptr);
    if (latitude != 0) {
      latitude *= 10000;
      parseptr = strchr(parseptr, '.')+1;
      latitude += parsedecimal(parseptr);
    }
    parseptr = strchr(parseptr, ',') + 1;
    // read latitude N/S data
    if (parseptr[0] != ',') {
      latdir = parseptr[0];
    }
    
    //Serial.println(latdir);
    
    // longitude
    parseptr = strchr(parseptr, ',')+1;
    longitude = parsedecimal(parseptr);
    if (longitude != 0) {
      longitude *= 10000;
      parseptr = strchr(parseptr, '.')+1;
      longitude += parsedecimal(parseptr);
    }
    parseptr = strchr(parseptr, ',')+1;
    // read longitude E/W data
    if (parseptr[0] != ',') {
      longdir = parseptr[0];
    }
    

    // groundspeed
    parseptr = strchr(parseptr, ',')+1;
    groundspeed = parsedecimal(parseptr);

    // track angle
    parseptr = strchr(parseptr, ',')+1;
    trackangle = parsedecimal(parseptr);


    // date
    parseptr = strchr(parseptr, ',')+1;
    tmp = parsedecimal(parseptr); 
    date = tmp / 10000;
    month = (tmp / 100) % 100;
    year = tmp % 100;
    
    Serial.print("\nTime: ");
    Serial.print(hour, DEC); Serial.print(':');
    Serial.print(minute, DEC); Serial.print(':');
    Serial.println(second, DEC);
    Serial.print("Date: ");
    Serial.print(month, DEC); Serial.print('/');
    Serial.print(date, DEC); Serial.print('/');
    Serial.println(year, DEC);
         

  }

}

uint32_t parsedecimal(char *str) {
  uint32_t d = 0;
  
  while (str[0] != 0) {
   if ((str[0] > '9') || (str[0] < '0'))
     return d;
   d *= 10;
   d += str[0] - '0';
   str++;
  }
  return d;
}

void readline(void) {
  char c;
  
  buffidx = 0; // start at begninning
  while (1) {
      c = Serial1.read();
      if (c == -1)
        continue;
      Serial.print(c);
      if (c == '\n')
        continue;
      if ((buffidx == BUFFSIZ-1) || (c == '\r')) {
        buffer[buffidx] = 0;
        return;
      }
      buffer[buffidx++]= c;     
  }
}

댓글목록

최고관리자님의 댓글

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

아두이노에서 float 은 4byte 크기입니다. 따라서 송신할 때 4byte를 쪼개서 1byte 씩 보내세요.
Serial.write(fval << 24); Serial.write(fval << 16); Serial.write(fval << 8); Serial.write(fval);
받을 때도 역순으로 복원해서 float 값을 만들면 됩니다.
fval = (Serial.read()) << 24 | fval; ...; fval = (Serial.read()) | fval;

짱쫑연님의 댓글

짱쫑연 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

안녕하세요 부산 동의대학교 전자공학과에 재학중인 4학년 학생입니다 1년이 지난 시간이지만 작성자분께서 만들려고 했던 작품과 현재 지금 저희 작품과 같아서 도움을 청하고자 글남깁니다. 죄송하지만 이글을 보시면 thomas741741@naver.com 으로 연락주실수 있으신가요?