![](/media/cache/profiles/f720ec3e5486f090fd382b68e230b435.50x50_q85.jpg)
code to drive the main board of the london-hackspace vending machine
Diff: main.cpp
- Revision:
- 0:68a443d62d80
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jan 23 00:31:36 2011 +0000 @@ -0,0 +1,265 @@ +#include "mbed.h" + +DigitalOut g(p22); +DigitalOut r(p21); + +void red(void) { + r = 1; g = 0; +} + +void green(void) { + r = 0; g = 1; +} + +void orange(void) { + r = 1; g = 1; +} + +void off(void) { + r = 0; g = 0; +} + +Serial pc(USBTX, USBRX); + +DigitalOut ser(p25); +DigitalOut mclock(p24); +DigitalOut oe(p26); +DigitalOut m10(p28); +DigitalOut m9(p27); + +InterruptIn vint(p30); + +int intrcount = 0; +bool vendfound = 0; + +/* +motor connectors pinouts: + + a b +1 a1 b1 +2 a2 b2 +3 a3 b3 +4 a4 b4 +5 a5 b5 +6 a6 b6 +7 a7 n/a +8 a8 n/a +9 a9 n/a +10 a0 n/a +*/ + +/* bits are: + * + * serial data mcu -> 5890 -> 5842A + * + * first bits out are for the first 8 motor sinks + * next 8 are the sources, we only need 2 + * + * low order bits are the sinks + * + */ +uint16_t motor_bits(int motor) +{ + uint16_t out = 0; // 16 bits! + + switch (motor) { + case 1: + out = 0x2080; // 0010000010000000 + break; + case 2: + out = 0x2040; // 0010000001000000 + break; + case 3: + out = 0x2020; // 0010000000100000 + break; + case 4: + out = 0x2010; // 0010000000010000 + break; + case 5: + out = 0x2008; // 0010000000001000 + break; + case 6: + out = 0x2004; // 0010000000000100 + break; + case 7: + out = 0x2002; // 0010000000000010 + break; + case 8: + out = 0x2001; // 0010000000000001 + break; + case 9: + out = 0x2000; // 0010000000000000 uses the darlingtons + break; + case 10: + out = 0x2000; // 0010000000000000 uses the darlingtons + break; + case 11: + out = 0x4080; // 0100000010000000 + break; + case 12: + out = 0x4040; // 0100000001000000 + break; + case 13: + out = 0x4020; // 0100000000100000 + break; + case 14: + out = 0x4010; // 0100000000010000 + break; + case 15: + out = 0x4008; // 0100000000001000 + break; + case 16: + out = 0x4004; // 0100000000000100 + break; + } + return out; +} + +/* + * motor is 1 to 16 + */ +int motors(int motor) { + int i, bit; + uint16_t bits; + + bits = 0; + + if (motor < 1) + return -1; + + if (motor > 16) + return -1; + + bits = motor_bits(motor); + + for (i = 0 ; i < 16 ; i++) + { + bit = (bits & (1 << i)) >> i; + ser = bit; + mclock = 0; + wait_ms(1); + mclock = 1; + wait_ms(1); + } + + // need to use the darlington pins instead + if (motor == 9) + m9 = 1; + + if (motor == 10) + m10 = 1; + + return 0; +} + +void clear(void) { + int i; + + ser = 0; + m9 = 0; + m10 = 0; + oe = 1; // oe is active low + + for (i = 0; i < 16 ; i++) + { + mclock = 0; + wait_ms(1); + mclock = 1; + } + wait_ms(1); + m9 = 0; + m10 = 0; + oe = 0; // should switch everything off. + intrcount = 0; +} + +void vendintr() { + intrcount++; +} + +int main() { + int i; + char got; + char state1, gcount; + int ga, gb; + + state1 = 'n'; + gcount = 0; + ga = gb = 0; + + oe = 1; // active low + ser = 0; + mclock = 0; + + printf("\n\rGo!\n\r"); + green(); + + vint.mode(PullUp); + vint.fall(&vendintr); + + for (i = 0; 1 ; i++) { + if (i % 2) { + orange(); + } else { + green(); + } + + wait_ms(100); + if (pc.readable()) + { + got = pc.getc(); + pc.putc(got); // remote echo + if (state1 == 'n') // no command in progress + { + if (got == 'c') // no args + { + clear(); + printf("cleared\n\r"); + } + if (got == 'r') { // no args, report intr count + printf("vendintrs: %d\n\r", intrcount); + } + if (got == 'm') // look for numbers + state1 = 'm'; + } else if (state1 == 'm') { + if ((got - '0') > -1 && (got - '0') < 10 ) + { + if (gcount == 0) + ga = got - '0'; + if (gcount == 1) + gb = got - '0'; + + gcount += 1; + } else if (got == '\n' || got == '\r') { + // newline, so end command + int runmotor = 0; + if (gcount < 3 && gcount != 0) { + if (gcount == 1) + runmotor = ga; + if (gcount == 2) + runmotor = (ga * 10) + gb; + if (runmotor > 16) { + printf("motor too big: %d\n\r", runmotor); + } else { + printf("running motor %d\n\r", runmotor); + oe = 1; + motors(runmotor); + oe = 0; // active low + } + } else { + printf("too many digits\n\r"); + } + state1 = 'n'; + gcount = ga = gb = 0; + } else { + printf("m fail\n\r"); + state1 = 'n'; + gcount = ga = gb = 0; + } + } + } + } + clear(); + + printf("Done!\r\n"); +}