ok

Dependencies:   PinDetect TextLCD mbed

Committer:
reiniermarcel
Date:
Mon Nov 30 11:12:00 2015 +0000
Revision:
0:2132d7ad612f
ok

Who changed what in which revision?

UserRevisionLine numberNew 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 }