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

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
Jasper
Date:
Sun Jan 23 00:31:36 2011 +0000
Commit message:

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 68a443d62d80 main.cpp
--- /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");
+}
diff -r 000000000000 -r 68a443d62d80 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Jan 23 00:31:36 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e