Arduinoシフトポジション付きOLEDメーター大改造

DSCF6931.jpg

Arduinoを使って、いろいろ勉強しながら作ったカスタムメーターも、だんだん調子が悪くなってきました(写真右)。頻繁にフリーズし、そして遂に、何も表示されなくなったので、思い切って作り直すことに。

まず、アナログポートを使うため不安定になりやすい電圧計と温度計を省略し、エンジン回転数、車速、各種ランプ系統など、デジタル入力のみにすることで、負荷を減らし回路も単純に。Arduinoの上に載せるシールド一枚に収めて、小型化しました(写真左)。

arduino9.jpg

右のEtherポートは、センサー基板につながって、5Vとアースを供給。処理済みのエンジンパルスと車輪の回転パルスを受け取ります。左のポートはメーター表示部に接続して、ニュートラルランプ、オイル警告灯、ウインカーランプと直結。真ん中の白いICは、これら表示ランプの12V系と、Arduinoの5V系を分離するためのフォトカプラです。内部のLEDが壊れたときのために、ICソケットに挿してある贅沢仕様。Arduinoで処理したデータは、同じケーブルを通じてカウル内のOLEDにI2C接続。ケーブルはカテゴリー7のノイズに強いタイプに。

DSCF6935.jpg

ポーチに挟んで浮遊状態にすることで、振動を軽減(かえって揺れてる気もする)。Etherケーブル等の引き回しも見直してみました。

DSCF6932.jpg

表示部もチェックして、オーバーホール。壊れやすいOLED基板は簡単に交換可能です。速度、シフトポジションの他にエンジン回転数も表示。

DSCF6937.jpg

ここまでやっても表示がたまに乱れてがっくり。まあ、バイクはノイズの塊ですし、仕方ないのだけれど、、、。メンテナンス性は以前とは段違いですから、トラブルが起きたらまた直せばいいやと思ってます。

IMG_2274.jpg IMG_2275.jpg

I2Cのケーブルにつけるプルアップ抵抗(5.1k)の効果。Arduinoの内部プルアップ(左)よりも、外部でプルアップしたほう(右)が信号の立ち上がりがきれいになっています。ところが、このテスト中にオシロスコープが故障。この際なので、秋月のカラーオシロスコープキットファンクション・ジェネレータをポチりました。それにしても、このOLEDのI2C信号、キタナイ、、、、。

(追記20170102)
IMG_2290.jpg IMG_2258.jpg


オシロスコープは復活しました(ジャンパピンのハンダ不良でした)が、ボードの不安定要因は特定できていません。I2Cのクロックを落としたらどうかと、Wire.setClock()なども試してみましたがうまくクロックが落ちてくれない。こうなったら安定を求めるのではなく、エラーが出たらArduinoのボードごとリブートするしかないと、WatchDogライブラリーを導入。ループごとにI2Cにダミーデータを書きこんで強制的にエラーを顕在化し、結果的にループに2秒以上かかった場合にソフトウエアリブートするようにしました。強引な方法ですが、通信エラーが避けられない状況ではこういうのもありかと。そんな苦労を忘れるために、漢字表示させたり、ブート画面にホンダロゴを表示させたりして、フリーズから気をそらす工夫をしています。解決への道のりは長そう。

(追記 2017/1/7)
ファンクションジェネレータが来たので、とりあえず組み立ててみました。ボタンがしょぼいけどなかなか楽しい装置です。

DSCF6941.jpg DSCF6943.jpg

しかし、いろいろな周波数の矩形波を入力して何時間プログラムを走らせてみてもまったくフリーズしません。仕方がないので、PCにつないだままバイクの上に乗せて、エンジンをかけるとあっけなくフリーズします。むしろ、Arduino単体の時より悪くて、I2CだけでなくPCの画面上のシリアルモニタからして止まります。この場合、PC-Arduino系はバイクの電気系統とはフォトカプラで絶縁されていますから、これはもう、USBも含めてシリアル通信に使っているケーブルに乗ったノイズが原因としか思えません。シリアルがオープんになってアンテナになりそうなUSB給電をやめて、12Vを直接ArduinoのVinに接続してみたら、ちょこっとマシになりました。ノイズに弱いシリアル接続は、バイクだと苦労します。

【u8gライブラリを使う場合のI2Cのクロック変更について 2017/3/15】
 ようやく、I2C通信の周波数を下げる方法を発見し検証できたので追記します。u8gライブラリ自体が内部でWire.begin()しているためにクロック変更できなかったのですが、最初にu8gの描画を呼び出した直後に、Wire.setClock()することでクロックを変更できました。

void setup()内で

u8g.firstPage();
do {
draw0();
} while( u8g.nextPage() );
delay(500);
Wire.setClock(40000L);//ここでクロック変更 40000L = 40kHzが設定可能な最低周波数

という感じで、最初のu8gの描画関数呼び出しの直後に、一回だけ40kHzに設定してやれば、以降は何度呼び出しても40kHzのままであることを、オシロスコープで確認できました。実際に走行してみても、前に比べてとても安定しており、ほぼ固まることがなくなりました!
関連記事
スポンサーサイト

コメント

非公開コメント

habingovt

2ストバイク(RZ250R&SDR)をおりてから二十余年。仕事で体調を崩したときに、友人からVT250Fというバイクを譲り受けました。4半世紀を生き抜いてきたバイクにまたがり、ふたたび走り始めたら、なんだかだんだん楽しくなって、バイクも自分も元気になってきました。目標は、YouTubeライブをしながら北海道を自由に走り回ること。いつ倒れるかも分かりませんが、生暖かい目で見守ってやってください。Twitter & tipmona @habingofit