peter brier
/
laos
LaOS Laser test program
main.cpp
- Committer:
- pbrier
- Date:
- 2011-01-27
- Revision:
- 0:5c352dab4496
- Child:
- 1:93d357b92fd0
File content as of revision 0:5c352dab4496:
/* * main.cpp * * Copyright (c) 2011 Peter Brier * * This file is part of the LaOS project (see: http://wiki.protospace.nl/index.php/LaOS) * * 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 implements Bresenham line algorithm program (2D) * see: http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm * In addition: we controll a Z-axis and a laser. * Note: Fixed speed lasering (no accelleration). Actually: vector speed depends on angle. Perpendicular to X or Y axis is lowest speed * At 45 degrees is is sqrt(2) faster (approx 40%). Simple program, no line buffering. Considerable jitter on pulses. * */ #include "mbed.h" // serial comm Serial pc(USBTX, USBRX); // status leds DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); // motors DigitalOut xdir(p26); DigitalOut xstep(p25); DigitalOut ydir(p24); DigitalOut ystep(p23); DigitalOut zdir(p22); DigitalOut zstep(p21); // laser DigitalOut laser(p27); // globals Ticker ticker; // Timer // Besenham variables int state, laseron; int x0,y0,x1,y1,z0,z1; // positions: 0=current, 1=new int dx, sx; // step int dy, sy; // delta int err, e2; // error /** *** ticker: implement timer ticker, step if required **/ void tick() { // Control X,Y: line tracker switch ( state ) { case 0: // idle (make sure laser is off) laser = laseron = 0; break; case 1: // init dx = abs(x1-x0); sx = x0<x1 ? 1 : -1; dy = abs(y1-y0); sy = y0<y1 ? 1 : -1; err = (dx>dy ? dx : -dy)/2; xdir = sx > 0; ydir = sy > 0; state++; laser = laseron; break; case 2: // moving if (x0==x1 && y0==y1) state = 0; else { e2 = err; if (e2 >-dx) { err -= dy; x0 += sx; xstep = 1;} if (e2 < dy) { err += dx; y0 += sy; ystep = 1;} } break; } // Controll Z: tracking controller (independent of XY motion, not queued) if ( z1 != z0 ) { zdir = z1 > z0; wait_us(5); zstep= 1; if ( z1 > z0 ) z0++; else z0--; } if ( xstep == 1 || ystep == 1 || zstep == 1 ) { wait_us(5); xstep = ystep = zstep = 0; } // diagnostic info led1 = xdir; led2 = ydir; led3 = zdir; led4 = laser; } // ticker /** *** main() *** Read commands, report state **/ int main() { int v=100,c=0,z=0; pc.baud(115200); ticker.attach_us(&tick, v); // the address of the function to be attached (flip) and the interval (microseconds) // init state = laser = xstep = xdir = ystep = ydir = zstep = zdir = 0; while( 1 ) { scanf("%d", &c); switch( c ) { case 0: // move x,y (laser off) scanf("%d %d", &x1, &y1); laseron = 0; state = 1; break; case 1: // line x,y (laser on) scanf("%d %d", &x1, &y1); laseron = 1; state = 1; break; case 2: // move z scanf("%d", &z1); break; case 3: // set t (1/v) scanf("%d", &v); ticker.attach_us(&tick, v); break; case 4: // set x,y,z absolute scanf("%d %d %d", &x0, &y0, &z); z1 = z0 = z; case 5: // nop break; default: // I do not understand: stop motion state = 0; break; } printf("%d %d %d %d %d %d\r\n", state, x0, y0, z0, v, laseron); } }