Matthew Marino
/
MBEDCAN_BNO
bno sensor for nmea
main.cpp@0:b0181b1ec83e, 2019-03-17 (annotated)
- Committer:
- LukeMar
- Date:
- Sun Mar 17 00:59:10 2019 +0000
- Revision:
- 0:b0181b1ec83e
3/16/19
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
LukeMar | 0:b0181b1ec83e | 1 | // Program to test the CAN bus using pins 29 and 30 on the mbed connected |
LukeMar | 0:b0181b1ec83e | 2 | // to an MCP2551 CAN transceiver bus IC |
LukeMar | 0:b0181b1ec83e | 3 | // Note that this program will only continue to transmit while the TX message is <= 8 bytes long |
LukeMar | 0:b0181b1ec83e | 4 | |
LukeMar | 0:b0181b1ec83e | 5 | #include "mbed.h" |
LukeMar | 0:b0181b1ec83e | 6 | #include "BNO055.h" |
LukeMar | 0:b0181b1ec83e | 7 | |
LukeMar | 0:b0181b1ec83e | 8 | #define RUDDER_ID 1 |
LukeMar | 0:b0181b1ec83e | 9 | #define BNO_ID 2 //Address of this CAN device |
LukeMar | 0:b0181b1ec83e | 10 | #define TELE_ID 3 |
LukeMar | 0:b0181b1ec83e | 11 | #define RC_ID 4 |
LukeMar | 0:b0181b1ec83e | 12 | |
LukeMar | 0:b0181b1ec83e | 13 | Serial pc(USBTX, USBRX); //tx, and rx for tera term |
LukeMar | 0:b0181b1ec83e | 14 | DigitalOut led1(LED1); //heartbeat |
LukeMar | 0:b0181b1ec83e | 15 | DigitalOut led2(LED2); //CAN read activity |
LukeMar | 0:b0181b1ec83e | 16 | DigitalOut led3(LED3); //CAN write activity |
LukeMar | 0:b0181b1ec83e | 17 | BNO055 bno(p9, p10); // (SDA, SCL) or... SDA is p28, SCL is p27 |
LukeMar | 0:b0181b1ec83e | 18 | CAN can(p30,p29); //CAN interface |
LukeMar | 0:b0181b1ec83e | 19 | Ticker pulse; |
LukeMar | 0:b0181b1ec83e | 20 | Timer tlog; |
LukeMar | 0:b0181b1ec83e | 21 | int tt = 1500; //thread delay to prevent self inflicted DOS |
LukeMar | 0:b0181b1ec83e | 22 | |
LukeMar | 0:b0181b1ec83e | 23 | void alive(void){ |
LukeMar | 0:b0181b1ec83e | 24 | led1 = !led1; |
LukeMar | 0:b0181b1ec83e | 25 | if(led1) |
LukeMar | 0:b0181b1ec83e | 26 | pulse.attach(&alive, .2); // the address of the function to be attached (flip) and the interval (2 seconds) |
LukeMar | 0:b0181b1ec83e | 27 | else |
LukeMar | 0:b0181b1ec83e | 28 | pulse.attach(&alive, 1.3); // the address of the function to be attached (flip) and the interval (2 seconds) |
LukeMar | 0:b0181b1ec83e | 29 | } |
LukeMar | 0:b0181b1ec83e | 30 | |
LukeMar | 0:b0181b1ec83e | 31 | void bno_init(void){ |
LukeMar | 0:b0181b1ec83e | 32 | if(bno.check()){ |
LukeMar | 0:b0181b1ec83e | 33 | pc.printf("BNO055 connected\r\n"); |
LukeMar | 0:b0181b1ec83e | 34 | bno.reset(); |
LukeMar | 0:b0181b1ec83e | 35 | wait(.5); |
LukeMar | 0:b0181b1ec83e | 36 | bno.setmode(OPERATION_MODE_CONFIG); |
LukeMar | 0:b0181b1ec83e | 37 | bno.SetExternalCrystal(1); |
LukeMar | 0:b0181b1ec83e | 38 | //bno.set_orientation(1); |
LukeMar | 0:b0181b1ec83e | 39 | bno.setmode(OPERATION_MODE_NDOF); //Uses magnetometer |
LukeMar | 0:b0181b1ec83e | 40 | //bno.setmode(OPERATION_MODE_NDOF_FMC_OFF); //no magnetometer |
LukeMar | 0:b0181b1ec83e | 41 | bno.set_angle_units(RADIANS); |
LukeMar | 0:b0181b1ec83e | 42 | } |
LukeMar | 0:b0181b1ec83e | 43 | else{ |
LukeMar | 0:b0181b1ec83e | 44 | pc.printf("BNO055 NOT connected\r\n Program Trap."); |
LukeMar | 0:b0181b1ec83e | 45 | while(1); |
LukeMar | 0:b0181b1ec83e | 46 | } |
LukeMar | 0:b0181b1ec83e | 47 | } |
LukeMar | 0:b0181b1ec83e | 48 | |
LukeMar | 0:b0181b1ec83e | 49 | |
LukeMar | 0:b0181b1ec83e | 50 | int main() { |
LukeMar | 0:b0181b1ec83e | 51 | char msg_send[20]; |
LukeMar | 0:b0181b1ec83e | 52 | Thread::wait(200); |
LukeMar | 0:b0181b1ec83e | 53 | |
LukeMar | 0:b0181b1ec83e | 54 | pulse.attach(&alive, 2.0); // the address of the function to be attached (alive) and the interval (2 seconds) |
LukeMar | 0:b0181b1ec83e | 55 | pc.baud(115200); |
LukeMar | 0:b0181b1ec83e | 56 | bno_init(); |
LukeMar | 0:b0181b1ec83e | 57 | can.frequency(500000); |
LukeMar | 0:b0181b1ec83e | 58 | tlog.start(); |
LukeMar | 0:b0181b1ec83e | 59 | |
LukeMar | 0:b0181b1ec83e | 60 | pc.printf("%s\r\n", __FILE__); |
LukeMar | 0:b0181b1ec83e | 61 | |
LukeMar | 0:b0181b1ec83e | 62 | while(1) { |
LukeMar | 0:b0181b1ec83e | 63 | |
LukeMar | 0:b0181b1ec83e | 64 | bno.get_angles(); |
LukeMar | 0:b0181b1ec83e | 65 | //sprintf(bnoStr, "%.2f %.2f %.2f",bno.euler.roll, bno.euler.pitch, bno.euler.yaw); |
LukeMar | 0:b0181b1ec83e | 66 | sprintf(msg_send, "s%.1f\r\n", bno.euler.pitch); //format output message string |
LukeMar | 0:b0181b1ec83e | 67 | |
LukeMar | 0:b0181b1ec83e | 68 | if(strlen(msg_send) > 8){ //if the message length exceeds 8 bytes |
LukeMar | 0:b0181b1ec83e | 69 | sprintf(msg_send, "bError"); //re-format the string as an error |
LukeMar | 0:b0181b1ec83e | 70 | } |
LukeMar | 0:b0181b1ec83e | 71 | |
LukeMar | 0:b0181b1ec83e | 72 | if(can.write(CANMessage(BNO_ID, msg_send, strlen(msg_send)))){ |
LukeMar | 0:b0181b1ec83e | 73 | pc.printf("\r\n Time: %4.3f \t Message: %s", tlog.read(), msg_send); |
LukeMar | 0:b0181b1ec83e | 74 | led2 = !led2; |
LukeMar | 0:b0181b1ec83e | 75 | //set up a random delay time of up to .79 seconds |
LukeMar | 0:b0181b1ec83e | 76 | //delayT = ((rand() % 7) * 31.0) + ((rand() % 9) * .1) + runTime.sec_total; |
LukeMar | 0:b0181b1ec83e | 77 | } |
LukeMar | 0:b0181b1ec83e | 78 | else{ |
LukeMar | 0:b0181b1ec83e | 79 | can.reset(); |
LukeMar | 0:b0181b1ec83e | 80 | } |
LukeMar | 0:b0181b1ec83e | 81 | Thread::wait(tt); |
LukeMar | 0:b0181b1ec83e | 82 | }//while(1) |
LukeMar | 0:b0181b1ec83e | 83 | }//main |