Group 3, Year 3 HWU

Dependencies:   MCP23017 WattBob_TextLCD mbed

Committer:
campbell101
Date:
Wed Dec 04 01:52:41 2013 +0000
Revision:
0:717026d23b8e
Group 3 Project;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
campbell101 0:717026d23b8e 1 #include "mbed.h"
campbell101 0:717026d23b8e 2 #include "MCP23017.h"
campbell101 0:717026d23b8e 3 #include <string>
campbell101 0:717026d23b8e 4 using namespace std;
campbell101 0:717026d23b8e 5
campbell101 0:717026d23b8e 6 DigitalOut FPGA1(p8);
campbell101 0:717026d23b8e 7 DigitalOut FPGA2(p9);
campbell101 0:717026d23b8e 8 DigitalOut FPGA3(p10);
campbell101 0:717026d23b8e 9 DigitalOut FPGA4(p11);
campbell101 0:717026d23b8e 10
campbell101 0:717026d23b8e 11 DigitalIn sorter_Tube(p5);
campbell101 0:717026d23b8e 12 DigitalIn AAA_tube(p6);
campbell101 0:717026d23b8e 13 InterruptIn voltage_Checker_Tube(p7);
campbell101 0:717026d23b8e 14
campbell101 0:717026d23b8e 15 Ticker AAA_checker;
campbell101 0:717026d23b8e 16 AnalogIn diode_bridge(p16);
campbell101 0:717026d23b8e 17 Serial pc(USBTX, USBRX);
campbell101 0:717026d23b8e 18
campbell101 0:717026d23b8e 19
campbell101 0:717026d23b8e 20 uint8_t mode;
campbell101 0:717026d23b8e 21 uint8_t in_Voltage_Checker;
campbell101 0:717026d23b8e 22 uint16_t AA_sorted; //Amount of AA sorted
campbell101 0:717026d23b8e 23 uint16_t AA_uncharged; //Amount of uncharged AA
campbell101 0:717026d23b8e 24 uint16_t AAA_sorted; //Amount of AAA sorted
campbell101 0:717026d23b8e 25 uint8_t servo_maintenance;
campbell101 0:717026d23b8e 26 float voltage;
campbell101 0:717026d23b8e 27
campbell101 0:717026d23b8e 28 void receive()
campbell101 0:717026d23b8e 29 {
campbell101 0:717026d23b8e 30 char c = pc.getc();
campbell101 0:717026d23b8e 31 if(c == 'S')//Normal Mode
campbell101 0:717026d23b8e 32 {
campbell101 0:717026d23b8e 33 mode = 1;
campbell101 0:717026d23b8e 34 }
campbell101 0:717026d23b8e 35 else if(c == 'M')//Maintenance Mode
campbell101 0:717026d23b8e 36 {
campbell101 0:717026d23b8e 37 mode = 2;
campbell101 0:717026d23b8e 38 }
campbell101 0:717026d23b8e 39 else if(c == 'A' && mode == 2)
campbell101 0:717026d23b8e 40 {
campbell101 0:717026d23b8e 41 servo_maintenance = 1;
campbell101 0:717026d23b8e 42 }
campbell101 0:717026d23b8e 43
campbell101 0:717026d23b8e 44 else if(c == 'B' && mode == 2)
campbell101 0:717026d23b8e 45 {
campbell101 0:717026d23b8e 46 servo_maintenance = 2;
campbell101 0:717026d23b8e 47
campbell101 0:717026d23b8e 48 }
campbell101 0:717026d23b8e 49
campbell101 0:717026d23b8e 50 else if(c == 'C' && mode == 2)
campbell101 0:717026d23b8e 51 {
campbell101 0:717026d23b8e 52 servo_maintenance = 3;
campbell101 0:717026d23b8e 53
campbell101 0:717026d23b8e 54 }
campbell101 0:717026d23b8e 55 else if(c == 'D' && mode == 2)
campbell101 0:717026d23b8e 56 {
campbell101 0:717026d23b8e 57 servo_maintenance = 4;
campbell101 0:717026d23b8e 58
campbell101 0:717026d23b8e 59 }
campbell101 0:717026d23b8e 60 else if(c == 'N')//Emergency Stop
campbell101 0:717026d23b8e 61 {
campbell101 0:717026d23b8e 62 while(1){;}
campbell101 0:717026d23b8e 63 }
campbell101 0:717026d23b8e 64 else if (c == 'B')//Safe Stop
campbell101 0:717026d23b8e 65 {
campbell101 0:717026d23b8e 66 mode = 0;
campbell101 0:717026d23b8e 67 }
campbell101 0:717026d23b8e 68 }
campbell101 0:717026d23b8e 69
campbell101 0:717026d23b8e 70 void AAA_passed()
campbell101 0:717026d23b8e 71 {
campbell101 0:717026d23b8e 72 if(AAA_tube == 1)
campbell101 0:717026d23b8e 73 {
campbell101 0:717026d23b8e 74 AAA_sorted++;
campbell101 0:717026d23b8e 75 }
campbell101 0:717026d23b8e 76 }
campbell101 0:717026d23b8e 77
campbell101 0:717026d23b8e 78 void in_Checker()
campbell101 0:717026d23b8e 79 {
campbell101 0:717026d23b8e 80 in_Voltage_Checker = 1;
campbell101 0:717026d23b8e 81
campbell101 0:717026d23b8e 82 }
campbell101 0:717026d23b8e 83
campbell101 0:717026d23b8e 84 float average_analog(int no_of_averages)
campbell101 0:717026d23b8e 85 {
campbell101 0:717026d23b8e 86 int i = 0;
campbell101 0:717026d23b8e 87 float average = 0;
campbell101 0:717026d23b8e 88 for ( i = 0; i < no_of_averages; i++)
campbell101 0:717026d23b8e 89 {
campbell101 0:717026d23b8e 90 average += diode_bridge.read();
campbell101 0:717026d23b8e 91 wait(0.001); // wait 1mS between reading inputs
campbell101 0:717026d23b8e 92 }
campbell101 0:717026d23b8e 93 return average/i;
campbell101 0:717026d23b8e 94 }
campbell101 0:717026d23b8e 95
campbell101 0:717026d23b8e 96 void update_pc()
campbell101 0:717026d23b8e 97 {
campbell101 0:717026d23b8e 98 AAA_checker.detach();
campbell101 0:717026d23b8e 99
campbell101 0:717026d23b8e 100 string serial_out;
campbell101 0:717026d23b8e 101
campbell101 0:717026d23b8e 102
campbell101 0:717026d23b8e 103 char voltage_buffer[4];
campbell101 0:717026d23b8e 104 sprintf(voltage_buffer, "%0.3f", voltage);
campbell101 0:717026d23b8e 105
campbell101 0:717026d23b8e 106 char AA_sorted_buffer[2];
campbell101 0:717026d23b8e 107 sprintf(AA_sorted_buffer, "%d", AA_sorted);
campbell101 0:717026d23b8e 108
campbell101 0:717026d23b8e 109
campbell101 0:717026d23b8e 110 char AA_uncharged_buffer[2];
campbell101 0:717026d23b8e 111 sprintf(AA_uncharged_buffer , "%d", AA_uncharged);
campbell101 0:717026d23b8e 112
campbell101 0:717026d23b8e 113 char AAA_sorted_buffer[2];
campbell101 0:717026d23b8e 114 sprintf(AAA_sorted_buffer , "%d", AAA_sorted);
campbell101 0:717026d23b8e 115
campbell101 0:717026d23b8e 116
campbell101 0:717026d23b8e 117
campbell101 0:717026d23b8e 118
campbell101 0:717026d23b8e 119 if(mode == 2)
campbell101 0:717026d23b8e 120 {
campbell101 0:717026d23b8e 121 char sorter_tube_sensor = sorter_Tube.read();
campbell101 0:717026d23b8e 122 char AAA_tube_sensor = AAA_tube.read();
campbell101 0:717026d23b8e 123
campbell101 0:717026d23b8e 124 char sorter_tube_buffer[2];
campbell101 0:717026d23b8e 125 sprintf(sorter_tube_buffer , "%d", sorter_tube_sensor);
campbell101 0:717026d23b8e 126
campbell101 0:717026d23b8e 127 char AAA_tube_buffer[2];
campbell101 0:717026d23b8e 128 sprintf(AAA_tube_buffer , "%d", AAA_tube_sensor);
campbell101 0:717026d23b8e 129
campbell101 0:717026d23b8e 130 pc.putc('A');
campbell101 0:717026d23b8e 131 pc.putc(sorter_tube_buffer[0]);
campbell101 0:717026d23b8e 132 pc.putc('B');
campbell101 0:717026d23b8e 133 pc.putc(AAA_tube_buffer[0]);
campbell101 0:717026d23b8e 134 pc.putc('C');
campbell101 0:717026d23b8e 135 pc.putc(in_Voltage_Checker);
campbell101 0:717026d23b8e 136 }
campbell101 0:717026d23b8e 137
campbell101 0:717026d23b8e 138
campbell101 0:717026d23b8e 139 pc.putc('W');
campbell101 0:717026d23b8e 140 pc.putc(voltage_buffer[0]);
campbell101 0:717026d23b8e 141 pc.putc(voltage_buffer[1]);
campbell101 0:717026d23b8e 142 pc.putc(voltage_buffer[2]);
campbell101 0:717026d23b8e 143 pc.putc(voltage_buffer[3]);
campbell101 0:717026d23b8e 144
campbell101 0:717026d23b8e 145 pc.putc('X');
campbell101 0:717026d23b8e 146 pc.putc(AA_sorted_buffer[0]);
campbell101 0:717026d23b8e 147 pc.putc(AA_sorted_buffer[1]);
campbell101 0:717026d23b8e 148 pc.putc('Y');
campbell101 0:717026d23b8e 149 pc.putc(AA_uncharged_buffer[0]);
campbell101 0:717026d23b8e 150 pc.putc(AA_uncharged_buffer[1]);
campbell101 0:717026d23b8e 151 pc.putc('Z');
campbell101 0:717026d23b8e 152 pc.putc(AAA_sorted_buffer[0]);
campbell101 0:717026d23b8e 153 pc.putc(AAA_sorted_buffer[1]);
campbell101 0:717026d23b8e 154 pc.putc(';');
campbell101 0:717026d23b8e 155 pc.putc('\0');
campbell101 0:717026d23b8e 156 pc.putc('\r');
campbell101 0:717026d23b8e 157 pc.putc('\n');
campbell101 0:717026d23b8e 158 wait(0.5);
campbell101 0:717026d23b8e 159 AAA_checker.attach(&AAA_passed, 0.1);
campbell101 0:717026d23b8e 160 }
campbell101 0:717026d23b8e 161
campbell101 0:717026d23b8e 162
campbell101 0:717026d23b8e 163 void voltage_checker()
campbell101 0:717026d23b8e 164 {
campbell101 0:717026d23b8e 165 AA_sorted++;
campbell101 0:717026d23b8e 166 in_Voltage_Checker = 0;
campbell101 0:717026d23b8e 167 FPGA4 = 1;
campbell101 0:717026d23b8e 168 wait(0.5);
campbell101 0:717026d23b8e 169 FPGA4 = 0;
campbell101 0:717026d23b8e 170 voltage = average_analog(100);
campbell101 0:717026d23b8e 171
campbell101 0:717026d23b8e 172 //pc.printf("%f\n", voltage);
campbell101 0:717026d23b8e 173 wait(1);
campbell101 0:717026d23b8e 174 if (voltage < 0.2)
campbell101 0:717026d23b8e 175 {
campbell101 0:717026d23b8e 176 AA_uncharged++;
campbell101 0:717026d23b8e 177 FPGA2 = 1;
campbell101 0:717026d23b8e 178 wait(2);
campbell101 0:717026d23b8e 179 FPGA2 = 0;
campbell101 0:717026d23b8e 180 }
campbell101 0:717026d23b8e 181 else
campbell101 0:717026d23b8e 182 {
campbell101 0:717026d23b8e 183 FPGA3 = 1;
campbell101 0:717026d23b8e 184 wait(2);
campbell101 0:717026d23b8e 185 FPGA3 = 0;
campbell101 0:717026d23b8e 186 }
campbell101 0:717026d23b8e 187 }
campbell101 0:717026d23b8e 188 int main() {
campbell101 0:717026d23b8e 189 pc.attach(&receive); //Attach PC receive interrupt
campbell101 0:717026d23b8e 190 voltage_Checker_Tube.rise(&in_Checker);
campbell101 0:717026d23b8e 191 AAA_checker.attach(&AAA_passed, 0.1);
campbell101 0:717026d23b8e 192 while(1) {
campbell101 0:717026d23b8e 193 if(mode == 1)
campbell101 0:717026d23b8e 194 {
campbell101 0:717026d23b8e 195 if(sorter_Tube == 1)
campbell101 0:717026d23b8e 196 {
campbell101 0:717026d23b8e 197 FPGA1 = 1;
campbell101 0:717026d23b8e 198 wait(1);
campbell101 0:717026d23b8e 199 FPGA1 = 0;
campbell101 0:717026d23b8e 200 wait(3);
campbell101 0:717026d23b8e 201
campbell101 0:717026d23b8e 202 if(in_Voltage_Checker == 1)
campbell101 0:717026d23b8e 203 {
campbell101 0:717026d23b8e 204 voltage_checker();
campbell101 0:717026d23b8e 205 update_pc();
campbell101 0:717026d23b8e 206 }
campbell101 0:717026d23b8e 207
campbell101 0:717026d23b8e 208 }
campbell101 0:717026d23b8e 209 }
campbell101 0:717026d23b8e 210 else if(mode == 2)
campbell101 0:717026d23b8e 211 {
campbell101 0:717026d23b8e 212
campbell101 0:717026d23b8e 213
campbell101 0:717026d23b8e 214 switch(servo_maintenance)
campbell101 0:717026d23b8e 215 {
campbell101 0:717026d23b8e 216 case 1:
campbell101 0:717026d23b8e 217 FPGA1 = 1;
campbell101 0:717026d23b8e 218 wait(1);
campbell101 0:717026d23b8e 219 FPGA1 = 0;
campbell101 0:717026d23b8e 220 break;
campbell101 0:717026d23b8e 221
campbell101 0:717026d23b8e 222 case 2:
campbell101 0:717026d23b8e 223 FPGA2 = 1;
campbell101 0:717026d23b8e 224 wait(2);
campbell101 0:717026d23b8e 225 FPGA2 = 0;
campbell101 0:717026d23b8e 226 break;
campbell101 0:717026d23b8e 227
campbell101 0:717026d23b8e 228 case 3:
campbell101 0:717026d23b8e 229 FPGA3 = 1;
campbell101 0:717026d23b8e 230 wait(2);
campbell101 0:717026d23b8e 231 FPGA3 = 0;
campbell101 0:717026d23b8e 232 break;
campbell101 0:717026d23b8e 233
campbell101 0:717026d23b8e 234 case 4:
campbell101 0:717026d23b8e 235 FPGA4 = 1;
campbell101 0:717026d23b8e 236 wait(1);
campbell101 0:717026d23b8e 237 FPGA4 = 0;
campbell101 0:717026d23b8e 238 wait(0.5);
campbell101 0:717026d23b8e 239 voltage_checker();
campbell101 0:717026d23b8e 240 break;
campbell101 0:717026d23b8e 241 }
campbell101 0:717026d23b8e 242 update_pc();
campbell101 0:717026d23b8e 243 servo_maintenance = 0;
campbell101 0:717026d23b8e 244 wait(4);
campbell101 0:717026d23b8e 245 }
campbell101 0:717026d23b8e 246 }
campbell101 0:717026d23b8e 247
campbell101 0:717026d23b8e 248 }