code to drive the main board of the london-hackspace vending machine

Dependencies:   mbed

Committer:
Jasper
Date:
Sun Jan 23 00:31:36 2011 +0000
Revision:
0:68a443d62d80

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jasper 0:68a443d62d80 1 #include "mbed.h"
Jasper 0:68a443d62d80 2
Jasper 0:68a443d62d80 3 DigitalOut g(p22);
Jasper 0:68a443d62d80 4 DigitalOut r(p21);
Jasper 0:68a443d62d80 5
Jasper 0:68a443d62d80 6 void red(void) {
Jasper 0:68a443d62d80 7 r = 1; g = 0;
Jasper 0:68a443d62d80 8 }
Jasper 0:68a443d62d80 9
Jasper 0:68a443d62d80 10 void green(void) {
Jasper 0:68a443d62d80 11 r = 0; g = 1;
Jasper 0:68a443d62d80 12 }
Jasper 0:68a443d62d80 13
Jasper 0:68a443d62d80 14 void orange(void) {
Jasper 0:68a443d62d80 15 r = 1; g = 1;
Jasper 0:68a443d62d80 16 }
Jasper 0:68a443d62d80 17
Jasper 0:68a443d62d80 18 void off(void) {
Jasper 0:68a443d62d80 19 r = 0; g = 0;
Jasper 0:68a443d62d80 20 }
Jasper 0:68a443d62d80 21
Jasper 0:68a443d62d80 22 Serial pc(USBTX, USBRX);
Jasper 0:68a443d62d80 23
Jasper 0:68a443d62d80 24 DigitalOut ser(p25);
Jasper 0:68a443d62d80 25 DigitalOut mclock(p24);
Jasper 0:68a443d62d80 26 DigitalOut oe(p26);
Jasper 0:68a443d62d80 27 DigitalOut m10(p28);
Jasper 0:68a443d62d80 28 DigitalOut m9(p27);
Jasper 0:68a443d62d80 29
Jasper 0:68a443d62d80 30 InterruptIn vint(p30);
Jasper 0:68a443d62d80 31
Jasper 0:68a443d62d80 32 int intrcount = 0;
Jasper 0:68a443d62d80 33 bool vendfound = 0;
Jasper 0:68a443d62d80 34
Jasper 0:68a443d62d80 35 /*
Jasper 0:68a443d62d80 36 motor connectors pinouts:
Jasper 0:68a443d62d80 37
Jasper 0:68a443d62d80 38 a b
Jasper 0:68a443d62d80 39 1 a1 b1
Jasper 0:68a443d62d80 40 2 a2 b2
Jasper 0:68a443d62d80 41 3 a3 b3
Jasper 0:68a443d62d80 42 4 a4 b4
Jasper 0:68a443d62d80 43 5 a5 b5
Jasper 0:68a443d62d80 44 6 a6 b6
Jasper 0:68a443d62d80 45 7 a7 n/a
Jasper 0:68a443d62d80 46 8 a8 n/a
Jasper 0:68a443d62d80 47 9 a9 n/a
Jasper 0:68a443d62d80 48 10 a0 n/a
Jasper 0:68a443d62d80 49 */
Jasper 0:68a443d62d80 50
Jasper 0:68a443d62d80 51 /* bits are:
Jasper 0:68a443d62d80 52 *
Jasper 0:68a443d62d80 53 * serial data mcu -> 5890 -> 5842A
Jasper 0:68a443d62d80 54 *
Jasper 0:68a443d62d80 55 * first bits out are for the first 8 motor sinks
Jasper 0:68a443d62d80 56 * next 8 are the sources, we only need 2
Jasper 0:68a443d62d80 57 *
Jasper 0:68a443d62d80 58 * low order bits are the sinks
Jasper 0:68a443d62d80 59 *
Jasper 0:68a443d62d80 60 */
Jasper 0:68a443d62d80 61 uint16_t motor_bits(int motor)
Jasper 0:68a443d62d80 62 {
Jasper 0:68a443d62d80 63 uint16_t out = 0; // 16 bits!
Jasper 0:68a443d62d80 64
Jasper 0:68a443d62d80 65 switch (motor) {
Jasper 0:68a443d62d80 66 case 1:
Jasper 0:68a443d62d80 67 out = 0x2080; // 0010000010000000
Jasper 0:68a443d62d80 68 break;
Jasper 0:68a443d62d80 69 case 2:
Jasper 0:68a443d62d80 70 out = 0x2040; // 0010000001000000
Jasper 0:68a443d62d80 71 break;
Jasper 0:68a443d62d80 72 case 3:
Jasper 0:68a443d62d80 73 out = 0x2020; // 0010000000100000
Jasper 0:68a443d62d80 74 break;
Jasper 0:68a443d62d80 75 case 4:
Jasper 0:68a443d62d80 76 out = 0x2010; // 0010000000010000
Jasper 0:68a443d62d80 77 break;
Jasper 0:68a443d62d80 78 case 5:
Jasper 0:68a443d62d80 79 out = 0x2008; // 0010000000001000
Jasper 0:68a443d62d80 80 break;
Jasper 0:68a443d62d80 81 case 6:
Jasper 0:68a443d62d80 82 out = 0x2004; // 0010000000000100
Jasper 0:68a443d62d80 83 break;
Jasper 0:68a443d62d80 84 case 7:
Jasper 0:68a443d62d80 85 out = 0x2002; // 0010000000000010
Jasper 0:68a443d62d80 86 break;
Jasper 0:68a443d62d80 87 case 8:
Jasper 0:68a443d62d80 88 out = 0x2001; // 0010000000000001
Jasper 0:68a443d62d80 89 break;
Jasper 0:68a443d62d80 90 case 9:
Jasper 0:68a443d62d80 91 out = 0x2000; // 0010000000000000 uses the darlingtons
Jasper 0:68a443d62d80 92 break;
Jasper 0:68a443d62d80 93 case 10:
Jasper 0:68a443d62d80 94 out = 0x2000; // 0010000000000000 uses the darlingtons
Jasper 0:68a443d62d80 95 break;
Jasper 0:68a443d62d80 96 case 11:
Jasper 0:68a443d62d80 97 out = 0x4080; // 0100000010000000
Jasper 0:68a443d62d80 98 break;
Jasper 0:68a443d62d80 99 case 12:
Jasper 0:68a443d62d80 100 out = 0x4040; // 0100000001000000
Jasper 0:68a443d62d80 101 break;
Jasper 0:68a443d62d80 102 case 13:
Jasper 0:68a443d62d80 103 out = 0x4020; // 0100000000100000
Jasper 0:68a443d62d80 104 break;
Jasper 0:68a443d62d80 105 case 14:
Jasper 0:68a443d62d80 106 out = 0x4010; // 0100000000010000
Jasper 0:68a443d62d80 107 break;
Jasper 0:68a443d62d80 108 case 15:
Jasper 0:68a443d62d80 109 out = 0x4008; // 0100000000001000
Jasper 0:68a443d62d80 110 break;
Jasper 0:68a443d62d80 111 case 16:
Jasper 0:68a443d62d80 112 out = 0x4004; // 0100000000000100
Jasper 0:68a443d62d80 113 break;
Jasper 0:68a443d62d80 114 }
Jasper 0:68a443d62d80 115 return out;
Jasper 0:68a443d62d80 116 }
Jasper 0:68a443d62d80 117
Jasper 0:68a443d62d80 118 /*
Jasper 0:68a443d62d80 119 * motor is 1 to 16
Jasper 0:68a443d62d80 120 */
Jasper 0:68a443d62d80 121 int motors(int motor) {
Jasper 0:68a443d62d80 122 int i, bit;
Jasper 0:68a443d62d80 123 uint16_t bits;
Jasper 0:68a443d62d80 124
Jasper 0:68a443d62d80 125 bits = 0;
Jasper 0:68a443d62d80 126
Jasper 0:68a443d62d80 127 if (motor < 1)
Jasper 0:68a443d62d80 128 return -1;
Jasper 0:68a443d62d80 129
Jasper 0:68a443d62d80 130 if (motor > 16)
Jasper 0:68a443d62d80 131 return -1;
Jasper 0:68a443d62d80 132
Jasper 0:68a443d62d80 133 bits = motor_bits(motor);
Jasper 0:68a443d62d80 134
Jasper 0:68a443d62d80 135 for (i = 0 ; i < 16 ; i++)
Jasper 0:68a443d62d80 136 {
Jasper 0:68a443d62d80 137 bit = (bits & (1 << i)) >> i;
Jasper 0:68a443d62d80 138 ser = bit;
Jasper 0:68a443d62d80 139 mclock = 0;
Jasper 0:68a443d62d80 140 wait_ms(1);
Jasper 0:68a443d62d80 141 mclock = 1;
Jasper 0:68a443d62d80 142 wait_ms(1);
Jasper 0:68a443d62d80 143 }
Jasper 0:68a443d62d80 144
Jasper 0:68a443d62d80 145 // need to use the darlington pins instead
Jasper 0:68a443d62d80 146 if (motor == 9)
Jasper 0:68a443d62d80 147 m9 = 1;
Jasper 0:68a443d62d80 148
Jasper 0:68a443d62d80 149 if (motor == 10)
Jasper 0:68a443d62d80 150 m10 = 1;
Jasper 0:68a443d62d80 151
Jasper 0:68a443d62d80 152 return 0;
Jasper 0:68a443d62d80 153 }
Jasper 0:68a443d62d80 154
Jasper 0:68a443d62d80 155 void clear(void) {
Jasper 0:68a443d62d80 156 int i;
Jasper 0:68a443d62d80 157
Jasper 0:68a443d62d80 158 ser = 0;
Jasper 0:68a443d62d80 159 m9 = 0;
Jasper 0:68a443d62d80 160 m10 = 0;
Jasper 0:68a443d62d80 161 oe = 1; // oe is active low
Jasper 0:68a443d62d80 162
Jasper 0:68a443d62d80 163 for (i = 0; i < 16 ; i++)
Jasper 0:68a443d62d80 164 {
Jasper 0:68a443d62d80 165 mclock = 0;
Jasper 0:68a443d62d80 166 wait_ms(1);
Jasper 0:68a443d62d80 167 mclock = 1;
Jasper 0:68a443d62d80 168 }
Jasper 0:68a443d62d80 169 wait_ms(1);
Jasper 0:68a443d62d80 170 m9 = 0;
Jasper 0:68a443d62d80 171 m10 = 0;
Jasper 0:68a443d62d80 172 oe = 0; // should switch everything off.
Jasper 0:68a443d62d80 173 intrcount = 0;
Jasper 0:68a443d62d80 174 }
Jasper 0:68a443d62d80 175
Jasper 0:68a443d62d80 176 void vendintr() {
Jasper 0:68a443d62d80 177 intrcount++;
Jasper 0:68a443d62d80 178 }
Jasper 0:68a443d62d80 179
Jasper 0:68a443d62d80 180 int main() {
Jasper 0:68a443d62d80 181 int i;
Jasper 0:68a443d62d80 182 char got;
Jasper 0:68a443d62d80 183 char state1, gcount;
Jasper 0:68a443d62d80 184 int ga, gb;
Jasper 0:68a443d62d80 185
Jasper 0:68a443d62d80 186 state1 = 'n';
Jasper 0:68a443d62d80 187 gcount = 0;
Jasper 0:68a443d62d80 188 ga = gb = 0;
Jasper 0:68a443d62d80 189
Jasper 0:68a443d62d80 190 oe = 1; // active low
Jasper 0:68a443d62d80 191 ser = 0;
Jasper 0:68a443d62d80 192 mclock = 0;
Jasper 0:68a443d62d80 193
Jasper 0:68a443d62d80 194 printf("\n\rGo!\n\r");
Jasper 0:68a443d62d80 195 green();
Jasper 0:68a443d62d80 196
Jasper 0:68a443d62d80 197 vint.mode(PullUp);
Jasper 0:68a443d62d80 198 vint.fall(&vendintr);
Jasper 0:68a443d62d80 199
Jasper 0:68a443d62d80 200 for (i = 0; 1 ; i++) {
Jasper 0:68a443d62d80 201 if (i % 2) {
Jasper 0:68a443d62d80 202 orange();
Jasper 0:68a443d62d80 203 } else {
Jasper 0:68a443d62d80 204 green();
Jasper 0:68a443d62d80 205 }
Jasper 0:68a443d62d80 206
Jasper 0:68a443d62d80 207 wait_ms(100);
Jasper 0:68a443d62d80 208 if (pc.readable())
Jasper 0:68a443d62d80 209 {
Jasper 0:68a443d62d80 210 got = pc.getc();
Jasper 0:68a443d62d80 211 pc.putc(got); // remote echo
Jasper 0:68a443d62d80 212 if (state1 == 'n') // no command in progress
Jasper 0:68a443d62d80 213 {
Jasper 0:68a443d62d80 214 if (got == 'c') // no args
Jasper 0:68a443d62d80 215 {
Jasper 0:68a443d62d80 216 clear();
Jasper 0:68a443d62d80 217 printf("cleared\n\r");
Jasper 0:68a443d62d80 218 }
Jasper 0:68a443d62d80 219 if (got == 'r') { // no args, report intr count
Jasper 0:68a443d62d80 220 printf("vendintrs: %d\n\r", intrcount);
Jasper 0:68a443d62d80 221 }
Jasper 0:68a443d62d80 222 if (got == 'm') // look for numbers
Jasper 0:68a443d62d80 223 state1 = 'm';
Jasper 0:68a443d62d80 224 } else if (state1 == 'm') {
Jasper 0:68a443d62d80 225 if ((got - '0') > -1 && (got - '0') < 10 )
Jasper 0:68a443d62d80 226 {
Jasper 0:68a443d62d80 227 if (gcount == 0)
Jasper 0:68a443d62d80 228 ga = got - '0';
Jasper 0:68a443d62d80 229 if (gcount == 1)
Jasper 0:68a443d62d80 230 gb = got - '0';
Jasper 0:68a443d62d80 231
Jasper 0:68a443d62d80 232 gcount += 1;
Jasper 0:68a443d62d80 233 } else if (got == '\n' || got == '\r') {
Jasper 0:68a443d62d80 234 // newline, so end command
Jasper 0:68a443d62d80 235 int runmotor = 0;
Jasper 0:68a443d62d80 236 if (gcount < 3 && gcount != 0) {
Jasper 0:68a443d62d80 237 if (gcount == 1)
Jasper 0:68a443d62d80 238 runmotor = ga;
Jasper 0:68a443d62d80 239 if (gcount == 2)
Jasper 0:68a443d62d80 240 runmotor = (ga * 10) + gb;
Jasper 0:68a443d62d80 241 if (runmotor > 16) {
Jasper 0:68a443d62d80 242 printf("motor too big: %d\n\r", runmotor);
Jasper 0:68a443d62d80 243 } else {
Jasper 0:68a443d62d80 244 printf("running motor %d\n\r", runmotor);
Jasper 0:68a443d62d80 245 oe = 1;
Jasper 0:68a443d62d80 246 motors(runmotor);
Jasper 0:68a443d62d80 247 oe = 0; // active low
Jasper 0:68a443d62d80 248 }
Jasper 0:68a443d62d80 249 } else {
Jasper 0:68a443d62d80 250 printf("too many digits\n\r");
Jasper 0:68a443d62d80 251 }
Jasper 0:68a443d62d80 252 state1 = 'n';
Jasper 0:68a443d62d80 253 gcount = ga = gb = 0;
Jasper 0:68a443d62d80 254 } else {
Jasper 0:68a443d62d80 255 printf("m fail\n\r");
Jasper 0:68a443d62d80 256 state1 = 'n';
Jasper 0:68a443d62d80 257 gcount = ga = gb = 0;
Jasper 0:68a443d62d80 258 }
Jasper 0:68a443d62d80 259 }
Jasper 0:68a443d62d80 260 }
Jasper 0:68a443d62d80 261 }
Jasper 0:68a443d62d80 262 clear();
Jasper 0:68a443d62d80 263
Jasper 0:68a443d62d80 264 printf("Done!\r\n");
Jasper 0:68a443d62d80 265 }