Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SPRESENSEで作るGPSロガー @ SPRESENSE勉強会 #2 / SPRESENSE GNSS Logger

SPRESENSEで作るGPSロガー @ SPRESENSE勉強会 #2 / SPRESENSE GNSS Logger

chibiegg

June 20, 2019
Tweet

More Decks by chibiegg

Other Decks in Technology

Transcript

  1. GNSSの初期化 fd = open("/dev/gps", O_RDONLY); ioctl(fd, CXD56_GNSS_IOCTL_STOP, 0); ioctl(fd, CXD56_GNSS_IOCTL_SET_OPE_MODE,

    set_opemode); ioctl(fd, CXD56_GNSS_IOCTL_SELECT_SATELLITE_SYSTEM, CXD56_GNSS_SAT_GPS | CXD56_GNSS_SAT_SBAS | CXD56_GNSS_SAT_QZ_L1CA | CXD56_GNSS_SAT_QZ_L1S ); ioctl(fd, CXD56_GNSS_IOCTL_START, CXD56_GNSS_STMOD_COLD); © 2019‑ こたまご chibiegg 11
  2. GNSSからの読み出し 1 SIGNALの設定 struct cxd56_gnss_signal_setting_s setting; /* Set the signal

    to notify GNSS events. */ setting.fd = fd; setting.enable = 1; setting.gnsssig = CXD56_GNSS_SIG_GNSS; setting.signo = MY_GNSS_SIG; setting.data = NULL; ret = ioctl( fd, CXD56_GNSS_IOCTL_SIGNAL_SET, (unsigned long)&setting ); © 2019‑ こたまご chibiegg 12
  3. GNSSからの読み出し 2 構造体のサイズ分だけ read() する sigset_t mask; sigemptyset(&mask); sigaddset(&mask, MY_GNSS_SIG);

    sigprocmask(SIG_BLOCK, &mask, NULL); while(1){ sigwaitinfo(&mask, NULL); read(fd, &posdat, sizeof(posdat)); // ここで処理をする } © 2019‑ こたまご chibiegg 13
  4. NEMAフォーマットへの変換 1 SDKに CXD56xx gnss NMEA convert library があります ドキュメントによると以下のセンテンスに対応しているようです

    GGA, GLL, GSA, GSV, GNS, RMC, VTG, ZDA NMEA output library https://developer.sony.com/develop/spresense/developer‑tools/api‑reference/api‑references‑ spresense‑sdk/group__gnss__nmea.html © 2019‑ こたまご chibiegg 14
  5. NEMAフォーマットへの変換 2 コールバックファンクションを作成し設定する #include "gpsutils/cxd56_gnss_nmea.h" NMEA_InitMask(); NMEA_SetMask(0x000040ff); funcs.bufReq = reqbuf;

    funcs.out = outnmea; funcs.outBin = outbin; funcs.bufFree = freebuf; NMEA_RegistOutputFunc(&funcs); © 2019‑ こたまご chibiegg 15
  6. SDカードへの書き出し 1 NuttxはPOSIXなので、 fopen() して fwrite() するだけ fp = fopen(filename,

    "a"); fputs("Hello world\n", fp); fclose(fp); © 2019‑ こたまご chibiegg 17
  7. SDカードへの書き出し 2 NMEAライブラリとのつなぎこみ FAR static char *reqbuf(uint16_t size) { return

    nmea_buf; } static void freebuf(FAR char *buf){} static int outnmea(FAR char *buf) { int ret = 0; if (fp != NULL){ ret = fputs(buf, fp); } return ret; } © 2019‑ こたまご chibiegg 18
  8. SDKのmain.c int logger_main(int argc, char *argv[]) { gnss_init(); gnss_loop(); }

    int logger_entry(int argc, char *argv[]) { /* Initialize */ int ret = boardctl(BOARDIOC_INIT, 0); /* Wait HW initialization done. */ sleep(2); if (ret == OK) { /* Call main function */ ret = logger_main(argc, argv); } return ret; } © 2019‑ こたまご chibiegg 27
  9. Arduinoの logger.ino void setup() { /* Wait HW initialization done.

    */ sleep(2); gnss_init(); } void loop() { gnss_loop(); } © 2019‑ こたまご chibiegg 28