目的 |
チューニング・カスタム |
作業 |
DIY |
難易度 |
初級 |
作業時間 |
6時間以内 |
1
シフト位置等をリアルタイムで表示する自作のディスプレイを改良しまして、CAN-busで取得したデータを表示できるようにしました
今のところ、冷却水温、吸気温度、エアー流量、電源電圧をCANから読み取って表示できます
その他にロービーム点灯状態、ウォッシャー液残量警告などが通知エリアに表示されます
表示パネルの大きさは27mm×27mmで、本体のインパネ表示にかぶらないギリギリの大きさです
ー・ー・ー・ー・ー・ー・ー・ー・ー・ー
【2023.9.3追記】
動画を追加
2
3
ドライバ1でCAN-busから車両情報を読み取っているが、その方法について簡単に記しておく
CAN-busにはエンジン回転数や冷却水温度などの情報が常に流れているが、そのデータ種類はPID(Parameter ID)という数値と対応している
ただ、このPIDはメーカーや車種毎にバラバラで公開もされていないので、流れているCANデータから車両情報を読み取るのは素人には難しい
しかし、図のように基本的な車両情報に関してはPIDが規格で定められており、このPIDをCAN-busに流すと対応した情報が返ってくるようになっている
例えばPIDを0Cにしてリクエストするとエンジン回転数が返ってくる
この方法を使ってドライバ1で車両情報を読み取るArduinoのプログラムの一部を下に示す
//必要なライブラリ
#include <CAN.h>
#include <OBD2.h>
//車両情報の読み取り
coolantTemp=OBD2.pidRead(0x05); //冷却水温 PID=0x05
intakeAirTemp=OBD2.pidRead(0x0f); //吸気温度 PID=0x0f
airFlowRate=OBD2.pidRead(0x10); //エアー質量流量 PID=0x10
controlModuleVoltage=OBD2.pidRead(0x42); //モジュール電圧 PID=0x42
他にもいろいろな車両情報が得られるようだ
ただ、あまりリクエストを多くしてECU等に負荷をかけるとよろしくないようなので、リクエストは1秒に1回に制限した
4
ドライバ1で取得した情報は無線通信でドライバ2へ送っている
プログラムは試行錯誤したが、下のように構造体として送受信するとうまくいった
【送信側(ドライバ1側)】
struct PayloadStruct {
byte dt,dt2;
float cltemp,iatemp,afr,cmv;};
PayloadStruct payload; //通信用構造体
radio.write(&payload,sizeof(payload))); //送信
【受信側(ドライバ2側】
struct PayloadStruct {
byte dt,dt2;
float cltemp,iatemp,afr,cmv;};
PayloadStruct payload; //通信用構造体
if (radio.available())
radio.read(&payload,sizeof(payload)); //受信
5
車両データは1秒に1回のペースで表示を書き換えるようにしたが、画面がちらつかないように書き換えるのに少し工夫が必要だったので記しておく
使用したディスプレイは1.5インチのフルカラーLCDで、解像度は240x240、SPIインターフェースでドライバはST7789Vである
Adafruitのライブラリを使用したが、読み込みフォントを使ってテキスト表示をさせた場合、前に書いたテキストの上に重なるように描画されてしまう
なので、データを更新して表示させるには一旦前に書いたテキストを消して(黒で塗りつぶして)から新しいテキストを表示させる必要がある
しかし、単にfillRect()関数で塗りつぶすと時間がかかるので、画面がちらついてしまう
解決方法としては、canvas機能を使って一旦canvasに描画したあと、そのcanvas内容をbitmap表示させてやることでちらつきのない書き換え表示が可能となった
該当部分のプログラムを示す
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
#define CVW 120
#define CVH 18
GFXcanvas1 canvas(CVW,CVH); //Text drawing region
・・・
//テキスト書き換え(吸気温度)
dtostrf(payload.iatemp,4,1,stbuf);
sprintf(stwork, "ART %s C", stbuf);
fgc=ST77XX_GREEN; bgc=ST77XX_BLACK;
canvas.fillScreen(0); canvas.setCursor(0,CVH-3);
canvas.print(stwork);
tft.drawBitmap(dsx2[5],dsy2[8],canvas.getBuffer(),CVW,CVH,fgc,bgc);
6
ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー
CAN-busデータを読み取って表示させるのは前からやろうと思っていたのですが、今回やっと実現できました
今後は表示項目を増やしたり、ビジュアルに表示させたりとちょこちょこと改良していこうかと思います
7
【2024.1.5 追記】
先月、表示項目を増やしました
CLT:冷却水温度
ART:エアー温度
MAF:エアー質量流量
IMP:インマニ圧力
A/FR:空燃比
HO2:排気O2センサ出力
CAT:触媒温度
CMV:制御モジュール電圧
[PR]Yahoo!ショッピング
[PR]Yahoo!オークション
タグ
関連コンテンツ( CAN-BUS の関連コンテンツ )
関連整備ピックアップ
関連リンク