Megasquirt CAN: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
=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. | |||
=CAN Database= | =CAN Database= | ||
[[CAN_Bus_database#Megasquirt_CAN_.28_MS2.2FMS3.2FMS3_Pro_.29|CAN Bus database for Megasquirt]] | [[CAN_Bus_database#Megasquirt_CAN_.28_MS2.2FMS3.2FMS3_Pro_.29|CAN Bus database for Megasquirt]] | ||
==Megasquirt Wiring== | ==Megasquirt Wiring== | ||
[http://www.diyautotune.com/downloads/ms3-pro/ms3pro_wiring.pdf MS3-Pro MS3-Pro wiring] | [http://www.diyautotune.com/downloads/ms3-pro/ms3pro_wiring.pdf MS3-Pro MS3-Pro wiring] | ||
Line 10: | Line 24: | ||
==Photos== | ==Photos== | ||
[[Image:megasquirt_CAN_RCP.jpg|500px]] | [[Image:megasquirt_CAN_RCP.jpg|500px]] | ||
<pre> | |||
--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, 10000) | |||
tpsId = addChannel("TPS", 10, 0, 0, 100, "%") | |||
mapId = addChannel("MAP", 10, 0, 0, 250, "kPa") | |||
cltId = addChannel("Coolant", 1, 0, 0, 200, "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) end, | |||
[1514] = function(data) map_chan(afrId, data, 1, 1, 0.1, 0) end | |||
} | |||
function onTick() | |||
processCAN(CAN_chan) | |||
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, little endian format | |||
function map_chan_le(cid, data, offset, len, mult, add) | |||
offset = offset + 1 | |||
local value = 0 | |||
local shift = 1 | |||
while len > 0 do | |||
value = value + (data[offset] * shift) | |||
shift = shift * 256 | |||
offset = offset + 1 | |||
len = len - 1 | |||
end | |||
setChannel(cid, (value * mult) + add) | |||
end | |||
--Map CAN channel, big endian format | |||
function map_chan_be(cid, data, offset, len, mult, add) | |||
offset = offset + 1 | |||
local value = 0 | |||
while len > 0 do | |||
value = (value * 256) + data[offset] | |||
offset = offset + 1 | |||
len = len - 1 | |||
end | |||
setChannel(cid, (value * mult) + add) | |||
end | |||
map_chan = (be_mode == 1) and map_chan_be or map_chan_le | |||
initCAN(CAN_chan, CAN_baud) | |||
setTickRate(tickRate) | |||
</pre> | |||
==References== | ==References== | ||
* [http://www.msextra.com/doc/pdf/Megasquirt_CAN_Broadcast.pdf Full CAN bus mapping] | * [http://www.msextra.com/doc/pdf/Megasquirt_CAN_Broadcast.pdf Full CAN bus mapping] |
Revision as of 03:23, 16 July 2015
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.
CAN Database
CAN Bus database for Megasquirt
Megasquirt Wiring
CAN bus connections available on MS3-Pro white connector:
- CAN High: Pin 33
- CAN Low : Pin 34
Photos
--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, 10000) tpsId = addChannel("TPS", 10, 0, 0, 100, "%") mapId = addChannel("MAP", 10, 0, 0, 250, "kPa") cltId = addChannel("Coolant", 1, 0, 0, 200, "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) end, [1514] = function(data) map_chan(afrId, data, 1, 1, 0.1, 0) end } function onTick() processCAN(CAN_chan) 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, little endian format function map_chan_le(cid, data, offset, len, mult, add) offset = offset + 1 local value = 0 local shift = 1 while len > 0 do value = value + (data[offset] * shift) shift = shift * 256 offset = offset + 1 len = len - 1 end setChannel(cid, (value * mult) + add) end --Map CAN channel, big endian format function map_chan_be(cid, data, offset, len, mult, add) offset = offset + 1 local value = 0 while len > 0 do value = (value * 256) + data[offset] offset = offset + 1 len = len - 1 end setChannel(cid, (value * mult) + add) end map_chan = (be_mode == 1) and map_chan_be or map_chan_le initCAN(CAN_chan, CAN_baud) setTickRate(tickRate)