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 Dec 17 17:23:24 2015 +0100
Revision:
32:9a4046224b11
Parent:
22:993821a4c396
Comments and clean up.

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 32:9a4046224b11 8 // Macro to sync MBED and FPGA clocks
dreamselec 6:98fe30430194 9 #define CLK() bbClk.write(1); wait(0.000001); bbClk.write(0); wait(0.000001);
dreamselec 3:843b830ee8bd 10
dreamselec 6:98fe30430194 11 DigitalOut bbClk(p11);
dreamselec 6:98fe30430194 12 DigitalOut bbRst(p12);
dreamselec 6:98fe30430194 13 DigitalOut bbOut(p13);
dreamselec 6:98fe30430194 14 DigitalIn bbIn(p14);
dreamselec 6:98fe30430194 15 int brkBbm_1, brkBbm_2, brkBbm_3, brkBbm_4, brkBbm_5, brkBbm_6, brkBbm_7, brkBbm_8;
dreamselec 6:98fe30430194 16
dreamselec 6:98fe30430194 17 FPGA::FPGA(){
dreamselec 6:98fe30430194 18
dreamselec 6:98fe30430194 19 }
dreamselec 6:98fe30430194 20
dreamselec 6:98fe30430194 21 FPGA::~FPGA(){
dreamselec 6:98fe30430194 22
dreamselec 6:98fe30430194 23 }
dreamselec 3:843b830ee8bd 24
dreamselec 32:9a4046224b11 25 /// Function that checks first IR sensor to detect if block in shoot
dreamselec 32:9a4046224b11 26 /// @return 1 if sensor beam broken, 0 otherwise
dreamselec 6:98fe30430194 27 int FPGA::checkForBlock(){
dreamselec 6:98fe30430194 28 return this->getBeamValue(1);
dreamselec 3:843b830ee8bd 29 }
dreamselec 3:843b830ee8bd 30
dreamselec 32:9a4046224b11 31 /// Function that checks if block is also breaking the second IR sensor.
dreamselec 32:9a4046224b11 32 /// @result 1 if it's large, 0 otherwise
dreamselec 6:98fe30430194 33 int FPGA::checkForSize(){
dreamselec 6:98fe30430194 34 return this->getBeamValue(2);
dreamselec 3:843b830ee8bd 35 }
dreamselec 3:843b830ee8bd 36
dreamselec 32:9a4046224b11 37 /// No longer used since idea of using top servo was discontinued.
dreamselec 32:9a4046224b11 38 /// Moves the stopping servo in the "hopper" to stop blocks from falling
dreamselec 6:98fe30430194 39 void FPGA::moveStoppingServo(StoppingServoPositions position) {
dreamselec 6:98fe30430194 40 if (position == Stop){
dreamselec 6:98fe30430194 41 bbRst.write(0);
dreamselec 6:98fe30430194 42 CLK();
dreamselec 6:98fe30430194 43 bbRst.write(1);
dreamselec 6:98fe30430194 44 CLK(); //Reset finish
dreamselec 6:98fe30430194 45 bbOut.write(1);
dreamselec 6:98fe30430194 46 CLK();
dreamselec 6:98fe30430194 47 bbOut.write(1);
dreamselec 6:98fe30430194 48 CLK();
dreamselec 6:98fe30430194 49 bbOut.write(0);
dreamselec 6:98fe30430194 50 CLK(); // Address finish
dreamselec 6:98fe30430194 51
dreamselec 6:98fe30430194 52 bbOut.write(0);
dreamselec 6:98fe30430194 53 CLK();
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(1);
dreamselec 6:98fe30430194 63 CLK();
dreamselec 6:98fe30430194 64 bbOut.write(1);
dreamselec 6:98fe30430194 65 CLK();
dreamselec 6:98fe30430194 66 bbOut.write(0);
dreamselec 6:98fe30430194 67 CLK(); // Position finish
dreamselec 6:98fe30430194 68
dreamselec 6:98fe30430194 69 bbOut.write(1);
dreamselec 6:98fe30430194 70 CLK();
dreamselec 6:98fe30430194 71 bbOut.write(0);
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(); // Number finish
dreamselec 6:98fe30430194 85 bbOut.write(0);
dreamselec 6:98fe30430194 86 }else if (position == Go){
dreamselec 6:98fe30430194 87 bbRst.write(0);
dreamselec 6:98fe30430194 88 CLK();
dreamselec 6:98fe30430194 89 bbRst.write(1);
dreamselec 6:98fe30430194 90 CLK(); //Reset finish
dreamselec 6:98fe30430194 91 bbOut.write(1);
dreamselec 6:98fe30430194 92 CLK();
dreamselec 6:98fe30430194 93 bbOut.write(1);
dreamselec 6:98fe30430194 94 CLK();
dreamselec 6:98fe30430194 95 bbOut.write(0);
dreamselec 6:98fe30430194 96 CLK(); // Address finish
dreamselec 6:98fe30430194 97
dreamselec 6:98fe30430194 98 bbOut.write(1);
dreamselec 6:98fe30430194 99 CLK();
dreamselec 6:98fe30430194 100 bbOut.write(0);
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(); //Position finish
dreamselec 6:98fe30430194 114
dreamselec 6:98fe30430194 115 bbOut.write(1);
dreamselec 6:98fe30430194 116 CLK();
dreamselec 6:98fe30430194 117 bbOut.write(0);
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(); //Number finish
dreamselec 6:98fe30430194 131 bbOut.write(0);
dreamselec 6:98fe30430194 132 }
dreamselec 10:16ba52f8e025 133 this->stoppingServoPosition = position;
dreamselec 3:843b830ee8bd 134 }
dreamselec 3:843b830ee8bd 135
dreamselec 32:9a4046224b11 136 /// Moves the servoe which decides which basket block should go into i.e. haz or not
dreamselec 6:98fe30430194 137 void FPGA::moveSortingServo(SortingServoPositions position){
dreamselec 10:16ba52f8e025 138 if (position == Haz){
dreamselec 22:993821a4c396 139 // HAZ = 26
dreamselec 10:16ba52f8e025 140 bbRst.write(0);
dreamselec 10:16ba52f8e025 141 CLK();
dreamselec 10:16ba52f8e025 142 bbRst.write(1);
dreamselec 10:16ba52f8e025 143 CLK(); //Reset finish
dreamselec 10:16ba52f8e025 144 bbOut.write(1);
dreamselec 10:16ba52f8e025 145 CLK();
dreamselec 10:16ba52f8e025 146 bbOut.write(1);
dreamselec 10:16ba52f8e025 147 CLK();
dreamselec 10:16ba52f8e025 148 bbOut.write(0);
dreamselec 10:16ba52f8e025 149 CLK(); // Address finish
dreamselec 22:993821a4c396 150 bbOut.write(0);
dreamselec 10:16ba52f8e025 151 CLK();
dreamselec 10:16ba52f8e025 152 bbOut.write(1);
dreamselec 10:16ba52f8e025 153 CLK();
dreamselec 10:16ba52f8e025 154 bbOut.write(0);
dreamselec 10:16ba52f8e025 155 CLK();
dreamselec 10:16ba52f8e025 156 bbOut.write(1);
dreamselec 10:16ba52f8e025 157 CLK();
dreamselec 22:993821a4c396 158 bbOut.write(1);
dreamselec 22:993821a4c396 159 CLK();
dreamselec 10:16ba52f8e025 160 bbOut.write(0);
dreamselec 10:16ba52f8e025 161 CLK();
dreamselec 10:16ba52f8e025 162 bbOut.write(0);
dreamselec 10:16ba52f8e025 163 CLK();
dreamselec 10:16ba52f8e025 164 bbOut.write(0);
dreamselec 10:16ba52f8e025 165 CLK(); //Position finish
dreamselec 10:16ba52f8e025 166 bbOut.write(0);
dreamselec 10:16ba52f8e025 167 CLK();
dreamselec 10:16ba52f8e025 168 bbOut.write(1);
dreamselec 10:16ba52f8e025 169 CLK();
dreamselec 10:16ba52f8e025 170 bbOut.write(0);
dreamselec 10:16ba52f8e025 171 CLK();
dreamselec 10:16ba52f8e025 172 bbOut.write(0);
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(); //Number finish
dreamselec 10:16ba52f8e025 182 bbOut.write(0);
dreamselec 10:16ba52f8e025 183 }else if (position == NonHaz){
dreamselec 22:993821a4c396 184 // NON-HAZ = 60
dreamselec 10:16ba52f8e025 185 bbRst.write(0);
dreamselec 10:16ba52f8e025 186 CLK();
dreamselec 10:16ba52f8e025 187 bbRst.write(1);
dreamselec 10:16ba52f8e025 188 CLK(); //Reset finish
dreamselec 10:16ba52f8e025 189 bbOut.write(1);
dreamselec 10:16ba52f8e025 190 CLK();
dreamselec 10:16ba52f8e025 191 bbOut.write(1);
dreamselec 10:16ba52f8e025 192 CLK();
dreamselec 10:16ba52f8e025 193 bbOut.write(0);
dreamselec 10:16ba52f8e025 194 CLK(); // Address finish
dreamselec 10:16ba52f8e025 195 bbOut.write(0);
dreamselec 10:16ba52f8e025 196 CLK();
dreamselec 10:16ba52f8e025 197 bbOut.write(0);
dreamselec 10:16ba52f8e025 198 CLK();
dreamselec 21:60c4fe94d79c 199 bbOut.write(1);
dreamselec 21:60c4fe94d79c 200 CLK();
dreamselec 21:60c4fe94d79c 201 bbOut.write(1);
dreamselec 21:60c4fe94d79c 202 CLK();
dreamselec 21:60c4fe94d79c 203 bbOut.write(1);
dreamselec 10:16ba52f8e025 204 CLK();
dreamselec 10:16ba52f8e025 205 bbOut.write(1);
dreamselec 10:16ba52f8e025 206 CLK();
dreamselec 10:16ba52f8e025 207 bbOut.write(0);
dreamselec 10:16ba52f8e025 208 CLK();
dreamselec 10:16ba52f8e025 209 bbOut.write(0);
dreamselec 10:16ba52f8e025 210 CLK(); //Position finish
dreamselec 10:16ba52f8e025 211 bbOut.write(0);
dreamselec 10:16ba52f8e025 212 CLK();
dreamselec 10:16ba52f8e025 213 bbOut.write(1);
dreamselec 10:16ba52f8e025 214 CLK();
dreamselec 10:16ba52f8e025 215 bbOut.write(0);
dreamselec 10:16ba52f8e025 216 CLK();
dreamselec 10:16ba52f8e025 217 bbOut.write(0);
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(); //Number finish
dreamselec 10:16ba52f8e025 227 bbOut.write(0);
dreamselec 6:98fe30430194 228 }
dreamselec 10:16ba52f8e025 229 this->sortingServoPosition = position;
dreamselec 10:16ba52f8e025 230 }
dreamselec 10:16ba52f8e025 231
dreamselec 32:9a4046224b11 232 /// Toggles stopping servo based on current position.
dreamselec 32:9a4046224b11 233 /// Used in the servo test mode.
dreamselec 10:16ba52f8e025 234 void FPGA::toggleStoppingServo(){
dreamselec 10:16ba52f8e025 235 if (this->stoppingServoPosition == Go)
dreamselec 10:16ba52f8e025 236 this->moveStoppingServo(Stop);
dreamselec 10:16ba52f8e025 237 else if (this->stoppingServoPosition == Stop)
dreamselec 10:16ba52f8e025 238 this->moveStoppingServo(Go);
dreamselec 10:16ba52f8e025 239 }
dreamselec 10:16ba52f8e025 240
dreamselec 32:9a4046224b11 241 /// Toggles sorting servo based on current position
dreamselec 32:9a4046224b11 242 /// Used in the servo test mode.
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 32:9a4046224b11 250 /// Place holder function. Since all servo move to their default position after kServoWaitTime
dreamselec 32:9a4046224b11 251 ///Reset the stopping servo to default position
dreamselec 6:98fe30430194 252 void FPGA::resetStoppingServo(){
dreamselec 6:98fe30430194 253
dreamselec 3:843b830ee8bd 254 }
dreamselec 32:9a4046224b11 255 /// Place holder function. Since all servo move to their default position after kServoWaitTime
dreamselec 32:9a4046224b11 256 /// Reset the sorting servo to default position
dreamselec 6:98fe30430194 257 void FPGA::resetSortingServo(){
dreamselec 6:98fe30430194 258
dreamselec 3:843b830ee8bd 259 }
dreamselec 32:9a4046224b11 260 /// Place holder function. Since all servo move to their default position after kServoWaitTime
dreamselec 32:9a4046224b11 261 /// Reset both servos, simply calls their respective reset methods.
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 32:9a4046224b11 267 /// Get beam value i.e. high = 1, low = 0;
dreamselec 32:9a4046224b11 268 /// Beam number Top = 1, Bottom = 2. USE ENUMS to avoid mistakes.
dreamselec 6:98fe30430194 269 int FPGA::getBeamValue(int beamNumber){
dreamselec 6:98fe30430194 270 // Return 0 or 1 value for break beam
dreamselec 6:98fe30430194 271 bbRst.write(0);
dreamselec 6:98fe30430194 272 CLK();
dreamselec 6:98fe30430194 273 bbRst.write(1);
dreamselec 6:98fe30430194 274 CLK(); //Reset finish
dreamselec 6:98fe30430194 275 bbOut.write(1);
dreamselec 6:98fe30430194 276 CLK();
dreamselec 6:98fe30430194 277 bbOut.write(0);
dreamselec 6:98fe30430194 278 CLK();
dreamselec 6:98fe30430194 279 bbOut.write(1);
dreamselec 6:98fe30430194 280 CLK(); //Address finish
dreamselec 6:98fe30430194 281 CLK();
dreamselec 6:98fe30430194 282 brkBbm_1 = bbIn.read();
dreamselec 6:98fe30430194 283 CLK();
dreamselec 6:98fe30430194 284 brkBbm_2 = bbIn.read();
dreamselec 6:98fe30430194 285 CLK();
dreamselec 6:98fe30430194 286 brkBbm_3 = bbIn.read();
dreamselec 6:98fe30430194 287 CLK();
dreamselec 6:98fe30430194 288 brkBbm_4 = bbIn.read();
dreamselec 6:98fe30430194 289 CLK();
dreamselec 6:98fe30430194 290 brkBbm_5 = bbIn.read();
dreamselec 6:98fe30430194 291 CLK();
dreamselec 6:98fe30430194 292 brkBbm_6 = bbIn.read();
dreamselec 6:98fe30430194 293 CLK();
dreamselec 6:98fe30430194 294 brkBbm_7 = bbIn.read();
dreamselec 6:98fe30430194 295 CLK();
dreamselec 6:98fe30430194 296 brkBbm_8 = bbIn.read();
dreamselec 6:98fe30430194 297 CLK(); //Break beam data recieved and saved
dreamselec 6:98fe30430194 298 bbOut.write(0);
dreamselec 6:98fe30430194 299
dreamselec 6:98fe30430194 300 if (beamNumber == 1) {
dreamselec 6:98fe30430194 301 return brkBbm_1;
dreamselec 6:98fe30430194 302 } else if (beamNumber == 2) {
dreamselec 6:98fe30430194 303 return brkBbm_2;
dreamselec 6:98fe30430194 304 }
dreamselec 6:98fe30430194 305 return -1;
dreamselec 6:98fe30430194 306 }
dreamselec 6:98fe30430194 307
dreamselec 32:9a4046224b11 308 /// Place holder for more servos that can be attached.
dreamselec 32:9a4046224b11 309 /// Currently both servo have their own designated methods.
dreamselec 6:98fe30430194 310 void FPGA::moveServo(int servoNumber, int position){
dreamselec 6:98fe30430194 311
dreamselec 6:98fe30430194 312 }