CIVIC(シビック)FL1カスタム:FlashPro番外編Bluetoothメーター

このページの目的

FlashProにはスマホアプリ(有料)があって、そのアプリではエンジン等の状態を確認できるようになっている。有料かつスマホを車内で使うのも面倒だという理由から手を出してない。たまたまHondataのサイトを徘徊していた際に、Bluetooth接続の解説資料を見つけたので、それを参考に手作りのOBD2メーターをベースにしてハード改造なしにFlashProとBluetooth接続できそうだし、OBD2通信よりも高速かつ多様な情報を提供してくれそうなので試してみることにした。

目次

必要なもの[2024-03-02]

以下を元手に今回の企画を進めていく。

Hondata FlashPro
純正ECUのプログラムを書き換えるだけでなく、「中の人」的な立場でOBD2接続では取得できないいろんな情報を提供してくれる。
https://hondata.com/products/flashpro/flashpro-civic-2022-int?route=product/product&language=en-gb
自作OBD2メーター
ESP32を使用したOBD2接続の自作データロガー&メーター
技術資料:Hondata Bluetooth Protocol
FlashPro他のHondata製品にBluetooth接続するための技術資料。プログラム例もあり。ただ、微妙に誤記があるので要注意
https://hondata.com/downloads/Bluetooth.pdf

ESP32からのBluetoothでFlashProが見つけられるかの確認[2024-03-02]

まずは、Bluetooth接続そのものができないと話が始まらない。FlashProのBluetoothが「FlashProManager」の「FlashPro」「Bluetooth」タブで有効になっていることを確認したら、下記プログラムを(Arduino-IDE)でESP32に書き込んでみよう。
※ところで、これってどうやって作ったんだ? ChatGPTに教えてもらったような気もするが、全然覚えてない。

#include "BluetoothSerial.h"  // "BluetoothSerial" by Henry Abrahamsen
#include "BLEDevice.h"        //

BluetoothSerial SerialBT;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
  void onResult(BLEAdvertisedDevice advertisedDevice) {
    Serial.print("BLE Advertised Device found: ");
    Serial.println(advertisedDevice.toString().c_str());
    SerialBT.print("BLE Advertised Device found: ");
    SerialBT.println(advertisedDevice.toString().c_str());
  }
};

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32_BT_Scanner");
  
  Serial.println("Starting device scan...");
  SerialBT.println("Starting device scan...");
  BLEDevice::init("");
}

void loop() {
  BLEScan* pBLEScan = BLEDevice::getScan();
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setInterval(1349);
  pBLEScan->setWindow(449);
  pBLEScan->setActiveScan(true);
  pBLEScan->start(5, false);

  // Wait for scan to complete
  delay(5000);
}

実行するとシリアルモニタに近くで見つかったBluetooth機器が表示されるはずだ。その中に「FlashPro」(デフォルト名称はこれのはず)があればBluetoothが使える状態になっているってことだ。

▲目次に戻る

取得可能なデータの確認[2024-03-02]

次は、取得可能なデータの確認だ。必要な情報を抽出しておこう。

FlashProのBluetoothデバイス名(またはMACアドレス)
「FlashProManager」の「FlashPro」「Bluetooth」タブで確認
FlashProのBluetooth接続用PINコード
同上
送信コマンド
「Hondata Bluetooth Protocol」の「2.3 Channel Packet」のあたり

ソースコード

// FlashPro_test01   Get Channel Info

#include "BluetoothSerial.h"  // Bluetoothserial by Henry Abrahamsen

#define MAX_DATA_SIZE 200

uint8_t Address[6] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC};  // FlashProのBluetooth用のMACアドレス(実機に合わせて修正)
const char    *PIN = "1234";                                // FlashProへのBluetooth接続用PINコード(実機に合わせて修正)
String      myName = "ESP32";                               // my Bluetooth name
uint8_t      CMD[] = {0x00, 0x31, 0x04, 0x00};              // 送信コマンド Get channel Info

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  
  bool connected;

  SerialBT.begin(myName, true);
  Serial.println("Bluetooth starting...");
  
  SerialBT.setPin(PIN);
  connected = SerialBT.connect(Address);
  Serial.println("Connecting to FlashPro with PIN_code ...  ");

  while(!SerialBT.connected(10000)) {}
  if(connected) {
    Serial.println(": Connected Successfully!");
  } else {
    Serial.println(": Failed to connect.");
  }
}

void loop() {
  Serial.println("send cmd");
  SerialBT.write(CMD, sizeof(CMD));

  Serial.print("Recieve ");
  uint8_t receivedData[MAX_DATA_SIZE];
  size_t dataSize = 0;
  while (SerialBT.available() && dataSize<MAX_DATA_SIZE) {
    receivedData[dataSize] = SerialBT.read();
    Serial.print(receivedData[dataSize], HEX);Serial.print(" ");
    dataSize++;
  }
  Serial.println(" ");
  delay(1000);
}

これを実行すると以下のレスポンスがシリアルモニタに表示された。

send cmd
Recieve 0 31 82 0 0 1 83 1 1 84 2 1 42 10 1 85 20 1 47 22 1 47 12 1 58 13 1 96 30 1 88 40 1 49 50 1 50 60 1 50 11 2 49 10 2 49 20 3 9E 22 3 9E 30 3 52 32 3 52 40 3 41 10 3 58 10 4 4B 12 4 51 70 1 46 80 1 59 0 2 41 21 4 82 22 4 82 23 4 82 24 4 82 11 4 49 61 1 50 51 1 50 14 1 85 15 2 49 14 2 49 91 1 A0 A0 1 A1 A1 1 A1 15 1 85 90 1 A0 16 1 91 3 B 51 

これは以下の意味を持っている。

意味
0Protocol header(固定値)
31Get Channel Info(を示すコマンド。送信に対するレスポンスで同じ値が返ってくる)
82 0レスポンス全体のバイト数。 「下位 上位」の順。今回は、0x0082=130バイト
0 1 83 1 1 84 ...対応しているデータの種類(3バイトで一つのデータを示す)と、データ取得時の各データの順番。今回はこのデータ部分が126バイトなので取得できるデータは42種類だ。
0 1 830 1 = 0x0100のデータ(後述)、83 = データのサイズ(上位2ビット10=2バイト、単位系0x03(後述)
1 1 841 1 = 0x0101のデータ(後述)、84 = データのサイズ(上位2ビット10=2バイト、単位系0x04(後述)
2 1 422 1 = 0x0102のデータ(後述)、42 = データのサイズ(上位2ビット01=1バイト、単位系0x02(後述)
......以下、同様の考え方......

FL1シビックでFlashProを用いて取得できるデータ

上記レスポンスを「Hondata Bluetooth Protocol」の「3.1 Channel Contents」「3.2 Channel Sizes」「3.3 Channel Data Types」のあたりを参照して整理しよう。

FlashProのデータ一覧。FL1シビックが未対応のものはグレー表示
アドレス名称内容バイト数単位系FL1でのデータ順
0x0100CID_RPMエンジン回転数20x031
0x0101CID_Speed車速20x042
0x0102CID_Gearギヤ10x023
0x0110CID_MAPインマニ圧(絶対値)24
0x0111CID_MAPVoltage MAP voltage
0x0112CID_AFMVoltage AFM voltage10x187
0x0113CID_AFMFlowエアフロ流量値20x168
0x0114CID_BP20x0533
0x0115CID_BPCMD20x0539
0x0116CID_AirCharge20x1141
0x0117CID_AFMFreq
0x0120CID_TPSスロットルポジション10x075
0x0121CID_TPSVoltage TPS voltage
0x0122CID_ThrottlePlateスロットルバルブ開度10x076
0x0130CID_Inj Injector duration20x089
0x0131CID_InjPhase Injector phase
0x0132CID_Duty Injector duty
0x0133CID_Inj_2
0x0140CID_Ign Ignition advance10x0910
0x0141CID_IgnDwell Ignition dwell
0x0150CID_IAT吸気温度10x1011
0x0151CID_IAT_2吸気温度210x1032
0x0160CID_ECT冷却水温10x1012
0x0161CID_ECT2冷却水温210x1031
0x0162CID_ECTCorrection冷却水修正値
0x0163CID_IATCorrection吸気温度修正値
0x0170CID_PA Atmospheric pressure10x0623
0x0180CID_BatteryVoltage Battery10x1924
0x0190CID_FuelPressureCmd20x2040
0x0191CID_FuelPressure20x2036
0x0192CID_FuelDuty
0x0198CID_OilPressure
0x01A0CID_WasteGateCMD20x2137
0x01A1CID_WasteGate20x2138
0x0200CID_VTS VTEC spool10x0125
0x0201CID_VTP VTEC pressure
0x0210CID_VTC_Cmd VTC command10x0914
0x0211CID_VTC_Actual VTC actual10x0913
0x0212CID_VTC_Duty VTC duty
0x0213CID_VTC_Phase VTC phase
0x0214CID_EXVTC_Cmd10x0935
0x0215CID_EXVTC_Actual10x0934
0x0300CID_O2A_V O2A voltage
0x0301CID_O2A_C O2A current
0x0302CID_O2A_Heat O2A heater
0x0303CID_O2A_Heat_R O2A heater resistance
0x0310CID_O2B_V O2B voltage10x1820
0x0311CID_O2B_Heat O2B heater
0x0320CID_Lambda_Lambda空燃比λ20x1E15
0x0321CID_Corr_Lambda Corrected lambda
0x0322CID_Target_Lambdaλの狙い値20x1E16
0x0323CID_Lambda_Lambda_2
0x0324CID_Target_Lambda_2
0x0328CID_Wideband_V Wideband voltage
0x0329CID_Wideband_Lambda Wideband lambda
0x0330CID_ShortTermTrim Short term trim10x1217
0x0331CID_MedTermTrim Medium term trim
0x0332CID_LongTermTrim Long term trim10x1218
0x0333CID_ShortTermTrim_2
0x0334CID_LongTermTrim_2
0x0340CID_ClosedLoopStatus Closed loop status10x0119
0x0341CID_ClosedLoopStatus_2
0x0400CID_KnockLevel Knock level
0x0401CID_KnockVoltage Knock voltage
0x0402CID_KnockThreshold Knock threshold
0x0410CID_KnockRetard Knock retard10x0B21
0x0411CID_KnockLimit Knock ignition limit10x0930
0x0412CID_KnockControl Knock control10x1122
0x0420CID_KnockCount Knock count
0x0421CID_KnockCount1 Knock #120x0226
0x0422CID_KnockCount2 Knock #220x0227
0x0423CID_KnockCount3 Knock #320x0228
0x0424CID_KnockCount4 Knock #420x0229
0x0425CID_KnockCount5 Knock #5
0x0426CID_KnockCount6 Knock #6
0x0430CID_KnockRetard1
0x0431CID_KnockRetard2
0x0432CID_KnockRetard3
0x0433CID_KnockRetard4
0x0500CID_ACSwitch AC switch
0x0501CID_SCS Service connector
0x0502CID_BrakeSwitch Brake switch
0x0503CID_ClutchIn Clutch in
0x0504CID_PSP Power steering pressure
0x0505CID_ELD_Voltage Electrical load voltage
0x0506CID_ELD_Current Electrical load current
0x0600CID_ACClutch AC clutch
0x0601CID_CheckEngine Check engine
0x0602CID_FuelPump Fuel pump
0x0603CID_ReverseLock Reverse lock
0x0604CID_AltControl Alternator control
0x0605CID_IAB Secondary runners
0x0606CID_RadFan Radiator fan
0x0700CID_Datalogging Datalogging
0x0701CID_SecondaryTables Secondary tables
0x0702CID_SecondaryInjector
0x0710CID_RevLimiter Rev limiter
0x0711CID_IgnitionCut Ignition cut
0x0712CID_BoostCut Boost cut
0x0713CID_LaunchCut Launch cut
0x0714CID_LaunchRetard Launch retard
0x0715CID_ShiftCut Shift cut
0x0720CID_PurgeDuty Purge duty
0x0721CID_PurgeOpen Purge open
0x0730CID_BoostControl_Duty Boost control duty
0x0740CID_FTP Fuel tank pressure
0x0800CID_Nitrous1Arm Nitrous 1 arm
0x0801CID_Nitrous1On Nitrous 1 on
0x0810CID_Nitrous2Arm Nitrous 2 arm
0x0811CID_Nitrous2On Nitrous 2 on
0x0820CID_Nitrous3Arm Nitrous 3 arm
0x0821CID_Nitrous3On Nitrous 3 on
0x0900CID_AnalogInput1 Analog 1
0x0901CID_AnalogInput2 Analog 2
0x0910CID_AN0 Analog input 0
0x0911CID_AN1 Analog input 1
0x0912CID_AN2 Analog input 2
0x0913CID_AN3 Analog input 3
0x0914CID_AN4 Analog input 4
0x0915CID_AN5 Analog input 5
0x0916CID_AN6 Analog input 6
0x0917CID_AN7 Analog input 7
0x0920CID_DI0 Digital input 0
0x0921CID_DI1 Digital input 1
0x0922CID_DI2 Digital input 2
0x0923CID_DI3 Digital input 3
0x0924CID_DI4 Digital input 4
0x0925CID_DI5 Digital input 5
0x0926CID_DI6 Digital input 6
0x0927CID_DI7 Digital input 7
0x0A00CID_TC_Speed_LF Traction control speed LF
0x0A01CID_TC_Speed_RF Traction control speed RF
0x0A02CID_TC_Speed_LR Traction control speed LR
0x0A03CID_TC_Speed_RR Traction control speed RR
0x0A10CID_TC_Slip Traction control slip
0x0A11CID_TC_Turn Traction control turn
0x0A12CID_TC_OverSlip Traction control over slip
0x0A20CID_TC_Output Traction control output
0x0A21CID_TC_Volts Traction control voltage
0x0A30CID_TC_Retard Traction control retard
0x0A31CID_TC_RevLimiter Traction control rev limiter
0x0B00CID_FuelLevel Fuel level
0x0B01CID_FuelEconomy Fuel economy
0x0B02CID_FuelUsed Fuel used
0x0B03CID_EthanolContent10x1142
0x0B04CID_FuelTemp
0x0B05CID_ABS_Speed_LF
0x0B06CID_ABS_Speed_RF
0x0B07CID_ABS_Speed_LR
0x0B08CID_ABS_Speed_RR
0x0B10CID_SteeringAngle
0x0B11CID_SteeringTorque
0x0B12CID_BrakePressure
0x0B13CID_ClutchPosition
0x0B20CID_GLat
0x0B21CID_GLong
0x0B22CID_YawRate
データの単位系
数値名称データ長換算単位
0x00CT_UNKNOWN未定義未定義
0x01CT_BITbyte1:ON,0:OFF
0x02CT_NUMBERbyteまたはword
0x03CT_RPMword値/4rpm
0x04CT_SPEEDwordkm/hr
0x05CT_MBARwordmbar
0x06CT_KPAbyte値/2kPa[abs]
0x07CT_TPSbyte0.5*値-20%
0x08CT_INJword値/1000msec
0x09CT_IGNdeg(カム角度)
0x0BCT_RETRADbyte値/64deg(遅角)
0x10CT_TEMPbyte5*(値-32)/9
0x11CT_PCTbyte100*値/256?%
0x12CT_PCT_SIGNEDbyte100*値/128-100?%
0x13CT_PCT_CHGword値/100%
0x16CT_MASSFLOWエアフロ流量mg/sec
0x18CT_5Vbyte5*値/256V
0x19CT_19Vbyte6+値/20V
0x1ECT_LAMBDA値/32768
0x20CT_BARwordbar
0x21CT_MM値/1000mm
0x22CT_GFORCEword
0x23CT_SOGNEDbyteまたはword
0x24CT_SIGNED100byteまたはword

▲目次に戻る

データを取得する(Datalog)[2024-03-02]

ここまでくれば、データ取得コマンドを発行するだけである。上の「取得可能なデータの確認」のソースコード10行めを、「Hondata Bluetooth Protocol」の「2.4 Datalogging Packets」を参考に変更するだけでデータ取得できるぞ。

// FlashPro_test01   Get Channel Info

#include "BluetoothSerial.h"  // Bluetoothserial by Henry Abrahamsen

#define MAX_DATA_SIZE 200

uint8_t Address[6] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC};  // FlashProのBluetooth用のMACアドレス(実機に合わせて修正)
const char    *PIN = "1234";                                // FlashProへのBluetooth接続用PINコード(実機に合わせて修正)
String      myName = "ESP32";                               // my Bluetooth name
uint8_t      CMD[] = {0x00, 0x35, 0x04, 0x00};              // 送信コマンド Datalog transmit packet
: 以下同一

データ取得例

send cmd
Recieve 0 35 40 0 8C 10 0 0 1 F0 0 14 1B 0 20 1 A4 3 2D 33 71 14 14 7C 80 84 81 7C 7D 1 2 0 8C CA A8 0 0 0 0 0 0 0 0 0 7A 30 30 EB 3 14 14 28 0 3D 1F 40 1F E8 3 2 0 BD 6 0 

このレスポンスを整理してみよう。それぞれの値のデータ種への割り付けは、前項とリンクしているぞ。

レスポンスデータ種類
0ヘッダー
35Datalog:0x35
40受信データバイト数(下位)0x40=64バイト
0受信データバイト数(下位)
8C 10回転数(0x108C)/4=1509[rpm]
0 0車速0x0000=0[km/hr]
1ギヤ0x01=1[取得できてないかも]
F0 0インマニ絶対圧0x00F0=240[mbar]
14スロットルポジション0.5*(0x14)-20=-10[%]
1Bスロットルバルブ開度0.5*(0x1B)-20=-6.5[%]
0エアフロ電圧0x00=0[V]
20 1エアフロ流量0x0120=288[mg/sec]
A4 3燃料噴射0x03A4=932=0.932[msec]
2D点火進角0x2D=45[??]
33インマニ温度0x33=51[゚F]=10.6[℃]
71冷却水温0x71=113[゚F]=45[℃]
14VTC actual0x14=20[deg]
14VTC command0x14=20[deg]
7C 80空燃比λ(0x807C)/32768=1.004
84 81λの狙い値(0x8184)/32768=1.035
7CShort term trim100*(0x7C)/128-100=3.13
7DLong term trim100*(0x7D)/128=-2.34
1Closed loop status0x01="ON"
2O2B voltage5*(0x02)/256=0.039[V]
0Knock retard(0x00)/64=0[deg]
8CKnock control100*(0x8C)/256=54.7[%]
CA大気圧(0xCA)/2=101[kPa]
A8バッテリー電圧6+(0xA8)/20=14.4[V]
0VTEC spool0x00="OFF"
0 0Knock #10x0000=0
0 0Knock #20x0000=0
0 0Knock #30x0000=0
0 0Knock #40x0000=0
7AKnock ignition limit0x7A=122[deg]?
30冷却水温25*(0x30-32)/9=10[℃]
30吸気温度25*(0x30-32)/9=10[℃]
EB 3CID_BP0x03EB=1003[mbar]
14EXVTC_Actual0x14=20[deg]?
14EXVTC_Cmd0x14=20[deg]?
28 0FuelPressure0x0028=40[bar]
3D 1FWasteGateCMD(0x1F3D)/1000=7.997[mm]
40 1FWasteGate(0x1F40)/1000=8.000[mm]
E8 3BPCMD0x03E8=1000[mbar]
2 0FuelPressureCmd0x0002=2[bar]
BD 6AirCharge100*(0x06BD)/256=1725[%]?
0EthanolContent100*(0x00)/256=0[%]?

とまぁ、こんな感じとなる。これでデータが取得できたたので、『OBD2実践編4:OBD2データロガーVer2』のプログラムをベースに、Bluetooth接続を追加・CAN通信を削除・データ取得部分を追加、すれば出来上がりだ。

▲目次に戻る