From MS4X Wiki
Revision as of 21:49, 21 August 2022 by Sorek (talk | contribs) (→‎Where to order?)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)



Logger.S is development board made for interfacing K-line (ISO 9141) / CAN (ISO15765-4) data signals.

It’s based on ESP32 dual-core MCU featuring Bluetooth and WiFi and can be programmed the same way as any ESP32-dev-board with Esp-idf or Arduino IDE.

If you want to see how device works and looks please refer to this video <==

DISCLAIMER: Note we do not take any responsibility for using firmware and files as they are given only for hobbyist/development use. All configuration files need to be created and checked by the user before usage to prevent potential damage to the car, driver or others.

It’s licensed on MIT license so both commercial and non-commercial use are permitted. Device features:

  • 2.8” TFT touch screen with 65k colours,
  • OBDII port,
  • CAN and K-line (ISO 9141) interface,
  • SD card up to 32GB FAT32 (used logging, firmware updates and configuration files),
  • 4 analog ADCs for 0-5V inputs (for eg. Wideband AFR),
  • USB-C,
  • Options to swap TFT/SD card and make use of different screen or reusing GPIOs used for the screen,
  • Bluetooth, Wi-fi and 2 serial ports – one for connecting over K-line, second for communication with USB, (3rd one can be used without screen).

Where to order?

Currently only direct purchase is possible. Please contact directly:

PayPal: @ £170 with postage to ALL countries

Ebay: @ £180 with postage to ALL countries <= ebay deleted auction


Discord: sorek#2137

Dogecoin: DPWc1pDB7ga8BR3jJjVQ1mFJrYU9ygZFg7


Firmware that device comes with is made by and is sole property of such. The code won’t be released public, although all firmware updates will be available on

Firmware features v0.6:

  • CAN logging with simultaneous K-line logging.
  • Full wifi SD card browser while on definition setup menu (just hold finger on your screen while powering up device).
  • Reset button when you hold pause button.
  • Wifi on normal screen, you can access it by IP that is shown in left bottom corner. Time update for SD card files.
  • User switchable JSON definitions.
  • Dimmable screen with persistent setting along with chosen graphs and display modes.
  • KWP2000 along with ME7.2 (M62TU) support.
  • Updated definitions and used @ba114 MS43 extended log definitions.
  • Data rate speed updated, up to 33Hz on MS43/42.
  • config.json can be kept on SD card now or it will copy itself onto SD card automatically,
  • New DMA mode for faster screen response,
  • Fixed small bugs.
  • Improved stability and performance.

Firmware features v0.5 (beta):

  • DTC ECU engine errors read and clear,
  • Knock tables and reset,
  • config.json files for custom device name, log in from startup and custom sleep timer,
  • Improved stability and performance.

Firmware features v0.4:

  • Fully configurable commands by JSON file format (read more in section 4. Programming),
  • Standard and telegram type logging over K-line,
  • CAN retransmission of data from K-line/analog sensors (eg. for telemetry devices),
  • 4 graphs, 4 gauges for data we want to display,
  • Baud change commands for faster logging,
  • SD card logging of all defined values,
  • Pausing graphs, min/max values showing and resetting,
  • Bluetooth and USB handle (recommended ALDLdroid for Android and RomRaider for PC – they work both with Bluetooth AND USB),
  • Auto-sleep mode after 30s of inactivity,
  • Initially made for MS41, MS41.2, MS42, MS43 Siemens ECUs but can be used for anything (not only ECUs!) provided right configuration.

Firmware can be updated easily copying update.bin to SD card and turning on the device.


Logger.S v2.0 features:

  • USB type C (that can be used both for communicating with car or for programming the device),
  • SD card slot (for big sized SD cards up to 32GB formatted in FAT32),
  • 3-position switch (program – on - off),
  • 7-pin connector (see fig. 1 below),
  • Standard OBDII connector (see fig. 2 below).

Hardware updates in v2.1:

  • 10-pin connector adding 5v out and CAN Low and CAN High lines,
  • Better case fitment,
  • Bigger (16MB instead of 4MB) flash for future improvements.

Fig 1. for v2.0 7-pin (1 is from left when looking at the connector on device, K is K-line)


Fig 2.


Fig 3. for v2.1+ 10-pin (1 is from left when looking at the connector on device, K is K-line)


Configuration files

Configuration (definitions) by default file named ecus.json is read from SD card, copied to internal memory and read from it each time new ECU at start up is spotted. It reads from it all commands that match ECU id. Currently ID request is only one command but it will be changeable in newer revisions of firmware.


This file lets you configure your device and point to which .json file for car definitions shall it use.

    // best to not use it if not needed, it forces provided ECU definition file without waiting for connecting, great for CAN only sniffing or some other cars
    "forceEcu": "7532675", // up to 7 characters max!
    "forceKwp": true, // default false, it forces KWP protocol to be used
    "definitionFile": "/definitions/ecus.json",
    "rotation": 1, // 1 and 3 are landscape orientations, 0 and 4 are portrait
    "forceLog": false, // force log to be always on, pressing sd card button will start new file
    "logFromStart": false, // when device boots it will start logging, but the logging could be stopped at any time
    "sleepTime": 30, // set sleep time of device after inactivity, 0 for off
    "btName": "Logger.S",
    "sdName": "Logger.S", // you can change your default file name on sd card
    "wifiSSID": "Logger.S", // change your wifi ssid/pswd to get to connect it or mimick your home network
    "wifiPSWD": "logger.s"


Configuration (definition) file (ecus.json) is JSON document that contains main JSON-array to store rest of the data, it starts with [ and ends with ] and then every entity is listed starting with { and ending with }. Field “config” must be defined (otherwise it will default to null), below is current list of config options:

CONFIG_NULL 255 // telegram message will be skipped (good if we 
				just want to turn it off without deleting data in 
				the file


Normal data config that lets you request data from the engine and then filter data by the offset.


	"id": 42, // Id of the definition, iterated automatically, but best if predefined, especially for CONFIG_NORMAL 

	"ecus": ["1429764", "1430844", "7526753", "7500255"], // List of ECUs that definition applies to

	"config": 0, // MOST IMPORTANT - our config mode

	"address": "0x12050B031F", // Address of the commmand that is send to ECU to request data, up to length of 5 it's easier to use it like this
	// Alternatively reccomended use is always: "address": ["0x12", "0x05", "0x0B", "0x03", "0x1F"]

	"ecuparam": [ // We define what type of data we want to retrieve from our command
		"header": "Battery Voltage", // String name used both for buttons and for SD card logging
		"unit": "V", // Unit string

		"offset": 20, // Offset at which data can be found; defaults to 0

		"length": 1, // Length of data 1 for 8-bit byte, 2 for 16-bit word (uint16_t or unsinged int); defaults to 1 always

		"max": 20, // Max value to display on a graph; defaults to 5

		"min": 5, // Min value to display on a graph; defaults to 0

		"mul": 0.1015625, // data (byte or word depending on length) is multiplied by this value; defaults to 1

		"add": 0, // then data is being offseted (by simple adding) this value; defaults to 0

		"canOn": true, // if we want to use can retransmition we need to make it true; defaults to false

		"can": { // can message for retransmition
				"messageId": 790, // messageID is the ID of message we want to retransmit it on CAN

			"payload": 8, // if <=8 it will use STD Can frame, otherwise it's extended; defaults to 8

			"length": 2, // wheather we want to send 1 byte or 2 byte value; defaults to 1

			"offset": 0, // offset where we want our byte/word to be placed in CAN message

			"canMul": 0.1015625 // If we want, we can normalize data, for example if we already use device that expects it in certain format; defaults to 1

			"canAdd": 0, // if you want to send original data that came from ECU just use same values you used for param above;
				the formula is: 
				(data_calculated_from_param - canAdd)/canMul
				defaults to 0
			"canRepeat": true, // Defaults to false, needs to be only called once, forces CAN to re-transmit message at faster rate if duplicates aren't issue;
			"canSpeed": 500 // can speed, usually 500 or 1000 that we want to use; defaults to 500
			"header": "Engine Speed",
			"unit": "RPM",
			"offset": 0,
			"length": 2,
			"max": 8000,
			"dec": 0, // number of decimal places to show/store on SD; defaults to 2
			"canOn": true,
			"can": {
				"messageId": 790,
				"offset": 2,
				"length": 2,
				"canMul": 1


	"config": 1, // lack of “ecus” will make this definition to be added to every ECU
	"address": "36", // address here is in DEC and corresponds to our GPIO for analog read,
	"ecuparam": [{
		"header": "Analog 3",
		"unit": "V",
		"max": 6,
		"mul": 0.001221


	"ecus": ["1405854", "1429373", "1429861", "1432401", "1437806", "1440176", "1406464", "SHINDE1"],

	"config": 2, // telegram mode, offset and other things will be calculated automaticaly
			so you can skip them

	"address": "0x010000E8E4", // for simplicity 5 byte address is made to take it in
						fromat like this, avoid using it everywhere else

	"ecuparam": [{
		"paramEcus": ["1406464", "SHINDE1"], // you can separate messages for different
							telegrams or ommit it if all telegrams for
							those ECUs are the same
		"header": "Engine Load",
		"unit": "mg/str",
		"max": 1024,
		"mul": 0.021
		"paramEcus": ["1429861"],
		"address": "0x010000FAFC", // if for specific ECU address is different you can
							change it there,
		"header": "Engine Load",
		"unit": "mg/str",
		"max": 1024,
		"mul": 0.021
		"paramEcus": ["1437806"],
		"address": "0x010000FC52",
		"header": "Engine Load",
		"unit": "mg/str",
		"max": 1024,
		"mul": 0.021


	"config": 3, // It’s reccomdended only one of those are defineduse 255 (CONFIG_NULL) otherwise
	"ecus": ["1429764", "1430844", "7526753", "7500255", "7511570", "7519308", "7545150", "7551615"],
	"address": ["0x12", "0x08", "0x91", "0x00", "0x96", "0x00", "0x00", "0x1D"],
	"ecuparam": [{
		"value": 38400 // uint32_t value for target baud


    "config": 4, // 4 stands for CAN
    "address": "0", // can be left empty, not used for CAN
    "ecuparam": [{
        "header": "CAN Test",
        "unit": "C",
        "value": 809, // CAN messag ID to look for remember its in DEC you have to convert from HEX
        "offset": 0, // default 0
        "length": 1, // default 1
        "mul": 1, // default 1
        "add": 0, // default 0
        "reverseEndianness": false, // default false; you can reverse endiannes as sometimes larger values are send in CAN frames opposite way
        "canSpeed": 500, // default 100; it will always chose highest number, only specify this once
        "max": 255, // default 5
        "min": 0 //  default 0


Logger.S is development board made for interfacing K-line (ISO 9141) / CAN (ISO15765-4) data signals.

It’s based on ESP32 dual-core MCU featuring Bluetooth and Wi-fi and can be programmed the same way as any ESP32-dev-board with eg. Esp-idf or Arduino IDE.

To program we need to set our device into programming mode (left position on the switch).

Please refer to official DS2 library for more examples of code:

NOTE: Some devices v2.0 have protection diode and need to be connected to +12V and won’t be able to start on just USB power without de-soldering this diode.