返回列表 发新帖

【开源】基于开发快的写字钟

[复制链接]
  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-14 11:01:12  | 显示全部楼层 | 阅读模式

    公开设备实时看 这是什么->

    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    22:41
    匿名用户
    通过微信控制多彩灯光
    17:16
    187****2226
    通过微信查询温湿度
    17:16
    187****2226
    通过微信查询温湿度
    17:15
    187****2226
    通过微信查询温湿度
    17:12
    187****2226
    通过微信控制多彩灯光
    17:12
    187****2226
    通过微信控制多彩灯光
    17:12
    187****2226
    通过微信控制多彩灯光
    17:12
    187****2226
    通过微信控制多彩灯光
    17:12
    187****2226
    通过微信控制多彩灯光
    17:12
    187****2226
    通过微信控制多彩灯光
    17:12
    187****2226
    通过微信控制多彩灯光
     

    马上注册,免费领取开发板,一周变智能硬件开发达人!

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

    x
    本帖最后由 STM64 于 2018-5-15 10:30 编辑

    项目简介:
    这是一款能够写字的时钟,方便制作者学习物联网远程控制和开发板对电机的控制方式,对物联网和机械自动化学习很有帮助

    效果图:
    回来的头发同样.jpg


    分两个版本:
    手工版:
    制作难度:三颗星(需具备一定的动手能力)
    适合人群:动手能力较强的人

    3D打印版:
    制作难度:一颗星(但需要一台3D打印机)
    适合人群:任何普通人均可轻松制作


    stm32,FPGA
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-14 11:11:55  | 显示全部楼层
    本帖最后由 STM64 于 2018-5-14 11:32 编辑

    首先是底架的制作:

    材料准备:
    1.stl文件
    2.3D打印机
    3.耗材

    或者:
    1.dwg图纸
    2.自带工具的木匠(或台钳、锯子、卡尺、划针、平衡器)
    [size=14.6666669845581px]3.木料


    上次群里有人反应说没有3D打印机,拿到stl图纸没什么用,

    那就拿dwg印成纸质图纸,用上个世纪的纯手工工艺做这些部件。
    (dwg和stl在本文中我都放上去,因为对于一部分人来讲,手工做比3D打印更耗时间,而且容易伤手)


    对于一个经常电脑前码代码的人来说,3D打印并不稀奇,
    所以下面来放手工制作过程的图:
    (也证实手工制作确实是可行的)
    步骤很简单:
    1.把图纸打印出来:


    2.量尺寸并划线:
    getimgdata (1).jpg
    getimgdata.jpg


    3.放虎钳夹具切割


    1.jpg

    平面整齐
    2.jpg

    给进速率约为3的速度切削
    3.jpg

    三个搞定
    4.jpg




    洗一下木屑并晾干:

    getimgdata (3).jpg


    喷漆什么的就依据个人兴趣了,我是感觉木质的原香不错,
    如果单单喜欢木质颜色,有一种透明的地板漆可以浸泡下如果喜欢其他味道,配制其他味道的汁液浸泡一下即可
    getimgdata (2).jpg


    如果喜欢木头做的,又不想动手的,可以夹桌面级CNC或其他种类的雕刻机里面加工,刀路文件如下





    stm32,FPGA
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-14 11:30:33  | 显示全部楼层
    然后是钻孔

    待我搭个台钻
    stm32,FPGA
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-15 10:12:06  | 显示全部楼层
    本帖最后由 STM64 于 2018-5-15 10:14 编辑

    今天来继续做底座部分
    本来画好线了打算用台钻手工钻的,
    不过搭一台台钻又会耗费好几天工期,
    就用桌面级CNC钻了下孔,
    CNC的主轴转速调到最低了还是有点偏高,
    孔附近都烧焦了,可能用台钻开低转速会好一些
    韩国vb.jpg

    擦一下烧焦的灰稍微好看一些
    gfbfd.jpg


    这种木头烤焦有点酒精的味道,香香的
    stm32,FPGA
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-15 10:19:55  | 显示全部楼层
    本帖最后由 STM64 于 2018-5-15 10:30 编辑

    先上图纸:3D打印全套配件:
    zzzzz.stl (2.37 MB, 下载次数: 0)
    手工版dwg图纸:
    zzz.dwg (2.05 MB, 下载次数: 0)
    (注:手工版与打印版是不同的,因为考虑到手工的便捷性)


    效果图预览:

    语句语句.jpg

    回来的头发同样.jpg

    一堂课鱼鱼困.jpg


    下个楼层代码


    stm32,FPGA
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-15 10:20:38  | 显示全部楼层
    再来上代码:

    1. /*
    2. 网络时间获取
    3. */
    4. #include <Time.h> ///////////////////////库文件//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    5. #include <Servo.h>
    6. #include <TimeLib.h>
    7. #include <ESP8266WiFi.h>
    8. #include <WiFiUdp.h>
    9. ///////////////////////////////////////////////////网络时间设置 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    10. const char ssid[] = "ssid";  //  无线网络名
    11. const char pass[] = "密码";       // 密码

    12. // ///////////////////////////////////////////////////NTP 服务器://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    13. IPAddress timeServer(182, 92, 12, 11); // 阿里云ntp服务器 如果失效可以使用 120.25.115.19   120.25.115.20
    14. #define STD_TIMEZONE_OFFSET +8 //设置中国
    15. const int timeZone = 8;     // 修改北京时区


    16. WiFiUDP Udp;
    17. unsigned int localPort = 8888;  // 修改udp 有些路由器端口冲突时修改
    18. /////////////////////////////////////////////////////////////////////////////////////////////////////
    19. //#define CALIBRATION      // 删除前面的//进入舵机调试模式
    20. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    21. #define SERVOFAKTOR 635//左右悬臂舵机的90度位置
    22. #define WISHY 3 //

    23. //左右悬臂舵机的 0或180度位置,,数字增加,左侧舵机逆时针调整,右侧舵机顺时针调整(先调这个)
    24. #define SERVOLEFTNULL 2100//数值减小,顺时针旋转,加大则逆时针旋转
    25. #define SERVORIGHTNULL 1140//数值减小,顺时针旋转,加大则逆时针旋转
    26. #define SERVOPINLIFT  D6 //抬臂舵机    三个舵机信号线分别 d6 D7 D8
    27. #define SERVOPINLEFT  D7 //左臂舵机
    28. #define SERVOPINRIGHT D8 //右臂舵机

    29. // lift positions of lifting servo
    30. #define LIFT0 1120  // on drawing su**ce
    31. #define LIFT1 800 // between numbers
    32. #define LIFT2 200  // going towards sweeper

    33. // speed of liftimg arm, higher is slower
    34. #define LIFTSPEED 1100 //书写速度 1000-1500

    35. // length of arms
    36. #define L1 35
    37. #define L2 57.1
    38. #define L3 13.2

    39. #define O1X 21
    40. #define O1Y -25
    41. #define O2X 48
    42. #define O2Y -25

    43. //////////////////////时钟模块////////////////////////////////////////////////////////////////////////////////////////////////////////

    44. int servoLift = 1500;
    45. //////////////////////////////////////////分析网络数据///////////////////////////////////////////////////////////////////////////////////////

    46. Servo servo1;  //
    47. Servo servo2;  //
    48. Servo servo3;  //

    49. volatile double lastX = 74.2;
    50. volatile double lastY = 47.5;

    51. int last_min = 0;

    52. void setup()
    53. {
    54. Serial.begin(115200);
    55.   while (!Serial) ; // 等待链接服务器
    56.   delay(250);
    57.   Serial.println("TimeNTP Example");
    58.   Serial.print("Connecting to ");
    59.   Serial.println(ssid);
    60.   WiFi.begin(ssid, pass);
    61.   
    62.   while (WiFi.status() != WL_CONNECTED) {
    63.     delay(500);
    64.     Serial.print(".");
    65.   }

    66.   
    67.   Serial.print("IP number assigned by DHCP is ");
    68.   Serial.println(WiFi.localIP());
    69.   Serial.println("Starting UDP");
    70.   Udp.begin(localPort);
    71.   Serial.print("Local port: ");
    72.   Serial.println(Udp.localPort());
    73.   Serial.println("waiting for sync");
    74.   setSyncProvider(getNtpTime);
    75.     Serial.print(hour());//输出当前网络小时
    76. Serial.println();
    77. Serial.print(minute());//输出当前网络分钟
    78.   Serial.println();
    79. ////////////////////////////////////////////////////////////////////////////网络时间////////////////////////////////////////////////////////////////////////////////////////////////////

    80.   setTime(int(hour()),int(minute()),0,0,0,0);//////////////////////////////////////////////////时间////////////////////////////////////////////////////////////////////////////////////////////////////////////

    81. lift(1);
    82.   

    83.   delay(1000);
    84.    
    85. }



    86. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    87. void loop()
    88. {

    89. #ifdef CALIBRATION

    90.   // Servohorns will have 90° between movements, parallel to x and y axis
    91.   drawTo(-3, 29.2);
    92.   delay(500);
    93.   drawTo(74.1, 28);
    94.   delay(500);

    95. #else


    96.   int i = 0;
    97.   if (1) {  /// 填 last_min != minute() 2分钟更新一次
    98.    

    99.     if (!servo1.attached()) servo1.attach(SERVOPINLIFT);
    100.     if (!servo2.attached()) servo2.attach(SERVOPINLEFT);
    101.     if (!servo3.attached()) servo3.attach(SERVOPINRIGHT);

    102.     lift(0);

    103.     hour();
    104.     while ((i+1)*10 <= hour())
    105.     {
    106.       i++;
    107.     }

    108.     number(3, 3, 111, 1);
    109.     number(5, 25, i, 0.9);
    110.     number(19, 25, (hour()-i*10), 0.9);
    111.     number(28, 25, 11, 0.9);

    112.     i=0;
    113.     while ((i+1)*10 <= minute())
    114.     {
    115.       i++;
    116.     }
    117.     number(34, 25, i, 0.9);
    118.     number(48, 25, (minute()-i*10), 0.9);
    119.     lift(2);
    120.    drawTo(74.2, 47.5);////////////////////////////////////////////////
    121.     lift(1);
    122.     last_min = minute();

    123.     servo1.detach();
    124.     servo2.detach();
    125.     servo3.detach();
    126.   }

    127. #endif

    128. }



    129. //////////////////////////////////////////////////////////////////////以下是数据库设置 没有能力的不用往下看了///////////////////////////////////////////////////////////////////////////////////////////
    130. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    131. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    132. void number(float bx, float by, int num, float scale) {

    133.   switch (num) {

    134.   case 0:
    135.     drawTo(bx + 12 * scale, by + 6 * scale);
    136.     lift(0);
    137.     bogenGZS(bx + 7 * scale, by + 10 * scale, 10 * scale, -0.8, 6.7, 0.5);
    138.     lift(1);
    139.     break;
    140.   case 1:

    141.     drawTo(bx + 3 * scale, by + 15 * scale);
    142.     lift(0);

    143.     drawTo(bx + 10 * scale, by + 0 * scale);
    144.     lift(1);
    145.     break;
    146.   case 2:
    147.     drawTo(bx + 2 * scale, by + 12 * scale);
    148.     lift(0);
    149.     bogenUZS(bx + 8 * scale, by + 14 * scale, 6 * scale, 3, -0.8, 1);
    150.     drawTo(bx + 1 * scale, by + 0 * scale);
    151.     drawTo(bx + 12 * scale, by + 0 * scale);
    152.     lift(1);
    153.     break;
    154.   case 3:
    155.     drawTo(bx + 2 * scale, by + 17 * scale);
    156.     lift(0);
    157.     bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 3, -2, 1);
    158.     bogenUZS(bx + 5 * scale, by + 5 * scale, 5 * scale, 1.57, -3, 1);
    159.     lift(1);
    160.     break;
    161.   case 4:
    162.     drawTo(bx + 10 * scale, by + 0 * scale);
    163.     lift(0);
    164.     drawTo(bx + 10 * scale, by + 20 * scale);
    165.     drawTo(bx + 2 * scale, by + 6 * scale);
    166.     drawTo(bx + 12 * scale, by + 6 * scale);
    167.     lift(1);
    168.     break;
    169.   case 5:
    170.     drawTo(bx + 2 * scale, by + 5 * scale);
    171.     lift(0);
    172.     bogenGZS(bx + 5 * scale, by + 6 * scale, 6 * scale, -2.5, 2, 1);
    173.     drawTo(bx + 5 * scale, by + 20 * scale);
    174.     drawTo(bx + 12 * scale, by + 20 * scale);
    175.     lift(1);
    176.     break;
    177.   case 6:
    178.     drawTo(bx + 2 * scale, by + 10 * scale);
    179.     lift(0);
    180.     bogenUZS(bx + 7 * scale, by + 6 * scale, 6 * scale, 2, -4.4, 1);
    181.     drawTo(bx + 11 * scale, by + 20 * scale);
    182.     lift(1);
    183.     break;
    184.   case 7:
    185.     drawTo(bx + 2 * scale, by + 20 * scale);
    186.     lift(0);
    187.     drawTo(bx + 12 * scale, by + 20 * scale);
    188.     drawTo(bx + 2 * scale, by + 0);
    189.     lift(1);
    190.     break;
    191.   case 8:
    192.     drawTo(bx + 5 * scale, by + 10 * scale);
    193.     lift(0);
    194.     bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 4.7, -1.6, 1);
    195.     bogenGZS(bx + 5 * scale, by + 5 * scale, 5 * scale, -4.7, 2, 1);
    196.     lift(1);
    197.     break;

    198.   case 9:
    199.     drawTo(bx + 9 * scale, by + 11 * scale);
    200.     lift(0);
    201.     bogenUZS(bx + 7 * scale, by + 15 * scale, 5 * scale, 4, -0.5, 1);
    202.     drawTo(bx + 5 * scale, by + 0);
    203.     lift(1);
    204.     break;

    205.   case 111:

    206.     lift(0);
    207.     drawTo(74, 46);///
    208.     drawTo(65, 43);

    209.     drawTo(65, 49);
    210.     drawTo(5, 49);
    211.     drawTo(5, 45);
    212.     drawTo(65, 45);
    213.     drawTo(65, 40);

    214.     drawTo(5, 40);
    215.     drawTo(5, 35);
    216.     drawTo(65, 35);
    217.     drawTo(65, 30);

    218.     drawTo(5, 30);
    219.     drawTo(5, 25);
    220.     drawTo(65, 25);
    221.     drawTo(65, 20);

    222.     drawTo(5, 20);
    223.     drawTo(60, 44);

    224.     drawTo(75.2, 47);
    225.     lift(2);

    226.     break;

    227.   case 11:
    228.     drawTo(bx + 5 * scale, by + 15 * scale);
    229.     lift(0);
    230.     bogenGZS(bx + 5 * scale, by + 15 * scale, 0.1 * scale, 1, -1, 1);
    231.     lift(1);
    232.     drawTo(bx + 5 * scale, by + 5 * scale);
    233.     lift(0);
    234.     bogenGZS(bx + 5 * scale, by + 5 * scale, 0.1 * scale, 1, -1, 1);
    235.     lift(1);
    236.     break;

    237.   }
    238. }

    239. //////////////////////////////////////////////////////////////////解包设置//////////////////////////////////////////////////////////////////////////////////////////////////////////////
    240. void digitalClockDisplay(){
    241.   //
    242.   Serial.print(hour());
    243.   printDigits(minute());
    244. Serial.println();
    245.   
    246.    // 输出设置

    247. }



    248. void printDigits(int digits){
    249.   // utility for digital clock display: prints preceding colon and leading 0
    250.   Serial.print(":");
    251.   if(digits < 10)
    252.     Serial.print('0');
    253.   Serial.print(digits);
    254. }

    255. /*-------- NTP 数据包解析 ----------*/

    256. const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
    257. byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

    258. time_t getNtpTime()
    259. {
    260.   while (Udp.parsePacket() > 0) ; // discard any previously received packets
    261.   Serial.println("Transmit NTP Request");
    262.   sendNTPpacket(timeServer);
    263.   uint32_t beginWait = millis();
    264.   while (millis() - beginWait < 1500) {
    265.     int size = Udp.parsePacket();
    266.     if (size >= NTP_PACKET_SIZE) {
    267.       Serial.println("Receive NTP Response");
    268.       Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
    269.       unsigned long secsSince1900;
    270.       // convert four bytes starting at location 40 to a long integer
    271.       secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
    272.       secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
    273.       secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
    274.       secsSince1900 |= (unsigned long)packetBuffer[43];
    275.       return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    276.     }
    277.   }
    278.   Serial.println("No NTP Response :-(");
    279.   return 0; // return 0 if unable to get the time
    280. }

    281. // send an NTP request to the time server at the given address
    282. void sendNTPpacket(IPAddress &address)
    283. {
    284.   // set all bytes in the buffer to 0
    285.   memset(packetBuffer, 0, NTP_PACKET_SIZE);
    286.   // Initialize values needed to form NTP request
    287.   // (see URL above for details on the packets)
    288.   packetBuffer[0] = 0b11100011;   // LI, Version, Mode
    289.   packetBuffer[1] = 0;   
    290.   packetBuffer[3] = 0xEC;

    291.   packetBuffer[12]  = 49;
    292.   packetBuffer[13]  = 0x4E;
    293.   packetBuffer[14]  = 49;
    294.   packetBuffer[15]  = 52;
    295.   // all NTP fields have been given values, now
    296.   // you can send a packet requesting a timestamp:                 
    297.   Udp.beginPacket(address, 123); //NTP requests are to port 123
    298.   Udp.write(packetBuffer, NTP_PACKET_SIZE);
    299.   Udp.endPacket();
    300. }
    301. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    302. void lift(char lift) {
    303.   switch (lift) {
    304.     // room to optimize  !

    305.   case 0: //850

    306.       if (servoLift >= LIFT0) {
    307.       while (servoLift >= LIFT0)
    308.       {
    309.         servoLift--;
    310.         servo1.writeMicroseconds(servoLift);        
    311.         delayMicroseconds(LIFTSPEED);
    312.       }
    313.     }
    314.     else {
    315.       while (servoLift <= LIFT0) {
    316.         servoLift++;
    317.         servo1.writeMicroseconds(servoLift);
    318.         delayMicroseconds(LIFTSPEED);

    319.       }

    320.     }

    321.     break;

    322.   case 1: //150

    323.     if (servoLift >= LIFT1) {
    324.       while (servoLift >= LIFT1) {
    325.         servoLift--;
    326.         servo1.writeMicroseconds(servoLift);
    327.         delayMicroseconds(LIFTSPEED);

    328.       }
    329.     }
    330.     else {
    331.       while (servoLift <= LIFT1) {
    332.         servoLift++;
    333.         servo1.writeMicroseconds(servoLift);
    334.         delayMicroseconds(LIFTSPEED);
    335.       }

    336.     }

    337.     break;

    338.   case 2:

    339.     if (servoLift >= LIFT2) {
    340.       while (servoLift >= LIFT2) {
    341.         servoLift--;
    342.         servo1.writeMicroseconds(servoLift);
    343.         delayMicroseconds(LIFTSPEED);
    344.       }
    345.     }
    346.     else {
    347.       while (servoLift <= LIFT2) {
    348.         servoLift++;
    349.         servo1.writeMicroseconds(servoLift);        
    350.         delayMicroseconds(LIFTSPEED);
    351.       }
    352.     }
    353.     break;
    354.   }
    355. }


    356. void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {
    357.   float inkr = -0.05;
    358.   float count = 0;

    359.   do {
    360.     drawTo(sqee * radius * cos(start + count) + bx,
    361.     radius * sin(start + count) + by);
    362.     count += inkr;
    363.   }
    364.   while ((start + count) > ende);

    365. }

    366. void bogenGZS(float bx, float by, float radius, int start, int ende, float sqee) {
    367.   float inkr = 0.05;
    368.   float count = 0;

    369.   do {
    370.     drawTo(sqee * radius * cos(start + count) + bx,
    371.     radius * sin(start + count) + by);
    372.     count += inkr;
    373.   }
    374.   while ((start + count) <= ende);
    375. }


    376. void drawTo(double pX, double pY) {
    377.   double dx, dy, c;
    378.   int i;

    379.   // dx dy of new point
    380.   dx = pX - lastX;
    381.   dy = pY - lastY;
    382.   //path lenght in mm, times 4 equals 4 steps per mm
    383.   c = floor(4 * sqrt(dx * dx + dy * dy));

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

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

    388.   }

    389.   lastX = pX;
    390.   lastY = pY;
    391. }

    392. double return_angle(double a, double b, double c) {
    393.   // cosine rule for angle between c and a
    394.   return acos((a * a + c * c - b * b) / (2 * a * c));
    395. }

    396. void set_XY(double Tx, double Ty)
    397. {
    398.   delay(1);
    399.   double dx, dy, c, a1, a2, Hx, Hy;

    400.   // calculate ** between pen, servoLeft and arm joint
    401.   // cartesian dx/dy
    402.   dx = Tx - O1X;
    403.   dy = Ty - O1Y;

    404.   // polar lemgth (c) and angle (a1)
    405.   c = sqrt(dx * dx + dy * dy); //
    406.   a1 = atan2(dy, dx); //
    407.   a2 = return_angle(L1, L2, c);

    408.   servo2.writeMicroseconds(floor(((a2 + a1 - M_PI) * SERVOFAKTOR) + SERVOLEFTNULL));

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

    413.   // calculate ** between pen joint, servoRight and arm joint
    414.   dx = Hx - O2X;
    415.   dy = Hy - O2Y;

    416.   c = sqrt(dx * dx + dy * dy);
    417.   a1 = atan2(dy, dx);
    418.   a2 = return_angle(L1, (L2 - L3), c);

    419.   servo3.writeMicroseconds(floor(((a1 - a2) * SERVOFAKTOR) + SERVORIGHTNULL));

    420. }


    复制代码


    stm32,FPGA
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-16 09:45:15  | 显示全部楼层
    接着搞底架
    10.jpg

    9.jpg

    8.jpg

    stm32,FPGA
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-26 15:12:30  | 显示全部楼层
    本帖最后由 STM64 于 2018-5-26 15:26 编辑

    然后是电子器件的准备:
    开发快小e一枚
    稻荷之春秋_20180526_094924.jpg

    然后esp8266专用编程器
    稻荷之春秋_20180526_094926.jpg


    或者用开发快M302I,这个集成了编程器芯片,看开发板左上角那枚芯片
    稻荷之春秋_20180526_094933.jpg



    然后这个亚克力准备不准备都没关系,开发板PCB露在外面也是一种风格
    稻荷之春秋_20180526_094921.jpg


    从云台套件取舵机
    稻荷之春秋_20180526_094930.jpg

    这个舵机要3个
    稻荷之春秋_20180526_094935.jpg

    大致就是准备这些东西了,然后安装前面的图纸连线即可
    稻荷之春秋_20180526_094939.jpg












    stm32,FPGA
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 10:48
  • 签到天数: 189 天

    [LV.7]常住居民III

    392

    主题

    1442

    帖子

    6972

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6972
    QQ
    发表于 2018-5-26 22:42:09  | 显示全部楼层
    上面这些都按图纸组装完成后,我们来整体的运行
    鉴于群友说3D打印成本高,而且手工做也没这动手能力,
    那么就用卡纸或纸板做一台,效果如下(跟3D打印的比起来,看一下就知道这个设计为啥推荐3D打印了吧)
    首先是机械臂的连接,折弯增加受力承度,这符合力学原理,而且更接近圆
    20180526_222622.jpg

    然后是与舵机的连接
    20180526_222842.jpg

    连接另一个舵机
    20180526_222832.jpg

    然后架起笔写字
    20180526_222823.jpg

    从开发快小e获取时间信息,然后写出来
    20180526_222818.jpg


    至此,基于开发快的写字钟制作完成
    stm32,FPGA
    回复 支持 反对

    使用道具 举报

    发表回复

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

    本版积分规则

    关于我们
    开发快官网
    关于我们
    联系我们
    帮助中心
    开发者中心
    快速入门
    视频教程
    社区活动
    免费开发板
    开发者大赛
    关注我们
    官方微博
    官方空间
    快速回复 返回顶部 返回列表

    湘公网安备 43019002000310号