公司网站维护与更新,wordpress语法高亮,企业seo排名服务,门户网站开发怎么收费调试程序#xff0c;运行调试程序#xff0c;舵机会移动两只悬臂分别停留在一只水平另一只垂直的位置上。如果差距非常大#xff0c;可拆下悬臂调节#xff0c;如果比较接近了#xff0c;就修改程序第3~6行的四个参数 SERVOFAKTORLEFT 左悬臂垂直位置#xff0c;SERVOFAK… 调试程序运行调试程序舵机会移动两只悬臂分别停留在一只水平另一只垂直的位置上。如果差距非常大可拆下悬臂调节如果比较接近了就修改程序第3~6行的四个参数 SERVOFAKTORLEFT 左悬臂垂直位置SERVOFAKTORRIGHT 右悬臂垂直位置SERVOLEFTNULL 左悬臂180度位置SERVORIGHTNULL 右悬臂0度位置右侧为0度逆时针画圆参数增加摆臂逆时针转动一般增幅50才能看到比较明显的变化。 调节参数直到摆臂停在下图的标准位置上为止。 LIFT0、1、2参数原理相同调试方法略过 《调试摆臂用代码》 //左右悬臂舵机的90度位置
#define SERVOFAKTORLEFT 550
#define SERVOFAKTORRIGHT 630 //此参数650是理论中间位置需要看实际情况调节//左右悬臂舵机的 0或180度位置
#define SERVOLEFTNULL 1750
#define SERVORIGHTNULL 880//三只舵机的接口
#define SERVOPINLIFT 2
#define SERVOPINLEFT 3
#define SERVOPINRIGHT 4//升举舵机的3个角度
#define LIFT0 1080 // on drspan stylefont-size:12px;awing surface 写的时候
#define LIFT1 925 // between numbers 字之间
#define LIFT2 725 // going towards sweeper 去笔擦高度/span// 速度
#define LIFTSPEED 1500// 悬臂的长度根据图纸测量无需改变
#define L1 35
#define L2 57.2
#define L3 14.2// 左右舵机轴心的位置
#define O1X 23
#define O1Y -25
#define O2X 49
#define O2Y -25#include Time.h // see [urlhttp://playground.arduino.cc/Code/time]http://playground.arduino.cc/Code/time[/url]
#include Servo.hint servoLift 1500;Servo servo1; // Servo 类 声明
Servo servo2; //
Servo servo3; // volatile double lastX 75;
volatile double lastY 47.5;int last_min 0;void setup()
{ // Set current time only the first to values, hh,mm are neededsetTime(19,38,0,0,0,0);drawTo(38, 24);lift(0);servo1.attach(SERVOPINLIFT); // lifting servoservo2.attach(SERVOPINLEFT); // left servoservo3.attach(SERVOPINRIGHT); // right servodelay(1000);} void loop()
{ // 移动左右悬臂让两只悬臂分别停留在水平和垂直的位置上。 通过修改 SERVOFAKTORLEFT SERVOFAKTORRIGHT SERVOLEFTNULL SERVORIGHTNULL 四个参数来微调drawTo(-3, 29.2);delay(500);drawTo(74.1, 28);delay(500);} // Writing numeral with bx by being the bottom left originpoint. Scale 1 equals a 20 mm high font.
// The structure follows this principle: move to first startpoint of the numeral, lift down, draw numeral, lift up
void number(float bx, float by, int num, float scale) {switch (num) {case 0:drawTo(bx 12 * scale, by 6 * scale);lift(0);bogenGZS(bx 7 * scale, by 10 * scale, 10 * scale, -0.8, 6.7, 0.5);lift(1);break;case 1:drawTo(bx 3 * scale, by 15 * scale);lift(0);drawTo(bx 10 * scale, by 20 * scale);drawTo(bx 10 * scale, by 0 * scale);lift(1);break;case 2:drawTo(bx 2 * scale, by 12 * scale);lift(0);bogenUZS(bx 8 * scale, by 14 * scale, 6 * scale, 3, -0.8, 1);drawTo(bx 1 * scale, by 0 * scale);drawTo(bx 12 * scale, by 0 * scale);lift(1);break;case 3:drawTo(bx 2 * scale, by 17 * scale);lift(0);bogenUZS(bx 5 * scale, by 15 * scale, 5 * scale, 3, -2, 1);bogenUZS(bx 5 * scale, by 5 * scale, 5 * scale, 1.57, -3, 1);lift(1);break;case 4:drawTo(bx 10 * scale, by 0 * scale);lift(0);drawTo(bx 10 * scale, by 20 * scale);drawTo(bx 2 * scale, by 6 * scale);drawTo(bx 12 * scale, by 6 * scale);lift(1);break;case 5:drawTo(bx 2 * scale, by 5 * scale);lift(0);bogenGZS(bx 5 * scale, by 6 * scale, 6 * scale, -2.5, 2, 1);drawTo(bx 5 * scale, by 20 * scale);drawTo(bx 12 * scale, by 20 * scale);lift(1);break;case 6:drawTo(bx 2 * scale, by 10 * scale);lift(0);bogenUZS(bx 7 * scale, by 6 * scale, 6 * scale, 2, -4.4, 1);drawTo(bx 11 * scale, by 20 * scale);lift(1);break;case 7:drawTo(bx 2 * scale, by 20 * scale);lift(0);drawTo(bx 12 * scale, by 20 * scale);drawTo(bx 2 * scale, by 0);lift(1);break;case 8:drawTo(bx 5 * scale, by 10 * scale);lift(0);bogenUZS(bx 5 * scale, by 15 * scale, 5 * scale, 4.7, -1.6, 1);bogenGZS(bx 5 * scale, by 5 * scale, 5 * scale, -4.7, 2, 1);lift(1);break;case 9:drawTo(bx 9 * scale, by 11 * scale);lift(0);bogenUZS(bx 7 * scale, by 15 * scale, 5 * scale, 4, -0.5, 1);drawTo(bx 5 * scale, by 0);lift(1);break;case 111:lift(0);drawTo(70, 46);drawTo(65, 43);drawTo(65, 49);drawTo(5, 49);drawTo(5, 45);drawTo(65, 45);drawTo(65, 40);drawTo(5, 40);drawTo(5, 35);drawTo(65, 35);drawTo(65, 30);drawTo(5, 30);drawTo(5, 25);drawTo(65, 25);drawTo(65, 20);drawTo(5, 20);drawTo(60, 44);drawTo(75.2, 47);lift(2);break;case 11:drawTo(bx 5 * scale, by 15 * scale);lift(0);bogenGZS(bx 5 * scale, by 15 * scale, 0.1 * scale, 1, -1, 1);lift(1);drawTo(bx 5 * scale, by 5 * scale);lift(0);bogenGZS(bx 5 * scale, by 5 * scale, 0.1 * scale, 1, -1, 1);lift(1);break;}
}void lift(char lift) {switch (lift) {// room to optimize !case 0: //850if (servoLift LIFT0) {while (servoLift LIFT0) {servoLift--;servo1.writeMicroseconds(servoLift); delayMicroseconds(LIFTSPEED);}} else {while (servoLift LIFT0) {servoLift;servo1.writeMicroseconds(servoLift);delayMicroseconds(LIFTSPEED);}}break;case 1: //150if (servoLift LIFT1) {while (servoLift LIFT1) {servoLift--;servo1.writeMicroseconds(servoLift);delayMicroseconds(LIFTSPEED);}} else {while (servoLift LIFT1) {servoLift;servo1.writeMicroseconds(servoLift);delayMicroseconds(LIFTSPEED);}}break;case 2:if (servoLift LIFT2) {while (servoLift LIFT2) {servoLift--;servo1.writeMicroseconds(servoLift);delayMicroseconds(LIFTSPEED);}} else {while (servoLift LIFT2) {servoLift;servo1.writeMicroseconds(servoLift); delayMicroseconds(LIFTSPEED);}}break;}
}void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {float inkr -0.05;float count 0;do {drawTo(sqee * radius * cos(start count) bx,radius * sin(start count) by);count inkr;} while ((start count) ende);}void bogenGZS(float bx, float by, float radius, int start, int ende, float sqee) {float inkr 0.05;float count 0;do {drawTo(sqee * radius * cos(start count) bx,radius * sin(start count) by);count inkr;} while ((start count) ende);
}void drawTo(double pX, double pY) {double dx, dy, c;int i;// dx dy of new pointdx pX - lastX;dy pY - lastY;//path lenght in mm, times 4 equals 4 steps per mmc floor(4 * sqrt(dx * dx dy * dy));if (c 1) c 1;for (i 0; i c; i) {// draw line point by pointset_XY(lastX (i * dx / c), lastY (i * dy / c));}lastX pX;lastY pY;
}double return_angle(double a, double b, double c) {// cosine rule for angle between c and areturn acos((a * a c * c - b * b) / (2 * a * c));
}void set_XY(double Tx, double Ty)
{delay(1);double dx, dy, c, a1, a2, Hx, Hy;// calculate triangle between pen, servoLeft and arm joint// cartesian dx/dydx Tx - O1X;dy Ty - O1Y;// polar lemgth (c) and angle (a1)c sqrt(dx * dx dy * dy); // a1 atan2(dy, dx); //a2 return_angle(L1, L2, c);servo2.writeMicroseconds(floor(((a2 a1 - M_PI) * SERVOFAKTORLEFT) SERVOLEFTNULL));// calculate joinr arm point for triangle of the right servo arma2 return_angle(L2, L1, c);Hx Tx L3 * cos((a1 - a2 0.621) M_PI); //36,5掳Hy Ty L3 * sin((a1 - a2 0.621) M_PI);// calculate triangle between pen joint, servoRight and arm jointdx Hx - O2X;dy Hy - O2Y;c sqrt(dx * dx dy * dy);a1 atan2(dy, dx);a2 return_angle(L1, (L2 - L3), c);servo3.writeMicroseconds(floor(((a1 - a2) * SERVOFAKTORRIGHT) SERVORIGHTNULL));}/span如果调试完毕就可以安装笔擦等附件开始耍贱了 标准程序需要时间模块读取时间如果没有模块可以修改函数返回随机数或者从00:00开始计时等办法。 《Plotclock小贱钟程序》 //↓↓↓↓↓↓↓ 以下参数在调试程序中调节好后复制过来 ↓↓↓↓↓↓↓//1.先调节0、180度的位置。调节到位后再调节90度位置
//左右悬臂舵机的 0或180度位置,数字增加左侧舵机逆时针调整右侧舵机顺时针调整
//【此数值可能需要调节】
#define SERVOLEFTNULL 2030 //数值减小顺时针旋转加大则逆时针旋转
//【此数值可能需要调节】
#define SERVORIGHTNULL 1100 //数值减小顺时针旋转加大则逆时针旋转//2.调节到位0、180再调节下面参数
//左右悬臂舵机的90度位置,数字增加左侧舵机顺时针调整右侧舵机逆时针调整
//【此数值可能需要调节】
#define SERVOFAKTORLEFT 580 //数值加大顺时针旋转减小则逆时针旋转
//【此数值可能需要调节】
#define SERVOFAKTORRIGHT 610 //数值减小顺时针旋转加大则逆时针旋转//升举舵机的3个角度
//【此数值可能需要调节】
#define LIFT0 1620 //落笔写字 on drawing surface
#define LIFT1 1320 //写字时抬臂动作 between numbers
#define LIFT2 580 //高抬笔架 going towards sweeper
//【此数值可能需要调节】//
//以上参数请运行调试程序 plotclockadj 调整好位置后将数据复制过来
////笔擦的坐标位置如不能对准笔擦可以微调单位毫米
int rubberx72,rubbery42; //【此数值可能需要调节】//三只舵机的接口号
#define SERVOPINLIFT 2 //抬臂舵机
#define SERVOPINLEFT 3 //左臂舵机
#define SERVOPINRIGHT 4 //右臂舵机// 速度 数字越小越慢太快了容易抖 1000~2000
#define LIFTSPEED 1500 // 悬臂的长度根据图纸测量无需改变
#define L1 35
#define L2 57.2
#define L3 14.2// 左右舵机轴心的位置根据图纸测量无需改变
#define O1X 22
#define O1Y -25
#define O2X 47
#define O2Y -25//需要的库函数 ,如果编译报告 time.h 错误请参考readme文档
#include Time.h // see http://playground.arduino.cc/Code/time
#include Servo.hint servoLift LIFT2;Servo servo1; //
Servo servo2; //
Servo servo3; // volatile double lastX rubberx;
volatile double lastY rubbery;int last_min 0;void setup()
{ // 设置一个模拟时间小时分钟后面全填0//如果此句编译错误请将文件包内的libraries库放到Arduino文件夹内具体操作办法见说明文档setTime(19,38,0,0,0,0); servo1.attach(SERVOPINLIFT); //初始化抬臂舵机 lifting servoservo2.attach(SERVOPINLEFT); //初始化左臂舵机 left servoservo3.attach(SERVOPINRIGHT); //初始化右臂舵机 right servolift(1); //抬笔drawTo(rubberx, rubbery); //停留在笔擦位置delay(1000);} void loop()
{ int i 0;//下面代码任选一行进行不同模式的书写//if (last_min ! minute()) //每分钟书写一次时间//if (1) //反复不间断的擦写模式if (1) //如需修改请复制上面代码{if (!servo1.attached()) servo1.attach(SERVOPINLIFT);if (!servo2.attached()) servo2.attach(SERVOPINLEFT);if (!servo3.attached()) servo3.attach(SERVOPINRIGHT);lift(0);hour();while ((i1)*10 hour()) //提取19:38时间部分的第一位也就是19的1{i;}number(3, 3, 111, 1); //擦黑板number(5, 25, i, 0.9); // 书写19:38的第一位也就是写1number(19, 25, (hour()-i*10), 0.9); //提取并书写19:38的第二位也就是写9number(28, 25, 11, 0.9);//书写19:38的点 i0;while ((i1)*10 minute()) //提取19:38时间部分的分钟位也就是38的3{i;}number(34, 25, i, 0.9);//书写19:38的第四位也就是3number(48, 25, (minute()-i*10), 0.9);//提取并书写19:38的第五位也就是8lift(2);drawTo(70, 44); //移动到70,44lift(1);last_min minute();servo1.detach();servo2.detach();servo3.detach();}} // Writing numeral with bx by being the bottom left originpoint. Scale 1 equals a 20 mm high font.
// The structure follows this principle: move to first startpoint of the numeral, lift down, draw numeral, lift up
//这里是写字的函数如果你觉得字写的丑可以自行修改字体结果可能是更丑。还可以自行增加其他内容比如字母甚至是汉字
void number(float bx, float by, int num, float scale) {switch (num) {case 0:drawTo(bx 12 * scale, by 6 * scale);lift(0);bogenGZS(bx 7 * scale, by 10 * scale, 10 * scale, -0.8, 6.7, 0.5);lift(1);break;case 1:drawTo(bx 3 * scale, by 15 * scale);lift(0);drawTo(bx 10 * scale, by 20 * scale);drawTo(bx 10 * scale, by 0 * scale);lift(1);break;case 2:drawTo(bx 2 * scale, by 12 * scale);lift(0);bogenUZS(bx 8 * scale, by 14 * scale, 6 * scale, 3, -0.8, 1);drawTo(bx 1 * scale, by 0 * scale);drawTo(bx 12 * scale, by 0 * scale);lift(1);break;case 3:drawTo(bx 2 * scale, by 17 * scale);lift(0);bogenUZS(bx 5 * scale, by 15 * scale, 5 * scale, 3, -2, 1);bogenUZS(bx 5 * scale, by 5 * scale, 5 * scale, 1.57, -3, 1);lift(1);break;case 4:drawTo(bx 10 * scale, by 0 * scale);lift(0);drawTo(bx 10 * scale, by 20 * scale);drawTo(bx 2 * scale, by 6 * scale);drawTo(bx 12 * scale, by 6 * scale);lift(1);break;case 5:drawTo(bx 2 * scale, by 5 * scale);lift(0);bogenGZS(bx 5 * scale, by 6 * scale, 6 * scale, -2.5, 2, 1);drawTo(bx 5 * scale, by 20 * scale);drawTo(bx 12 * scale, by 20 * scale);lift(1);break;case 6:drawTo(bx 2 * scale, by 10 * scale);lift(0);bogenUZS(bx 7 * scale, by 6 * scale, 6 * scale, 2, -4.4, 1);drawTo(bx 11 * scale, by 20 * scale);lift(1);break;case 7:drawTo(bx 2 * scale, by 20 * scale);lift(0);drawTo(bx 12 * scale, by 20 * scale);drawTo(bx 2 * scale, by 0);lift(1);break;case 8:drawTo(bx 5 * scale, by 10 * scale);lift(0);bogenUZS(bx 5 * scale, by 15 * scale, 5 * scale, 4.7, -1.6, 1);bogenGZS(bx 5 * scale, by 5 * scale, 5 * scale, -4.7, 2, 1);lift(1);break;case 9:drawTo(bx 9 * scale, by 11 * scale);lift(0);bogenUZS(bx 7 * scale, by 15 * scale, 5 * scale, 4, -0.5, 1);drawTo(bx 5 * scale, by 0);lift(1);break;case 111:lift(0);drawTo(rubberx, rubbery);drawTo(58, 42);drawTo(58, 45);drawTo(2, 45);drawTo(2, 41);drawTo(58, 41);drawTo(60, 37);drawTo(2, 37);drawTo(2, 33);drawTo(60, 33);drawTo(60, 29);drawTo(2, 29);drawTo(2, 25);drawTo(60, 25);drawTo(60, 20);drawTo(2, 20);drawTo(60, rubbery);drawTo(rubberx 3 , rubbery);lift(2);break;case 11:drawTo(bx 5 * scale, by 15 * scale);lift(0);bogenGZS(bx 5 * scale, by 15 * scale, 0.1 * scale, 1, -1, 1);lift(1);drawTo(bx 5 * scale, by 5 * scale);lift(0);bogenGZS(bx 5 * scale, by 5 * scale, 0.1 * scale, 1, -1, 1);lift(1);break;}
}//抬函数不同的摆臂高度
void lift(char lift) {switch (lift) {// room to optimize !case 0: if (servoLift LIFT0) {while (servoLift LIFT0) {servoLift--;servo1.writeMicroseconds(servoLift); delayMicroseconds(LIFTSPEED);}} else {while (servoLift LIFT0) {servoLift;servo1.writeMicroseconds(servoLift);delayMicroseconds(LIFTSPEED);}}break;case 1: if (servoLift LIFT1) {while (servoLift LIFT1) {servoLift--;servo1.writeMicroseconds(servoLift);delayMicroseconds(LIFTSPEED);}} else {while (servoLift LIFT1) {servoLift;servo1.writeMicroseconds(servoLift);delayMicroseconds(LIFTSPEED);}}break;case 2:if (servoLift LIFT2) {while (servoLift LIFT2) {servoLift--;servo1.writeMicroseconds(servoLift);delayMicroseconds(LIFTSPEED);}} else {while (servoLift LIFT2) {servoLift;servo1.writeMicroseconds(servoLift); delayMicroseconds(LIFTSPEED);}}break;}
}//里面似乎有勾股定理
void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {float inkr -0.05;float count 0;do {drawTo(sqee * radius * cos(start count) bx,radius * sin(start count) by);count inkr;} while ((start count) ende);}//cossin
void bogenGZS(float bx, float by, float radius, int start, int ende, float sqee) {float inkr 0.05;float count 0;do {drawTo(sqee * radius * cos(start count) bx,radius * sin(start count) by);count inkr;} while ((start count) ende);
}void drawTo(double pX, double pY) {double dx, dy, c;int i;// dx dy of new pointdx pX - lastX;dy pY - lastY;//path lenght in mm, times 4 equals 4 steps per mmc floor(4 * sqrt(dx * dx dy * dy));if (c 1) c 1;for (i 0; i c; i) {// draw line point by pointset_XY(lastX (i * dx / c), lastY (i * dy / c));}lastX pX;lastY pY;
}double return_angle(double a, double b, double c) {// cosine rule for angle between c and areturn acos((a * a c * c - b * b) / (2 * a * c));
}//用各种三角函数把位置坐标换算成舵机的角度具体咋算的请参考
//Plotclock by joo - Thingiverse
//http://www.thingiverse.com/thing:248009/
void set_XY(double Tx, double Ty)
{delay(1);double dx, dy, c, a1, a2, Hx, Hy;// calculate triangle between pen, servoLeft and arm joint// cartesian dx/dydx Tx - O1X;dy Ty - O1Y;// polar lemgth (c) and angle (a1)c sqrt(dx * dx dy * dy); // a1 atan2(dy, dx); //a2 return_angle(L1, L2, c);servo2.writeMicroseconds(floor(((a2 a1 - M_PI) * SERVOFAKTORLEFT) SERVOLEFTNULL));// calculate joinr arm point for triangle of the right servo arma2 return_angle(L2, L1, c);Hx Tx L3 * cos((a1 - a2 0.621) M_PI); //36,5掳Hy Ty L3 * sin((a1 - a2 0.621) M_PI);// calculate triangle between pen joint, servoRight and arm jointdx Hx - O2X;dy Hy - O2Y;c sqrt(dx * dx dy * dy);a1 atan2(dy, dx);a2 return_angle(L1, (L2 - L3), c);servo3.writeMicroseconds(floor(((a1 - a2) * SERVOFAKTORRIGHT) SERVORIGHTNULL));}