3rd year group project. Electronic and Electrical Engineering. Heriot-Watt University. This is the code for the mbed for the Automatic Little Object Organiser (ALOO).
Dependencies: MCP23017 TCS3472_I2C WattBob_TextLCD mbed
fpga.cpp@22:993821a4c396, 2015-11-26 (annotated)
- Committer:
- dreamselec
- Date:
- Thu Nov 26 15:47:17 2015 +0000
- Revision:
- 22:993821a4c396
- Parent:
- 21:60c4fe94d79c
- Child:
- 32:9a4046224b11
Taking 3 colour values and averaging it to determine the colour of the block.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dreamselec |
6:98fe30430194 | 1 | // |
dreamselec |
6:98fe30430194 | 2 | // fpga.cpp |
dreamselec |
6:98fe30430194 | 3 | // Created by Chandan Siyag on 14/11/2015. |
dreamselec |
6:98fe30430194 | 4 | |
dreamselec | 3:843b830ee8bd | 5 | #include "fpga.h" |
dreamselec | 3:843b830ee8bd | 6 | #include "mbed.h" |
dreamselec |
6:98fe30430194 | 7 | |
dreamselec |
6:98fe30430194 | 8 | #define CLK() bbClk.write(1); wait(0.000001); bbClk.write(0); wait(0.000001); |
dreamselec | 3:843b830ee8bd | 9 | |
dreamselec |
6:98fe30430194 | 10 | DigitalOut bbClk(p11); |
dreamselec |
6:98fe30430194 | 11 | DigitalOut bbRst(p12); |
dreamselec |
6:98fe30430194 | 12 | DigitalOut bbOut(p13); |
dreamselec |
6:98fe30430194 | 13 | DigitalIn bbIn(p14); |
dreamselec |
6:98fe30430194 | 14 | int brkBbm_1, brkBbm_2, brkBbm_3, brkBbm_4, brkBbm_5, brkBbm_6, brkBbm_7, brkBbm_8; |
dreamselec |
6:98fe30430194 | 15 | |
dreamselec |
6:98fe30430194 | 16 | FPGA::FPGA(){ |
dreamselec |
6:98fe30430194 | 17 | |
dreamselec |
6:98fe30430194 | 18 | } |
dreamselec |
6:98fe30430194 | 19 | |
dreamselec |
6:98fe30430194 | 20 | FPGA::~FPGA(){ |
dreamselec |
6:98fe30430194 | 21 | |
dreamselec |
6:98fe30430194 | 22 | } |
dreamselec | 3:843b830ee8bd | 23 | |
dreamselec | 3:843b830ee8bd | 24 | /** Function that checks first IR sensor to detect if block in shoot |
dreamselec | 3:843b830ee8bd | 25 | @return 1 if sensor beam broken, 0 otherwise |
dreamselec |
6:98fe30430194 | 26 | */ |
dreamselec |
6:98fe30430194 | 27 | int FPGA::checkForBlock(){ |
dreamselec |
6:98fe30430194 | 28 | return this->getBeamValue(1); |
dreamselec | 3:843b830ee8bd | 29 | } |
dreamselec | 3:843b830ee8bd | 30 | |
dreamselec | 3:843b830ee8bd | 31 | /** Function that checks if block is also breaking the second IR sensor. |
dreamselec |
6:98fe30430194 | 32 | @result 1 if it's large, 0 otherwise |
dreamselec |
6:98fe30430194 | 33 | */ |
dreamselec |
6:98fe30430194 | 34 | int FPGA::checkForSize(){ |
dreamselec |
6:98fe30430194 | 35 | return this->getBeamValue(2); |
dreamselec | 3:843b830ee8bd | 36 | } |
dreamselec | 3:843b830ee8bd | 37 | |
dreamselec | 3:843b830ee8bd | 38 | /** Moves the stopping servo in the "hopper" to stop blocks from falling |
dreamselec | 3:843b830ee8bd | 39 | @param position: TBD |
dreamselec |
6:98fe30430194 | 40 | */ |
dreamselec |
6:98fe30430194 | 41 | void FPGA::moveStoppingServo(StoppingServoPositions position) { |
dreamselec |
6:98fe30430194 | 42 | if (position == Stop){ |
dreamselec |
6:98fe30430194 | 43 | bbRst.write(0); |
dreamselec |
6:98fe30430194 | 44 | CLK(); |
dreamselec |
6:98fe30430194 | 45 | bbRst.write(1); |
dreamselec |
6:98fe30430194 | 46 | CLK(); //Reset finish |
dreamselec |
6:98fe30430194 | 47 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 48 | CLK(); |
dreamselec |
6:98fe30430194 | 49 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 50 | CLK(); |
dreamselec |
6:98fe30430194 | 51 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 52 | CLK(); // Address finish |
dreamselec |
6:98fe30430194 | 53 | |
dreamselec |
6:98fe30430194 | 54 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 55 | CLK(); |
dreamselec |
6:98fe30430194 | 56 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 57 | CLK(); |
dreamselec |
6:98fe30430194 | 58 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 59 | CLK(); |
dreamselec |
6:98fe30430194 | 60 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 61 | CLK(); |
dreamselec |
6:98fe30430194 | 62 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 63 | CLK(); |
dreamselec |
6:98fe30430194 | 64 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 65 | CLK(); |
dreamselec |
6:98fe30430194 | 66 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 67 | CLK(); |
dreamselec |
6:98fe30430194 | 68 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 69 | CLK(); // Position finish |
dreamselec |
6:98fe30430194 | 70 | |
dreamselec |
6:98fe30430194 | 71 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 72 | CLK(); |
dreamselec |
6:98fe30430194 | 73 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 74 | CLK(); |
dreamselec |
6:98fe30430194 | 75 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 76 | CLK(); |
dreamselec |
6:98fe30430194 | 77 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 78 | CLK(); |
dreamselec |
6:98fe30430194 | 79 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 80 | CLK(); |
dreamselec |
6:98fe30430194 | 81 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 82 | CLK(); |
dreamselec |
6:98fe30430194 | 83 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 84 | CLK(); |
dreamselec |
6:98fe30430194 | 85 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 86 | CLK(); // Number finish |
dreamselec |
6:98fe30430194 | 87 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 88 | }else if (position == Go){ |
dreamselec |
6:98fe30430194 | 89 | bbRst.write(0); |
dreamselec |
6:98fe30430194 | 90 | CLK(); |
dreamselec |
6:98fe30430194 | 91 | bbRst.write(1); |
dreamselec |
6:98fe30430194 | 92 | CLK(); //Reset finish |
dreamselec |
6:98fe30430194 | 93 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 94 | CLK(); |
dreamselec |
6:98fe30430194 | 95 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 96 | CLK(); |
dreamselec |
6:98fe30430194 | 97 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 98 | CLK(); // Address finish |
dreamselec |
6:98fe30430194 | 99 | |
dreamselec |
6:98fe30430194 | 100 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 101 | CLK(); |
dreamselec |
6:98fe30430194 | 102 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 103 | CLK(); |
dreamselec |
6:98fe30430194 | 104 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 105 | CLK(); |
dreamselec |
6:98fe30430194 | 106 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 107 | CLK(); |
dreamselec |
6:98fe30430194 | 108 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 109 | CLK(); |
dreamselec |
6:98fe30430194 | 110 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 111 | CLK(); |
dreamselec |
6:98fe30430194 | 112 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 113 | CLK(); |
dreamselec |
6:98fe30430194 | 114 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 115 | CLK(); //Position finish |
dreamselec |
6:98fe30430194 | 116 | |
dreamselec |
6:98fe30430194 | 117 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 118 | CLK(); |
dreamselec |
6:98fe30430194 | 119 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 120 | CLK(); |
dreamselec |
6:98fe30430194 | 121 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 122 | CLK(); |
dreamselec |
6:98fe30430194 | 123 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 124 | CLK(); |
dreamselec |
6:98fe30430194 | 125 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 126 | CLK(); |
dreamselec |
6:98fe30430194 | 127 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 128 | CLK(); |
dreamselec |
6:98fe30430194 | 129 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 130 | CLK(); |
dreamselec |
6:98fe30430194 | 131 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 132 | CLK(); //Number finish |
dreamselec |
6:98fe30430194 | 133 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 134 | } |
dreamselec | 10:16ba52f8e025 | 135 | this->stoppingServoPosition = position; |
dreamselec | 3:843b830ee8bd | 136 | } |
dreamselec | 3:843b830ee8bd | 137 | |
dreamselec | 3:843b830ee8bd | 138 | /** Moves the servoe which decides which basket block should go into i.e. bad/good |
dreamselec | 3:843b830ee8bd | 139 | @param positon: TBD |
dreamselec |
6:98fe30430194 | 140 | */ |
dreamselec |
6:98fe30430194 | 141 | void FPGA::moveSortingServo(SortingServoPositions position){ |
dreamselec | 10:16ba52f8e025 | 142 | if (position == Haz){ |
dreamselec | 22:993821a4c396 | 143 | // HAZ = 26 |
dreamselec | 10:16ba52f8e025 | 144 | bbRst.write(0); |
dreamselec | 10:16ba52f8e025 | 145 | CLK(); |
dreamselec | 10:16ba52f8e025 | 146 | bbRst.write(1); |
dreamselec | 10:16ba52f8e025 | 147 | CLK(); //Reset finish |
dreamselec | 10:16ba52f8e025 | 148 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 149 | CLK(); |
dreamselec | 10:16ba52f8e025 | 150 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 151 | CLK(); |
dreamselec | 10:16ba52f8e025 | 152 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 153 | CLK(); // Address finish |
dreamselec | 22:993821a4c396 | 154 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 155 | CLK(); |
dreamselec | 10:16ba52f8e025 | 156 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 157 | CLK(); |
dreamselec | 10:16ba52f8e025 | 158 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 159 | CLK(); |
dreamselec | 10:16ba52f8e025 | 160 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 161 | CLK(); |
dreamselec | 22:993821a4c396 | 162 | bbOut.write(1); |
dreamselec | 22:993821a4c396 | 163 | CLK(); |
dreamselec | 10:16ba52f8e025 | 164 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 165 | CLK(); |
dreamselec | 10:16ba52f8e025 | 166 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 167 | CLK(); |
dreamselec | 10:16ba52f8e025 | 168 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 169 | CLK(); //Position finish |
dreamselec | 10:16ba52f8e025 | 170 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 171 | CLK(); |
dreamselec | 10:16ba52f8e025 | 172 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 173 | CLK(); |
dreamselec | 10:16ba52f8e025 | 174 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 175 | CLK(); |
dreamselec | 10:16ba52f8e025 | 176 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 177 | CLK(); |
dreamselec | 10:16ba52f8e025 | 178 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 179 | CLK(); |
dreamselec | 10:16ba52f8e025 | 180 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 181 | CLK(); |
dreamselec | 10:16ba52f8e025 | 182 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 183 | CLK(); |
dreamselec | 10:16ba52f8e025 | 184 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 185 | CLK(); //Number finish |
dreamselec | 10:16ba52f8e025 | 186 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 187 | }else if (position == NonHaz){ |
dreamselec | 22:993821a4c396 | 188 | // NON-HAZ = 60 |
dreamselec | 10:16ba52f8e025 | 189 | bbRst.write(0); |
dreamselec | 10:16ba52f8e025 | 190 | CLK(); |
dreamselec | 10:16ba52f8e025 | 191 | bbRst.write(1); |
dreamselec | 10:16ba52f8e025 | 192 | CLK(); //Reset finish |
dreamselec | 10:16ba52f8e025 | 193 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 194 | CLK(); |
dreamselec | 10:16ba52f8e025 | 195 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 196 | CLK(); |
dreamselec | 10:16ba52f8e025 | 197 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 198 | CLK(); // Address finish |
dreamselec | 10:16ba52f8e025 | 199 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 200 | CLK(); |
dreamselec | 10:16ba52f8e025 | 201 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 202 | CLK(); |
dreamselec | 21:60c4fe94d79c | 203 | bbOut.write(1); |
dreamselec | 21:60c4fe94d79c | 204 | CLK(); |
dreamselec | 21:60c4fe94d79c | 205 | bbOut.write(1); |
dreamselec | 21:60c4fe94d79c | 206 | CLK(); |
dreamselec | 21:60c4fe94d79c | 207 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 208 | CLK(); |
dreamselec | 10:16ba52f8e025 | 209 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 210 | CLK(); |
dreamselec | 10:16ba52f8e025 | 211 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 212 | CLK(); |
dreamselec | 10:16ba52f8e025 | 213 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 214 | CLK(); //Position finish |
dreamselec | 10:16ba52f8e025 | 215 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 216 | CLK(); |
dreamselec | 10:16ba52f8e025 | 217 | bbOut.write(1); |
dreamselec | 10:16ba52f8e025 | 218 | CLK(); |
dreamselec | 10:16ba52f8e025 | 219 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 220 | CLK(); |
dreamselec | 10:16ba52f8e025 | 221 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 222 | CLK(); |
dreamselec | 10:16ba52f8e025 | 223 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 224 | CLK(); |
dreamselec | 10:16ba52f8e025 | 225 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 226 | CLK(); |
dreamselec | 10:16ba52f8e025 | 227 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 228 | CLK(); |
dreamselec | 10:16ba52f8e025 | 229 | bbOut.write(0); |
dreamselec | 10:16ba52f8e025 | 230 | CLK(); //Number finish |
dreamselec | 10:16ba52f8e025 | 231 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 232 | } |
dreamselec | 10:16ba52f8e025 | 233 | this->sortingServoPosition = position; |
dreamselec | 10:16ba52f8e025 | 234 | } |
dreamselec | 10:16ba52f8e025 | 235 | |
dreamselec | 10:16ba52f8e025 | 236 | void FPGA::toggleStoppingServo(){ |
dreamselec | 10:16ba52f8e025 | 237 | if (this->stoppingServoPosition == Go) |
dreamselec | 10:16ba52f8e025 | 238 | this->moveStoppingServo(Stop); |
dreamselec | 10:16ba52f8e025 | 239 | else if (this->stoppingServoPosition == Stop) |
dreamselec | 10:16ba52f8e025 | 240 | this->moveStoppingServo(Go); |
dreamselec | 10:16ba52f8e025 | 241 | } |
dreamselec | 10:16ba52f8e025 | 242 | |
dreamselec | 10:16ba52f8e025 | 243 | void FPGA::toggleSortingServo() { |
dreamselec | 10:16ba52f8e025 | 244 | if (this->sortingServoPosition == Haz) |
dreamselec | 10:16ba52f8e025 | 245 | this->moveSortingServo(NonHaz); |
dreamselec | 10:16ba52f8e025 | 246 | else if (this->sortingServoPosition == NonHaz) |
dreamselec | 10:16ba52f8e025 | 247 | this->moveSortingServo(Haz); |
dreamselec | 3:843b830ee8bd | 248 | } |
dreamselec | 3:843b830ee8bd | 249 | |
dreamselec | 3:843b830ee8bd | 250 | /** Reset the stopping servo to default posiotn i.e. not letting blcoks fall. |
dreamselec |
6:98fe30430194 | 251 | */ |
dreamselec |
6:98fe30430194 | 252 | void FPGA::resetStoppingServo(){ |
dreamselec |
6:98fe30430194 | 253 | |
dreamselec | 3:843b830ee8bd | 254 | } |
dreamselec | 3:843b830ee8bd | 255 | /** Reset the sorting servo to default posiont i.e. falling blocks go in haz-bin |
dreamselec |
6:98fe30430194 | 256 | */ |
dreamselec |
6:98fe30430194 | 257 | void FPGA::resetSortingServo(){ |
dreamselec |
6:98fe30430194 | 258 | |
dreamselec | 3:843b830ee8bd | 259 | } |
dreamselec | 3:843b830ee8bd | 260 | /** Reset both servos, simply calls their respective reset methods. |
dreamselec |
6:98fe30430194 | 261 | */ |
dreamselec |
6:98fe30430194 | 262 | void FPGA::resetAllServos(){ |
dreamselec |
6:98fe30430194 | 263 | resetSortingServo(); |
dreamselec |
6:98fe30430194 | 264 | resetStoppingServo(); |
dreamselec |
6:98fe30430194 | 265 | } |
dreamselec |
6:98fe30430194 | 266 | |
dreamselec |
6:98fe30430194 | 267 | int FPGA::getBeamValue(int beamNumber){ |
dreamselec |
6:98fe30430194 | 268 | // Return 0 or 1 value for break beam |
dreamselec |
6:98fe30430194 | 269 | bbRst.write(0); |
dreamselec |
6:98fe30430194 | 270 | CLK(); |
dreamselec |
6:98fe30430194 | 271 | bbRst.write(1); |
dreamselec |
6:98fe30430194 | 272 | CLK(); //Reset finish |
dreamselec |
6:98fe30430194 | 273 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 274 | CLK(); |
dreamselec |
6:98fe30430194 | 275 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 276 | CLK(); |
dreamselec |
6:98fe30430194 | 277 | bbOut.write(1); |
dreamselec |
6:98fe30430194 | 278 | CLK(); //Address finish |
dreamselec |
6:98fe30430194 | 279 | CLK(); |
dreamselec |
6:98fe30430194 | 280 | brkBbm_1 = bbIn.read(); |
dreamselec |
6:98fe30430194 | 281 | CLK(); |
dreamselec |
6:98fe30430194 | 282 | brkBbm_2 = bbIn.read(); |
dreamselec |
6:98fe30430194 | 283 | CLK(); |
dreamselec |
6:98fe30430194 | 284 | brkBbm_3 = bbIn.read(); |
dreamselec |
6:98fe30430194 | 285 | CLK(); |
dreamselec |
6:98fe30430194 | 286 | brkBbm_4 = bbIn.read(); |
dreamselec |
6:98fe30430194 | 287 | CLK(); |
dreamselec |
6:98fe30430194 | 288 | brkBbm_5 = bbIn.read(); |
dreamselec |
6:98fe30430194 | 289 | CLK(); |
dreamselec |
6:98fe30430194 | 290 | brkBbm_6 = bbIn.read(); |
dreamselec |
6:98fe30430194 | 291 | CLK(); |
dreamselec |
6:98fe30430194 | 292 | brkBbm_7 = bbIn.read(); |
dreamselec |
6:98fe30430194 | 293 | CLK(); |
dreamselec |
6:98fe30430194 | 294 | brkBbm_8 = bbIn.read(); |
dreamselec |
6:98fe30430194 | 295 | CLK(); //Break beam data recieved and saved |
dreamselec |
6:98fe30430194 | 296 | bbOut.write(0); |
dreamselec |
6:98fe30430194 | 297 | |
dreamselec |
6:98fe30430194 | 298 | if (beamNumber == 1) { |
dreamselec |
6:98fe30430194 | 299 | return brkBbm_1; |
dreamselec |
6:98fe30430194 | 300 | } else if (beamNumber == 2) { |
dreamselec |
6:98fe30430194 | 301 | return brkBbm_2; |
dreamselec |
6:98fe30430194 | 302 | } |
dreamselec |
6:98fe30430194 | 303 | return -1; |
dreamselec |
6:98fe30430194 | 304 | } |
dreamselec |
6:98fe30430194 | 305 | |
dreamselec |
6:98fe30430194 | 306 | void FPGA::moveServo(int servoNumber, int position){ |
dreamselec |
6:98fe30430194 | 307 | |
dreamselec |
6:98fe30430194 | 308 | } |