Jasmine Karlsson
/
train_rail
New project
main.cpp@13:78a2481fd65b, 2018-06-06 (annotated)
- Committer:
- tanjinamicky
- Date:
- Wed Jun 06 11:44:35 2018 +0000
- Revision:
- 13:78a2481fd65b
- Parent:
- 12:75aab2bdb3a1
- Child:
- 14:a5fd98a957e6
move forward and stop
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jasminealice | 0:57cbecaac770 | 1 | #include "mbed.h" |
Kwame |
2:9bb410612929 | 2 | #include "TextLCD.h" |
jasminealice | 4:4b62680f91b5 | 3 | #include <string> |
jasminealice | 4:4b62680f91b5 | 4 | #include <iostream> |
KwamsC | 10:cda57976225f | 5 | #include "mcp23017.h" |
jasminealice | 0:57cbecaac770 | 6 | |
KwamsC | 10:cda57976225f | 7 | |
KwamsC | 10:cda57976225f | 8 | //board 1 |
KwamsC | 10:cda57976225f | 9 | |
KwamsC | 10:cda57976225f | 10 | I2C i2c(p28, p27); // sda, scl pins (you can also use the other I2C port pins: 9,10) |
KwamsC | 10:cda57976225f | 11 | |
KwamsC | 10:cda57976225f | 12 | const int addr0 = 0x20 << 1; // 7-bit base address of the MCP23017 + address bits (which are 000 for the first one), shifted 1 place to the right (see top header) |
KwamsC | 10:cda57976225f | 13 | |
KwamsC | 10:cda57976225f | 14 | DigitalOut myled(LED1); // |
KwamsC | 10:cda57976225f | 15 | DigitalOut myled2(LED2); // led |
KwamsC | 10:cda57976225f | 16 | DigitalOut myled3(LED3); // |
KwamsC | 10:cda57976225f | 17 | DigitalOut myled4(LED4); // |
KwamsC | 10:cda57976225f | 18 | AnalogIn Ain(p20); // pot. met. |
tanjinamicky | 13:78a2481fd65b | 19 | DigitalOut Track(p21); // train track |
KwamsC | 10:cda57976225f | 20 | |
tanjinamicky | 13:78a2481fd65b | 21 | AnalogIn detect_21(p15); // detectors pin d2, d21, d22 |
tanjinamicky | 13:78a2481fd65b | 22 | AnalogIn detect_22(p16); |
tanjinamicky | 13:78a2481fd65b | 23 | AnalogIn detect_2(p17); |
KwamsC | 10:cda57976225f | 24 | |
KwamsC | 10:cda57976225f | 25 | DigitalIn sw1(p5); // |
KwamsC | 10:cda57976225f | 26 | DigitalIn sw2(p30); // switches |
KwamsC | 10:cda57976225f | 27 | DigitalIn sw3(p29); // |
KwamsC | 10:cda57976225f | 28 | DigitalIn sw4(p28); // |
jasminealice | 0:57cbecaac770 | 29 | |
KwamsC | 10:cda57976225f | 30 | void mcpWriteReg(uint8_t address, uint8_t reg, uint8_t data); // Write an I2C register |
KwamsC | 10:cda57976225f | 31 | uint8_t mcpReadReg(uint8_t address, uint8_t reg); // Read an I2C register |
KwamsC | 10:cda57976225f | 32 | void initMcp0(void); |
tanjinamicky | 13:78a2481fd65b | 33 | void readVoltage(); |
tanjinamicky | 13:78a2481fd65b | 34 | void readDetector(); |
KwamsC | 10:cda57976225f | 35 | |
tanjinamicky | 13:78a2481fd65b | 36 | unsigned int DCCaddress_darkRed = 0x01; |
tanjinamicky | 13:78a2481fd65b | 37 | unsigned int DCCaddress_lightRed = 0x03; |
KwamsC | 10:cda57976225f | 38 | unsigned int DCCinst_forward = 0x68; //forward half speed |
KwamsC | 10:cda57976225f | 39 | |
tanjinamicky | 13:78a2481fd65b | 40 | unsigned int DCCinst_forward_stop = 0x60; //forward and stop 01100000 |
tanjinamicky | 13:78a2481fd65b | 41 | |
KwamsC | 10:cda57976225f | 42 | //move forward |
KwamsC | 10:cda57976225f | 43 | |
KwamsC | 10:cda57976225f | 44 | //speed dial |
KwamsC | 10:cda57976225f | 45 | |
KwamsC | 10:cda57976225f | 46 | //stop |
KwamsC | 10:cda57976225f | 47 | |
KwamsC | 10:cda57976225f | 48 | //read switch out |
KwamsC | 10:cda57976225f | 49 | |
KwamsC | 10:cda57976225f | 50 | //read signal |
KwamsC | 10:cda57976225f | 51 | |
KwamsC | 10:cda57976225f | 52 | //display message |
KwamsC | 10:cda57976225f | 53 | |
KwamsC | 10:cda57976225f | 54 | //send command |
KwamsC | 10:cda57976225f | 55 | void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count); |
KwamsC | 10:cda57976225f | 56 | |
KwamsC | 10:cda57976225f | 57 | TextLCD lcd(p22, p21, p23, p24, p25, p26); // lcd |
jasminealice | 4:4b62680f91b5 | 58 | |
jasminealice | 5:49651a9f8ff7 | 59 | int main() { |
jasminealice | 5:49651a9f8ff7 | 60 | while(1){ |
tanjinamicky | 13:78a2481fd65b | 61 | //unsigned int DCCaddress = 0x03; |
tanjinamicky | 13:78a2481fd65b | 62 | //unsigned int DCCaddress_darkRed = 0x01; |
tanjinamicky | 13:78a2481fd65b | 63 | readDetector(); |
tanjinamicky | 13:78a2481fd65b | 64 | lcd.printf("Forward"); |
tanjinamicky | 13:78a2481fd65b | 65 | DCC_send_command(DCCaddress_lightRed,DCCinst_forward,400); // forward half speed train address 3 |
tanjinamicky | 13:78a2481fd65b | 66 | wait(0.5); |
tanjinamicky | 13:78a2481fd65b | 67 | lcd.printf("Stop"); |
tanjinamicky | 13:78a2481fd65b | 68 | DCC_send_command(DCCaddress_lightRed,DCCinst_forward_stop,400); // forward half speed train address 3 |
tanjinamicky | 13:78a2481fd65b | 69 | wait(1); |
tanjinamicky | 13:78a2481fd65b | 70 | //readVoltage(); |
tanjinamicky | 13:78a2481fd65b | 71 | //myled=1; |
tanjinamicky | 13:78a2481fd65b | 72 | } |
tanjinamicky | 13:78a2481fd65b | 73 | } |
tanjinamicky | 13:78a2481fd65b | 74 | |
tanjinamicky | 13:78a2481fd65b | 75 | void readDetector(){ |
tanjinamicky | 13:78a2481fd65b | 76 | float val = detect_21.read(); |
tanjinamicky | 13:78a2481fd65b | 77 | lcd.printf("%.2f", val); |
tanjinamicky | 13:78a2481fd65b | 78 | } |
tanjinamicky | 13:78a2481fd65b | 79 | |
tanjinamicky | 13:78a2481fd65b | 80 | void readVoltage(){ |
jasminealice | 5:49651a9f8ff7 | 81 | float f = Ain.read(); //Read voltage value |
jasminealice | 5:49651a9f8ff7 | 82 | float Vin = f *3.3; |
jasminealice | 5:49651a9f8ff7 | 83 | lcd.printf("%.2f", Vin); |
tanjinamicky | 13:78a2481fd65b | 84 | wait(0.1); |
jasminealice | 5:49651a9f8ff7 | 85 | lcd.printf("\n"); |
jasminealice | 5:49651a9f8ff7 | 86 | } |
KwamsC | 10:cda57976225f | 87 | |
KwamsC | 10:cda57976225f | 88 | void mcpWriteReg(uint8_t address, uint8_t reg, uint8_t data){ |
KwamsC | 10:cda57976225f | 89 | char cmd[2];cmd[0] = reg; |
KwamsC | 10:cda57976225f | 90 | cmd[1] = data; |
KwamsC | 10:cda57976225f | 91 | i2c.write(address, cmd, 2); // Write 2 bytes to device on specified address |
KwamsC | 10:cda57976225f | 92 | } |
KwamsC | 10:cda57976225f | 93 | |
KwamsC | 10:cda57976225f | 94 | uint8_t mcpReadReg(uint8_t address, uint8_t reg){ |
KwamsC | 10:cda57976225f | 95 | char cmd[1]; |
KwamsC | 10:cda57976225f | 96 | cmd[0] = reg; |
KwamsC | 10:cda57976225f | 97 | i2c.write(address, cmd, 1); // Write address |
KwamsC | 10:cda57976225f | 98 | i2c.read(address, cmd, 1); // Read value (one byte) |
KwamsC | 10:cda57976225f | 99 | |
KwamsC | 10:cda57976225f | 100 | return cmd[0]; // Return the read value |
KwamsC | 10:cda57976225f | 101 | } |
KwamsC | 10:cda57976225f | 102 | |
KwamsC | 10:cda57976225f | 103 | void initMcp0(void){ |
KwamsC | 10:cda57976225f | 104 | mcpWriteReg(addr0, MCP_IODIRA, 0xff); // All inputs |
KwamsC | 10:cda57976225f | 105 | mcpWriteReg(addr0, MCP_IODIRB, 0xff); // All inputs |
KwamsC | 10:cda57976225f | 106 | } |
KwamsC | 10:cda57976225f | 107 | |
KwamsC | 10:cda57976225f | 108 | void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count) |
KwamsC | 10:cda57976225f | 109 | { |
KwamsC | 10:cda57976225f | 110 | unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type |
KwamsC | 10:cda57976225f | 111 | unsigned __int64 temp_command = 0x0000000000000000; |
KwamsC | 10:cda57976225f | 112 | unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start |
KwamsC | 10:cda57976225f | 113 | unsigned int error = 0x00; //error byte |
KwamsC | 10:cda57976225f | 114 | //calculate error detection byte with xor |
KwamsC | 10:cda57976225f | 115 | error = address ^ inst; |
KwamsC | 10:cda57976225f | 116 | //combine packet bits in basic DCC format |
KwamsC | 10:cda57976225f | 117 | command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01; |
KwamsC | 10:cda57976225f | 118 | //printf("\n\r %llx \n\r",command); |
KwamsC | 10:cda57976225f | 119 | int i=0; |
KwamsC | 10:cda57976225f | 120 | //repeat DCC command lots of times |
KwamsC | 10:cda57976225f | 121 | while(i < repeat_count) { |
KwamsC | 10:cda57976225f | 122 | temp_command = command; |
KwamsC | 10:cda57976225f | 123 | //loops through packet bits encoding and sending out digital pulses for a DCC command |
KwamsC | 10:cda57976225f | 124 | for (int j=0; j<64; j++) { |
KwamsC | 10:cda57976225f | 125 | if((temp_command&0x8000000000000000)==0) { //test packet bit |
KwamsC | 10:cda57976225f | 126 | //send data for a "0" bit |
KwamsC | 10:cda57976225f | 127 | Track=0; |
KwamsC | 10:cda57976225f | 128 | wait_us(100); |
KwamsC | 10:cda57976225f | 129 | Track=1; |
KwamsC | 10:cda57976225f | 130 | wait_us(100); |
KwamsC | 10:cda57976225f | 131 | //printf("0011"); |
KwamsC | 10:cda57976225f | 132 | } else { |
KwamsC | 10:cda57976225f | 133 | //send data for a "1"bit |
KwamsC | 10:cda57976225f | 134 | Track=0; |
KwamsC | 10:cda57976225f | 135 | wait_us(58); |
KwamsC | 10:cda57976225f | 136 | Track=1; |
KwamsC | 10:cda57976225f | 137 | wait_us(58); |
KwamsC | 10:cda57976225f | 138 | //printf("01"); |
KwamsC | 10:cda57976225f | 139 | } |
KwamsC | 10:cda57976225f | 140 | // next bit in packet |
KwamsC | 10:cda57976225f | 141 | temp_command = temp_command<<1; |
KwamsC | 10:cda57976225f | 142 | } |
KwamsC | 10:cda57976225f | 143 | i++; |
KwamsC | 10:cda57976225f | 144 | } |
KwamsC | 10:cda57976225f | 145 | } |