スバルとArduino:SSM1プロトコル。 握手

ソースデータ







Carduino Nano v7と呼ばれるボードが最近来ました。 そして、どういうわけか突然それが偶然一致し、私の車のパネルでほぼ同時に、チェックエンジンライトが燃えているのを見つけて驚いた。 「これには理由がないわけではありません」と私は考え、検索をさらに深くしました。 エラーは追加のデバイスなしで読み取れることが判明しました。Forestersの自己診断は非常に簡単で、誰でもアクセスできます。 そして、ここにArduinoがありますか? そして、診断情報の検索の直接の結果は、 スバルセレクトモニターバージョン1のような面白いものの存在の発見であったという事実にもかかわらず、Kラインが登場する前でさえ、そのプロトコル(面白いもの)に古いスバル車が装備されています。 私のフォレスターが属するのはこれらの車です。 そこで、Arduinoに何らかのオンボードコンピューターを実装するという、いたずらな考えを思いつきました。 K-lineにアピールする同様のプロジェクトを見ましたが、SSM1を使用しました。YouTubeのビデオは数本のみで、詳細はありません。 したがって、すべてを自分で行う必要があります。



SSM1プロトコルの概要



ボーレート1953ボー(1953-8 E 1)。 コンピューターはデータを読み取るコマンドを受け取り、停止するコマンドを受け取るまで、要求されたアドレスからの応答データの注入を開始します。 アドレスにデータを書き込むには、最初に同じアドレスのデータを読み取る必要があります。 ECU識別子を要求するには、最初に任意のアドレスからデータを読み取る必要があります。



チーム







データの読み取りおよび書き込みコマンドに応答して、次のデータパケットが送信されます。





そして再びフォレスター



私の車にはOBD2コネクタがあるという事実にもかかわらず、「K-line」コンタクトは完全にありません。





私の車のコネクタには、4、4、5、12、13、16の接点がありました。



1、2、3、4、5-ペアリングを開始



OBD2コネクタの提供者は、中国の兄弟から購入したELM327アダプターでしたが、私のForesterにはまったく役に立ちません。 検死により、必要な脚を除くほぼすべての脚がELM自体で使用するためにはんだ付けされていることが示されました。 arduinoのポートを焼かないように、抵抗を介してデータ(12および13)の脚を接続します-240オームの抵抗を使用しました。 地球を両脚に接続します(4と5)。 Arduinoは、USBアダプターを介してシガーライターから給電されます。



したがって、3本のワイヤを使用します。





理論的には、これを止めて、Arduinoスケッチタイプで縫うことができます。



void setup() { pinMode(0, INPUT); pinMode(1, OUTPUT); } void loop() { }
      
      





Arduinoをラップトップに接続することにより、EvoScanやSelectMonitorなどのプログラムを備えた通常のUSB-Subaruストラップのように使用します。 しかし、主なアイデアは正確にオンボードコンピューターでしたので、続けましょう。



スケッチを作成する



この記事のタイトルでは「握手」という言葉が使われているため、フォレスターとArduinoの間の握手に限定します。車のROM IDを読み取ります。 既に組み立てられたデザインに限定するために、内蔵Arduino LEDで読み取ったROM IDを読み取り、1を長いフラッシュとして、0を2つの短いフラッシュとして指定します。



したがって、アクションに従って:

  1. UART交換モードを1953-8E1に設定します
  2. 3秒間、LEDをオンにします
  3. LEDを消して2秒待ちます
  4. リクエストROM ID
  5. 組み込みのArduino LEDでROM IDを宣伝する


私は、パリティが必要であることをArduinoに説明する方法をもう少しグーグルする必要がありました。

 int led = 13; void setup() { byte romid[3]; //    Serial.begin(1953); //   : Even Parity UCSR0C = ( UCSR0C & ~_BV(UPM00) | _BV(UPM01) ); pinMode(led, OUTPUT); //    3  digitalWrite(led, HIGH); delay(3000); //     2  digitalWrite(led, LOW); delay(2000); if (ECU_GetROMID(romid)) //  ROM ID - , { for (int i=0;i<3;i++) { show_byte(romid[i]); //     } } } void loop() { //       } void show_byte(byte b) { for (int i=7;i>=0;i--) { if (bitRead(b,i)==1) { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); } else { digitalWrite(led, HIGH); delay(300); digitalWrite(led, LOW); delay(200); digitalWrite(led, HIGH); delay(300); digitalWrite(led, LOW); delay(1200); } } } void ECU_Stop() { byte txbuf[4]={0x12,0x00,0x00,0x00}; Serial.write(txbuf[0]); Serial.write(txbuf[1]); Serial.write(txbuf[2]); Serial.write(txbuf[3]); delay(50); Serial.flush(); } boolean ECU_GetROMID(byte * buffer) { char readCmd[4] ={0x78,0x00,0x00,0x00}; char romidCmd[4]={0x00,0x46,0x48,0x49}; char romid[3] ={0}; ECU_Stop(); Serial.write(readCmd[0]); Serial.write(readCmd[1]); Serial.write(readCmd[2]); Serial.write(readCmd[3]); int retries = 0; while (retries<8) { int nbytes = Serial.readBytes(romid,3); if ((nbytes == 3) && (romid[0]!=0x00)) break; Serial.write(romidCmd[0]); Serial.write(romidCmd[1]); Serial.write(romidCmd[2]); Serial.write(romidCmd[3]); ++retries; } ECU_Stop(); buffer[0] = romid[0]; buffer[1] = romid[1]; buffer[2] = romid[2]; if (romid[0] == 0x00) { return false; } return true; }
      
      







結果



Arduinoにこのスケッチを記入し、車に乗り込み、OBD2コネクタを接続し、イグニッションをオンにし、Arduinoの電源をオンにして...電話でゼロと1を駆動し始めます。 Arduinoは1010 0011 0000 0001 0001 0111



組み合わせを元気よく見逃しました。これは、翻訳ではユニバーサル0xA30117



意味し0xA30117



-これは私のForesterのROM IDです。 「こんにちは0xA30117! 私の名前はローマです。」



あとがき



残念ながら、SSM1をサポートするほとんどの車両では、バッテリー電圧、エンジン速度など、重要なパラメーターのアドレスはせいぜい18個しか知られていません。 したがって、作業はまだ未耕作フィールドです-メモリダンプの読み取り、エラーのあるアドレスの検索など。 まあ-まだ努力するものがあります...



使用材料



SSM1プロトコル情報

SSM1の説明、アダプターRS232-SSM1およびUSB-SSM1のスキームに関する情報



All Articles