• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

まるにつたの愛車 [マツダ アクセラスポーツ(ハッチバック)]

整備手帳

作業日:2023年8月27日

車両情報を表示するディスプレイ製作・設置

他の整備手帳を見る 他の整備手帳を見る

目的 チューニング・カスタム
作業 DIY
難易度

初級

作業時間 6時間以内

1
シフト位置等をリアルタイムで表示する自作のディスプレイを改良しまして、CAN-busで取得したデータを表示できるようにしました 

今のところ、冷却水温、吸気温度、エアー流量、電源電圧をCANから読み取って表示できます 

その他にロービーム点灯状態、ウォッシャー液残量警告などが通知エリアに表示されます 

表示パネルの大きさは27mm×27mmで、本体のインパネ表示にかぶらないギリギリの大きさです 
ー・ー・ー・ー・ー・ー・ー・ー・ー・ー
【2023.9.3追記】
動画を追加
2
ドライバ1はCANデータの読み取り等を行うもので、クラスタスイッチの下あたりのロアーパネル内に設置した

ドライバ2はシフト位置検知等を行い、ドライバ1から無線で送られてくる情報と合わせてディスプレイに表示するもので、センターコンソールの下に設置した

いずれのドライバも過去に製作したものを一部改良して作り直した


↓これら2つのドライバに関する過去の整備手帳
https://minkara.carview.co.jp/userid/2985560/car/2597060/6383960/note.aspx
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:制御モジュール電圧

イイね!0件




タグ

関連整備ピックアップ

錆除去&塗装

難易度:

クーラント交換

難易度:

オイル交換DIY32、ブレーキクラッチエア抜き

難易度:

バッテリー交換

難易度:

夏タイヤ交換

難易度:

オイルとフィルター クラッチフルード

難易度:

関連リンク

この記事へのコメント

2023年8月27日 16:55
こんにちは。こんな感じでOBDから取得したいな〜と思いましたが、中々テクニックが必要そうですね。試行錯誤で完成させられるって凄いです!
コメントへの返答
2023年8月27日 17:37
ありがとうございます

試行錯誤といってもネットの情報をあさりまくって、できそうな方法をいろいろ試してみてって感じです

クイズというかパズルみたいに考えて策を練る過程を楽しんでおります!

プロフィール

マツダ車オーナーになってずいぶんと経ちました。 ほとんど毎日クルマいぢりを楽しんでいます。 どうぞよろしくお願いします。
みんカラ新規会員登録

ユーザー内検索

リンク・クリップ

車高調異音対策ついでにハブ回りのお掃除 
カテゴリ:その他(カテゴリ未設定)
2024/01/09 07:05:57
排ガスやべ~😱 
カテゴリ:その他(カテゴリ未設定)
2023/12/25 07:30:53
DVDレスのコンソールに交換 
カテゴリ:その他(カテゴリ未設定)
2023/10/11 03:51:42

愛車一覧

マツダ アクセラスポーツ(ハッチバック) マツダ アクセラスポーツ(ハッチバック)
マツダ アクセラスポーツのソニックシルバーです。 純正マツダスピードのエアロ一式着けてま ...
トヨタ マークX トヨタ マークX
とにかく快適ないい車でした。
ヘルプ利用規約サイトマップ

あなたの愛車、今いくら?

複数社の査定額を比較して愛車の最高額を調べよう!

あなたの愛車、今いくら?
メーカー
モデル
年式
走行距離(km)
© LY Corporation