极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18223|回复: 5

制作小贱钟

[复制链接]
发表于 2017-2-10 11:42:32 | 显示全部楼层 |阅读模式
本帖最后由 康宇哲 于 2017-2-11 21:21 编辑

用了商家提供的time库和ds3231库但编译不通过。我认为time库需要改动一下,本人还不具备修改库的能力,只会调用
  1. //淘宝『有名称的店铺』更新时间 20141126


  2. //↓↓↓↓↓↓↓  以下参数在调试程序中调节好后复制过来   ↓↓↓↓↓↓↓

  3. //1.先调节0、180度的位置。调节到位后,再调节90度位置
  4. //左右悬臂舵机的 0或180度位置,,数字增加,左侧舵机逆时针调整,右侧舵机顺时针调整
  5. //【此数值可能需要调节】
  6. #define SERVOLEFTNULL 2030  //数值减小,顺时针旋转,加大则逆时针旋转
  7. //【此数值可能需要调节】
  8. #define SERVORIGHTNULL 1100  //数值减小,顺时针旋转,加大则逆时针旋转

  9. //2.调节到位0、180,再调节下面参数
  10. //左右悬臂舵机的90度位置,,数字增加,左侧舵机顺时针调整,右侧舵机逆时针调整
  11. //【此数值可能需要调节】
  12. #define SERVOFAKTORLEFT 580 //数值加大,顺时针旋转,减小则逆时针旋转
  13. //【此数值可能需要调节】
  14. #define SERVOFAKTORRIGHT 610  //数值减小,顺时针旋转,加大则逆时针旋转


  15. //升举舵机的3个角度
  16. //【此数值可能需要调节】
  17. #define LIFT0 1220 //落笔写字 on drawing surface
  18. #define LIFT1 1320  //写字时抬臂动作 between numbers
  19. #define LIFT2 1580  //高抬笔架  going towards sweeper
  20. //【此数值可能需要调节】

  21. //
  22. //以上参数,请运行调试程序 plotclockadj ,调整好位置后,将数据复制过来
  23. //

  24. //笔擦的坐标位置,如不能对准笔擦可以微调单位毫米
  25. int  rubberx=72,rubbery=42;   //【此数值可能需要调节】

  26. //三只舵机的接口号
  27. #define SERVOPINLIFT  2 //抬臂舵机
  28. #define SERVOPINLEFT  3 //左臂舵机
  29. #define SERVOPINRIGHT 4 //右臂舵机

  30. // 速度  数字越小越慢,太快了容易抖 1000~2000
  31. #define LIFTSPEED 1500

  32. // 悬臂的长度,根据图纸测量,无需改变
  33. #define L1 35
  34. #define L2 57.2
  35. #define L3 14.2

  36. // 左右舵机轴心的位置,根据图纸测量,无需改变
  37. #define O1X 22
  38. #define O1Y -25
  39. #define O2X 47
  40. #define O2Y -25

  41. //需要的库函数
  42. #include <Servo.h>
  43. #include <DS3231.h>
  44. #include <Wire.h>

  45. //时钟模块,如果没有时钟模块,请用另一个程序
  46. DS3231 Clock;  
  47. bool h12;
  48. bool PM;



  49. int servoLift = LIFT2;

  50. Servo servo1;  //
  51. Servo servo2;  //
  52. Servo servo3;  //

  53. volatile double lastX = rubberx;
  54. volatile double lastY = rubbery;

  55. int last_min = 0;

  56. void setup()
  57. {
  58.   Wire.begin();
  59.   //第一次运行 请设置时间,设置成功后请删除此行代码,或者如下格式注释掉
  60.   Clock.setMinute(59);//设置分钟
  61.   Clock.setHour(11);  //设置小时
  62.   //Clock.setMinute(59);  
  63.   //Clock.setHour(11);
  64.   //第一次运行 请设置时间,设置成功后请删除此行代码
  65.    
  66.   servo1.attach(SERVOPINLIFT);  //初始化抬臂舵机  lifting servo
  67.   servo2.attach(SERVOPINLEFT);  //初始化左臂舵机  left servo
  68.   servo3.attach(SERVOPINRIGHT); //初始化右臂舵机  right servo
  69.   lift(1); //抬笔
  70.   drawTo(rubberx, rubbery); //停留在笔擦位置
  71.   delay(1000);

  72. }

  73. void loop()
  74. {
  75. int minute,hour;
  76. minute=Clock.getMinute();
  77. hour=Clock.getHour(h12, PM);//读取时间
  78.    
  79. int i = 0;
  80.   //下面代码任选一行,进行不同模式的书写
  81.   if (last_min != minute())  //每分钟书写一次时间
  82.   //if  (1)                  //反复不间断的擦写模式
  83.    
  84. //  if (1)  //如需修改请复制上面代码
  85.   {

  86.     if (!servo1.attached()) servo1.attach(SERVOPINLIFT);
  87.     if (!servo2.attached()) servo2.attach(SERVOPINLEFT);
  88.     if (!servo3.attached()) servo3.attach(SERVOPINRIGHT);

  89.     lift(0);

  90.      
  91.     while ((i+1)*10 <= hour)
  92.     {
  93.       i++;
  94.     }

  95.     number(3, 3, 111, 1);
  96.     number(5, 25, i, 0.9);
  97.     number(19, 25, (hour-i*10), 0.9);
  98.     number(28, 25, 11, 0.9);

  99.     i=0;
  100.     while ((i+1)*10 <= minute)
  101.     {
  102.       i++;
  103.     }
  104.     number(34, 25, i, 0.9);
  105.     number(48, 25, (minute-i*10), 0.9);
  106.     lift(2);
  107.     drawTo(rubberx, rubbery);
  108.     lift(1);
  109.     last_min = minute;

  110.     servo1.detach();
  111.     servo2.detach();
  112.     servo3.detach();
  113.   }


  114. }

  115. // Writing numeral with bx by being the bottom left originpoint. Scale 1 equals a 20 mm high font.
  116. // The structure follows this principle: move to first startpoint of the numeral, lift down, draw numeral, lift up
  117. //这里是写字的函数,如果你觉得字写的丑,可以自行修改字体,结果可能是更丑
  118. //还可以自行增加其他内容,比如字母甚至是汉字
  119. void number(float bx, float by, int num, float scale) {

  120.   switch (num) {

  121.   case 0:
  122.     drawTo(bx + 12 * scale, by + 6 * scale);
  123.     lift(0);
  124.     bogenGZS(bx + 7 * scale, by + 10 * scale, 10 * scale, -0.8, 6.7, 0.5);
  125.     lift(1);
  126.     break;
  127.   case 1:

  128.     drawTo(bx + 3 * scale, by + 15 * scale);
  129.     lift(0);
  130.     drawTo(bx + 10 * scale, by + 20 * scale);
  131.     drawTo(bx + 10 * scale, by + 0 * scale);
  132.     lift(1);
  133.     break;
  134.   case 2:
  135.     drawTo(bx + 2 * scale, by + 12 * scale);
  136.     lift(0);
  137.     bogenUZS(bx + 8 * scale, by + 14 * scale, 6 * scale, 3, -0.8, 1);
  138.     drawTo(bx + 1 * scale, by + 0 * scale);
  139.     drawTo(bx + 12 * scale, by + 0 * scale);
  140.     lift(1);
  141.     break;
  142.   case 3:
  143.     drawTo(bx + 2 * scale, by + 17 * scale);
  144.     lift(0);
  145.     bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 3, -2, 1);
  146.     bogenUZS(bx + 5 * scale, by + 5 * scale, 5 * scale, 1.57, -3, 1);
  147.     lift(1);
  148.     break;
  149.   case 4:
  150.     drawTo(bx + 10 * scale, by + 0 * scale);
  151.     lift(0);
  152.     drawTo(bx + 10 * scale, by + 20 * scale);
  153.     drawTo(bx + 2 * scale, by + 6 * scale);
  154.     drawTo(bx + 12 * scale, by + 6 * scale);
  155.     lift(1);
  156.     break;
  157.   case 5:
  158.     drawTo(bx + 2 * scale, by + 5 * scale);
  159.     lift(0);
  160.     bogenGZS(bx + 5 * scale, by + 6 * scale, 6 * scale, -2.5, 2, 1);
  161.     drawTo(bx + 5 * scale, by + 20 * scale);
  162.     drawTo(bx + 12 * scale, by + 20 * scale);
  163.     lift(1);
  164.     break;
  165.   case 6:
  166.     drawTo(bx + 2 * scale, by + 10 * scale);
  167.     lift(0);
  168.     bogenUZS(bx + 7 * scale, by + 6 * scale, 6 * scale, 2, -4.4, 1);
  169.     drawTo(bx + 11 * scale, by + 20 * scale);
  170.     lift(1);
  171.     break;
  172.   case 7:
  173.     drawTo(bx + 2 * scale, by + 20 * scale);
  174.     lift(0);
  175.     drawTo(bx + 12 * scale, by + 20 * scale);
  176.     drawTo(bx + 2 * scale, by + 0);
  177.     lift(1);
  178.     break;
  179.   case 8:
  180.     drawTo(bx + 5 * scale, by + 10 * scale);
  181.     lift(0);
  182.     bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 4.7, -1.6, 1);
  183.     bogenGZS(bx + 5 * scale, by + 5 * scale, 5 * scale, -4.7, 2, 1);
  184.     lift(1);
  185.     break;

  186.   case 9:
  187.     drawTo(bx + 9 * scale, by + 11 * scale);
  188.     lift(0);
  189.     bogenUZS(bx + 7 * scale, by + 15 * scale, 5 * scale, 4, -0.5, 1);
  190.     drawTo(bx + 5 * scale, by + 0);
  191.     lift(1);
  192.     break;

  193.   case 111:

  194.     lift(0);
  195.     drawTo(rubberx, rubbery);
  196.     drawTo(58, 42);

  197.     drawTo(58, 45);
  198.     drawTo(2, 45);
  199.     drawTo(2, 41);
  200.     drawTo(58, 41);
  201.     drawTo(60, 37);

  202.     drawTo(2, 37);
  203.     drawTo(2, 33);
  204.     drawTo(60, 33);
  205.     drawTo(60, 29);

  206.     drawTo(2, 29);
  207.     drawTo(2, 25);
  208.     drawTo(60, 25);
  209.     drawTo(60, 20);

  210.     drawTo(2, 20);
  211.     drawTo(60, rubbery);

  212.     drawTo(rubberx + 3 , rubbery);
  213.     lift(2);

  214.     break;

  215.   case 11:
  216.     drawTo(bx + 5 * scale, by + 15 * scale);
  217.     lift(0);
  218.     bogenGZS(bx + 5 * scale, by + 15 * scale, 0.1 * scale, 1, -1, 1);
  219.     lift(1);
  220.     drawTo(bx + 5 * scale, by + 5 * scale);
  221.     lift(0);
  222.     bogenGZS(bx + 5 * scale, by + 5 * scale, 0.1 * scale, 1, -1, 1);
  223.     lift(1);
  224.     break;

  225.   }
  226. }


  227. //抬臂函数,不同的摆臂高度
  228. void lift(char lift) {
  229.   switch (lift) {
  230.     // room to optimize  !

  231.   case 0: //850

  232.       if (servoLift >= LIFT0) {
  233.       while (servoLift >= LIFT0)
  234.       {
  235.         servoLift--;
  236.         servo1.writeMicroseconds(servoLift);               
  237.         delayMicroseconds(LIFTSPEED);
  238.       }
  239.     }
  240.     else {
  241.       while (servoLift <= LIFT0) {
  242.         servoLift++;
  243.         servo1.writeMicroseconds(servoLift);
  244.         delayMicroseconds(LIFTSPEED);

  245.       }

  246.     }

  247.     break;

  248.   case 1: //150

  249.     if (servoLift >= LIFT1) {
  250.       while (servoLift >= LIFT1) {
  251.         servoLift--;
  252.         servo1.writeMicroseconds(servoLift);
  253.         delayMicroseconds(LIFTSPEED);

  254.       }
  255.     }
  256.     else {
  257.       while (servoLift <= LIFT1) {
  258.         servoLift++;
  259.         servo1.writeMicroseconds(servoLift);
  260.         delayMicroseconds(LIFTSPEED);
  261.       }

  262.     }

  263.     break;

  264.   case 2:

  265.     if (servoLift >= LIFT2) {
  266.       while (servoLift >= LIFT2) {
  267.         servoLift--;
  268.         servo1.writeMicroseconds(servoLift);
  269.         delayMicroseconds(LIFTSPEED);
  270.       }
  271.     }
  272.     else {
  273.       while (servoLift <= LIFT2) {
  274.         servoLift++;
  275.         servo1.writeMicroseconds(servoLift);               
  276.         delayMicroseconds(LIFTSPEED);
  277.       }
  278.     }
  279.     break;
  280.   }
  281. }

  282. //里面似乎有勾股定理?
  283. void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {
  284.   float inkr = -0.05;
  285.   float count = 0;

  286.   do {
  287.     drawTo(sqee * radius * cos(start + count) + bx,
  288.     radius * sin(start + count) + by);
  289.     count += inkr;
  290.   }
  291.   while ((start + count) > ende);

  292. }

  293. //cos?sin?
  294. void bogenGZS(float bx, float by, float radius, int start, int ende, float sqee) {
  295.   float inkr = 0.05;
  296.   float count = 0;

  297.   do {
  298.     drawTo(sqee * radius * cos(start + count) + bx,
  299.     radius * sin(start + count) + by);
  300.     count += inkr;
  301.   }
  302.   while ((start + count) <= ende);
  303. }


  304. void drawTo(double pX, double pY) {
  305.   double dx, dy, c;
  306.   int i;

  307.   // dx dy of new point
  308.   dx = pX - lastX;
  309.   dy = pY - lastY;
  310.   //path lenght in mm, times 4 equals 4 steps per mm
  311.   c = floor(4 * sqrt(dx * dx + dy * dy));

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

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

  316.   }

  317.   lastX = pX;
  318.   lastY = pY;
  319. }

  320. double return_angle(double a, double b, double c) {
  321.   // cosine rule for angle between c and a
  322.   return acos((a * a + c * c - b * b) / (2 * a * c));
  323. }

  324. //用各种三角函数把位置坐标换算成舵机的角度,具体咋算的,请参考
  325. //Plotclock by joo - Thingiverse
  326. //http://www.thingiverse.com/thing:248009/
  327. void set_XY(double Tx, double Ty)
  328. {
  329.   delay(1);
  330.   double dx, dy, c, a1, a2, Hx, Hy;

  331.   // calculate triangle between pen, servoLeft and arm joint
  332.   // cartesian dx/dy
  333.   dx = Tx - O1X;
  334.   dy = Ty - O1Y;

  335.   // polar lemgth (c) and angle (a1)
  336.   c = sqrt(dx * dx + dy * dy); //
  337.   a1 = atan2(dy, dx); //
  338.   a2 = return_angle(L1, L2, c);

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

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

  344.   // calculate triangle between pen joint, servoRight and arm joint
  345.   dx = Hx - O2X;
  346.   dy = Hy - O2Y;

  347.   c = sqrt(dx * dx + dy * dy);
  348.   a1 = atan2(dy, dx);
  349.   a2 = return_angle(L1, (L2 - L3), c);

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

  351. }
复制代码

想让它一分钟写一次但编译错误




本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2017-2-10 14:09:38 | 显示全部楼层
你这程序是例程?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-10 14:36:05 | 显示全部楼层
董董soul 发表于 2017-2-10 14:09
你这程序是例程?

差不多///////////////////////////
回复 支持 反对

使用道具 举报

发表于 2017-2-10 20:47:41 | 显示全部楼层
康宇哲 发表于 2017-2-10 14:36
差不多///////////////////////////

你这是语法错误啊
你定义的是int minute,hour;
也就是说minute是一个int类型变量
然后你接下来写的是minute()这代表的是调用函数minute
这有冲突啊,你把minute后面的括号去了试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-11 09:35:27 | 显示全部楼层
zjz5717 发表于 2017-2-10 20:47
你这是语法错误啊
你定义的是int minute,hour;
也就是说minute是一个int类型变量

对,我发现了现在已解决
回复 支持 反对

使用道具 举报

发表于 2017-2-11 12:26:12 | 显示全部楼层
康宇哲 发表于 2017-2-11 09:35
对,我发现了现在已解决

好的,请将主题标记为已解决
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-30 00:04 , Processed in 0.051681 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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