极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32999|回复: 18

小贱钟做好了

[复制链接]
发表于 2014-5-15 00:28:46 | 显示全部楼层 |阅读模式
架子撘起来了,但是手头只有2个舵机,没办法看到全貌。很是郁闷。分开测试,到是运行的挺流畅。


来个全家福


这个小孔改造的非常棒,和舵机可以实现无螺丝固定,而且配合很完美。


但愿舵机的轴都是这样。


组装很简单


摆拍一个。。那是马克笔,不是白板笔,如果写上了,就再也擦不掉了


少一个舵机,真是挠头


挥舞起来吧


用手持方式写了一个


猜了半天,才看明白,它写的是 00:02,那个零好圆哦

机架结构似乎还是不太合理,还有修改的余地。过几天弄个完美版的,淘宝开个店卖卖20¥一套预定送螺丝哦!


程序奉上,需要时间模块一个,我是用的DS3231,如果是其他时间模块,。H文件需要改一下。字模文件都是程序里写好的路径,如果感觉它的字实在太难看了,可以自己修改。呵呵


  1. #define CALIBRATION      // enable calibration mode
  2. //#define REALTIMECLOCK    // enable real time clock

  3. // When in calibration mode, adjust the following factor until the servos move exactly 90 degrees
  4. #define SERVOFAKTORLEFT 650
  5. #define SERVOFAKTORRIGHT 650

  6. // Zero-position of left and right servo
  7. // When in calibration mode, adjust the NULL-values so that the servo arms are at all times parallel
  8. // either to the X or Y axis
  9. #define SERVOLEFTNULL 2250
  10. #define SERVORIGHTNULL 920

  11. #define SERVOPINLIFT  2
  12. #define SERVOPINLEFT  3
  13. #define SERVOPINRIGHT 4

  14. // lift positions of lifting servo
  15. #define LIFT0 1080 // on drawing surface
  16. #define LIFT1 925  // between numbers
  17. #define LIFT2 725  // going towards sweeper

  18. // speed of liftimg arm, higher is slower
  19. #define LIFTSPEED 1500

  20. // length of arms
  21. #define L1 35
  22. #define L2 55.1
  23. #define L3 13.2

  24. // origin points of left and right servo
  25. #define O1X 22
  26. #define O1Y -25
  27. #define O2X 47
  28. #define O2Y -25

  29. #include <Time.h>
  30. #include <Servo.h>
  31. #include <Wire.h>
  32. #include <DS3231.h>   


  33. int servoLift = 1500;

  34. Servo servo1;  //
  35. Servo servo2;  //
  36. Servo servo3;  //

  37. volatile double lastX = 75;
  38. volatile double lastY = 47.5;

  39. int last_min = 0;

  40. void setup()
  41. {

  42.   Serial.begin(9600);
  43.   Wire.begin();
  44.   
  45.   drawTo(75.2, 47);
  46.   lift(0);
  47.   servo1.attach(SERVOPINLIFT);  //  lifting servo
  48.   servo2.attach(SERVOPINLEFT);  //  left servo
  49.   servo3.attach(SERVOPINRIGHT);  //  right servo
  50.   delay(1000);

  51. }

  52. void loop()
  53. {

  54.   int i = 0;
  55.   if (last_min != minute()) {

  56.     if (!servo1.attached()) servo1.attach(SERVOPINLIFT);
  57.     if (!servo2.attached()) servo2.attach(SERVOPINLEFT);
  58.     if (!servo3.attached()) servo3.attach(SERVOPINRIGHT);

  59.     lift(0);

  60.     hour();
  61.     while ((i+1)*10 <= hour())
  62.     {
  63.       i++;
  64.     }

  65.     number(3, 3, 111, 1);
  66.     number(5, 25, i, 0.9);
  67.     number(19, 25, (hour()-i*10), 0.9);
  68.     number(28, 25, 11, 0.9);

  69.     i=0;
  70.     while ((i+1)*10 <= minute())
  71.     {
  72.       i++;
  73.     }
  74.     number(34, 25, i, 0.9);
  75.     number(48, 25, (minute()-i*10), 0.9);
  76.     lift(2);
  77.     drawTo(74.2, 47.5);
  78.     lift(1);
  79.     last_min = minute();

  80.     servo1.detach();
  81.     servo2.detach();
  82.     servo3.detach();
  83.   }



  84. }

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

  88.   switch (num) {

  89.   case 0:
  90.     drawTo(bx + 12 * scale, by + 6 * scale);
  91.     lift(0);
  92.     bogenGZS(bx + 7 * scale, by + 10 * scale, 10 * scale, -0.8, 6.7, 0.5);
  93.     lift(1);
  94.     break;
  95.   case 1:

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

  154.   case 9:
  155.     drawTo(bx + 9 * scale, by + 11 * scale);
  156.     lift(0);
  157.     bogenUZS(bx + 7 * scale, by + 15 * scale, 5 * scale, 4, -0.5, 1);
  158.     drawTo(bx + 5 * scale, by + 0);
  159.     lift(1);
  160.     break;

  161.   case 111:

  162.     lift(0);
  163.     drawTo(70, 46);
  164.     drawTo(65, 43);

  165.     drawTo(65, 49);
  166.     drawTo(5, 49);
  167.     drawTo(5, 45);
  168.     drawTo(65, 45);
  169.     drawTo(65, 40);

  170.     drawTo(5, 40);
  171.     drawTo(5, 35);
  172.     drawTo(65, 35);
  173.     drawTo(65, 30);

  174.     drawTo(5, 30);
  175.     drawTo(5, 25);
  176.     drawTo(65, 25);
  177.     drawTo(65, 20);

  178.     drawTo(5, 20);
  179.     drawTo(60, 44);

  180.     drawTo(75.2, 47);
  181.     lift(2);

  182.     break;

  183.   case 11:
  184.     drawTo(bx + 5 * scale, by + 15 * scale);
  185.     lift(0);
  186.     bogenGZS(bx + 5 * scale, by + 15 * scale, 0.1 * scale, 1, -1, 1);
  187.     lift(1);
  188.     drawTo(bx + 5 * scale, by + 5 * scale);
  189.     lift(0);
  190.     bogenGZS(bx + 5 * scale, by + 5 * scale, 0.1 * scale, 1, -1, 1);
  191.     lift(1);
  192.     break;

  193.   }
  194. }



  195. void lift(char lift) {
  196.   

  197.   switch (lift) {
  198.     // room to optimize  !

  199.   
  200.   case 0: //850

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

  214.       }

  215.     }

  216.     break;

  217.   case 1: //150

  218.     if (servoLift >= LIFT1) {
  219.       while (servoLift >= LIFT1) {
  220.         servoLift--;
  221.         servo1.writeMicroseconds(servoLift);
  222.         delayMicroseconds(LIFTSPEED);

  223.       }
  224.     }
  225.     else {
  226.       while (servoLift <= LIFT1) {
  227.         servoLift++;
  228.         servo1.writeMicroseconds(servoLift);
  229.         delayMicroseconds(LIFTSPEED);
  230.       }

  231.     }

  232.     break;

  233.   case 2:

  234.     if (servoLift >= LIFT2) {
  235.       while (servoLift >= LIFT2) {
  236.         servoLift--;
  237.         servo1.writeMicroseconds(servoLift);
  238.         delayMicroseconds(LIFTSPEED);
  239.       }
  240.     }
  241.     else {
  242.       while (servoLift <= LIFT2) {
  243.         servoLift++;
  244.         servo1.writeMicroseconds(servoLift);                               
  245.         delayMicroseconds(LIFTSPEED);
  246.       }
  247.     }
  248.     break;
  249.   }
  250. }


  251. void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {
  252.   float inkr = -0.05;
  253.   float count = 0;

  254.   do {
  255.     drawTo(sqee * radius * cos(start + count) + bx,
  256.     radius * sin(start + count) + by);
  257.     count += inkr;
  258.   }
  259.   while ((start + count) > ende);

  260. }

  261. void bogenGZS(float bx, float by, float radius, int start, int ende, float sqee) {
  262.   float inkr = 0.05;
  263.   float count = 0;

  264.   do {
  265.     drawTo(sqee * radius * cos(start + count) + bx,
  266.     radius * sin(start + count) + by);
  267.     count += inkr;
  268.   }
  269.   while ((start + count) <= ende);
  270. }


  271. void drawTo(double pX, double pY) {
  272.   double dx, dy, c;
  273.   int i;

  274.   // dx dy of new point
  275.   dx = pX - lastX;
  276.   dy = pY - lastY;
  277.   //path lenght in mm, times 4 equals 4 steps per mm
  278.   c = floor(4 * sqrt(dx * dx + dy * dy));

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

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

  283.   }

  284.   lastX = pX;
  285.   lastY = pY;
  286. }

  287. double return_angle(double a, double b, double c) {
  288.   // cosine rule for angle between c and a
  289.   return acos((a * a + c * c - b * b) / (2 * a * c));
  290. }

  291. void set_XY(double Tx, double Ty)
  292. {
  293.   delay(1);
  294.   double dx, dy, c, a1, a2, Hx, Hy;

  295.   // calculate triangle between pen, servoLeft and arm joint
  296.   // cartesian dx/dy
  297.   dx = Tx - O1X;
  298.   dy = Ty - O1Y;

  299.   // polar lemgth (c) and angle (a1)
  300.   c = sqrt(dx * dx + dy * dy); //
  301.   a1 = atan2(dy, dx); //
  302.   a2 = return_angle(L1, L2, c);

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

  304.   // calculate joinr arm point for triangle of the right servo arm
  305.   a2 = return_angle(L2, L1, c);
  306.   Hx = Tx + L3 * cos((a1 - a2 + 0.621) + M_PI); //36,5°
  307.   Hy = Ty + L3 * sin((a1 - a2 + 0.621) + M_PI);

  308.   // calculate triangle between pen joint, servoRight and arm joint
  309.   dx = Hx - O2X;
  310.   dy = Hy - O2Y;

  311.   c = sqrt(dx * dx + dy * dy);
  312.   a1 = atan2(dy, dx);
  313.   a2 = return_angle(L1, (L2 - L3), c);

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

  315. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-5-15 09:17:01 | 显示全部楼层
先提前预订一套。
楼主淘宝店地址是什么。
回复 支持 反对

使用道具 举报

发表于 2014-5-15 09:18:27 | 显示全部楼层
这个有没有其他颜色的。感觉红色暗了点。弄个鲜明活泼的颜色呗。
回复 支持 反对

使用道具 举报

发表于 2014-5-15 09:27:33 | 显示全部楼层
不知道把字体换成数码管显示的那种,写出来会不会更好看些。楼主试验下呗。
还有,能不能做个底座,把小贱钟和Arduino固定在一起。
回复 支持 反对

使用道具 举报

发表于 2014-5-15 14:11:16 | 显示全部楼层
{:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2014-5-15 14:13:23 | 显示全部楼层
要是卖成品,就集成Mini。卖散件的话,就在底座上钻四个能装UNO的孔。毕竟大家还是用UNO的多。
回复 支持 反对

使用道具 举报

发表于 2014-5-15 17:24:37 | 显示全部楼层
mxhhaixin 发表于 2014-5-15 14:13
要是卖成品,就集成Mini。卖散件的话,就在底座上钻四个能装UNO的孔。毕竟大家还是用UNO的多。

搞精致点,做成工艺品,就有人愿意花钱了。
回复 支持 反对

使用道具 举报

发表于 2014-5-15 18:51:44 | 显示全部楼层
能不能脱离电脑工作?
回复 支持 反对

使用道具 举报

发表于 2014-5-16 14:31:43 | 显示全部楼层
激光切割吗?支持!预订!。。。对了,怎么预订啊?
回复 支持 反对

使用道具 举报

发表于 2014-5-26 11:04:05 | 显示全部楼层
求上架日期
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-5 00:57:17 | 显示全部楼层
『超人不会飞』 发表于 2014-5-26 11:04
求上架日期

【新提醒】plotclock小贱钟套件完工啦 - Powered by Discuz!
http://www.geek-workshop.com/thread-10014-1-1.html

刚刚上线
回复 支持 反对

使用道具 举报

发表于 2014-7-24 10:06:49 | 显示全部楼层
您好问一下。想按自己轨迹写的话用改那些参数,数据。那些事不用改的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-24 10:21:01 | 显示全部楼层
那一小撮人 发表于 2014-7-24 10:06
您好问一下。想按自己轨迹写的话用改那些参数,数据。那些事不用改的?

程序里有个 drawto函数 还有个 lift抬臂函数 ,就用着个函数控制就能随便画了。比如做个小绘图仪啥的。呵呵
回复 支持 反对

使用道具 举报

发表于 2014-7-24 11:08:23 | 显示全部楼层
shihaipeng04 发表于 2014-7-24 10:21
程序里有个 drawto函数 还有个 lift抬臂函数 ,就用着个函数控制就能随便画了。比如做个小绘图仪啥的。呵 ...

恩谢谢, 你知道有什么类似可以建立坐标纸的软件吗
回复 支持 反对

使用道具 举报

发表于 2014-7-25 20:08:03 | 显示全部楼层
问一下 bogenUZS函数中的start,ende,sqee代表什么
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 12:12 , Processed in 0.079300 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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