![見出し画像](https://assets.st-note.com/production/uploads/images/81005315/rectangle_large_type_2_b33f9a304bde24714bace250a406018c.png?width=800)
M5stack Core2で作るBluetoothタコメーター
久しぶりにエンジニアらしいことをしたので記事を更新
特に理由はありませんが、以前からCAN通信を使って何かしてみたいと思っていたので、ELM327を使ってLEDタコメーターを作ってみました。
しかし、ELM327を使っている人の情報を見るとだいたいがECUへコマンドを送信してそのレスポンスを表示するという方法を取っている
これはあくまで故障解析のための機能であり、走行中に常時コマンドを送信するというのは精神衛生上よろしくないので、流れているCAN情報を取得して表示するという方法を取りました
やったことお品書き
M5stackとELM327のBluetooth接続
CAN信号の受信
m5stackディスプレイへの表示
Neopixel LEDへの表示
M5stackとELM327のBluetooth接続
M5stackとELM327の接続自体はすでにいろんな方がされており、これらのHPを参考にさせていただきました。特に有用だったのが韓国の方の以下のサイトでした。
これは冒頭に述べた、コマンド送信によるCAN信号受信の例ですが、これについては後程書きます
まずはBluetooth接続ですが、コードを参考にすれば簡単にできるっしょ!と思っていたんですが、そうは烏賊のき〇たま。
何度やっても接続できない・・・
![](https://assets.st-note.com/img/1655632363910-NXulo9PukG.jpg?width=800)
事前にスマホと接続してTorqueなどのアプリと接続できることは確認していたので、初期不良などでないことは確認していたのですが・・・。
原因は以下の2つでした(たぶん)
M5stackではELM327を機器名称で検索できない
一度接続できても、その後スマホなどをELM327と接続するとM5stackのペアリングを解除しないと接続できなくなる
本来はOBDIIと書いて検索すれば接続できるようなのですが、私のM5stackの問題?なのかできませんでした。
しょうがないので一度スマホをELM327と接続しMACアドレスを確認。M5stackの接続先をELM327のMACアドレスで指示することで接続できるようになりました
しかし、一度接続できたにも関わらず接続できなくなる問題が発生。なぜだなぜだと思いながらいろいろ試したところ、M5stackを一度初期化すると再度接続できるようになることがわかりました。
おそらく、一度ペアリングした後にほかの機器でペアリングをしてしまうと、ELM327側のペアリング情報は更新されているのにM5stack側のペアリング情報が残っているため接続できなくなるようです。
そのため、工場リセットをするか、bluetoothのペアリングを解除する処理を一度回してあげなければいけませんでした。
何度も工場リセットするのが面倒になったので、最終的には以下のサイトを参考にさせていただきました
CAN信号の受信
bluetooth接続できるようになったら次にCANの受信設定
一言でCANといってもプロトコルが何種類もあり、さらにボーレートやBitにも種類があり・・・
これはELM327で設定できるCANプロトコルをすべて試して力業で解析しました。
そして本当の闘いはこれからの、CAN信号解析
Diagコマンド?で受信する方式ならば、統一規格があるようなのでCAN信号の解析は必要ないのですが、冒頭にも述べた通り、走行中に各ECUに信号を送信するなんて、自動車開発に携わったことある人ならやろうとは思わないでしょう・・・
なので、インターネットの海から私の車に合いそうなCAN信号の解析結果を探していくつか試したところ、とりあえずエンジン回転数っぽいものが取得できました。
![](https://assets.st-note.com/img/1655646351581-BIWuxGTFuM.jpg?width=800)
CAN信号を受信するには、ELM327のAT MAというコマンドを使用すればよいのですが、1つ問題が。
Bluetooth接続だと通信速度が遅いため、すべての信号を受信しようとするとELM327のバッファがいっぱいになってしまい、すぐにCAN信号の受信を中止してしまいます
なので、必要なCAN信号だけを受信するように、受信するCAN信号をフィルタリングしなければなりません。
CAN信号のアドレスがわかっているなら、AT CRA XXX(XXXはCAN信号のアドレス)を送信することで、そのアドレスから信号が送信されたときだけELM327がバッファを取るためオーバーフローの可能性が減ります
ここまで出来たら後は取得した値をディスプレイに表示したり、LEDに出力したりラジバンダリ。
細かいことをいうとエンジン回転数のように周期の早い信号を取得する場合、マルチタスク化などによって1つのコアでは常にCANの信号を受信しながら、別のコアでディスプレイ関係の処理をするなどの対応が必要でした・・・
とりあえずCAN信号を受信することができたので、ほかの信号を解析したりしていろいろなものを作ってみようと思います。
![](https://assets.st-note.com/img/1655646875835-mumOpckJlJ.png?width=800)
この記事が気に入ったらサポートをしてみませんか?