車の復活に向けてフルコンを準備しておりますが、
エンジンの制御を近代化するだけではなく、メーター周りの配線も
近代化したいと考えています。
せっかくCANが実装されているのだから、
センサー情報はできるだけ、ECUにすべて入れて、CAN経由で
メーターに表示させれば、メーター周りの配線はCAN線2本と12V(バッテリー)とGND(アース)の4本だけで済みます。
古い車のハーネスはどうしても線数も接点数も多く、それが故障や不調の原因になります。
今までの配線は
- ECU用センサ → ハーネス → ECU →メーター
- メーター用センサ →ハーネス → メーター
の2系統があるのですが、最終的には
- 全センサ → 新規ハーネス→ フルコン → CAN → メーター
としたいのです。
そうなると、CANからどうやってデータを取り出してメーターを駆動させるかです。 古い車のメーターの入力は電圧かパルス信号です。そういう意味で言えば、CANとメータの間は
- CAN → D/A(またがパルス出力) →メーター
という変換機が必要になります。
ということで、今どきのマイコンを勉強しようかな、と思って、さっそく散財投資しました。
安くて環境が整っているマイコンということで、Arduino UNO を使おうかなと思いました。
理由は、基本的に5V系のTTL/CMOSロジックで動作させられることです。
昨年登場したArduino Uno R4系で、CANバスも内蔵しているminima を買いました。
実売で、1台あたり3000円ちょいでした。 CAN 周りを扱う場合、1台では実験ができない場合があるので、2台まとめ買いです。
昔はマイコンを使うにしても、ハード側の機能実装は自分で回路を組む必要がありましたし、プログラミングも、命令実行サイクル数とバスタイミングなどをすべて計算しながらプログラミングミングしていましたが、いまはCPUクロックが充分高いので、CPUの命令実行サイクル数とか気にすることないし、ライブラリも充実しているので、ゼロからインターフェース回路の制御プログラムを書き起こす必要もなく、プログラムもC言語やそれに近い高級言語でコーディングができるのですから、便利になったものです。
ROMライタとか使った焼きこみも不要でUSB刺してそのまま焼くだけ。統合環境でコーディングしている限り、焼いているという自覚すらありません。ブートローダも意識する必要ないです。ハードも、SPIかI2C インターフェースのインターフェースを持つミニボードを買ってくれば素人でも回路を組まずに配線をつなぐだけでセンサもアクチュエーターも制御できてしまう時代です。
と、いうことで、30年前(40年前)のマイコン時代のハード実走とか、プログラミングの知識なんてカビが生えたようなものを後生大事にするつもりはないので、まずは「新しい流儀」に触れてみようと思います。
とりあえず4行×16文字のLCDをI2C接続し、バイクの水温センサを
5V 1KΩのプルアップでArduinoのアナログポートにつなぎこんで
表示させてみたり、タイマ割り込みのプログラム書いてみたり、AD変換を取り込んだり、
それをLCDに表示させてみたりしてみました。
LCDの水温表示26.05℃(=センサ温度=気温)と、後ろにある温度計の値(26.3℃)も
大体あっているし、割り込み制御もまともに動いています。LCDの部分消去/書き換えとか、数字の桁の右寄せなどもサブルーチン化して処理しているけれど、割り込み処理の合間で問題なく動いてくれています。
Arduino IDEも初めて使いましたが、環境自体はほぼすべて直感で使えるし、プログラミングもCとか使っていたことがあれば他人のArduinoのプログラムを何本か眺めてみれば、普通に書けちゃいますね。
しかし、32ビットっていうのは計算するときにも十分すぎます。マイコンっぽくないですね。
続いて、CAN トランシーバーをつないで、CAN接続してECUからエンジン回転/車速や油水温データのブッコ抜きをやってみようと思うけど、
まずは、我が家の普通の車(smartとか、Golfなど)のOBDから
データを吸い出して外付けメータの制御をできるかやってみるかですね。
CAN トランシーバーも、何枚か基盤を買ってあります。
CANバス増やすときは、CAN コントローラとトランシーバーの両方の追加が必要です。CAN コントローラー+トランシーバーの両方が搭載されているのは、こちらのタイプの基盤です。
実はトランシーバー単体よりもCAN コントローラー+トランシーバーのほうが安く買える今日この頃。回路も簡単なので、中華製でも品質的に問題無いです。