夜行バスを快適にするデバイス
この記事はUEC2 Advent Calendar 2025 18日目の記事です。
昨日の記事について
昨日は、こーすーさんの
情報学部の大学生が電気工事士2種を受けた話についてでした。
実は私も電気工事士第2種を持っているのですが(About Me 参照)、技能試験の会場が 調布 だったのはうらやましいです。
私は 東京流通センター が会場で、上京したての頃に慣れない列車を乗り継ぎ、会場まで90分ほどかけて行ったことを思い出しました。
こーすーさん……受かっているといいですね。
夜行バスを快適にするデバイス(製作の動機)
では本題に入ります。
皆さんは夜行バスを使われるでしょうか?
私の実家は 愛媛県西条市 なのですが、帰省手段として ほぼ毎回夜行バス を使っています。
というのも、他の選択肢を考えると
- 新幹線:四国には新幹線が通っていないため乗り換えが必要。高い
- 飛行機:調布から羽田空港が遠い。松山空港から実家も遠い。高い
- 船:オーシャン東九フェリー。毎日運行ではない(試したことはない)
- 全部普通列車:楽しいが、とにかく時間がかかる
- サンライズ瀬戸:乗り換えが必要。のびのび座席は寝心地が夜行バス以下。高い。
と、色々試した結果、夜行バスに落ち着きました。
安い!双方の乗り場まで近い!寝ていれば着く!.
とても優秀です。
そんな贔屓にしている夜行バスにもデメリットがあります。狭い?寝られない?違います!
自分がどこにいるのかわからないことです!(異論だらけだと思う)。
と言うのも安眠の妨げになるため、スマホをつけるのはマナー違反です(アナウンスもある)。そこでトイレに行くついでにgooglemapを見ています。まあ些細な不便さなのですが、小さな悩みを順番に解決するうちにやがてはサンライズ瀬戸のシングルデラックス級の過ごしやすさになるでしょう。
夜行バスを快適にするデバイス(構成図案)
この問題を解決するために、GPSで緯度経度を取得し、市町村名に変換、その情報を耳元で囁くデバイスの作成を決意しました。
デバイスの大まかの構成を以下の感じで考えました。
実際にデバイスについて市販の部品をあてがってみました。
-
GPS / 制御用マイコン
ESP32-C3-WROOM-02-N4
小型であり、Wi-Fi が使用できます。 -
GPS モジュール
Air530
あまり GPS デバイスを多く見つけることができず、選択肢はこれくらいでした。
Seed 用のモジュールのようで、UART で緯度・経度を出力します。 -
スピーカー
スピーカー
耳元で鳴らすものですし、音質も必要ないため、小型のダイナミックスピーカーをチョイスしました。
ここで問題になるのが次の2点
- ESP32で音声信号を扱ってスピーカーで鳴らすの、むずくない?
- 緯度・経度から市町村名を返してくれるサービスってあるの?.
考えた解決策を順番に説明します。
ESP32で音声信号受信して鳴らすってむずくね?
ESP32 には、そもそも DAC がありません。そのため、音声をそのまま出力することはできず、音声を再生するための IC を別途用意する必要があります。
ATP3011F4-PU.
いわゆる 音声合成 LSI です。
ローマ字で発声させたい文字列を送ると、いわゆる「ゆっくり実況」的な声で読み上げてくれます。
これを使えば、音声データを Wi-Fi 経由でやり取りする必要がなくなり、
ESP32 側は 文字列を送るだけ で済むようになります。
2点目は緯度経度から市町村名を返すサービスってあるん?
探してみましたが、ピンポイントで使いやすいものが見当たりませんでした。
それなら 作ったほうが早い ということで、Python で API を自作し、自宅サーバーに設置しました。
クエリの概念は以下の感じです。
http://localhost:1111/query?x=<緯度>&y=<経度>&auth=<パスワード>&mode=<モード>&jcc=<yes or no>
- x に緯度
- y に経度
- 外部から使われすぎないように auth でパスワードを設定
- mode では、返却形式をローマ字 / ひらがな,漢字 から選べるようにしました。
ローマ字で返す場合、音声合成 LSI は / を文節の区切りとして扱うため、pykakashi を使って、適切に文節分割する処理を入れています。
市町村名を返すだけでは面白くないので、 市町村名を使って Gemini API を叩き、名産品も一緒に返す ようにしました。
実際に URL を叩くと、以下のような応答が返ってきます。
https://busguidebot.otterstb-io.org/query?x=35.659&y=139.543&auth=秘密&mode=roma&jcc=no
/genzaichiha/choufushifujimichou,meibutsuha/jindaijisobadegozaimasu.
さらに jcc オプションも用意しました。 私はアマチュア無線をやっているのですが、位置情報を JCC ナンバー(4桁) でやり取りすることがあります。 デバイスのモードをスイッチなどで切り替え、 ボタンを押すだけで JCC ナンバーを教えてくれる、というアップデートもできるようにしています。
これで、説明した URL を ESP32 から叩き、 返ってきた文字列を音声合成 LSI に流すだけで、現在地を発音してくれるデバイスが完成します。 詳しく知りたい方はお手数ですがGithubのリポジトリまで
夜行バスを快適にするデバイス(実装)
部品を組み立てて、コードを書いてみました。下が3dプリンターで作った筐体に取り付けた様子です。
バッテリーがどうしても大きくなるんですよね、、、というのもリポバッテリーを高速バスに持ち込むわけにもいかず、持っている一番小さなモバイルバッテリーでも、握り拳くらいの大きさになってしまいます。
あとは筐体を作ったら完成!というところでアドカレの提出期限がきちゃったわけです。
夜行バスを快適にするデバイス(今後の課題)
- 筐体の作成.
本当は3Dプリンターで今部活で流行っている透明を使った造形にしたいのですが、危険物と間違われそうです。首から下げておきたいのでかっこいい形にしたい。 - 起動時のラグ.
最初にGPSを取得するまでに時間がかかります。不本意にもバッテリーが大きくなったので、GPSを10時間くらいスリープモードにするくらいにはできそう。
終わりの挨拶と明日の記事の告知
慣れないマークダウンと作りかけの個人サイトでの公開の影響で読みにくかったと思います。最後まで読んでいただきありがとうございました。私は実家に帰る(12/25)までにこのデバイスを仕上げて実際に使ってみることを目標にしています。それでは良いお年を~
明日はしぐれさんによる好きな同人音声とかです!