AIM SmartyCam CAN
Introduction
Note: This is the old way using Lua Script. Please see the new way to integrate with your AIM Data Logging system using CAN mapping.
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 cable connection mapping | ||||||
---|---|---|---|---|---|---|
Connection | AIM Pin (Binder 702) | RaceCapture/Pro Pin (EIA-T568B Ethernet cable) | ||||
CAN High | 1 (White) | 2 (Orange) | ||||
CAN Low | 4 (Blue) | 3 (Green / White) | ||||
Ground | 2 (Brown) | 1 (Orange / White) | ||||
VBExt | 3 | N/C (Do not connect) |
Note
- RaceCapture/Pro provides a 12v input pin (Pin 8) on the RJ45 connector, which has a common connection to the 12v input of the RaceCapture/Pro terminal block.
- This pin is rated at 1A max. We do not recommend using this pin to supply power to the AIM Smarty CAM.
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 Integration configuration
Direct CAN channel Mapping
Download this starter configuration to instantly import 16 pre-configured channels mapped to your AIM Smarty Cam data.
Instructions:
- Save any existing channel configuration, such as your analog sensors, as this starter configuration will overwrite your current configuration.
- Unzip the downloaded AIM SmartyCAM configuration and extract the .rcp file.
- Connect the RaceCapture app to your RaceCapture system
- Go to Setup, and press Open to open the unzipped configuration file.
- Press Write to write the configuration to your RaceCapture system.
- Switch to the Dashboard view to monitor and verify the AIM SmartyCAM channels.
Important Note
- If you are converting from the Lua script integration to direct CAN mapping, be sure to completely remove your Lua script mapping by erasing the Lua scripting window and writing the configuration back to RaceCapture.
- Full guide on CAN Mapping here.
Lua script mapping (old approach)
The original integration uses the Lua scripting technology to map AIM data channels. We recommend using the Direct CAN channel mapping approach mentioned above.
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)