AIM SmartyCam CAN: Difference between revisions

Line 6: Line 6:


{| class="wikitable"
{| class="wikitable"
!colspan="7"|BMW E46 (including M3)
!colspan="7"|AIM cable connection mapping
|-
|-
!Connection
!Connection

Revision as of 22:50, 15 April 2016

Introduction

This CAN bus integration maps CAN bus data from AIM systems using the CAN protocol used for the SmartyCam camera system.

Connecting to the AIM system

AIM RCP pinout mapping.png

AIM cable connection mapping
Connection AIM Pin RaceCapture/Pro Pin
CAN High 1 (White) 2 (Orange)
CAN Low 4 (Blue) 3 (Green / White)
Ground 2 (Brown) 1 (Orange / White)

Available Channels

This integration enables the following channels.

This assumes the AIM channels 1-5 are defined with the following configuration. You can customize this mapping based on your particular AIM configuration.

BMW E46 (including M3)
AIM Channel Name RaceCapture channel name
RPM RPM
Gear Gear
WaterTemp EngineTemp
Oil Press OilPress
Oil Temp OilTemp
Throttle Position TPS
Head Temp HeadTemp
Exhaust Temp EGT
Brake Pos (channel 1) BrakePos
Clutch Pos (channel 2) Clutch
Brake Press (channel 3) Brake
Steer Position (channel 4) Steering
Lambda (channel 5) Lambda
FuelLevel FuelLevel

Integration Cable

Build your own

AIM uses a Binder 5-pin series 702 connector - you can modify an existing compatible cable, or make a custom cable with the appropriate connectors and splice it with an RJ45 network cable.

Get a pre-made cable

We have AIM integration cables available in our online store:

AIM RCP integration cable.jpg

Add to cart.png



AIM Integration Script

Copy this entire Lua script into the script window of RaceCapture app, and write the configuration back.

  • Note - ensure any existing script is removed before copying in the AIM integration script.
--AIM Smarty Cam Stream For Race Capture

--how frequently we poll for CAN messages
tickRate = 30
--the CAN baud rate
CAN_baud = 1000000
--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 = 0

--add your virtual channels here
tpsId = addChannel("TPS", 10, 0, 0, 100, "%")
tempId = addChannel("EngineTemp", 1, 0, 0, 120, 'C')
oilTempId = addChannel("OilTemp", 1, 0, 0, 170, 'C')
rpmId = addChannel("RPM", 10, 0, 0, 10000, 'RPM')
oilPresId = addChannel("OilPress", 10, 2, 0, 10, 'Bar')
fuellevelId = addChannel("FuelLevel", 1, 0, 0, 120, "L")
temp1Id = addChannel ("HeadTemp" , 1, 0, 0, 170, 'C')

temp2Id = addChannel ("EGT" , 10, 0, 0, 1000, 'C')
ch1Id = addChannel ("BrakePos", 10, 0, 0, 100, "%") 
ch2Id = addChannel ("ClutchPos", 10, 0, 0, 100, "%")
ch3Id = addChannel ("Brake", 1, 0, 0, 150, "Bar")
ch4Id = addChannel ("Steering", 1, 0, -300, 300, "Deg")
ch5Id = addChannel ("Lambda", 10, 2, -1, 1, "C")
fuelPresId = addChannel ("FuelPress", 10, 2, 0, 10, "Bar")

gearId = addChannel ("Gear", 10, 0, 0, 7, "#")

--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 = {
[1056] = function(data) map_chan(rpmId, data, 0, 2, 1, 0) map_chan(gearId, data, 4, 2, 1, 0) map_chan_le(tempId, data, 6, 2, 0.1, 0) end,
[1057] = function(data) map_chan(temp1Id, data, 0, 2, 0.1, 0) map_chan(temp2Id, data, 2, 2, 0.1, 0) map_chan(oilTempId, data, 4, 2, 0.1, 0) map_chan_le(oilPresId, data, 6, 2, 0.01, 0) end,
[1058] = function(data) map_chan(ch3Id, data, 0, 2, 0.01, 0) map_chan(tpsId, data, 2, 2, 1, 0) map_chan(ch1Id, data, 4, 2, 1, 0) map_chan(ch2Id, data, 6, 2, 1, 0) end
,
[1059] = function(data) map_chan(ch4Id, data, 0, 2, 1, 0) map_chan(ch5Id, data, 2, 2, 0.01, 0) end,
[1060] = function(data) map_chan(fuellevelId, data, 0, 2, 1, 0) map_chan(fuelPresId, data, 2, 2, 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)