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

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

chibiegg
June 20, 2019

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

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

    View Slide

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

    View Slide

  3. 自己紹介
    ソフトウエアエンジニア
    サーバサイド/組み込みソフトウエア
    回路設計
    NW/SC/DBスペシャリスト
    趣味
    旅行♨・写真 (@hinatan_net) ・電子工作・プログラミング
    所属
    さくらインターネット株式会社 執行役員 技術推進統括担当
    © 2019‑ こたまご chibiegg 3

    View Slide

  4. ハードウエアを用意する
    SPRESENSE
    拡張基板 KASPI001
    GPSアンテナ
    microSD
    モバイルバッテリー
    フリスクケース
    シール
    © 2019‑ こたまご chibiegg 4

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  16. NEMAフォーマットへの変換 3
    NMEA_Output()
    へ渡すと設定したコールバックにNMEAフォーマットが渡される
    NMEA_Output(&posdat);
    © 2019‑ こたまご chibiegg 16

    View Slide

  17. SDカードへの書き出し 1
    NuttxはPOSIXなので、 fopen()
    して fwrite()
    するだけ
    fp = fopen(filename, "a");
    fputs("Hello world\n", fp);
    fclose(fp);
    © 2019‑ こたまご chibiegg 17

    View Slide

  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

    View Slide

  19. SDカードへの書き出し 3
    今回実装したロジック
    測位をしたら現在時刻をファイル名にして保存開始
    毎時0分0秒に新規ファイルを作成
    © 2019‑ こたまご chibiegg 19

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. SDK用のコードをArduino IDEでコンパイルする
    SDK固有の初期化を分離する
    .inoファイルを作成する
    固有の初期化以降の処理を setup()
    や loop()
    で呼び出す
    実質、違いは boardctl(BOARDIOC_INIT, 0);
    の有無のみ。
    © 2019‑ こたまご chibiegg 26

    View Slide

  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

    View Slide

  28. Arduinoの logger.ino
    void setup()
    {
    /* Wait HW initialization done. */
    sleep(2);
    gnss_init();
    }
    void loop()
    {
    gnss_loop();
    }
    © 2019‑ こたまご chibiegg 28

    View Slide

  29. ソフトウエアリセットをかける
    #include
    #include
    board_xtal_power_control(true);
    board_flash_power_control(true);
    /* System reboot */
    up_pm_reboot(); /* this function never returns */
    © 2019‑ こたまご chibiegg 29

    View Slide

  30. GPS・NTP本 / インフラ写真集 出しました!
    Boothで販売しています!
    https://chofutech.booth.pm/
    © 2019‑ こたまご chibiegg 30

    View Slide