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

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

1ebd0877fc2fa18ecd0cf3105293fa1e?s=47 chibiegg
June 20, 2019

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

1ebd0877fc2fa18ecd0cf3105293fa1e?s=128

chibiegg

June 20, 2019
Tweet

More Decks by chibiegg

Other Decks in Technology

Transcript

  1. SPRESENSEで作るGNSSロガー 2019/06/20 @ SPRESENSE 勉強会 #2 こたまご ( @chibiegg, @hinatan_net

    ) © 2019‑ こたまご chibiegg 1
  2. あらすじ ハードウエアを用意する macOSでSPRESENSE SDKを使う コードを書く 実際に使う おまけ SDK用のコードをArduino IDEでコンパイルする ソフトウエアリセットをかける

    © 2019‑ こたまご chibiegg 2
  3. 自己紹介 ソフトウエアエンジニア サーバサイド/組み込みソフトウエア 回路設計 NW/SC/DBスペシャリスト 趣味 旅行♨・写真 (@hinatan_net) ・電子工作・プログラミング 所属

    さくらインターネット株式会社 執行役員 技術推進統括担当 © 2019‑ こたまご chibiegg 3
  4. ハードウエアを用意する SPRESENSE 拡張基板 KASPI001 GPSアンテナ microSD モバイルバッテリー フリスクケース シール ©

    2019‑ こたまご chibiegg 4
  5. 外観 1 © 2019‑ こたまご chibiegg 5

  6. 外観 2 © 2019‑ こたまご chibiegg 6

  7. macOSでSPRESENSE SDKを使う Docker方式 (独自) ネイティブ方式 (from v1.3.0 2019/6/5) © 2019‑

    こたまご chibiegg 7
  8. Docker方式 ビルドはDockerで行う 書き込みはmacでやる macOSでSPRESENSE SDKを使った開発環境を用意する https://qiita.com/chibiegg/items/11836bb5cef8bf314103 © 2019‑ こたまご chibiegg

    8
  9. ネイティブ方式 SPRESENSE SDK チュートリアル https://developer.sony.com/ja/develop/spresense/developer‑tools/get‑started‑using‑nuttx/set‑ up‑the‑nuttx‑environment#_macos向けセットアップ © 2019‑ こたまご chibiegg

    9
  10. コードを書く https://github.com/chibiegg/spresense‑gnss‑logger 要点は GNSSの初期化と読み出し NEMAフォーマットへの変換 SDカードへの書き出し © 2019‑ こたまご chibiegg

    10
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. NEMAフォーマットへの変換 3 NMEA_Output() へ渡すと設定したコールバックにNMEAフォーマットが渡される NMEA_Output(&posdat); © 2019‑ こたまご chibiegg 16

  17. SDカードへの書き出し 1 NuttxはPOSIXなので、 fopen() して fwrite() するだけ fp = fopen(filename,

    "a"); fputs("Hello world\n", fp); fclose(fp); © 2019‑ こたまご chibiegg 17
  18. 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
  19. SDカードへの書き出し 3 今回実装したロジック 測位をしたら現在時刻をファイル名にして保存開始 毎時0分0秒に新規ファイルを作成 © 2019‑ こたまご chibiegg 19

  20. 実際に使う 1 © 2019‑ こたまご chibiegg 20

  21. 実際に使う 2 © 2019‑ こたまご chibiegg 21

  22. 実際に使う 3 © 2019‑ こたまご chibiegg 22

  23. 実際に使う 4 消費電力がすごく少ない <30mA@5V ぐらい 主要GNSSが受信できる ロギングの挙動が自分で決められる 安定して動く 体感精度は太陽誘電のGYSFDMAXBの方がちょっといい感じ? ホットスタートが事実上難しい

    (RTC) © 2019‑ こたまご chibiegg 23
  24. 知りたいこと・欲しいこと 省電力機能を試したい 不要なインターフェースを止めたりできるか? コア数減らしたりできるか? U.FLコネクタ実装しておいて欲しい © 2019‑ こたまご chibiegg 24

  25. おまけ SDK用のコードをArduino IDEでコンパイルする ソフトウエアリセットをかける © 2019‑ こたまご chibiegg 25

  26. SDK用のコードをArduino IDEでコンパイルする SDK固有の初期化を分離する .inoファイルを作成する 固有の初期化以降の処理を setup() や loop() で呼び出す 実質、違いは

    boardctl(BOARDIOC_INIT, 0); の有無のみ。 © 2019‑ こたまご chibiegg 26
  27. 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
  28. Arduinoの logger.ino void setup() { /* Wait HW initialization done.

    */ sleep(2); gnss_init(); } void loop() { gnss_loop(); } © 2019‑ こたまご chibiegg 28
  29. ソフトウエアリセットをかける #include <arch/board/common/cxd56_power.h> #include <arch/chip/pm.h> board_xtal_power_control(true); board_flash_power_control(true); /* System reboot

    */ up_pm_reboot(); /* this function never returns */ © 2019‑ こたまご chibiegg 29
  30. GPS・NTP本 / インフラ写真集 出しました! Boothで販売しています! https://chofutech.booth.pm/ © 2019‑ こたまご chibiegg

    30