极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27684|回复: 15

plotclock 小贱钟的套件基本完毕

[复制链接]
发表于 2014-5-28 17:22:19 | 显示全部楼层 |阅读模式
本帖最后由 shihaipeng04 于 2014-6-20 11:26 编辑

最新出锅链接淘宝网 http://item.taobao.com/item.htm?id=39370904218


目前套件基本准备完毕了。还有几个小障碍。

1.自己做的一套,始终没有能写出个完整的时间来。可能是因为安装的问题,写出来的字总是歪歪扭扭的。

2.整体结构不是很稳定,因为支撑的部分是T型,当摆臂剧烈摇晃的时候,可能会倒掉。也许是我的笔太重了。

3.虽然做了一个很不错的舵机连接的摆臂,但是发现不同的舵机,主轴直径还不一样。目前已经见到2种舵机了。

4.架子用亚克力胶粘接会更好。但是,这种胶又不太好运输。也许用502可以替代。还没有试验。

5.笔擦找朋友做3d打印去了,还没有出锅。



  1. #define CALIBRATION      



  2. #define SERVOFAKTORLEFT 650
  3. #define SERVOFAKTORRIGHT 650


  4. #define SERVOLEFTNULL 2250
  5. #define SERVORIGHTNULL 920

  6. #define SERVOPINLIFT  2
  7. #define SERVOPINLEFT  3
  8. #define SERVOPINRIGHT 4


  9. #define LIFT0 1080 // on drawing surface
  10. #define LIFT1 925  // between numbers
  11. #define LIFT2 725  // going towards sweeper


  12. #define LIFTSPEED 1500


  13. #define L1 35
  14. #define L2 55.1
  15. #define L3 13.2


  16. #define O1X 22
  17. #define O1Y -25
  18. #define O2X 47
  19. #define O2Y -25

  20. #include <Time.h>
  21. #include <Servo.h>
  22. #include <Wire.h>
  23. #include <DS3231.h>


  24. int servoLift = 1500;

  25. Servo servo1;  //
  26. Servo servo2;  //
  27. Servo servo3;  //

  28. volatile double lastX = 75;
  29. volatile double lastY = 47.5;

  30. int last_min = 0;

  31. void setup()
  32. {

  33.   Serial.begin(9600);
  34.   Wire.begin();
  35.   
  36.   drawTo(75.2, 47);
  37.   lift(0);
  38.   servo1.attach(SERVOPINLIFT);  //  lifting servo
  39.   servo2.attach(SERVOPINLEFT);  //  left servo
  40.   servo3.attach(SERVOPINRIGHT);  //  right servo
  41.   delay(1000);

  42. }

  43. void loop()
  44. {




  45.   int i = 0;
  46.   if (last_min != minute()) {

  47.     if (!servo1.attached()) servo1.attach(SERVOPINLIFT);
  48.     if (!servo2.attached()) servo2.attach(SERVOPINLEFT);
  49.     if (!servo3.attached()) servo3.attach(SERVOPINRIGHT);

  50.     lift(0);

  51.     hour();
  52.     while ((i+1)*10 <= hour())
  53.     {
  54.       i++;
  55.     }

  56.     number(3, 3, 111, 1);
  57.     number(5, 25, i, 0.9);
  58.     number(19, 25, (hour()-i*10), 0.9);
  59.     number(28, 25, 11, 0.9);

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

  71.     servo1.detach();
  72.     servo2.detach();
  73.     servo3.detach();
  74.   }



  75. }

  76. void number(float bx, float by, int num, float scale) {

  77.   switch (num) {

  78.   case 0:
  79.     drawTo(bx + 12 * scale, by + 6 * scale);
  80.     lift(0);
  81.     bogenGZS(bx + 7 * scale, by + 10 * scale, 10 * scale, -0.8, 6.7, 0.5);
  82.     lift(1);
  83.     break;
  84.   case 1:

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

  143.   case 9:
  144.     drawTo(bx + 9 * scale, by + 11 * scale);
  145.     lift(0);
  146.     bogenUZS(bx + 7 * scale, by + 15 * scale, 5 * scale, 4, -0.5, 1);
  147.     drawTo(bx + 5 * scale, by + 0);
  148.     lift(1);
  149.     break;

  150.   case 111:

  151.     lift(0);
  152.     drawTo(70, 46);
  153.     drawTo(65, 43);

  154.     drawTo(65, 49);
  155.     drawTo(5, 49);
  156.     drawTo(5, 45);
  157.     drawTo(65, 45);
  158.     drawTo(65, 40);

  159.     drawTo(5, 40);
  160.     drawTo(5, 35);
  161.     drawTo(65, 35);
  162.     drawTo(65, 30);

  163.     drawTo(5, 30);
  164.     drawTo(5, 25);
  165.     drawTo(65, 25);
  166.     drawTo(65, 20);

  167.     drawTo(5, 20);
  168.     drawTo(60, 44);

  169.     drawTo(75.2, 47);
  170.     lift(2);

  171.     break;

  172.   case 11:
  173.     drawTo(bx + 5 * scale, by + 15 * scale);
  174.     lift(0);
  175.     bogenGZS(bx + 5 * scale, by + 15 * scale, 0.1 * scale, 1, -1, 1);
  176.     lift(1);
  177.     drawTo(bx + 5 * scale, by + 5 * scale);
  178.     lift(0);
  179.     bogenGZS(bx + 5 * scale, by + 5 * scale, 0.1 * scale, 1, -1, 1);
  180.     lift(1);
  181.     break;

  182.   }
  183. }



  184. void lift(char lift) {
  185.   
  186.   
  187.   switch (lift) {
  188.     // room to optimize  !

  189.   
  190.   case 0: //850

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

  204.       }

  205.     }

  206.     break;

  207.   case 1: //150

  208.     if (servoLift >= LIFT1) {
  209.       while (servoLift >= LIFT1) {
  210.         servoLift--;
  211.         servo1.writeMicroseconds(servoLift);
  212.         delayMicroseconds(LIFTSPEED);

  213.       }
  214.     }
  215.     else {
  216.       while (servoLift <= LIFT1) {
  217.         servoLift++;
  218.         servo1.writeMicroseconds(servoLift);
  219.         delayMicroseconds(LIFTSPEED);
  220.       }

  221.     }

  222.     break;

  223.   case 2:

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


  241. void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {
  242.   float inkr = -0.05;
  243.   float count = 0;

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

  250. }

  251. void bogenGZS(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 drawTo(double pX, double pY) {
  262.   double dx, dy, c;
  263.   int i;

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

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

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

  273.   }

  274.   lastX = pX;
  275.   lastY = pY;
  276. }

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

  281. void set_XY(double Tx, double Ty)
  282. {
  283.   delay(1);
  284.   double dx, dy, c, a1, a2, Hx, Hy;

  285.   // calculate triangle between pen, servoLeft and arm joint
  286.   // cartesian dx/dy
  287.   dx = Tx - O1X;
  288.   dy = Ty - O1Y;

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

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

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

  298.   // calculate triangle between pen joint, servoRight and arm joint
  299.   dx = Hx - O2X;
  300.   dy = Hy - O2Y;

  301.   c = sqrt(dx * dx + dy * dy);
  302.   a1 = atan2(dy, dx);
  303.   a2 = return_angle(L1, (L2 - L3), c);

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

  305. }
复制代码


程序粘贴如上,希望有高人能对代码加以完善。
时钟模块,我用的是DS3231,如果是其他的时钟模块,修改一下.h文件就可以了,读取时间的代码没什么变化。


L1 L2 L3 是按照图纸的尺寸量的。不需要修改。
面板的左下角是坐标0,0,笔擦的位置是 75.2,47 单位是毫米,(因为摆臂的安装位置,可能需要再调节一下)
drawto函数是从当前笔位置,移动到相应的坐标。
程序很简单,调试很麻烦。
基础版本一套20¥,大家一起happy一下,目前在制作高阶版本,预计6.1上市。





本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-5-28 23:20:30 | 显示全部楼层
老兄真勤力, 遲下我又印個玩下先.  你係做呢個 (http://www.thingiverse.com/thing:248009) 版本?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-29 00:36:13 | 显示全部楼层
Super169 发表于 2014-5-28 23:20
老兄真勤力, 遲下我又印個玩下先.  你係做呢個 (http://www.thingiverse.com/thing:248009) 版本?


呵呵,就是这个版本的。不过我怀疑,他发出的程序,和他拍照的不是一个代码,因为下载的代码,写出的字比照片里的大很多。
主体的结构我也改了一些,悬臂和舵机的链接改的很完美。 呵呵
回复 支持 反对

使用道具 举报

发表于 2014-5-29 11:58:57 | 显示全部楼层
让这个钟写数码字,不知效果会不会好点。
回复 支持 反对

使用道具 举报

发表于 2014-5-29 15:28:06 | 显示全部楼层
请问套件购买传送门?
回复 支持 反对

使用道具 举报

发表于 2014-5-29 18:50:30 | 显示全部楼层
楼主 素描纸上的图片是用什么软件画的
回复 支持 反对

使用道具 举报

发表于 2014-5-29 22:06:02 | 显示全部楼层
加以那方面的完善呢?
回复 支持 反对

使用道具 举报

发表于 2014-5-30 16:52:03 | 显示全部楼层
这个很好玩啊
回复 支持 反对

使用道具 举报

发表于 2014-5-31 16:51:51 | 显示全部楼层
求LZ的淘宝网址啊!
回复 支持 反对

使用道具 举报

发表于 2014-5-31 17:01:15 | 显示全部楼层
用的什么舵机?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-31 23:04:33 | 显示全部楼层
Tonycxc122 发表于 2014-5-31 17:01
用的什么舵机?

就是普通的9克舵机
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2014-7-25 21:41:09 | 显示全部楼层
那一小撮人 发表于 2014-7-25 20:10
你好问一下 bogenUZS函数中。start,sqee,ende代表什么啊

你研究的还真细致,我粗略看了看,好像是画了一个弧线,那些参数好像是角度和位置什么的。
回复 支持 反对

使用道具 举报

发表于 2014-7-26 08:16:33 | 显示全部楼层
shihaipeng04 发表于 2014-7-25 21:41
你研究的还真细致,我粗略看了看,好像是画了一个弧线,那些参数好像是角度和位置什么的。

我这个明白了,UZS表示顺时针画,GZS、逆时针画
回复 支持 反对

使用道具 举报

发表于 2014-7-26 15:06:31 | 显示全部楼层
楼主知道怎么可以让字写得好看些嘛
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 20:41 , Processed in 0.092140 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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