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

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?

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