#include <FlexCAN.h>
#include <Stepper.h>
#define STEPS 600
static CAN_message_t txmsg, rxmsg;
//18 19 5 20
Stepper stepper(STEPS, 5, 20, 18, 19);
long previous = STEPS /2;
//Megasquirt data vars
byte indicator[7]; // where to store indicator data
float BATTV, IAC, dwell, idle_tar, AFRtgt, AFR, newBATTV, oldBATTV;
unsigned int MAP, SPKADV, RPM, TPS, MAT, CLT, injduty, Baro, PW1, nexAFR, nexCLT;
void setup() {
stepper.setSpeed(30);
Can0.begin(500000);
Serial.begin(115200); //***Uncomment this section to output CAN message IDs to Serial Monitor***
stepper.step(-50);
}
void loop(void) {
//Look for CAN broadcasts
if ( Can0.read(rxmsg) ) {
switch (rxmsg.id) { // ID's 1520+ are Megasquirt CAN broadcast frames. EAch frame represents a data group http://www.msextra.com/doc/pdf/Megasquirt_CAN_Broadcast.pdf
case 1520: // Group 0
RPM = (float)(word(rxmsg.buf[6], rxmsg.buf[7]));
PW1 = (float)(word(rxmsg.buf[2], rxmsg.buf[3]));
injduty = ((PW1 / 1000 * RPM / 120) / 10);
break;
case 1521: // Group 1
SPKADV = (float)(word(rxmsg.buf[0], rxmsg.buf[1]));
indicator[0] = rxmsg.buf[3]; // engine
AFRtgt = (float)(word(0x00, rxmsg.buf[4]));
break;
case 1522: // Group 2
Baro = (float)(word(rxmsg.buf[0], rxmsg.buf[1]));
MAP = (float)(word(rxmsg.buf[2], rxmsg.buf[3]));
MAT = (float)(word(rxmsg.buf[4], rxmsg.buf[5]));
CLT = (float)(word(rxmsg.buf[6], rxmsg.buf[7]));
nexCLT = (float)(word(rxmsg.buf[6], rxmsg.buf[7]));
break;
case 1523: // Group 3
TPS = (float)(word(rxmsg.buf[0], rxmsg.buf[1]));
BATTV = (float)(word(rxmsg.buf[2], rxmsg.buf[3]));
AFR = (float)(word(rxmsg.buf[4], rxmsg.buf[5]));
nexAFR = (float)(word(rxmsg.buf[4], rxmsg.buf[5]));
break;
case 1524: // Group 4
break;
case 1526: // Group 6
IAC = (float)(word(rxmsg.buf[6], rxmsg.buf[7])); //IAC = (IAC * 49) / 125;
case 1529: // 9
dwell = (float)(word(rxmsg.buf[4], rxmsg.buf[5]));
break;
case 1530: // Group 10
indicator[1] = rxmsg.buf[0]; // status 1
indicator[2] = rxmsg.buf[1]; // status 2
indicator[3] = rxmsg.buf[2]; // status 3
indicator[6] = rxmsg.buf[6]; // status 6
indicator[7] = rxmsg.buf[7]; // status 7
break;
case 1537: // Group 17
break;
case 1548: // Group 28
idle_tar = (float)(word(rxmsg.buf[0], rxmsg.buf[1]));
break;
case 1551: // Group 31
break;
case 1574: // Group 54
indicator[4] = rxmsg.buf[2]; // cel
break;
}
}
long val = (long)CLT * STEPS /400 ;
stepper.step(val - previous);
previous = val;
Serial.println(val);
}