ok
Dependencies: PinDetect TextLCD mbed
main.cpp@0:2132d7ad612f, 2015-11-30 (annotated)
- Committer:
- reiniermarcel
- Date:
- Mon Nov 30 11:12:00 2015 +0000
- Revision:
- 0:2132d7ad612f
ok
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
reiniermarcel | 0:2132d7ad612f | 1 | /* |
reiniermarcel | 0:2132d7ad612f | 2 | |
reiniermarcel | 0:2132d7ad612f | 3 | mbed LPC1768 |
reiniermarcel | 0:2132d7ad612f | 4 | ___________________ |
reiniermarcel | 0:2132d7ad612f | 5 | 1 |GND | | VOUT|40 |
reiniermarcel | 0:2132d7ad612f | 6 | 2 |VIN | | VU|39 |
reiniermarcel | 0:2132d7ad612f | 7 | 3 |VB |____| IF-|38 |
reiniermarcel | 0:2132d7ad612f | 8 | 4 |nR IF+|37 |
reiniermarcel | 0:2132d7ad612f | 9 | SPI NRF24L01+ 5 |MOSI ETH RD-|36 |
reiniermarcel | 0:2132d7ad612f | 10 | SPI NRF24L01+ 6 |MISO ETH RD+|35 |
reiniermarcel | 0:2132d7ad612f | 11 | SPI NRF24L01+ 7 |SCK ETH TD-|34 |
reiniermarcel | 0:2132d7ad612f | 12 | SPI (CSN) NRF24L01+ 8 | ETH TD+|33 |
reiniermarcel | 0:2132d7ad612f | 13 | SPI (CE) NRF24L01+ 9 |TX/SDA USB D-|32 |
reiniermarcel | 0:2132d7ad612f | 14 | SPI (IRQ) NRF24L01+ 10|RX/SCL USB D+|31 |
reiniermarcel | 0:2132d7ad612f | 15 | 11|MOSI (CAN)RD|30 CAN bus |
reiniermarcel | 0:2132d7ad612f | 16 | 12|MISO (CAN)TD|29 CAN bus |
reiniermarcel | 0:2132d7ad612f | 17 | 13|TX/SCK SDA/TX|28 I2C 16x2 Display |
reiniermarcel | 0:2132d7ad612f | 18 | 14|RX SCL/RX|27 I2C 16x2 Display |
reiniermarcel | 0:2132d7ad612f | 19 | Left indicator input 15|AI PWMOUT|26 |
reiniermarcel | 0:2132d7ad612f | 20 | Right indicator input 16|AI PWMOUT|25 |
reiniermarcel | 0:2132d7ad612f | 21 | Headlights input 17|AI PWMOUT|24 Dashboard left indicator output |
reiniermarcel | 0:2132d7ad612f | 22 | Brake input 18|AI/AOUT PWMOUT|23 Dashboard right indicator output |
reiniermarcel | 0:2132d7ad612f | 23 | 19|AI PWMOUT|22 Dashboard headlights output |
reiniermarcel | 0:2132d7ad612f | 24 | 20|AI PWMOUT|21 Dashboard warning output |
reiniermarcel | 0:2132d7ad612f | 25 | ------------------- |
reiniermarcel | 0:2132d7ad612f | 26 | |
reiniermarcel | 0:2132d7ad612f | 27 | */ |
reiniermarcel | 0:2132d7ad612f | 28 | |
reiniermarcel | 0:2132d7ad612f | 29 | #define DEBUG 1 //1 = debugging via USB serial port, 0 = debugging off |
reiniermarcel | 0:2132d7ad612f | 30 | |
reiniermarcel | 0:2132d7ad612f | 31 | #include "mbed.h" |
reiniermarcel | 0:2132d7ad612f | 32 | #include "PinDetect.h" |
reiniermarcel | 0:2132d7ad612f | 33 | #include "TextLCD.h" |
reiniermarcel | 0:2132d7ad612f | 34 | |
reiniermarcel | 0:2132d7ad612f | 35 | //pinouts |
reiniermarcel | 0:2132d7ad612f | 36 | PinDetect PIN_LEFT_IN (p15); |
reiniermarcel | 0:2132d7ad612f | 37 | PinDetect PIN_RIGHT_IN (p16); |
reiniermarcel | 0:2132d7ad612f | 38 | PinDetect PIN_HEADLIGHTS_IN (p17); |
reiniermarcel | 0:2132d7ad612f | 39 | PinDetect PIN_BRAKE_IN (p18); |
reiniermarcel | 0:2132d7ad612f | 40 | DigitalOut PIN_WARNING_OUT (p21); |
reiniermarcel | 0:2132d7ad612f | 41 | DigitalOut PIN_HEADLIGHTS_OUT (p22); |
reiniermarcel | 0:2132d7ad612f | 42 | DigitalOut PIN_RIGHT_OUT (p23); |
reiniermarcel | 0:2132d7ad612f | 43 | DigitalOut PIN_LEFT_OUT (p24); |
reiniermarcel | 0:2132d7ad612f | 44 | DigitalOut LED_1 (LED1); //onboard |
reiniermarcel | 0:2132d7ad612f | 45 | DigitalOut LED_2 (LED2); //onboard |
reiniermarcel | 0:2132d7ad612f | 46 | DigitalOut LED_3 (LED3); //onboard |
reiniermarcel | 0:2132d7ad612f | 47 | DigitalOut LED_4 (LED4); //onboard |
reiniermarcel | 0:2132d7ad612f | 48 | |
reiniermarcel | 0:2132d7ad612f | 49 | //Setup serial pins for debugging |
reiniermarcel | 0:2132d7ad612f | 50 | Serial pc(USBTX, USBRX); |
reiniermarcel | 0:2132d7ad612f | 51 | |
reiniermarcel | 0:2132d7ad612f | 52 | //Setup I2C pins for 16x2 display |
reiniermarcel | 0:2132d7ad612f | 53 | I2C i2c_lcd(p28,p27); //SDA, SCL |
reiniermarcel | 0:2132d7ad612f | 54 | TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD16x2); // I2C exp: I2C bus, PCF8574 Slaveaddress, LCD Type |
reiniermarcel | 0:2132d7ad612f | 55 | |
reiniermarcel | 0:2132d7ad612f | 56 | //Setup CAN busses 1 en 2 |
reiniermarcel | 0:2132d7ad612f | 57 | CAN CAN1(p9, p10); |
reiniermarcel | 0:2132d7ad612f | 58 | CAN CAN2(p30, p29); |
reiniermarcel | 0:2132d7ad612f | 59 | char CANcounter = 'a'; |
reiniermarcel | 0:2132d7ad612f | 60 | Ticker CANticker; |
reiniermarcel | 0:2132d7ad612f | 61 | |
reiniermarcel | 0:2132d7ad612f | 62 | //Setup tickers for blinking the indicator and warning lights on the dashboard |
reiniermarcel | 0:2132d7ad612f | 63 | Ticker ticker_left; |
reiniermarcel | 0:2132d7ad612f | 64 | Ticker ticker_right; |
reiniermarcel | 0:2132d7ad612f | 65 | Ticker ticker_warning; |
reiniermarcel | 0:2132d7ad612f | 66 | |
reiniermarcel | 0:2132d7ad612f | 67 | void CANsend() //Sends a message from CAN1 |
reiniermarcel | 0:2132d7ad612f | 68 | { |
reiniermarcel | 0:2132d7ad612f | 69 | pc.printf("send()\n"); |
reiniermarcel | 0:2132d7ad612f | 70 | CANMessage CANmsgTX(CANMessage(887, &CANcounter, 1)); |
reiniermarcel | 0:2132d7ad612f | 71 | if(CAN1.write(CANmsgTX)) |
reiniermarcel | 0:2132d7ad612f | 72 | { |
reiniermarcel | 0:2132d7ad612f | 73 | CANcounter++; |
reiniermarcel | 0:2132d7ad612f | 74 | pc.printf("MESSAGE SENT: %d, %d\n", CANcounter, CANmsgTX.data[0]); |
reiniermarcel | 0:2132d7ad612f | 75 | LED_1 = !LED_1; |
reiniermarcel | 0:2132d7ad612f | 76 | } |
reiniermarcel | 0:2132d7ad612f | 77 | else |
reiniermarcel | 0:2132d7ad612f | 78 | { |
reiniermarcel | 0:2132d7ad612f | 79 | pc.printf("Failed to send the message\n"); |
reiniermarcel | 0:2132d7ad612f | 80 | } |
reiniermarcel | 0:2132d7ad612f | 81 | } |
reiniermarcel | 0:2132d7ad612f | 82 | |
reiniermarcel | 0:2132d7ad612f | 83 | void toggle_left() { PIN_LEFT_OUT = !PIN_LEFT_OUT; } |
reiniermarcel | 0:2132d7ad612f | 84 | void toggle_right() { PIN_RIGHT_OUT = !PIN_RIGHT_OUT; } |
reiniermarcel | 0:2132d7ad612f | 85 | void toggle_warning() { PIN_WARNING_OUT = !PIN_WARNING_OUT; } |
reiniermarcel | 0:2132d7ad612f | 86 | |
reiniermarcel | 0:2132d7ad612f | 87 | void start_left() |
reiniermarcel | 0:2132d7ad612f | 88 | |
reiniermarcel | 0:2132d7ad612f | 89 | { |
reiniermarcel | 0:2132d7ad612f | 90 | PIN_LEFT_OUT = 1; |
reiniermarcel | 0:2132d7ad612f | 91 | ticker_left.attach(&toggle_left, 0.5); |
reiniermarcel | 0:2132d7ad612f | 92 | //SEND CAN TO LEFT_FRONT_MODULE AND BACK_MODULE |
reiniermarcel | 0:2132d7ad612f | 93 | if(DEBUG) pc.printf("Left on\n"); |
reiniermarcel | 0:2132d7ad612f | 94 | } |
reiniermarcel | 0:2132d7ad612f | 95 | |
reiniermarcel | 0:2132d7ad612f | 96 | void stop_left() |
reiniermarcel | 0:2132d7ad612f | 97 | { |
reiniermarcel | 0:2132d7ad612f | 98 | ticker_left.detach(); |
reiniermarcel | 0:2132d7ad612f | 99 | PIN_LEFT_OUT = 0; |
reiniermarcel | 0:2132d7ad612f | 100 | //SEND CAN TO LEFT_FRONT_MODULE AND BACK_MODULE |
reiniermarcel | 0:2132d7ad612f | 101 | if(DEBUG) pc.printf("Left off\n"); |
reiniermarcel | 0:2132d7ad612f | 102 | } |
reiniermarcel | 0:2132d7ad612f | 103 | |
reiniermarcel | 0:2132d7ad612f | 104 | void start_right() |
reiniermarcel | 0:2132d7ad612f | 105 | { |
reiniermarcel | 0:2132d7ad612f | 106 | PIN_RIGHT_OUT = 1; |
reiniermarcel | 0:2132d7ad612f | 107 | ticker_right.attach(&toggle_right, 0.5); |
reiniermarcel | 0:2132d7ad612f | 108 | //SEND CAN TO RIGHT_FRONT_MODULE AND BACK_MODULE |
reiniermarcel | 0:2132d7ad612f | 109 | if(DEBUG) pc.printf("Right on\n"); |
reiniermarcel | 0:2132d7ad612f | 110 | } |
reiniermarcel | 0:2132d7ad612f | 111 | |
reiniermarcel | 0:2132d7ad612f | 112 | void stop_right() |
reiniermarcel | 0:2132d7ad612f | 113 | { |
reiniermarcel | 0:2132d7ad612f | 114 | ticker_right.detach(); |
reiniermarcel | 0:2132d7ad612f | 115 | PIN_RIGHT_OUT = 0; |
reiniermarcel | 0:2132d7ad612f | 116 | //SEND CAN TO RIGHT_FRONT_MODULE AND BACK_MODULE |
reiniermarcel | 0:2132d7ad612f | 117 | if(DEBUG) pc.printf("Right off\n"); |
reiniermarcel | 0:2132d7ad612f | 118 | } |
reiniermarcel | 0:2132d7ad612f | 119 | |
reiniermarcel | 0:2132d7ad612f | 120 | void start_headlights() |
reiniermarcel | 0:2132d7ad612f | 121 | { |
reiniermarcel | 0:2132d7ad612f | 122 | PIN_HEADLIGHTS_OUT = 1; |
reiniermarcel | 0:2132d7ad612f | 123 | //SEND CAN TO LEFT_FRONT_MODULE AND RIGHT_FRONT_MODULE |
reiniermarcel | 0:2132d7ad612f | 124 | if(DEBUG) pc.printf("Headlights on\n"); |
reiniermarcel | 0:2132d7ad612f | 125 | } |
reiniermarcel | 0:2132d7ad612f | 126 | |
reiniermarcel | 0:2132d7ad612f | 127 | void stop_headlights() |
reiniermarcel | 0:2132d7ad612f | 128 | { |
reiniermarcel | 0:2132d7ad612f | 129 | PIN_HEADLIGHTS_OUT = 0; |
reiniermarcel | 0:2132d7ad612f | 130 | //SEND CAN TO LEFT_FRONT_MODULE AND RIGHT_FRONT_MODULE |
reiniermarcel | 0:2132d7ad612f | 131 | if(DEBUG) pc.printf("Headlights off\n"); |
reiniermarcel | 0:2132d7ad612f | 132 | } |
reiniermarcel | 0:2132d7ad612f | 133 | |
reiniermarcel | 0:2132d7ad612f | 134 | void start_brake() |
reiniermarcel | 0:2132d7ad612f | 135 | { |
reiniermarcel | 0:2132d7ad612f | 136 | PIN_WARNING_OUT = 1; |
reiniermarcel | 0:2132d7ad612f | 137 | ticker_warning.attach(&toggle_warning, 0.2); |
reiniermarcel | 0:2132d7ad612f | 138 | //SEND CAN TO BACK_MODULE |
reiniermarcel | 0:2132d7ad612f | 139 | if(DEBUG) pc.printf("Brake start\n"); |
reiniermarcel | 0:2132d7ad612f | 140 | } |
reiniermarcel | 0:2132d7ad612f | 141 | |
reiniermarcel | 0:2132d7ad612f | 142 | void stop_brake() |
reiniermarcel | 0:2132d7ad612f | 143 | { |
reiniermarcel | 0:2132d7ad612f | 144 | ticker_warning.detach(); |
reiniermarcel | 0:2132d7ad612f | 145 | PIN_WARNING_OUT = 0; |
reiniermarcel | 0:2132d7ad612f | 146 | //SEND CAN TO BACK_MODULE |
reiniermarcel | 0:2132d7ad612f | 147 | if(DEBUG) pc.printf("Brake stop\n"); |
reiniermarcel | 0:2132d7ad612f | 148 | } |
reiniermarcel | 0:2132d7ad612f | 149 | |
reiniermarcel | 0:2132d7ad612f | 150 | int main() |
reiniermarcel | 0:2132d7ad612f | 151 | { |
reiniermarcel | 0:2132d7ad612f | 152 | if(DEBUG) pc.baud(230400); //default 9600, but we want it to be as fast as possible |
reiniermarcel | 0:2132d7ad612f | 153 | if(DEBUG) pc.printf("BRW Urban Features Controller\n\n"); |
reiniermarcel | 0:2132d7ad612f | 154 | if(DEBUG) pc.printf("Setting up...\n"); |
reiniermarcel | 0:2132d7ad612f | 155 | |
reiniermarcel | 0:2132d7ad612f | 156 | //setup PinDetect; input interrupts with built-in debounce (important!) |
reiniermarcel | 0:2132d7ad612f | 157 | PIN_LEFT_IN.attach_asserted (&start_left); //press |
reiniermarcel | 0:2132d7ad612f | 158 | PIN_LEFT_IN.attach_deasserted (&stop_left); //release |
reiniermarcel | 0:2132d7ad612f | 159 | PIN_LEFT_IN.setSampleFrequency (); //defaults to 20ms. |
reiniermarcel | 0:2132d7ad612f | 160 | PIN_RIGHT_IN.attach_asserted (&start_right); |
reiniermarcel | 0:2132d7ad612f | 161 | PIN_RIGHT_IN.attach_deasserted (&stop_right); |
reiniermarcel | 0:2132d7ad612f | 162 | PIN_RIGHT_IN.setSampleFrequency (); |
reiniermarcel | 0:2132d7ad612f | 163 | PIN_HEADLIGHTS_IN.attach_asserted (&start_headlights); |
reiniermarcel | 0:2132d7ad612f | 164 | PIN_HEADLIGHTS_IN.attach_deasserted (&stop_headlights); |
reiniermarcel | 0:2132d7ad612f | 165 | PIN_HEADLIGHTS_IN.setSampleFrequency (); |
reiniermarcel | 0:2132d7ad612f | 166 | PIN_BRAKE_IN.attach_asserted (&start_brake); |
reiniermarcel | 0:2132d7ad612f | 167 | PIN_BRAKE_IN.attach_deasserted (&stop_brake); |
reiniermarcel | 0:2132d7ad612f | 168 | PIN_BRAKE_IN.setSampleFrequency (); |
reiniermarcel | 0:2132d7ad612f | 169 | if(DEBUG) pc.printf("Pin interrupts set\n"); |
reiniermarcel | 0:2132d7ad612f | 170 | |
reiniermarcel | 0:2132d7ad612f | 171 | //setup 16x2 display |
reiniermarcel | 0:2132d7ad612f | 172 | lcd.setCursor(TextLCD::CurOff_BlkOff); //cursor off, blinking off |
reiniermarcel | 0:2132d7ad612f | 173 | lcd.cls(); //clear screen |
reiniermarcel | 0:2132d7ad612f | 174 | if(DEBUG) pc.printf("Display initialized\n"); |
reiniermarcel | 0:2132d7ad612f | 175 | |
reiniermarcel | 0:2132d7ad612f | 176 | //setup CAN bus |
reiniermarcel | 0:2132d7ad612f | 177 | CAN1.frequency(615000); |
reiniermarcel | 0:2132d7ad612f | 178 | CAN2.frequency(615000); |
reiniermarcel | 0:2132d7ad612f | 179 | CANticker.attach(&CANsend, 1); //Calls the function CANsend() every second |
reiniermarcel | 0:2132d7ad612f | 180 | CANMessage CANmsgRX; |
reiniermarcel | 0:2132d7ad612f | 181 | |
reiniermarcel | 0:2132d7ad612f | 182 | if(DEBUG) pc.printf("Setup complete.\n\n"); |
reiniermarcel | 0:2132d7ad612f | 183 | |
reiniermarcel | 0:2132d7ad612f | 184 | pc.printf("main()\n"); |
reiniermarcel | 0:2132d7ad612f | 185 | |
reiniermarcel | 0:2132d7ad612f | 186 | while(1) { //Constantly check for a Rx'ed message on CAN2, and notify if there is one |
reiniermarcel | 0:2132d7ad612f | 187 | //pc.printf("loop()\n"); |
reiniermarcel | 0:2132d7ad612f | 188 | //pc.printf("RXed MSG:%d\n", can2.read(msg1)); |
reiniermarcel | 0:2132d7ad612f | 189 | if(CAN2.read(CANmsgRX)) { |
reiniermarcel | 0:2132d7ad612f | 190 | char ch = CANmsgRX.data[0]; |
reiniermarcel | 0:2132d7ad612f | 191 | lcd.locate(0,0); |
reiniermarcel | 0:2132d7ad612f | 192 | lcd.printf("Message received: "); |
reiniermarcel | 0:2132d7ad612f | 193 | lcd.putc(ch); |
reiniermarcel | 0:2132d7ad612f | 194 | LED_2 = !LED_2; |
reiniermarcel | 0:2132d7ad612f | 195 | wait(0.5); |
reiniermarcel | 0:2132d7ad612f | 196 | lcd.cls(); |
reiniermarcel | 0:2132d7ad612f | 197 | } |
reiniermarcel | 0:2132d7ad612f | 198 | } |
reiniermarcel | 0:2132d7ad612f | 199 | } |