ArduinoでOBDⅡのELM327なシミュレータを作成
Raspberry Pi 3とPythonでバイクのデジタルメータを制作しているのですが、実機検証のためには駐車場まで足を運ぶ必要があり面倒(冬は地獄だった)。
かといってダミーの値を返すデバッグ用コードを埋め込むのもナンセンスかなと思ったので、ELM327なシュミレータをGoogleしてみた。
高すぎぃ!
「elm327 emulator」とかでぐぐってみると
など出てくるのだが、高すぎる。3万て…。
そうだ、Arduino使おう!
どうにか安くで済ます方法はないのかと調べまくったら、こんなページを発見。
これだ!これを探していたのだ…ッ!
もともとArduinoは、バイクのパルス拾って車速や回転数を表示するために買ってあったのだ…買っといてよかった…
コード
String inputString = "";
boolean stringComplete = false;
void setup() {
Serial.begin(9600);
inputString.reserve(200);
Serial.println(">");
}
void loop() {
if (stringComplete) {
int len = inputString.length();
String ans = "4" + inputString.substring(1,2) + " ";
if (len > 4) ans = ans + inputString.substring(3,5) + ":";
else if (len > 3) ans = ans + inputString.substring(2,4) + ":";
else if (len > 2) ans = ans + inputString.substring(3,4) + ":";
if (inputString.substring(0,3) == "ATZ") Serial.println("ELM327 v1.4");
else if (inputString.substring(0,2) == "AT") Serial.println("OK");
else if (inputString.substring(0,5) == "01 00") Serial.println("41 00:FF FF FC FF");
else if (inputString.substring(0,5) == "01 01") Serial.println("41 01:84 07 61 00");
else if (inputString.substring(0,5) == "01 20") Serial.println("41 20:FF FF FC FF");
else if (inputString.substring(0,5) == "01 40") Serial.println("41 40:FF FF FC FF");
else if (inputString.substring(0,5) == "01 60") Serial.println("41 60:FF FF FC FF");
else if (inputString.substring(0,5) == "01 80") Serial.println("41 80:FF FF FC FF");
else if (inputString.substring(0,5) == "01 A0") Serial.println("41 A0:FF FF FC FF");
else if (inputString.substring(0,5) == "01 C0") Serial.println("41 C0:FF FF FC FF");
else if (inputString.substring(0,2) == "01") Serial.println(ans + "00 00 00 00");
else if (inputString.substring(0,2) == "03") Serial.println("43 03 00 03 01 03\r\n43 13 01 04");
else if (inputString.substring(0,5) == "09 02") Serial.println("49 02:1Z3768470804");
else Serial.println(ans + "NO DATA");
Serial.println(">");
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar == '\n') continue;
if (inChar == '\r') {
stringComplete = true;
if (inputString == "") inputString = "NULL";
inputString.toUpperCase();
continue;
}
inputString += inChar;
}
}
コードは以上だが、このままでは車速と回転数が取得できない。
該当箇所は"01 00"の部分。
この返答を適宜修正する。
また応答の値を追記する
例)回転数
else if (inputString.substring(0,5) == "01 00") ~
これで屋外に一々行かなくても大丈夫になった。