今から数えてちょうど1年前 — 2018 年の 11 月に日本の衛星測位システム 『みちびき』の運用が開始されました。
これは米国の GPS と協調して測位精度を向上させたり、2k bps もの伝送量のある信号を送信してセンチメータ級の測位補強情報を提供する日本独自の画期的な取り組みを行ったりしています。
ごく最近までの衛星信号の民生利用では、およそ 20,000 km も離れた位置にある GPS の微弱な信号しか拾えないことが一般的で、誤差も 10.0 m ぐらいあることが当たり前でした。
ロシアの GLONASS の信号が拾えるのは良い機器で、他の衛星(たとえばヨーロッパの Galileo や中国の北斗)の信号まで拾えるモジュールは個人では手が出せないような値段が付いていました。
それが現在では誤差 2.5-3.0 m 程度の高精度モジュールが 2,000 円から 5,000 円ぐらいで市販されていて、その一部は日本の『みちびき』にも対応しています。
さらに SONY に至っては衛星信号受信モジュールを標準搭載したボードコンピュータまで販売しています。これを使うと SONY 製のサイコンを作れます
これから衛星測位システムの活用が本格化し、測位精度も高まってくるとホイールの回転数から移動速度を推定するよりも、距離と時間から速度を求めるほうが正確な数値を得られるのではないか…と思うかどうかは別として、わりと簡単に実装できるので知っておいて損はないかと思われます。
そこで、みんな大好き、GPS 受信機キット (太陽誘電社 GYSFDMAXB) を用意しました。
これと Raspberry Pi を組み合わせると、それだけでも市販のサイコンよりも高機能な玩具が作れます。しかし、どうせ雨で濡れたり、ダウンヒルで飛んでいったりするので、ここではそんなに高価で高性能なものは求めません。
安価で小型で通信機能が使えればいいということで ESP32 を使います。
ESP32 ESP-32S 2個セット NodeMCU-32S ESP32-WROOM-32 開発ボード 2.4GHz WiFi + Bluetooth
これを使って GPS 受信機キットで受信した測位情報を BLE でスマートフォンに転送し、 SQLite にログを残したり、走行記録を地図上にオーバーレイ表示することを考えているわけです。
取り付けようと思えば、液晶ディスプレイなども付けられますが、大きく、重たく、電池消費量が激しくなるだけで実用性があまりないので、個人的には不要に思えます。
また反対に機能を削って走行記録を SD カードに残すだけならば、さらに小型化しつつ稼働時間を伸ばせますが、それでは地味でつまらないので、必要なときだけスマートフォンの液晶ディスプレイを借りる方針です。
BLE 通信で接続するので、うまくやらないとスマートフォンのバッテリを無駄に消費する懸念があります、というか、そこを調べることが最大の目的で GPS もサイコンも本当はオマケです。
ただ、いきなり、スマートフォンのアプリ開発という重たいタスクに取り掛かるのは大変なので、今回は測位情報を Bluetooth で送信するところまでを行います。
まずは ESP32-WROOM-32 のデータシートを見て Pin Layout を確認します。そこから TxD の接続先がわかりますので、線でつないでスケッチを動かしてみます(RxDはいまのところは不要です)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include "HardwareSerial.h" #include "BluetoothSerial.h" #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run 'make menuconfig' to and enable it #endif BluetoothSerial SerialBT; HardwareSerial mySerial(2); void setup() { SerialBT.begin("Hoge"); mySerial.begin(9600, SERIAL_8N1, 34, 35); } void loop() { if (mySerial.available()) { SerialBT.write(mySerial.read()); } delay(1000); } |
このスケッチをコンパイルしてアップロードすると、ESP32 は Bluetooth で測位情報を送信し続けるようになるはずなので、無事にデータ送信ができているかどうかを確認します。
うまくアップロードを行えない場合は、こちらを参考にしてみてください。
送信されたデータを Linux で確認するには rfcomm コマンドを使用してシリアルポートにバインドしてしまえば良いです。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ sudo bluetoothctl [bluetooth]# power on Changing power on succeeded [bluetooth]# scan on Discovery started [bluetooth]# pair 00:00:00:00:00:00 Attempting to pair with 00:00:00:00:00:00 [bluetooth]# exit $ sudo rfcomm connect /dev/rfcomm0 1 00:00:00:00:00:00 Connected /dev/rfcomm0 to 00:00:00:00:00:00 on channel 1 Press CTRL-C for hangup $ sudo cat /dev/rfcomm0 |
※ 00:00:00:00:00:00 は架空のMACアドレスです
できましたら、ファイルを標準出力に表示するときと同様に cat で出力できるようになります。上の例ですと、GPS受信機キットの出力をそのまま Bluetooth に流してしまっていますけれども、いちど Arduino Serial Monitor に書き出して内容を確認してから同じものが表示されるかどうかを確かめたほうが安全かも知れません。
ともかく、これで位置情報を表示できていれば、ESP32 側の準備は万端です。
ここまでは難しいことはないのですが、遠隔でセンサデータを取得できるのはいつ見ても楽しいものですね。
スマートフォン側のアプリ開発は、こう簡単にはいきません。
BLE通信が前提になりますので、少しばかり手間と時間がかかります。
いま忙しくて、実際に走行ログを集めに行く暇もないので、だいぶ後回しになりそうな気がしますが、せっかくなので既存のサイコンと同一条件で計測を行って、結果を比較してみたいですね。
つづき: サイクルコンピュータを自作する #2 – みちびき対応 GPS と市販のサイコンの比較実験