Ryan Greene
/
ecu_reader
OBD reader
Revision 0:60212cabf694, committed 2011-01-31
- Comitter:
- rtgree01
- Date:
- Mon Jan 31 05:18:42 2011 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r 60212cabf694 FATFileSystem.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FATFileSystem.lib Mon Jan 31 05:18:42 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_unsupported/code/fatfilesystem/ \ No newline at end of file
diff -r 000000000000 -r 60212cabf694 ecu_reader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ecu_reader.cpp Mon Jan 31 05:18:42 2011 +0000 @@ -0,0 +1,97 @@ +#include "mbed.h" +#include "ecu_reader.h" +#include "globals.h" + + +// Use a timer to see if things take too long +Timer CANTimer; +namespace mbed { + + +ecu_reader::ecu_reader(int can_speed) +{ + can2.frequency(can_speed); +} + +#define TIMEOUT 200 +unsigned char ecu_reader::request(unsigned char pid, char *buffer) +{ + char can_msg[8]; + float engine_data; + + led1 = 1; + + can_msg[0] = 0x02; + can_msg[1] = 0x01; + can_msg[2] = pid; + can_msg[3] = 0; + can_msg[4] = 0; + can_msg[5] = 0; + can_msg[6] = 0; + can_msg[7] = 0; + + if (can2.write(CANMessage(PID_REQUEST, can_msg, 8))) { + + } + + led1 = 0; + CANTimer.reset(); + CANTimer.start(); + + while(CANTimer.read_ms() < TIMEOUT) { + + if (can2.read(can_MsgRx)) { + + if((can_MsgRx.id == PID_REPLY) && (can_MsgRx.data[2] == pid)) + { + switch(can_MsgRx.data[2]) + { /* Details from http://en.wikipedia.org/wiki/OBD-II_PIDs */ + case ENGINE_RPM: // ((A*256)+B)/4 [RPM] + engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4; + sprintf(buffer,"%d rpm ",(int) engine_data); + break; + + case ENGINE_COOLANT_TEMP: // A-40 [degree C] + engine_data = can_MsgRx.data[3] - 40; + sprintf(buffer,"%d degC ",(int) engine_data); + + break; + + case VEHICLE_SPEED: // A [km] + engine_data = can_MsgRx.data[3]; + sprintf(buffer,"%d km ",(int) engine_data); + + break; + + case MAF_SENSOR: // ((256*A)+B) / 100 [g/s] + engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/100; + sprintf(buffer,"%d g/s",(int) engine_data); + + break; + + case O2_VOLTAGE: // A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) + engine_data = can_MsgRx.data[3]*0.005; + sprintf(buffer,"%d v ",(int) engine_data); + + case THROTTLE: // + engine_data = (can_MsgRx.data[3]*100)/255; + sprintf(buffer,"%d %% ",(int) engine_data); + + + break; + } + + return 1; + + } + + } + } + + return 0; + + + + +} +} // namespace mbed \ No newline at end of file
diff -r 000000000000 -r 60212cabf694 ecu_reader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ecu_reader.h Mon Jan 31 05:18:42 2011 +0000 @@ -0,0 +1,43 @@ +#ifndef ECU_READER_H +#define ECU_READER_H + +#define CANSPEED_125 125000 // CAN speed at 125 kbps +#define CANSPEED_250 250000 // CAN speed at 250 kbps +#define CANSPEED_500 500000 // CAN speed at 500 kbps + + /* Details from http://en.wikipedia.org/wiki/OBD-II_PIDs */ +#define ENGINE_COOLANT_TEMP 0x05 +#define ENGINE_RPM 0x0C +#define VEHICLE_SPEED 0x0D +#define MAF_SENSOR 0x10 +#define THROTTLE 0x11 +#define O2_VOLTAGE 0x14 + +#define PID_REQUEST 0x7DF +#define PID_REPLY 0x7E8 + +namespace mbed { + +class ecu_reader{ + +public: + + ecu_reader(int can_speed); + + unsigned char request(unsigned char pid, char *buffer); + +private: + + int i; + +}; + + + + + + } + + + +#endif \ No newline at end of file
diff -r 000000000000 -r 60212cabf694 globals.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/globals.cpp Mon Jan 31 05:18:42 2011 +0000 @@ -0,0 +1,12 @@ +#include "globals.h" + +Serial pc (USBTX,USBRX); + +DigitalOut led1 (LED1); +DigitalOut led2 (LED2); +DigitalOut led3 (LED3); +DigitalOut led4 (LED4); + +// We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). +CAN can2(p9, p10); +CANMessage can_MsgRx; \ No newline at end of file
diff -r 000000000000 -r 60212cabf694 globals.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/globals.h Mon Jan 31 05:18:42 2011 +0000 @@ -0,0 +1,15 @@ +#ifndef GLOBALS_H +#define GLOBALS_H + +#include "mbed.h" + +extern Serial pc; +extern DigitalOut led1; +extern DigitalOut led2; +extern DigitalOut led3; +extern DigitalOut led4; + +// We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). +extern CAN can2; +extern CANMessage can_MsgRx; +#endif \ No newline at end of file
diff -r 000000000000 -r 60212cabf694 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jan 31 05:18:42 2011 +0000 @@ -0,0 +1,71 @@ +/* + +mbed Can-Bus demo + +This program is to demonstrate the CAN-bus capability of the mbed module. + +http://www.skpang.co.uk/catalog/product_info.php?products_id=741 + +v1.0 July 2010 + +******************************************************************************** + +WARNING: Use at your own risk, sadly this software comes with no guarantees. +This software is provided 'free' and in good faith, but the author does not +accept liability for any damage arising from its use. + +******************************************************************************** + + +*/ + +#include "mbed.h" +#include "ecu_reader.h" +#include "globals.h" + + +ecu_reader obdii(CANSPEED_500); //Create object and set CAN speed + +int main() { + + char buffer[20]; + + pc.printf("\n\rCAN-bus demo..."); + + while(1) { // Main CAN loop + led2 = 1; + wait(0.1); + led2 = 0; + wait(0.1); + + if(obdii.request(ENGINE_RPM,buffer) == 1) // Get engine rpm and display on LCD + { + pc.printf("%s\n\r", buffer); + } + + if(obdii.request(ENGINE_COOLANT_TEMP,buffer) == 1) + { + pc.printf("%s\n\r", buffer); + } + + if(obdii.request(VEHICLE_SPEED,buffer) == 1) + { + pc.printf("%s\n\r", buffer); + } + + if(obdii.request(THROTTLE,buffer) ==1 ) + { + pc.printf("%s\n\r", buffer); + } + + if(obdii.request(MAF_SENSOR,buffer) ==1 ) + { + pc.printf("%s\n\r", buffer); + } + + if(obdii.request(O2_VOLTAGE,buffer) ==1 ) + { + pc.printf("%s\n\r", buffer); + } + } +} \ No newline at end of file
diff -r 000000000000 -r 60212cabf694 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Jan 31 05:18:42 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/9114680c05da