This is a test program for the LaOS - Laser Open Source driverboard, stepper drivers, sensors and I2C display.

Dependencies:   mbed SDFileSystem

Files at this revision

API Documentation at this revision

Comitter:
fablabtruck
Date:
Fri Jun 08 09:31:33 2012 +0000
Commit message:
svn rev 379

Changed in this revision

FATFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FATFileSystem.lib	Fri Jun 08 09:31:33 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_unsupported/code/fatfilesystem/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Fri Jun 08 09:31:33 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/SDFileSystem/#b1ddfc9a9b25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jun 08 09:31:33 2012 +0000
@@ -0,0 +1,283 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 2011 Peter Brier
+ *
+ *   This file is part of the LaOS project (see: http://laoslaser.org)
+ *
+ *   LaOS is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   LaOS is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with LaOS.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * This program tests the inputs and outputs of the laoslaser v1 board
+ * LED1 = xhome
+ * LED2 = yhome
+ * LED3 = zmin
+ * LED4 = zmax
+ *
+ */
+#include "mbed.h"
+#include "SDFileSystem.h"
+
+// USB Serial
+Serial pc(USBTX, USBRX); // tx, rx
+
+// SD card
+SDFileSystem sd(p11, p12, p13, p14, "sd");
+
+// Analog in/out (cover sensor) + NC
+DigitalIn cover(p19);
+
+// I2C
+I2C i2c(p9, p10);        // sda, scl
+#define _I2C_ADDRESS 0x04
+#define _I2C_HOME 0xFE
+#define _I2C_CLS 0xFF
+#define _I2C_BAUD 10000
+
+// status leds
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+// Inputs;
+DigitalIn xhome(p8);
+DigitalIn yhome(p17);
+DigitalIn zmin(p15);
+DigitalIn zmax(p16);
+
+
+// motors
+DigitalOut enable(p7);
+DigitalOut xdir(p23);
+DigitalOut xstep(p24);
+DigitalOut ydir(p25);
+DigitalOut ystep(p26);
+DigitalOut zdir(p27);
+DigitalOut zstep(p28);
+
+// laser
+DigitalOut o1(p22);
+DigitalOut o2(p21);
+DigitalOut o3(p6);
+DigitalOut o4(p5);
+
+
+// CAN bus
+CAN can(p30, p29);
+
+
+void home()
+{
+  printf("Homing with x,y,z dir=0\n");
+  int i=0;
+  xdir = 0;
+  ydir = 0;
+  zdir = 0;
+  led1 = 0;
+  while ( 1 )
+  {
+    xstep = ystep = 0;
+    wait(0.0001);
+    xstep = xhome;
+    ystep = yhome;
+    zstep = zmin;
+    wait(0.0001);
+    led1 = !xhome;    
+    led2 = !yhome;
+    led3 = !zmin;
+    led4 = ((i++) & 0x10000);
+    if ( (!xhome) && (!yhome) ) return;
+  }
+}
+
+#define TEST(c,x) case c: io = &x; x = !x; printf("Test %c: " #x " is now %s \n\r", c, (x ? "ON" : "OFF")); break 
+
+/**
+*** main()
+**/
+int main() 
+{
+  led1 = led2 = led3 = led4 = 1;
+  Timer t;
+  DigitalOut *io = NULL;
+  CANMessage msg;
+
+  i2c.frequency(_I2C_BAUD);
+  pc.baud(115200);
+  //pc.baud(9600);
+
+  xhome.mode(PullUp);
+  yhome.mode(PullUp);
+  zmin.mode(PullUp);
+  zmax.mode(PullUp); 
+  
+  char buf[512];
+  char *help = "\n\r\n\r\n\rLaOS Test program\n\r"
+   __DATE__ " " __TIME__ "\n\r"
+   "++++++++++++++++++\n\r"
+   "Use these keys to test the functionality of the board:\n\r"
+   "xX: X Step/Dir\t"
+   "yY: Y Step/Dir\t"
+   "zZ: Z Step/Dir\t"
+   "tT: Ext Step/Dir (o1/o2)\n\r"
+   "e: Toggle Stepper enable\n\r"
+   "c: Can bus test\n\r"
+   "sS: SD-Card test (s=test file, S=speed test)\n\r"
+   "i: I2C\n\r"
+   "1/2/3/4: Toggle outputs\n\r"
+   "f: apply 1Khz frequency to last IO line (1 second)\n\r"
+   "h: X/Y homing (note: direction and home sensor polarity may be wrong\n\r";
+  char iline[] = " LAOS-IOTEST V1.1";
+  iline[0] = 0xFF;
+  //i2c.write(_I2C_ADDRESS, iline, 17);
+  printf(help);
+
+  int i=0;
+  int test=0;
+  char key=0;
+  while( 1 )
+  {
+    i++;
+    led1 = xhome;
+    led2 = yhome;
+    led3 = zmin;
+    led4 = zmax;
+    if ( pc.readable() )
+      test = pc.getc();
+    else 
+      test = 0;
+    switch( test )
+    {
+      TEST('e',enable);
+      TEST('X',xdir);
+      TEST('x',xstep);
+      TEST('Y',ydir);
+      TEST('y',ystep);
+      TEST('Z',zdir);
+      TEST('z',zstep);
+      TEST('t',o2);
+      TEST('T',o1);
+      TEST('1',o1);
+      TEST('2',o2);
+      TEST('3',o3);
+      TEST('4',o4);
+      case 'h': 
+        home(); 
+        break;
+      case 'f':
+      case 'F':
+        if (io != NULL ) 
+        {
+          printf("pulsing output for 1000 pulses sec at 500Hz or 10kHz...\n");
+          for(i=0;i<1000;i++)
+          {
+            wait((test == 'f' ? 0.001 : 0.00005));
+            *io = 1;
+            wait((test == 'f' ? 0.001 : 0.00005));
+            *io = 0;
+          }
+        
+        }
+        break;
+      case 's':
+        memset(buf,0,sizeof(buf));
+        printf("Testing IO board SD card: Write...\n\r");
+        FILE *test1 = fopen("/sd/text.txt", "wb");
+        fwrite("bla bla\n",8, 1, test1); 
+        fclose(test1);
+        printf("Testing IO board SD card: Read...\n\r");
+        test1 = fopen("/sd/text.txt", "rb");
+        fread(&buf,8, 1, test1); 
+        printf("Result: '%s'\n\r", buf);
+        fclose(test1);
+        break;
+      case 'S':
+        printf("SD card speed test (writing and reading 1MByte file\n");
+        memset(buf,23,sizeof(buf));
+        FILE *test2 = fopen("/sd/test.bin", "wb");
+        t.reset();
+        t.start();
+        for(i=0;i<sizeof(buf);i++)
+          buf[i] = (char)t.read_ms();
+         t.stop(); t.reset(); t.start();
+        for(i=0;i<200;i++)
+          fwrite(buf,sizeof(buf), 1, test2); 
+        t.stop();
+        fclose(test2);
+        printf("Write 1MByte: %d msec\n\r", (int)t.read_ms());
+        test2 = fopen("/sd/test.bin", "rb");
+        t.reset();
+        t.start();
+        while( fread(&buf, sizeof(buf), 1, test2) > 0 );
+        t.stop();
+        printf("Read 1MByte: %d msec\n\r", (int)t.read_ms());
+      case 'i': 
+        printf("I2C test:\n\r");
+        char s[48];
+        sprintf(s," 0123456789ABCDEF1234567890ABCDEF");
+        s[0] = 0xFF;
+        i2c.write(_I2C_ADDRESS, s, strlen(s));
+        wait(3);
+        i2c.read(_I2C_ADDRESS, s, 48);
+        sprintf(iline," Key read: %c", s[0]);
+        i2c.write(_I2C_ADDRESS, iline, strlen(iline));
+        break;
+      case 'c':
+        printf("CAN bus test, sending and receiving characters, press any key to quit\n\r");
+        can.frequency(500000);
+        can.reset();
+        t.start();
+        can.reset();
+        while( !pc.readable() )
+        {
+          if ( t > 1.0 ) 
+          {
+            t.reset();
+            can.write(CANMessage(10, &key, 1));
+            key++;
+          }
+          wait(0.1);
+          if(can.read(msg)) 
+            printf("Message received: id=%d, len=%d, data[0]=%d\n\n\r", (int)msg.id, (int)msg.len, (int)msg.data[0]);
+   
+         printf("value=%d, rderror=%d, tderror=%d\n\r", (int)key, can.rderror(), can.tderror());
+       
+        }         
+        break;
+      case 0:
+      case '\n':
+      case '\r': break;
+      default: printf(help); break;
+    }
+    //i2c.read(_I2C_ADDRESS,&key, 1);
+    if (key != 0) {
+        char s[48];
+        printf("I2C key read: %c\n\r", key);
+        sprintf(s," Key read: %c", key);
+        s[0] = 0xFF;
+        //i2c.write(_I2C_ADDRESS, s, strlen(s));
+        wait(0.2);
+        if (key == '7') {
+            wait(1);
+            //i2c.write(_I2C_ADDRESS, iline, 17);
+        }
+        //i2c.read(_I2C_ADDRESS, s, 48);
+        key=0;
+    }
+    if ( test ) 
+    {
+      printf("xhome=%d, yhome=%d, zmin=%d, zmax=%d, cover=%s\n\r", (int)xhome, (int)yhome, (int)zmin, (int)zmax, (cover ? "OPEN" : "CLOSED") );
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Jun 08 09:31:33 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e