そうそう変わるもんじゃねえな (前略、ドイツにて。あらため) -7ページ目

そうそう変わるもんじゃねえな (前略、ドイツにて。あらため)

ゆるーく日常をつづります。と言いながら、6年ぐらいほったらかしにしていたブログ。2018年に入ってから思うところあって復活したけれど、とりあえず三日坊主の危機は脱出。でも、あまり更新しないなぁ。

マイコンで何かを制御したいと考えたとき、最終的にやりたいことから

必要なものを洗い出してそれを習得する。

 

やりたいこと:

車両のエンジン回転数や車速をCAN経由で古い車のメーターを使って表示させたい。

先日、古い車両のメーターの例として初代GSX1300R 隼のメーターを引っ張り出してきて調査した結果、0V-5Vの矩形波で動くことを確認しました。隼は私が20代後半~30代前半で登場したわけですが、衝撃的でした。が、すでに25年近い月日が経過しているのですよね。(しみじみ)

車の復活に向けた電子工作(3) 初代GSX1300R 隼のメーター解析。 | そうそう変わるもんじゃねえな (前略、ドイツにて。あらため) (ameblo.jp)

 

 

Arduinoを使って、メーターを駆動させるにはArduinoで矩形波を出力させる必要があります。可聴帯域の矩形波ならばtone関数でも実現できますが、いろいろと制約があるので、今回は使いません。

 

王道のタイマ割り込みをするにあたって調べたところ、R4系の標準ライブラリにはFspTimerというclassがあり、こいつを使うことで、タイマの割り当てやタイマ割り込み処理などを簡単に設定できるようです。

 

例のごとく、ルネサスのアプリケーションノートやWebから、FspTimerを使ってLチカさせているようなスケッチ探してきて、それをデジタル11番や12番ピンを叩くように改造するパターンで、プログラム(スケッチ)を書きあげます。

 

割り込み間隔は、お試しで50μs毎に設定し、割り込みごとにカウンタを回して目的の周波数の周期の半分以上の時間経過を条件に出力ポートのレベルを反転してカウンタをゼロにするだけの「基本中の基本」的なタイマ割り込み。

これならシンプルゆえに割り込みを5μs毎にしても取りこぼしなく動くでしょう。隼のスピードメーターの300km/h付近の周波数(400Hz前後)で、分解能を1Km/hを実現しようとすると、最終的にはそのぐらいの割り込み処理が必要だけど、まあ、時速300km/h出すわけでもないし、50μsの割り込みでも、タコメーターは、10000min付近で100min-1の分解能があるので、今のところは50μs毎の割り込みで充分かなと思ってます。

 

プログラム(スケッチ)は書くまでもないので、省略。

 

というか実験的に動かすだけだからと、あまりにもプログラムが汚すぎて、お見せできるような状態ではないというのが正しいです。

 昔々のポケコンで1行basicプログラムというものがありまして、そのノリで、条件判断を4重入れ子ぐらいにしたものを1行で書いちゃったりとか、まあ読みづらいです。今どきの判りやすいプログラミングを真っ向から否定するような書き方なので、、、、。

 

まあ、そんなこんなで、とりあえず動作確認し、一定の間隔で、uint16_tで読み取った車速やエンジン回転を使って50μs毎に発生する割り込みをカウントしながら、矩形波を車速用と、エンジン回転用の2チャンネル分作成し、出力することはできました。

 

 

Arduinoから2000rpmと40Km/hに相当する矩形波の同時出力

Arduinoから4000rpmと80Km/hに相当する矩形波の同時出力

 

ただし、微妙に応答性が悪いことが気になりました。

これはArduino側の問題ではなく、初代GSX1300R 隼のメーターの問題です。

 

タコメーターは2000min-1→4000min-1に動く際に、最初の0.2秒で3200min-1まで動いてから、指針が4000min-1で完全に止まるまでに0.7秒要しています。

車速は40m/h → 80km/hの変化に対して、0.2秒で58km/h(変化量は18km/h)、0.4秒で63km/h(0.2秒から0.4秒までの変化量は5km/h)、となって、速度指示値が止まるまでに信号を入れて1.7秒かかりました。

 

まだ、詳細にメーターの構造が解析できていませんが、おそらくメーター側の電子回路側でレスポンスを落としていますが、針の脱調を避けるための加速度制御ではないように思います。

 

隼の整備書を読むと、メーターの駆動には、(構造的には)3相ステッピングモーターを使っているようなのですが、励磁回路が少し特殊で、2相同時通電で、回転角センサで2相間の電流にフィードバックしているようなのです。

ステッピング角内の任意の角度にローター(針)を動かすために、3相の磁気回路の2相を同時に使って2相間の磁力を電流(電力)制御してステッピング各以外の任意の角度にローター(針)を動かしているようです。 2つの磁気回路の磁力差でローターの角度を決めている状態なので、ローターとステーターの空隙が大きく、ブレーキトルクなんて議論できるようなレベルではないです。特に2相の中間にローターがいるときの空隙が最も大きく、保持トルクは弱いです。 だから、針を大きく動かすときは素早く動かせるのだけど、そこから先の針の位置の調整に時間がかかるというメーターのようです。

 

果たしてこれをステッピングモーター駆動といえるのかどうか悩ましいです。と、同時にメーターとしてのレスポンスはどうしようもないということです。インターバル撮影で記録したメーターの針の動きの写真を並べますが、初代隼のメーターは、エンジンと車体の能力に対して動きが追従できていないです。

 

隼とは、0-100km加速2.6秒とかいうような乗り物です。このスピードメーターでは動きが間に合っていません。タコメーターは、ゼロヨン負荷条件(1速)ならば、動きとしてはぎりぎり追従できるかなぁ、という状態ですね。  

 

 

0.0秒=2000min-1、40km/h  →  4000min-1、80km/hの信号を入れた瞬間。

0.1秒

0.2秒

0.3秒

0.4秒

0.5秒

0.6秒

0.7秒ここでタコメーターがようやく4000min-1で安定。

1.0秒

1.7秒 速度も目標値(80km/h)に到達して安定。

 

 

今考えているのは、追従性が悪いメーターでも、先読み制御でコントロールすればレスポンス上げられないかな、ということです。オーバーシュート気味に変化させるというか、エンジン回転に対してのメーターの指示値の応答遅れを疑似的なPID制御でどうにかできないかな、と思っています。でも、トルクが足りなくて、オーバーシュート気味に目標値を設定しても追従スピードが上がらないかもしれませんが。。。。

 

今やっている実験のゴールは隼のメーターのレスポンスをよくしたい、といういう話ではないので、どこまで取り組むか悩ましいところですが、隼のメーターの隅っこに「NS」というロゴがあるので、製造は日本精機でしょう。日本精密製のメーターはいろいろな車に使われているので、同じ構成のメーターを載せた車両で、メーターの応答遅れを改善したい、と思っている人には、(疑似)PIDで解決することができれば、面白いかな、と思います。

 

ArduinoでCANのデータを抜く前に、Arduinoに繋ぐ自動車用のメーターを用意しないといけません。

 

物置を探してみたら、初代GSX 1300R 隼(ハヤブサ)のメーター(ジャンク)があったので、そいつを動かそうかなと思います。資料を探したのだけど、どこにも隼スピードメータのピンアサイン表(16ピン)が存在しません。

整備解説書を見たのですが、メーターパネルに接続される線はピン番号ではなく、ハーネスの色で書かれていました。実物のハーネスがあれば配線の色からどのピンに何の信号を入れればいいのかが解るというもの。

 

しかし、手元にあるのはメーター本体のみ。車体側のハーネスなんて持っていません。

となると、基板のパターンから追いかけるしかない。、

仕方ないので、スピードとタコメーターだけ動かすのに必要な線だけ拾い出しました。

 

解析結果::  下図

黒線(8番)と白線(9番)はGND,

オレンジ線(6番)が12V()IGN)、

黄色線(15番)はタコメーターです。信号は5Vピークの矩形波。

線を刺していませんが、13番ピンがスピードメーターです。信号は5Vピークの矩形波。

 

そのほか、今のところ分かっているのは、6番ピンをGNDに落とすとオイル警告灯がONです。4番ピンは、12Vを入れると、メーターの透過照明ONです。3番ピンをグランドに落とすと、ニュートラルランプONです、

 

この配線はGSX1300R 隼 の純正のハーネスの配線色とは違います&私の手元のジャンクメーターの解析結果で、正しいかどうかは保証できません。

上記コネクタ、(メータ裏向かって左に爪)とすると、爪のある近い列のピンが下から1番ピンで一番上(プリント基板の縁に近い側)が8番ピン,詰めの無い側の一番下が9番ピンで、一番上(基盤の端に違い側が16番ピン) ピン番号の根拠は、表面のシルクスクリーンCN1の上にあるプラスねじの左右の数字の番号に基づいています。(下の写真)

 

とりあえず、液晶に「CHEC」(警告)は出ていますが、12Vとグランドをつなぐと、

オープニングアクション(メーターがゼロからフルスケール迄動いてから再び

ゼロになる動作)をおこないます。

15番ピンに0-5V矩形波を流し込む。190Hzで12000rpmとなっている。

13番ピンに0-5V矩形波を流し込む。100Hzで80km/Hとなっている。

 

とりあえず、隼のスピードメーターとタコメーターをCANで動かすのならば、データをパルスの周波数に変換できればOKそうです。

 

車の復活に向けてフルコンを準備しておりますが、

エンジンの制御を近代化するだけではなく、メーター周りの配線も

近代化したいと考えています。

 

せっかく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 コントローラー+トランシーバーのほうが安く買える今日この頃。回路も簡単なので、中華製でも品質的に問題無いです。