
久しぶりに電子回路で遊んでみます。
「
クルマとiPhoneをBluetoothでつなげてみた」で作った車用のモニター。
iPhone側のアプリを作った頃はまだ開発言語Swiftが発表されたばかりでiPhoneバージョンもiOS9になって色々とAPIなども変わってきた。
アプリ自体には特に困ってはないんだけど大分Swift言語にも慣れてきたしマイコンも変えたいしもう一度作り直してみる。
ってことで、今回はクルマ(スクラム)から送られてくるデータで使えるものはないかと色々探ってみます。
前回の「
クルマとiPhoneをBluetoothでつなげてみた」で作った車用のモニターは、ECUの情報として「アクセル開度」「水温計」をもらって表示させていました。
加えて「ブースト計」の簡単な回路を使って過給圧を表示。「電圧計」・「位置情報」などなど。
今回はECUデータとして「車速信号」「エンジン回転数」が拾えそうなのでちょっと考察してみます。
自身の備忘録なので暇な方だけどうぞ…w
ちなみに、スクラム(エブリィ)のECUは運転席下エンジンルームの右側についています。

私のクルマではECUについているコネクタは図の「SP」が車速信号。「TA」がエンジン回転数となっていました。同じ年式でも微妙に位置が違ったり、コネクタ形状が違ったりと取り出す時には注意が必要です。
まずは「車速パルス」を拾って遊んでみます。
手元にあるハンディのオシロスコープに速度パルス信号を突っ込んで走ってみました。
メーター読み時速60kmの時の波形…

電圧7.5Vで24ミリ秒の波長。周波数では42Hzみたい。
続いてメーター読み時速80kmの時…

同じく電圧7.5Vで18ミリ秒の波長。周波数で56Hz。
ちょっとノイズが乗っているけど綺麗な波形が取れています。
クルマについている車速センサーが吐き出す信号は「JIS D5601」で決まっているモノらしいです。
「機械式スピードメータの速度指示機構は、駆動軸が637rpm(主として四輪自動車用)又は1400rpm(主として二、三輪自動車用)の回転をしたとき、60km/hを指示する割合とする。」
「電気式及び電子式スピードメータの速度指示機構は、原則として下式が成り立つように指示する割合とする。」
って難しく書かれていますが簡単に式に書くとこんな感じ
(車速パルス) = (車速) X (N) X 637rpm / (60秒 X 60km/h)
車速パルスの単位はHz。車速はkm/h。
式中のNは「駆動軸1回転当たりの発生パルス数」となっており「4・8・16・20・25」のいずれかの値を取れ、とあります。
この値はスクラム(エブリィ)では詰めていくと「4」を取っていることがわかりました。すなわち駆動軸90°回転するごとに1パルス吐き出すってこと。
これらから上式をもっと簡単にすると「(車速) = (車速パルス) / 0.708」ってことになる。
これを先ほどオシロで測定した波形で計算すると、メーター読み時速60kmでは「時速59.3km」。メーター読み時速80kmでは「時速79.1km」となるのでいい値として測定できそうなのがわかる。
なので、このパルスを測定して「速度メーター」が作れそう♪
続いて「エンジン回転数」を拾って遊んでみます。
同じようにエンジン回転数信号をオシロスコープに突っ込んで測定してます。
1000rpmのほぼアイドリング時の波形。

電圧12Vで41ミリ秒の波長。周波数では24Hzみたい。
続いて、走行中3000rpm弱ぐらいの波形。

同じく電圧12Vで16ミリ秒の波長。周波数で63Hz。
これも比較的綺麗な波形が取れそうです。
ここで最初は素直にエンジン回転軸1回転当たり1パルス吐き出しているのかな〜って思って計算してみました。
1000rpmの時が24Hz。すなわち1秒間に24パルス60秒で1440パルスなので1440rpmってことになる。50%くらいの誤差があるのでこれは単純にエンジン回転軸1回転当たりの信号ではなさそう。
だとしたら…。
プラグ点火のタイミングか?ってことで計算。
スクラム(エブリィ)は4サイクルエンジンの3気筒です。
4サイクルエンジンなので回転軸2回転で1回点火ということは720°で1回点火。
それが3気筒なので720°/3気筒で240°毎に点火していることになる。
ということは360°/240°=1.5なので、点火間隔時間を1.5倍してやれば1回転のパルスが計算できる。
メーター読み1000rpmの時の波長の場合、1000ミリ秒/(41ミリ秒X1.5)X60=975rpm
メーター読み3000rpm弱の時の波長の場合、1000ミリ秒/(16ミリ秒X1.5)X60=2500rpm
となって近い値が計算できることがわかる。
この計算式でエンジン回転数「タコメーター」が作れそう♪
これらの考察であっているかどうか、ブレッドボードを使って簡単な回路を作って検証してみます。
この回路の流れとしては…。
ECUの「速度パルス」と「エンジン回転数」をマイコンに取り込んで、マイコン内でパルスの間隔時間を測定します。
測定した生データをUARTという通信規格にもとづき「SBDBT5V」というBluetoothモジュールへ送ってやります。
受信した「SBDBT5V」は生データをiPhoneへBluetoothの無線送信を使ってひたすら続けます。
受信したiPhoneはアプリによって「速度」「回転数」を計算しiPhone上に表示させてやります。
今回のECUからのデータは8Vや12Vの電圧の信号のようです。このままでは電圧が高すぎてマイコンには直接突っ込むことができません。トランジスタのスイッチングを使って5Vの信号に変えマイコンに取り込んでやります。
マイコンは、「PIC16F1705」を使いました。14ピンの小さなボディに機能が満載です。パルスの時間間隔はCCPの「キャプチャー」を使って測定しています。
Bluetoothモジュール「SBDBT5V」のBLE(Bluetooth Low Energy)という規格は、「近距離無線通信技術 Bluetoothの拡張仕様」でありBluetooth4.0て策定された規格です。この規格により個人でも、このように気軽に無線通信のプログラムが作れるようになりました。確かiPhone4Sから使える機能でiOS7あたりからアプリが作れたと思います。
「マイコン」で計算を行うのと「iPhone」とでは圧倒的にiPhoneの方が計算速度は速いです。なので、マイコンではデータのみを取ってやってそのデータをそのままiPhoneに送ります。そしてiPhoneアプリで細かい計算を行っています。
せっかくここまでデータを取って回路も作ったのでデバッグ用の簡単な「アプリ」を作りました。

何もない「速度」と「エンジン回転数」を表示するだけのアプリですw
開発言語は「Swift2.0」。iOSはバージョン9.1。開発統合環境はXcode7.1で今の最新の環境を使って開発しました。iPhoneは「6」です。
Swiftも2.0となり大分使いやすい言語になってきました。もうレガシー言語Objective-Cには戻れません…w
この手のアプリはBLEの接続部分のプログラムが複雑で面倒臭いです。一度ライブラリーを作ってしまえば、表示プログラムなんぞは1時間もあれば作れちゃいます。
実際にアプリを作って車に乗り込み使ってみました。

クルマについているメーターと照らし合わせても大きな違いもなく正常に「速度」「回転数」を指していると思います。
なので、上記の考察はあってる……多分。
通常の走行での表示は全く問題なしですが、強めにアクセルを踏み込むとおかしな値を示します。これはおそらくノイズを拾ってるんだと思う。時速250kmとか15,000rpmとか…。
回路側でこのノイズ除去処理を考えると色々面倒くさいので本番のソフトではある程度ノイズを無視するフィルターを作ってやります。
クルマとの接続は、もちろん無線で接続しているのでこんな風に配線無しで表示できてしまいます。
ちなみに、このBluetoothモジュールは送受信ができるので、今回はiPhoneへ送信だけですが、逆にiPhoneからの操作ってこともできます。遊び道具としては面白い。
また久々に凝ったアプリも作りたいしもう一度「カーモニター」アプリVer.3を作ってみます♪