ELM327の最近のブログ記事

うまくペアリングできたBTモジュールですが、通信がどうもうまくいきません。

2013-05-28 21.37.37.jpg

オウム返しするだけの簡単なプログラムを書いて、とりあえず9600bpsでPCと接続してみると盛大な文字化け。
通信速度が合ってないようなので、徐々に速度を上げていくと115200bpsで一応は接続できたみたいです。
ただ、いくらなんでも115200bpsは速すぎるようで、ビットがダブってしまうらしい。
化け方が変わってて、文字ごとというかビットの並びで頻度と化け方が決まってます。

0-9 → 1文字ずつ送るとほとんど文字化けなしで応答がくる
a-o →  30%ぐらいの確率で文字化け。化けるときはa→q b→rと規則的できれいにビットがずれてる様子。
p-z → 1文字ずつ送るとほとんど文字化けなしで応答がくる
どの文字も一気に送ると文字化けです。

接続速度を9600bpsや19200bps程度に落とせば安定しそうですが、マニュアルないしどうやって速度を変えるのか不明。
ATコマンドが使えるらしいけど、ATコマンドモードへ移行する方法が謎です。
基板についてるスイッチの意味もよくわからないし。。。

肝心のスマホのUSB端子を壊してしまい、USB HOST機能が使えなくなってしまったのですが、せっかくここまで作ったので、最後の悪あがきとしてこんなものを調達しました。

2013-05-17_00001.jpg
eBayで購入した品がシンガポールから届きました。


中心となるAndroid端末ですが、悩みに悩んで選択したのがこちらです。
2013-04-30_00001.jpg

iNew社製 i2000です。

AVRマイコン周りの回路です。

avr_1.png
AVRマイコンの役割は、シフトLED用信号の出力、電源コントロール部から電源状態の受け取り、CdSセンサー部からの受光状態の受け取りです。これらの機能をUSB経由でAndroid端末に提供することです。

キーをオフにすると、ACC電源に連動するPIC側の電源が先に落ちて、その電圧をAVRのPART-Cの4番ピンにも入れてキーオフを検出する計画でしたが、うまく動作しませんでした。
PIC側の電源が落ちても、何故か4番ピンに1.6Vほど電圧が残り、キーオフを検出できません。
USB側の電源はオンのままなので、どういう経路からか流れ込んできているようでした。

回路図を見てもそのような配線はなく、いろいろ調べたところ、CdSコントロールPICに送っているクロック信号が原因でした。ラッチアップっていう現象でしょうか? 電源を落としたICの入力端子には電流を流してはいけないというルールがありますが、電源オフと同時に出力を止めるので問題ないと思ってましたが、電源がオフになったこと自体が検出できないという結果に。

仕方なく、電源コントロール部を変更して、PIC側に供給する電源とは別にACCオフの信号をAVRに送るようにしました。

power_4.png
RA0ピンから出ているACC DOWNという線です。
AVRマイコンのPORT-C周辺の抵抗も「電源電圧よりも高い電圧を入力してはいけない」のルールに従い追加しておきました。AVRマイコンはUSBのバスパワーで動作し、他のICは別電源ですから同じ5V規格とはいえ微妙な差があると思いますし。

この変更でやっと計画通りの動作になりました。

AVRのプログラムはこちら elm327d.zip
電源コントロールプログラムの修正版はこちら power_v2.asm


シフトLEDと警告灯センサーの回路です。


led.png
こちらはシフトLEDです。
AVRマイコンのRB1-7(上の図ではRB0-6となってますが間違いです)の出力をトランジスタアレイ(TD62083APG)で受けて、外部電源の5VでLEDを発光させています。
LEDは色によって見た目の明るさが異なるようなので、抵抗で明るさを調整しています。

sensor.png
こちらは警告灯センサーです。
外部電源の5Vを抵抗とCdSで受けて按分した電圧を、環境光用のCdSの電圧とコンパレータで比較し、結果をマイコン(PIC16F88)に入力しています。
環境光用のCdSにつながる抵抗は半固定抵抗にして、感度の調整ができるようにしてみました。
実際に試してみると、CdSの感度のバラつきが結構あり、多めに購入したCdSからできるだけ特性のそろったものを選別して使用しています。

マイコンでは、入力された12ビットのデータをシリアルデータとしてAVRマイコンに送信しています。
シリアル通信の形式はこんな感じです。
serial.png
CSとCLKはAVR→PICで、DATAはPIC→AVRです。
AVR側からCSを1にした後、CLKでクロックを送ります。
PIC側ではCSが1になるのを待ってから、CLKが0→1でCdSのデータをDATAに出力し、CLKが1→0になるを待ちます。
これを12回繰り返して最後にCSを1→0にして1回の通信が完了します。
CLKの周期は少し余裕をもって400マイクロ秒にしていますので、1回の通信に要する時間は約4.8ミリ秒です。
連続して通信すると、最大毎秒20回ですから警告灯センサーの用途としては十分な速度です。

この構成だと、固定抵抗1個では調整が難しいようで、少し不安定な反応となってしまいましたが、とりあえずこれで試してみるつもりです。実験結果によっては、CdSをフォトダイオードに変えないとダメかもしれません。

2013-04-15 2 09 13.jpg

2013-04-15 2 09 13c.jpg

PICのプログラムはこちら

標準のメーターパネルを覆ってしまうので、警告灯の表示を別の位置に移動させないと見えなくなってしまいます。

2013-02-15 23 20 32.jpg

純正のパネルでは、警告灯のほかにウィンカーやライト状態など14個のLEDが装備されています。
このうち、下段の右から2番目の「横滑り注意」はクルマのオプション設定で機能しません。また左側のガソリンマークは警告ではなくアイコンなので不要。その下の温度警告はELM327にも来ているクーランと温度で代用できます。
残る11個の信号をとらえてをAndroid端末内に表示する事にしました。

2013-03-20 20 20 52.jpg

メーターの後ろの配線から信号を引き出してもいいのですが、それだと気軽に脱着ができなくなりますし、クルマ側の配線をいじって壊しても面倒です。そこで、このCdS素子を使って発光状態を光学的に読み取ることにしました。

2013-03-30 15 06 57.jpg

メータパネルのベースボードです。ここにCdS素子をちょうどLEDの真上に来るように埋め込みました。

2013-03-30 15 07 13.jpg

13個と2個余分なのは、横滑り警告灯のところにも誤って付けてしまったのと、メーター照明の影響を避けるため、環境光を測定するために追加したためです。警告灯は、環境光を測定するセンサーよりも明るい光を当てた時だけ反応するようにしました。


シフトアップのタイミングをLEDの点灯で教えてくれるシフトLEDです。
このパネルをAndroid端末にかぶせて使います。

2013-04-15 2 08 09.jpg
左右7個のLEDは端から緑緑緑黄黄赤赤 赤赤黄黄緑緑緑とならんでます。
エンジン回転数と連動して点灯し、低回転では緑色、高回転では赤が付きます。赤が点いたらシフトアップです。

2013-04-15 2 08 41.jpg
裏面は配線隠しと端末の液晶面の保護を兼ねて、フェルト貼りです。


電源コントローラです。

写真 2013-03-30 14 51 11.jpg

車載機器の電源は細々とした制御が必要になります。
この電源コントローラの機能は、こんなふうです。

2種類の電圧出力
クルマの電源は12Vバッテリーですが、停止中は13Vから13.5Vほどで走行中は14Vから15Vぐらいの電圧になります。
この電源からマイコンやセンサーを動作させるための5Vと、Android端末を動作させるための3.7Vを出力します。

・3.7Vライン
Android端末の電源はUSB端子で供給するので通常5Vですが、今回はUSB端子を通信用に使用するので使えません。
そこで、うまく動作するのかわかりませんがクルマのバッテリーをそのまま端末のバッテリーにしてしまおうと、端末で使われているリチウムイオンバッテリーと同じ3.7Vに降圧した電源を直につなぐ計画です。

・5Vライン
こちらは、マイコンやLEDの点灯用なので容量はさほど必要ではありません。

キー連動
5Vラインの方は、クルマのキーに連動してON/OFFになります。単純な連動だと電源の電圧変動に弱いので、タイマーでアクセサリー電源の電圧を監視しています。
電圧が低下して2秒間後に、パイロットLEDを点滅させ、10秒後に供給を止めるようになっています。

電圧監視
Android端末は起動に時間がかかるので、常時起動のままにする予定です。
でもそれでクルマのバッテリーが上がってしまっては不味いので、バッテリー電圧を監視しています。
13.5Vを下回るとLEDがゆっくり点滅して、電圧低下信号を端末に送ります。
13.0Vを下回るとLEDが早く点滅して、10秒後にすべての電力供給を停止します。

power_ctrl.png
回路図です。
端末の消費電力いかほどかわかりませんが、大きい画面サイズの機種ではパソコンのUSBからでは充電できないので、200mA以上は流れるようです。市販のUSB電源アダプターでは、iPad対応の大出力をうたう製品で1Aほどで多くは500mA程度のようです。12V電源から3.7Vを4Wで出力すると、3端子レギュレータでは損失がばかになりませんので、5Vへの降圧にはスイッチングレギュレータを使っています。

電圧の監視とON/OFF制御にはPIC16F88を使用し、A/Dコンバータで電圧を測定してリレーを制御しています。
5Vから3.7Vに降圧するレギュレータPQ20RX11にもスイッチ機能があるので、3.7Vラインのリレーは不要だったのですが、機械的にカチッ!と音がする方が好きなので。

写真 2013-03-24 23 10 30.jpg
基板部品面
レギュレータの放熱器が大きすぎてケースに入りませんでした。今はケースにICをねじ止めしてケースから放熱するように変更してあります。

写真 2013-03-24 23 11 12.jpg
基板配線面
まだまだ下手ですが、だいぶ配線ができるようになってきました(笑)

写真 2013-03-30 14 51 31.jpg
ケース背面

左から、電源入力、3.7V出力、5V+電圧低下信号出力です。
トップ写真の前面は、左が強制電源ONスイッチ、右が主電源スイッチ、中央がパイロットLEDです。

PIC16F88のプログラムはこちら (power.asm)

車載PC Playerの制作も途中ですが、こんどはクルマのメーターパネルを作ってみることにしました。
きっかけは、ELM327 Bluetoothアダプタを買ってみたことで、これを使って遊んでみようという単純なお話です。

クルマ系の話題なのでみんカラの方に少し前から書いていましたが、だんだん工作面が強くなってきたのでこちらで書くことにしました。

2013-01-31 12 08 28.jpg

これをクルマのOBD2ポートに接続すると、Bluetooth経由で主要なデータを取得することができます。
例えば、エンジン回転数、冷却水温度、走行速度、などなど。

5fdd8fe8dd.jpg
これが標準状態のメーターパネルです。

c004cb673c.jpg
ここに適当な大きさのAndroid端末を置いて、

96337d2ead.jpg
オリジナルアプリでELM327から受信したデータを表示します。

6e59458323.jpg
周りをお化粧すると出来上がりという計画。


link.jpg
全体の構成はこんな感じで。


現在の進捗は、Androidアプリの作成がほぼ完成して、周辺機器と格闘しているところです。

2023年10月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
OpenID対応しています OpenIDについて