Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of linearMirrorMotion by
Revision 20:8475768fc2f7, committed 2013-05-31
- Comitter:
- hiromasaoku
- Date:
- Fri May 31 06:32:07 2013 +0000
- Parent:
- 19:8e9fe7d25b9c
- Commit message:
- for sharing
Changed in this revision
--- a/main.cpp Fri May 24 06:37:58 2013 +0000 +++ b/main.cpp Fri May 31 06:32:07 2013 +0000 @@ -10,8 +10,7 @@ DigitalIn directionPin(p15); //green void processSerial(); -Timer timer_v; // for shearing -Timer timer; //for send the speed on the serial port every 30 ms: +Timer timer_v; // for shearing //for send the speed on the serial port every 30 ms: LocalFileSystem local("local"); //Serial pc(USBTX, USBRX); @@ -51,7 +50,7 @@ ////for culculate rotary velocity -------------------------------------------------------- -volatile float angleIncrement = 2.0*PI / 360; // when in Sign/Magnitude mode +volatile float angleIncrement = 2.0*PI / 1024; // when in Sign/Magnitude mode float radious = 700, attachSecond = 10000; // a ticker function to compute the speed periodically------------------------------------------------------------- @@ -71,9 +70,11 @@ void computeSpeed() { // We know exactly how much time passed since we last computed the speed, this is PERIODIC_COMPUTE in microseconds - angularSpeed = 1000000.0 * (float)(angle-oldAngle) / (float)(PERIODIC_COMPUTE); // in rad/sec + float oldspeed = angularSpeed; + angularSpeed = ( 1000000.0 * (float)(angle-oldAngle) / (float)(PERIODIC_COMPUTE) + oldspeed )/ 2.0; // in rad/sec oldAngle=angle; myRender.updateSpeed(angularSpeed,angle); + void processSerial(); } @@ -109,9 +110,9 @@ oldAngle=angle=0; // Attach the external interrupt routine---------------------------------------------------------------------- - superEncoder.attach_us(&encoderClock, attachSecond); - timer.reset(); - timer.start(); + superEncoder.attach_us(&encoderClock, 111); + //clockEncoderPin.rise(&encoderClock); + //clockEncoderPin.fall(&encoderClock); //using renderclass.cpp ---------------------------------------------------------- //createTextPoints(textString); @@ -131,16 +132,6 @@ // MAIN LOOP: -------------------------------------------------------------------------------------------- while(1) { if (pc.readable()>0) processSerial(); - - if(1/*start*/) { - timer_v.reset(); - wait_us(5000); - /* send the speed on the serial port every 30 ms: - if (timer.read_ms()>300000) { - pc.printf("Angular Speed = %4.2f\t Cumulative Angle = %4.2f\n" , angularSpeed, angle); - timer.reset(); - }*/ - } } } @@ -210,7 +201,8 @@ //makeBuffer(); } else if (val == 'S') { stringData[indexStringData] = 0; - st = atoi(stringData); + myRender.shearingSwitch = 1 - myRender.shearingSwitch; + pc.printf("shearingSwitch : %d \n" , myRender.shearingSwitch); indexStringData=0; //makeBuffer(); } else if (val == 'R') { @@ -221,6 +213,7 @@ } else if (val == 'T') { stringData[indexStringData] = 0; attachSecond = atoi(stringData); + pc.printf("attachSecond : %d \n" , attachSecond); indexStringData=0; //makeBuffer(); }
--- a/renderclass.cpp Fri May 24 06:37:58 2013 +0000 +++ b/renderclass.cpp Fri May 31 06:32:07 2013 +0000 @@ -9,21 +9,21 @@ inline void render::shearing(point2dl& dataBefore) { - dataBefore.x = dataBefore.x ;//+ speed * cos(angle) * timer_v.read_us()/st/1000; - dataBefore.y = dataBefore.y ;//+ speed * sin(angle) * timer_v.read_us()/st/1000; - + dataBefore.x = dataBefore.x - speed * cos(angle+PI/2)*speedTimer.read_us()/400; + dataBefore.y = dataBefore.y - speed * sin(angle+PI/2)*speedTimer.read_us()/400; } inline void render::rotation(point2dl& dataBefore) { int x=dataBefore.x; - dataBefore.x = cos(angle)*x - sin(angle)*dataBefore.y; - dataBefore.y = sin(angle)*x + cos(angle)*dataBefore.y; + dataBefore.x = 1800 * cos(angle) + sin(angle)*x - cos(angle)*dataBefore.y; + dataBefore.y = 1800 * sin(angle) - cos(angle)*x - sin(angle)*dataBefore.y; } //---------------------------------------------------------------------------------- void render::startRender() { + speedTimer.start(); renderTimer.attach_us(this, &render::draw,RENDER_INTERVAL); pc.printf("render started!\n"); } @@ -43,12 +43,13 @@ //for(int i=0; i!=(*ptext).size(); i++){ for(std::vector<letter>::iterator itr = (*ptext).begin(); itr != (*ptext).end(); ++itr) { translated.push_back(*itr); - pc.printf("moving...." ); } //copy the liblary to the buffer. currentLetters=0; currentPoints=0; + shearingSwitch = 1; + } @@ -59,40 +60,53 @@ //speed=sqrt(vx*vx+vy*vy);//*factorSpeed; //angle=atan2(vy,vx); } -float t=0; + +int stopcounter=100; + void render::draw() { if(translated.size()>0){ + if(stopcounter == 99) speedTimer.reset(); + if(stopcounter==100){ + point2dl drawPoint=translated[currentLetters].letpoints[currentPoints]; transform(drawPoint); // transform it with the current speed and angle - pc.printf("%d, %d, %d \n" , (int)drawPoint.x, (int)drawPoint.y, (int)drawPoint.laserSwitch); //IO.setRedPower(drawPoint.laserSwitch); - IO.writeOutXY(CENTER_AD_MIRROR_X+ 4*(int)drawPoint.x , CENTER_AD_MIRROR_Y - 4*(int)drawPoint.y); + IO.writeOutXY(CENTER_AD_MIRROR_X + (int)drawPoint.x , CENTER_AD_MIRROR_Y + (int)drawPoint.y); if(currentPoints>0) IO.setRedPower(translated[currentLetters].letpoints[currentPoints-1].laserSwitch); - else IO.setRedPower(0); ///laserswitch txt library needs to rewrite..........?\(>o<)/? + else IO.setRedPower(0); currentPoints++; + } + else stopcounter++; if(currentPoints >= translated[currentLetters].letpoints.size() ) { + if(stopcounter == 100) stopcounter = 0; + else if(stopcounter == 0){ + renderTimer.detach(); + } + //wait_us(RENDER_INTERVAL); + else if(stopcounter == 1){ + IO.setRedPower(0); + //wait_us(RENDER_INTERVAL); currentLetters++; currentPoints = 0; - - renderTimer.detach(); - wait_us(RENDER_INTERVAL); - IO.setRedPower(0); - wait_us(RENDER_INTERVAL*40); renderTimer.attach_us(this, &render::draw,RENDER_INTERVAL); + speedTimer.reset(); + } } if(currentLetters >= translated.size()) { currentLetters = 0; currentPoints = 0; renderTimer.detach(); - wait_us(RENDER_INTERVAL); + //wait_us(RENDER_INTERVAL); IO.setRedPower(0); - wait_us(RENDER_INTERVAL*20); + //wait_us(RENDER_INTERVAL*200); renderTimer.attach_us(this, &render::draw,RENDER_INTERVAL); + speedTimer.reset(); + stopcounter = -200; } } } @@ -100,26 +114,6 @@ void render::transform(point2dl& mypoint) { rotation(mypoint); - shearing(mypoint); + if(shearingSwitch == 1) shearing(mypoint); } -/* -void render::translating(float speed, float angle) //DO when get the speed and angle data. -{ - for (int i = 0; i > 10; i++) { - int j=0; - if(currentPoints + j > (*ptext)[currentLetters].letpoints.size()) { - currentPoints = 0; - currentLetters++; - j=0; - } - if(currentLetters > (*ptext).size()) break; - - point2dl bufferRotate = rotation((*ptext)[currentLetters].letpoints[currentPoints]); - point2dl bufferShear = shearing(bufferRotate); - - translated[currentLetters].letpoints[currentPoints] = bufferShear; - - j++; - } -}*/ \ No newline at end of file
--- a/renderclass.h Fri May 24 06:37:58 2013 +0000 +++ b/renderclass.h Fri May 31 06:32:07 2013 +0000 @@ -2,7 +2,7 @@ #include <vector> #define PI 3.14159 -#define RENDER_INTERVAL 1000// in microseconds +#define RENDER_INTERVAL 700// in microseconds struct point2dl { int x,y; @@ -25,6 +25,8 @@ void shearing(point2dl& dataBefore); void rotation(point2dl& dataBefore); void updateSpeed(float vx, float vy); + + int shearingSwitch; private: vector<letter> *ptext; @@ -34,7 +36,9 @@ point2dl drawPoint; Ticker renderTimer; + Timer speedTimer; float speed; float angle; + }; \ No newline at end of file