まずは水温とエンジン回転数の取得方法を説明します。今回車両のOBDコネクタに繋ぎましたが、これは元々カリフォルニア州の法律で設置が義務付けられ、その後世界各国で法制化されたコネクタの規格になります。
で、このカリフォルニアの法律では、コネクタの形状、ピン配だけでなく水温や車速、回転数といった情報も読み出すことができるように、通信のフォーマットも決めています。そのため、基本的には1990年代以降の車では、同じ方法でこれらの情報を読み出すことが可能です。
で、その規格がSAE J1979になるんですが、この規格の内容は、関連情報URLに書いた、英語版のWikipediaが一番わかりやすいので、こちらを参考にしてください。(Google先生に翻訳してもらえば、誰でも読めるかと思います。)
とはいえ、実際に取得する方法には読んでもわかりにくいので、水温の取得方法に絞って、説明していきます。
まず、水温情報を取得するには、水温情報を持っているECUにリクエストしなければいけません。このリクエストするメッセージフレームをCANドライバに渡しているところが下記になります。
rx_frame.FIR.B.FF = CAN_frame_ext;
1)CANのメッセージID長の設定
CANのメッセージIDの長さには、11bitと29bitの二種類があり、Freedの場合は29bitの拡張IDと呼ばれるものを使ってます。この行では、CANドライバに送信する、メッセージID長を拡張IDにしますよというフラグを立ててます。
rx_frame.MsgID = 0x18db33f1 ;
2)CANのメッセージIDのセット
ここで、次に送信するメッセージのIDとして、「0x18db33f1」という機能アドレスを設定しています。このIDにすると、「誰でもいいから水温わかる人返事して」みたいな呼びかけをすることになります。(実際このメッセージを送ると、2つぐらいのノードから返事が返ってきてました。)
rx_frame.FIR.B.DLC = 3;
3)CANのメッセージ長のセット
ここでは、IDに連なるCANのデータ長を3バイトにしています。ここで、CANは8バイトまでのメッセージ長を許すのですが、実際には次の最初のデータバイトで長さを指定していますので、8バイト送ったとしても特に問題は起きません。結論としてここでは、3~8のうちの何の値でも特に問題はないです。(指定しなくても問題ないかも?)
rx_frame.data.u8[0] = 0x02;
4)1バイト目のデータの指定
ここからが本当の送信データの中身になります。ここで、「02」を送ると受け取り側は、そのあとに続く2バイトが要求だということがわかるということになります。
rx_frame.data.u8[1] = 0x01;
5)要求するサービスの指定
SAE J1979では下表の10個のサービスが規定されています。今回は現在値を読み出すため、サービス0x01を利用することになるので、2バイト目に数値として0x01を指定しています。
rx_frame.data.u8[2] = 0x05; // Request coolant temperature
6)要求するPIDの指定
PIDには200個近いものが用意されています。今回はこのうちのエンジン水温を読み出したいので、WikipediaにあるPIDの表(下表)から、0x05の値を送信しているわけです。
この応用で、回転数が見たければ0x0Cをここに入れればよく、車速は0x0D、吸気温0x0F、外気温は、0x46といった具合です。
Posted at 2020/11/20 20:09:42 | |
トラックバック(0) | 日記