极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 28702|回复: 14

Plotclock小贱钟的调试方法

[复制链接]
发表于 2014-6-5 23:52:28 | 显示全部楼层 |阅读模式
本帖最后由 shihaipeng04 于 2014-6-6 00:54 编辑

之前的代码因为误删了一段很重要的内容,所以调试起来非常困难,现在前面的推翻,重头来过。

  


警告:在没有调试完毕之前,请不要安装笔、笔擦和笔擦支架,以免摆臂和以上零件纠缠在一起,可能会损坏支架。

调试程序,运行调试程序,舵机会移动两只悬臂分别停留在一只水平另一只垂直的位置上。如果差距非常大,可拆下悬臂调节,如果比较接近了,就修改程序第3~6行的四个参数 SERVOFAKTORLEFT 左悬臂垂直位置,SERVOFAKTORRIGHT 右悬臂垂直位置,SERVOLEFTNULL 左悬臂180度位置,SERVORIGHTNULL 右悬臂0度位置(右侧为0度,逆时针画圆),参数增加摆臂逆时针转动,一般增幅50,才能看到比较明显的变化。


调节参数,直到摆臂停在下图的标准位置上为止。


LIFT0、1、2参数原理相同调试方法略过

《调试摆臂用代码》
  1. //左右悬臂舵机的90度位置
  2. #define SERVOFAKTORLEFT 550
  3. #define SERVOFAKTORRIGHT 630  //此参数650是理论中间位置,需要看实际情况调节

  4. //左右悬臂舵机的 0或180度位置
  5. #define SERVOLEFTNULL 1750
  6. #define SERVORIGHTNULL 880

  7. //三只舵机的接口
  8. #define SERVOPINLIFT  2
  9. #define SERVOPINLEFT  3
  10. #define SERVOPINRIGHT 4

  11. //升举舵机的3个角度
  12. #define LIFT0 1080 // on drawing surface
  13. #define LIFT1 925  // between numbers
  14. #define LIFT2 725  // going towards sweeper

  15. // 速度
  16. #define LIFTSPEED 1500

  17. // 悬臂的长度,根据图纸测量,无需改变
  18. #define L1 35
  19. #define L2 57.2
  20. #define L3 14.2


  21. // 左右舵机轴心的位置
  22. #define O1X 23
  23. #define O1Y -25
  24. #define O2X 49
  25. #define O2Y -25



  26. #include <Time.h> // see [url=http://playground.arduino.cc/Code/time]http://playground.arduino.cc/Code/time[/url]
  27. #include <Servo.h>

  28. int servoLift = 1500;

  29. Servo servo1;  //
  30. Servo servo2;  //
  31. Servo servo3;  //

  32. volatile double lastX = 75;
  33. volatile double lastY = 47.5;

  34. int last_min = 0;

  35. void setup()
  36. {
  37.   // Set current time only the first to values, hh,mm are needed
  38.   setTime(19,38,0,0,0,0);

  39.   drawTo(38, 23);
  40.   lift(0);
  41.   servo1.attach(SERVOPINLIFT);  //  lifting servo
  42.   servo2.attach(SERVOPINLEFT);  //  left servo
  43.   servo3.attach(SERVOPINRIGHT);  //  right servo
  44.   delay(1000);

  45. }

  46. void loop()
  47. {



  48.   // 移动左右悬臂,让两只悬臂分别停留在水平和垂直的位置上。 通过修改 SERVOFAKTORLEFT , SERVOFAKTORRIGHT, SERVOLEFTNULL , SERVORIGHTNULL 四个参数来微调
  49.   drawTo(-3, 29.2);
  50.   delay(500);
  51.   drawTo(74.1, 28);
  52.   delay(500);



  53. }

  54. // Writing numeral with bx by being the bottom left originpoint. Scale 1 equals a 20 mm high font.
  55. // The structure follows this principle: move to first startpoint of the numeral, lift down, draw numeral, lift up
  56. void number(float bx, float by, int num, float scale) {

  57.   switch (num) {

  58.   case 0:
  59.     drawTo(bx + 12 * scale, by + 6 * scale);
  60.     lift(0);
  61.     bogenGZS(bx + 7 * scale, by + 10 * scale, 10 * scale, -0.8, 6.7, 0.5);
  62.     lift(1);
  63.     break;
  64.   case 1:

  65.     drawTo(bx + 3 * scale, by + 15 * scale);
  66.     lift(0);
  67.     drawTo(bx + 10 * scale, by + 20 * scale);
  68.     drawTo(bx + 10 * scale, by + 0 * scale);
  69.     lift(1);
  70.     break;
  71.   case 2:
  72.     drawTo(bx + 2 * scale, by + 12 * scale);
  73.     lift(0);
  74.     bogenUZS(bx + 8 * scale, by + 14 * scale, 6 * scale, 3, -0.8, 1);
  75.     drawTo(bx + 1 * scale, by + 0 * scale);
  76.     drawTo(bx + 12 * scale, by + 0 * scale);
  77.     lift(1);
  78.     break;
  79.   case 3:
  80.     drawTo(bx + 2 * scale, by + 17 * scale);
  81.     lift(0);
  82.     bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 3, -2, 1);
  83.     bogenUZS(bx + 5 * scale, by + 5 * scale, 5 * scale, 1.57, -3, 1);
  84.     lift(1);
  85.     break;
  86.   case 4:
  87.     drawTo(bx + 10 * scale, by + 0 * scale);
  88.     lift(0);
  89.     drawTo(bx + 10 * scale, by + 20 * scale);
  90.     drawTo(bx + 2 * scale, by + 6 * scale);
  91.     drawTo(bx + 12 * scale, by + 6 * scale);
  92.     lift(1);
  93.     break;
  94.   case 5:
  95.     drawTo(bx + 2 * scale, by + 5 * scale);
  96.     lift(0);
  97.     bogenGZS(bx + 5 * scale, by + 6 * scale, 6 * scale, -2.5, 2, 1);
  98.     drawTo(bx + 5 * scale, by + 20 * scale);
  99.     drawTo(bx + 12 * scale, by + 20 * scale);
  100.     lift(1);
  101.     break;
  102.   case 6:
  103.     drawTo(bx + 2 * scale, by + 10 * scale);
  104.     lift(0);
  105.     bogenUZS(bx + 7 * scale, by + 6 * scale, 6 * scale, 2, -4.4, 1);
  106.     drawTo(bx + 11 * scale, by + 20 * scale);
  107.     lift(1);
  108.     break;
  109.   case 7:
  110.     drawTo(bx + 2 * scale, by + 20 * scale);
  111.     lift(0);
  112.     drawTo(bx + 12 * scale, by + 20 * scale);
  113.     drawTo(bx + 2 * scale, by + 0);
  114.     lift(1);
  115.     break;
  116.   case 8:
  117.     drawTo(bx + 5 * scale, by + 10 * scale);
  118.     lift(0);
  119.     bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 4.7, -1.6, 1);
  120.     bogenGZS(bx + 5 * scale, by + 5 * scale, 5 * scale, -4.7, 2, 1);
  121.     lift(1);
  122.     break;

  123.   case 9:
  124.     drawTo(bx + 9 * scale, by + 11 * scale);
  125.     lift(0);
  126.     bogenUZS(bx + 7 * scale, by + 15 * scale, 5 * scale, 4, -0.5, 1);
  127.     drawTo(bx + 5 * scale, by + 0);
  128.     lift(1);
  129.     break;

  130.   case 111:

  131.     lift(0);
  132.     drawTo(70, 46);
  133.     drawTo(65, 43);

  134.     drawTo(65, 49);
  135.     drawTo(5, 49);
  136.     drawTo(5, 45);
  137.     drawTo(65, 45);
  138.     drawTo(65, 40);

  139.     drawTo(5, 40);
  140.     drawTo(5, 35);
  141.     drawTo(65, 35);
  142.     drawTo(65, 30);

  143.     drawTo(5, 30);
  144.     drawTo(5, 25);
  145.     drawTo(65, 25);
  146.     drawTo(65, 20);

  147.     drawTo(5, 20);
  148.     drawTo(60, 44);

  149.     drawTo(75.2, 47);
  150.     lift(2);

  151.     break;

  152.   case 11:
  153.     drawTo(bx + 5 * scale, by + 15 * scale);
  154.     lift(0);
  155.     bogenGZS(bx + 5 * scale, by + 15 * scale, 0.1 * scale, 1, -1, 1);
  156.     lift(1);
  157.     drawTo(bx + 5 * scale, by + 5 * scale);
  158.     lift(0);
  159.     bogenGZS(bx + 5 * scale, by + 5 * scale, 0.1 * scale, 1, -1, 1);
  160.     lift(1);
  161.     break;

  162.   }
  163. }



  164. void lift(char lift) {
  165.   switch (lift) {
  166.     // room to optimize  !

  167.   case 0: //850

  168.       if (servoLift >= LIFT0) {
  169.       while (servoLift >= LIFT0)
  170.       {
  171.         servoLift--;
  172.         servo1.writeMicroseconds(servoLift);                                
  173.         delayMicroseconds(LIFTSPEED);
  174.       }
  175.     }
  176.     else {
  177.       while (servoLift <= LIFT0) {
  178.         servoLift++;
  179.         servo1.writeMicroseconds(servoLift);
  180.         delayMicroseconds(LIFTSPEED);

  181.       }

  182.     }

  183.     break;

  184.   case 1: //150

  185.     if (servoLift >= LIFT1) {
  186.       while (servoLift >= LIFT1) {
  187.         servoLift--;
  188.         servo1.writeMicroseconds(servoLift);
  189.         delayMicroseconds(LIFTSPEED);

  190.       }
  191.     }
  192.     else {
  193.       while (servoLift <= LIFT1) {
  194.         servoLift++;
  195.         servo1.writeMicroseconds(servoLift);
  196.         delayMicroseconds(LIFTSPEED);
  197.       }

  198.     }

  199.     break;

  200.   case 2:

  201.     if (servoLift >= LIFT2) {
  202.       while (servoLift >= LIFT2) {
  203.         servoLift--;
  204.         servo1.writeMicroseconds(servoLift);
  205.         delayMicroseconds(LIFTSPEED);
  206.       }
  207.     }
  208.     else {
  209.       while (servoLift <= LIFT2) {
  210.         servoLift++;
  211.         servo1.writeMicroseconds(servoLift);                                
  212.         delayMicroseconds(LIFTSPEED);
  213.       }
  214.     }
  215.     break;
  216.   }
  217. }


  218. void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {
  219.   float inkr = -0.05;
  220.   float count = 0;

  221.   do {
  222.     drawTo(sqee * radius * cos(start + count) + bx,
  223.     radius * sin(start + count) + by);
  224.     count += inkr;
  225.   }
  226.   while ((start + count) > ende);

  227. }

  228. void bogenGZS(float bx, float by, float radius, int start, int ende, float sqee) {
  229.   float inkr = 0.05;
  230.   float count = 0;

  231.   do {
  232.     drawTo(sqee * radius * cos(start + count) + bx,
  233.     radius * sin(start + count) + by);
  234.     count += inkr;
  235.   }
  236.   while ((start + count) <= ende);
  237. }


  238. void drawTo(double pX, double pY) {
  239.   double dx, dy, c;
  240.   int i;

  241.   // dx dy of new point
  242.   dx = pX - lastX;
  243.   dy = pY - lastY;
  244.   //path lenght in mm, times 4 equals 4 steps per mm
  245.   c = floor(4 * sqrt(dx * dx + dy * dy));

  246.   if (c < 1) c = 1;

  247.   for (i = 0; i <= c; i++) {
  248.     // draw line point by point
  249.     set_XY(lastX + (i * dx / c), lastY + (i * dy / c));

  250.   }

  251.   lastX = pX;
  252.   lastY = pY;
  253. }

  254. double return_angle(double a, double b, double c) {
  255.   // cosine rule for angle between c and a
  256.   return acos((a * a + c * c - b * b) / (2 * a * c));
  257. }

  258. void set_XY(double Tx, double Ty)
  259. {
  260.   delay(1);
  261.   double dx, dy, c, a1, a2, Hx, Hy;

  262.   // calculate triangle between pen, servoLeft and arm joint
  263.   // cartesian dx/dy
  264.   dx = Tx - O1X;
  265.   dy = Ty - O1Y;

  266.   // polar lemgth (c) and angle (a1)
  267.   c = sqrt(dx * dx + dy * dy); //
  268.   a1 = atan2(dy, dx); //
  269.   a2 = return_angle(L1, L2, c);

  270.     servo2.writeMicroseconds(floor(((a2 + a1 - M_PI) * SERVOFAKTORLEFT) + SERVOLEFTNULL));

  271.   // calculate joinr arm point for triangle of the right servo arm
  272.   a2 = return_angle(L2, L1, c);
  273.   Hx = Tx + L3 * cos((a1 - a2 + 0.621) + M_PI); //36,5掳
  274.   Hy = Ty + L3 * sin((a1 - a2 + 0.621) + M_PI);

  275.   // calculate triangle between pen joint, servoRight and arm joint
  276.   dx = Hx - O2X;
  277.   dy = Hy - O2Y;

  278.   c = sqrt(dx * dx + dy * dy);
  279.   a1 = atan2(dy, dx);
  280.   a2 = return_angle(L1, (L2 - L3), c);

  281.    servo3.writeMicroseconds(floor(((a1 - a2) * SERVOFAKTORRIGHT) + SERVORIGHTNULL));

  282. }
复制代码



如果调试完毕,就可以安装笔擦等附件,开始耍贱了!

标准程序需要时间模块读取时间,如果没有模块,可以修改函数,返回随机数或者从00:00开始计时等办法。

《Plotclock小贱钟程序》
  1. //左右悬臂舵机的90度位置
  2. #define SERVOFAKTORLEFT 550
  3. #define SERVOFAKTORRIGHT 630

  4. //左右悬臂舵机的 0或180度位置
  5. #define SERVOLEFTNULL 1750
  6. #define SERVORIGHTNULL 880

  7. //三只舵机的接口
  8. #define SERVOPINLIFT  2
  9. #define SERVOPINLEFT  3
  10. #define SERVOPINRIGHT 4

  11. //升举舵机的3个角度
  12. #define LIFT0 1080 // on drawing surface
  13. #define LIFT1 925  // between numbers
  14. #define LIFT2 725  // going towards sweeper

  15. // 速度
  16. #define LIFTSPEED 1500

  17. // 悬臂的长度,根据图纸测量,无需改变
  18. #define L1 35
  19. #define L2 57.2
  20. #define L3 14.2


  21. // 左右舵机轴心的位置
  22. #define O1X 23
  23. #define O1Y -25
  24. #define O2X 49
  25. #define O2Y -25



  26. #include <Time.h> // see [url=http://playground.arduino.cc/Code/time]http://playground.arduino.cc/Code/time[/url]
  27. #include <Servo.h>

  28. int servoLift = 1500;

  29. Servo servo1;  //
  30. Servo servo2;  //
  31. Servo servo3;  //

  32. volatile double lastX = 75;
  33. volatile double lastY = 47.5;

  34. int last_min = 0;

  35. void setup()
  36. {
  37.   // Set current time only the first to values, hh,mm are needed
  38.   setTime(19,38,0,0,0,0);
  39.   lift(2);
  40.   drawTo(75.2, 47);

  41.   servo1.attach(SERVOPINLIFT);  //  lifting servo
  42.   servo2.attach(SERVOPINLEFT);  //  left servo
  43.   servo3.attach(SERVOPINRIGHT);  //  right servo
  44.   delay(1000);

  45. }

  46. void loop()
  47. {

  48. int i = 0;
  49.   if (last_min != minute())  //标准程序是每分钟书写一次,如果你着急可以改成       if  (1 ||  last_min != minute())  //这样它就会不停的书写。
  50.   {

  51.     if (!servo1.attached()) servo1.attach(SERVOPINLIFT);
  52.     if (!servo2.attached()) servo2.attach(SERVOPINLEFT);
  53.     if (!servo3.attached()) servo3.attach(SERVOPINRIGHT);

  54.     lift(0);

  55.     hour();
  56.     while ((i+1)*10 <= hour())
  57.     {
  58.       i++;
  59.     }

  60.     number(3, 3, 111, 1);
  61.     number(5, 25, i, 0.9);
  62.     number(19, 25, (hour()-i*10), 0.9);
  63.     number(28, 25, 11, 0.9);

  64.     i=0;
  65.     while ((i+1)*10 <= minute())
  66.     {
  67.       i++;
  68.     }
  69.     number(34, 25, i, 0.9);
  70.     number(48, 25, (minute()-i*10), 0.9);
  71.     lift(2);
  72.     drawTo(74.2, 47.5);
  73.     lift(1);
  74.     last_min = minute();

  75.     servo1.detach();
  76.     servo2.detach();
  77.     servo3.detach();
  78.   }


  79. }

  80. // Writing numeral with bx by being the bottom left originpoint. Scale 1 equals a 20 mm high font.
  81. // The structure follows this principle: move to first startpoint of the numeral, lift down, draw numeral, lift up
  82. void number(float bx, float by, int num, float scale) {

  83.   switch (num) {

  84.   case 0:
  85.     drawTo(bx + 12 * scale, by + 6 * scale);
  86.     lift(0);
  87.     bogenGZS(bx + 7 * scale, by + 10 * scale, 10 * scale, -0.8, 6.7, 0.5);
  88.     lift(1);
  89.     break;
  90.   case 1:

  91.     drawTo(bx + 3 * scale, by + 15 * scale);
  92.     lift(0);
  93.     drawTo(bx + 10 * scale, by + 20 * scale);
  94.     drawTo(bx + 10 * scale, by + 0 * scale);
  95.     lift(1);
  96.     break;
  97.   case 2:
  98.     drawTo(bx + 2 * scale, by + 12 * scale);
  99.     lift(0);
  100.     bogenUZS(bx + 8 * scale, by + 14 * scale, 6 * scale, 3, -0.8, 1);
  101.     drawTo(bx + 1 * scale, by + 0 * scale);
  102.     drawTo(bx + 12 * scale, by + 0 * scale);
  103.     lift(1);
  104.     break;
  105.   case 3:
  106.     drawTo(bx + 2 * scale, by + 17 * scale);
  107.     lift(0);
  108.     bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 3, -2, 1);
  109.     bogenUZS(bx + 5 * scale, by + 5 * scale, 5 * scale, 1.57, -3, 1);
  110.     lift(1);
  111.     break;
  112.   case 4:
  113.     drawTo(bx + 10 * scale, by + 0 * scale);
  114.     lift(0);
  115.     drawTo(bx + 10 * scale, by + 20 * scale);
  116.     drawTo(bx + 2 * scale, by + 6 * scale);
  117.     drawTo(bx + 12 * scale, by + 6 * scale);
  118.     lift(1);
  119.     break;
  120.   case 5:
  121.     drawTo(bx + 2 * scale, by + 5 * scale);
  122.     lift(0);
  123.     bogenGZS(bx + 5 * scale, by + 6 * scale, 6 * scale, -2.5, 2, 1);
  124.     drawTo(bx + 5 * scale, by + 20 * scale);
  125.     drawTo(bx + 12 * scale, by + 20 * scale);
  126.     lift(1);
  127.     break;
  128.   case 6:
  129.     drawTo(bx + 2 * scale, by + 10 * scale);
  130.     lift(0);
  131.     bogenUZS(bx + 7 * scale, by + 6 * scale, 6 * scale, 2, -4.4, 1);
  132.     drawTo(bx + 11 * scale, by + 20 * scale);
  133.     lift(1);
  134.     break;
  135.   case 7:
  136.     drawTo(bx + 2 * scale, by + 20 * scale);
  137.     lift(0);
  138.     drawTo(bx + 12 * scale, by + 20 * scale);
  139.     drawTo(bx + 2 * scale, by + 0);
  140.     lift(1);
  141.     break;
  142.   case 8:
  143.     drawTo(bx + 5 * scale, by + 10 * scale);
  144.     lift(0);
  145.     bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 4.7, -1.6, 1);
  146.     bogenGZS(bx + 5 * scale, by + 5 * scale, 5 * scale, -4.7, 2, 1);
  147.     lift(1);
  148.     break;

  149.   case 9:
  150.     drawTo(bx + 9 * scale, by + 11 * scale);
  151.     lift(0);
  152.     bogenUZS(bx + 7 * scale, by + 15 * scale, 5 * scale, 4, -0.5, 1);
  153.     drawTo(bx + 5 * scale, by + 0);
  154.     lift(1);
  155.     break;

  156.   case 111:

  157.     lift(0);
  158.     drawTo(70, 46);
  159.     drawTo(65, 43);

  160.     drawTo(65, 49);
  161.     drawTo(5, 49);
  162.     drawTo(5, 45);
  163.     drawTo(65, 45);
  164.     drawTo(65, 40);

  165.     drawTo(5, 40);
  166.     drawTo(5, 35);
  167.     drawTo(65, 35);
  168.     drawTo(65, 30);

  169.     drawTo(5, 30);
  170.     drawTo(5, 25);
  171.     drawTo(65, 25);
  172.     drawTo(65, 20);

  173.     drawTo(5, 20);
  174.     drawTo(60, 44);

  175.     drawTo(75.2, 47);
  176.     lift(2);

  177.     break;

  178.   case 11:
  179.     drawTo(bx + 5 * scale, by + 15 * scale);
  180.     lift(0);
  181.     bogenGZS(bx + 5 * scale, by + 15 * scale, 0.1 * scale, 1, -1, 1);
  182.     lift(1);
  183.     drawTo(bx + 5 * scale, by + 5 * scale);
  184.     lift(0);
  185.     bogenGZS(bx + 5 * scale, by + 5 * scale, 0.1 * scale, 1, -1, 1);
  186.     lift(1);
  187.     break;

  188.   }
  189. }



  190. void lift(char lift) {
  191.   switch (lift) {
  192.     // room to optimize  !

  193.   case 0: //850

  194.       if (servoLift >= LIFT0) {
  195.       while (servoLift >= LIFT0)
  196.       {
  197.         servoLift--;
  198.         servo1.writeMicroseconds(servoLift);                                
  199.         delayMicroseconds(LIFTSPEED);
  200.       }
  201.     }
  202.     else {
  203.       while (servoLift <= LIFT0) {
  204.         servoLift++;
  205.         servo1.writeMicroseconds(servoLift);
  206.         delayMicroseconds(LIFTSPEED);

  207.       }

  208.     }

  209.     break;

  210.   case 1: //150

  211.     if (servoLift >= LIFT1) {
  212.       while (servoLift >= LIFT1) {
  213.         servoLift--;
  214.         servo1.writeMicroseconds(servoLift);
  215.         delayMicroseconds(LIFTSPEED);

  216.       }
  217.     }
  218.     else {
  219.       while (servoLift <= LIFT1) {
  220.         servoLift++;
  221.         servo1.writeMicroseconds(servoLift);
  222.         delayMicroseconds(LIFTSPEED);
  223.       }

  224.     }

  225.     break;

  226.   case 2:

  227.     if (servoLift >= LIFT2) {
  228.       while (servoLift >= LIFT2) {
  229.         servoLift--;
  230.         servo1.writeMicroseconds(servoLift);
  231.         delayMicroseconds(LIFTSPEED);
  232.       }
  233.     }
  234.     else {
  235.       while (servoLift <= LIFT2) {
  236.         servoLift++;
  237.         servo1.writeMicroseconds(servoLift);                                
  238.         delayMicroseconds(LIFTSPEED);
  239.       }
  240.     }
  241.     break;
  242.   }
  243. }


  244. void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {
  245.   float inkr = -0.05;
  246.   float count = 0;

  247.   do {
  248.     drawTo(sqee * radius * cos(start + count) + bx,
  249.     radius * sin(start + count) + by);
  250.     count += inkr;
  251.   }
  252.   while ((start + count) > ende);

  253. }

  254. void bogenGZS(float bx, float by, float radius, int start, int ende, float sqee) {
  255.   float inkr = 0.05;
  256.   float count = 0;

  257.   do {
  258.     drawTo(sqee * radius * cos(start + count) + bx,
  259.     radius * sin(start + count) + by);
  260.     count += inkr;
  261.   }
  262.   while ((start + count) <= ende);
  263. }


  264. void drawTo(double pX, double pY) {
  265.   double dx, dy, c;
  266.   int i;

  267.   // dx dy of new point
  268.   dx = pX - lastX;
  269.   dy = pY - lastY;
  270.   //path lenght in mm, times 4 equals 4 steps per mm
  271.   c = floor(4 * sqrt(dx * dx + dy * dy));

  272.   if (c < 1) c = 1;

  273.   for (i = 0; i <= c; i++) {
  274.     // draw line point by point
  275.     set_XY(lastX + (i * dx / c), lastY + (i * dy / c));

  276.   }

  277.   lastX = pX;
  278.   lastY = pY;
  279. }

  280. double return_angle(double a, double b, double c) {
  281.   // cosine rule for angle between c and a
  282.   return acos((a * a + c * c - b * b) / (2 * a * c));
  283. }

  284. void set_XY(double Tx, double Ty)
  285. {
  286.   delay(1);
  287.   double dx, dy, c, a1, a2, Hx, Hy;

  288.   // calculate triangle between pen, servoLeft and arm joint
  289.   // cartesian dx/dy
  290.   dx = Tx - O1X;
  291.   dy = Ty - O1Y;

  292.   // polar lemgth (c) and angle (a1)
  293.   c = sqrt(dx * dx + dy * dy); //
  294.   a1 = atan2(dy, dx); //
  295.   a2 = return_angle(L1, L2, c);

  296.     servo2.writeMicroseconds(floor(((a2 + a1 - M_PI) * SERVOFAKTORLEFT) + SERVOLEFTNULL));

  297.   // calculate joinr arm point for triangle of the right servo arm
  298.   a2 = return_angle(L2, L1, c);
  299.   Hx = Tx + L3 * cos((a1 - a2 + 0.621) + M_PI); //36,5掳
  300.   Hy = Ty + L3 * sin((a1 - a2 + 0.621) + M_PI);

  301.   // calculate triangle between pen joint, servoRight and arm joint
  302.   dx = Hx - O2X;
  303.   dy = Hy - O2Y;

  304.   c = sqrt(dx * dx + dy * dy);
  305.   a1 = atan2(dy, dx);
  306.   a2 = return_angle(L1, (L2 - L3), c);

  307.    servo3.writeMicroseconds(floor(((a1 - a2) * SERVOFAKTORRIGHT) + SERVORIGHTNULL));

  308. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-6-6 10:41:45 | 显示全部楼层
请问一下,这个架构能不能完美的画出一个圆?
回复 支持 反对

使用道具 举报

发表于 2014-6-6 13:28:01 | 显示全部楼层
我只是问这样的臂的结构和相应的程序能否实现?至于电机么,要是需要可以换更好的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-8 00:28:35 | 显示全部楼层
哇哈哈 发表于 2014-6-6 13:28
我只是问这样的臂的结构和相应的程序能否实现?至于电机么,要是需要可以换更好的

当然是可以换
回复 支持 反对

使用道具 举报

发表于 2014-6-9 09:57:04 | 显示全部楼层
shihaipeng04 发表于 2014-6-8 00:28
当然是可以换

如果我想用这个结构画标准的圆,是否可以做到,是不是要改程序?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-9 10:44:57 | 显示全部楼层
哇哈哈 发表于 2014-6-9 09:57
如果我想用这个结构画标准的圆,是否可以做到,是不是要改程序?

哈哈,简单啊。用drawto函数就行了。

绘图板中心位置大约是 (35,25)然后就围着点算一下呗。
int r =10;//圆半径
for(int s=0;s<360;s++)
{
x = sin(s)*r+35;
y = cos(s)*r+25;
drawTo(x,y);
}
这可是计算机从娃娃抓起的童子功啊。不会都忘了吧?
回复 支持 反对

使用道具 举报

发表于 2014-6-9 11:56:26 | 显示全部楼层
谢谢,那这个结构的运动范围是怎么样的呢?是不是在臂的长度范围内的点都能接触到呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-9 13:24:16 | 显示全部楼层
哇哈哈 发表于 2014-6-9 11:56
谢谢,那这个结构的运动范围是怎么样的呢?是不是在臂的长度范围内的点都能接触到呢?

理论上比面板的要大一些。。但是一些边角的位置摆臂会打架,如果掰过劲了可能会折掉。
回复 支持 反对

使用道具 举报

发表于 2014-6-9 13:48:50 | 显示全部楼层
shihaipeng04 发表于 2014-6-9 13:24
理论上比面板的要大一些。。但是一些边角的位置摆臂会打架,如果掰过劲了可能会折掉。

我看到楼主有卖这个套件的,想问一下,此套件的安装好后,其水平度如何?因为我需要将笔换成其他头子,在水平面上画一个标准的圆。还有就是是否可以依照此结构比例放大结构,以画更大的圆。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-9 16:10:03 | 显示全部楼层
哇哈哈 发表于 2014-6-9 13:48
我看到楼主有卖这个套件的,想问一下,此套件的安装好后,其水平度如何?因为我需要将笔换成其他头子,在 ...

抬臂舵机也是有参数精确调节的。不过这个东西是转轴的精度影响整体的精度。放大缩小分辨率也都一样。类似矢量图形。

而且理论上说,越是放大精度越差
回复 支持 反对

使用道具 举报

发表于 2014-6-19 13:52:04 | 显示全部楼层
字没有演示写的那么圆,应该调整哪些参数?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-19 14:42:36 | 显示全部楼层
夏哲腾 发表于 2014-6-19 13:52
字没有演示写的那么圆,应该调整哪些参数?

Plotclock小贱钟正式完工公开图纸 - Powered by Discuz!
http://www.geek-workshop.com/thread-10097-1-1.html

第2段视频,从10分钟开始看,有如何调教的说明。呵呵
回复 支持 反对

使用道具 举报

发表于 2014-7-25 19:21:36 | 显示全部楼层
你好,问一下程序当中bogenUZS,bogenGZS代表什么意思?
回复 支持 反对

使用道具 举报

发表于 2014-7-29 09:40:36 | 显示全部楼层

请问为什么我编译后会报错呢?time也装好了
Build options changed, rebuilding all
In file included from /Users/apple/Documents/Arduino/libraries/Time/DateStrings.cpp:11:0:
/Users/apple/Documents/Arduino/libraries/Time/DateStrings.cpp:41:22: error: variable 'monthNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
PGM_P monthNames_P[] PROGMEM =
                      ^
/Users/apple/Documents/Arduino/libraries/Time/DateStrings.cpp:58:20: error: variable 'dayNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
PGM_P dayNames_P[] PROGMEM = { dayStr0,dayStr1,dayStr2,dayStr3,dayStr4,dayStr5,dayStr6,dayStr7};
                    ^
/Users/apple/Documents/Arduino/libraries/Time/DateStrings.cpp:59:24: error: variable 'dayShortNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayShortNames_P[] PROGMEM = "ErrSunMonTueWedThrFriSat";
                        ^
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-29 14:12:54 | 显示全部楼层
innerrain 发表于 2014-7-29 09:40
请问为什么我编译后会报错呢?time也装好了
Build options changed, rebuilding all
In file included  ...

有点晕。似乎不像是程序的错误呢? 我也不太清楚是啥意思。 要不你发个帖子问问高人
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 10:31 , Processed in 0.045887 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表