Megasquirt CAN

Revision as of 02:27, 17 July 2016 by Brentp (talk | contribs)

Megasquirt Dashboard CAN broadcast

This CAN script enables integration with the simplified dashboard mode CAN stream. Refer to the Megasquirt documentation for enabling Dashboard mode CAN broadcast.

Channels enabled:

  • Engine RPM (RPM)
  • Throttle Position (TPS)
  • Coolant Temperature (Coolant)
  • Manifold Absolute Pressure (MAP)
  • Air/Fuel Ratio (AFR)

Additional channels can be enabled by expanding the script.


Megasquirt Wiring

Megasquirt 2 V3

Wire up the CANH / CANL internal jumpers according to the instructions in the Megasquirt Manual

If connected per the guide, you CAN connections will be on the following port on the DB37

  • CAN High - DB37 Pin 3 (SPR1)
  • CAN Low - DB37 Pin 4 (SPR2)

Connect CAN High and CAN Low to the corresponding CAN High and CAN Low channel connections on RaceCapture/Pro

You can use a standard CAT-5 ethernet cable with RJ45 connectors to integrate with RaceCapture/Pro.

Power, ground and CAN bus connections to RaceCapture/Pro
Connection RaceCapture/Pro (RJ45 cable)
+12v Brown
Ground Orange/White
CAN 1 High Orange
CAN 1 Low Green/White

These color codes assume EIA-T568B RJ45 cable (check printing on the cable to confirm)

  • Note: If you have RaceCapture/Pro powered through the terminal block and grounded at the same location, all you need to wire are the two CAN ligh/CAN low connections. You do not need to separately connect ground and power via the RJ45 port.

Canrj45.png

MS3 Pro

MS3-Pro MS3-Pro wiring

CAN bus connections available on MS3-Pro white connector:

  • CAN High: Pin 34
  • CAN Low : Pin 33

Photos

Megasquirt CAN RCP.jpg

Enable Megasquirt Dashboard Mode

In TunerStudio, enable CAN dashboard mode and burn it to the controller. Once this is done, RaceCapture/Pro will be receiving CAN bus data from the Megasquirt.

Integration Script

Paste this entire script into the Scripting window of RaceCapture/Pro. Ensure any existing script is completely overwritten - do not append to an existing script.

--This example configured for Megasquirt Dashboard Mode

--how frequently we poll for CAN messages
tickRate = 30
--the CAN baud rate
CAN_baud = 500000
--CAN channel to listen on. 0=first CAN channel, 1=second
CAN_chan = 0
--1 for Big Endian (MSB) mode; 0 for Little Endian mode (LSB)
be_mode = 1

--add your virtual channels here
--addChannel(<name>, <sample rate>, [logging precision], [min], [max], [units label])
rpmId = addChannel("RPM", 10, 0, 0, 8000)
tpsId = addChannel("TPS", 10, 0, 0, 100, "%")
mapId = addChannel("MAP", 10, 0, 0, 105, "kPa")
cltId = addChannel("Coolant", 1, 0, 0, 250, "F")
afrId = addChannel("AFR", 10, 1, 0, 20)

--customize here for CAN channel mapping
--format is: [CAN Id] = function(data) map_chan(<channel id>, data, <CAN offset>, <CAN length>, <multiplier>, <adder>)
CAN_map = {
[1512] = function(data) map_chan(mapId, data, 0, 2, 0.1, 0) map_chan(rpmId, data, 2, 2, 1, 0) map_chan(cltId, data, 4, 2, 0.1, 0) map_chan(tpsId, data, 6, 2, 0.1, 0, filter_tps) end,
[1514] = function(data) map_chan(afrId, data, 1, 1, 0.1, 0) end
}

function onTick()
    processCAN(CAN_chan)
end

function filter_tps(value)
  --filter out overflow
  if value > 100 then value = 0 end
  return value

end

--===========do not edit below===========
function processCAN(chan)
    repeat
        local id, e, data = rxCAN(chan)
        if id ~= nil then
            local map = CAN_map[id]
            if map ~= nil then
                map(data)         
            end
        end
    until id == nil
end

--Map CAN channel, big endian format
function map_chan(cid, data, offset, len, mult, add, filter)
    offset = offset + 1
    local value = 0
    while len > 0 do
        value = (value * 256) + data[offset]
        offset = offset + 1
        len = len - 1
    end
    local cv = value * mult + add
    if filter ~= nil then cv = filter(cv) end
    setChannel(cid, cv)
end

initCAN(CAN_chan, CAN_baud)
setTickRate(tickRate)

References