5435浏览
查看: 5435|回复: 9

Arduino 2.4G 遥控机械臂

[复制链接]
本帖最后由 justsoso_sl 于 2021-11-26 00:48 编辑

Arduino 2.4G 遥控机械臂

导语:

最近迷上了多通道的机械臂,尝试着去自主设计,发现做出来的效果相比互联网上的成品差距还是比较远的。于是乎,在thingiverse上下载了一位大神的图纸,耗费了一天时间,将部件打印了出来。遗憾的是没有合适的控制程序,个人觉得机械臂这玩意儿用手机App操控的体验还是比较差的,最好是带摇杆的遥控,体验才比较逼真。于是乎,一边进行多道道非阻塞的机械臂步进电机控制开发,一边进行基于Arduino 2.4G遥控器的开发。鉴于有些朋友想要,所以草草的先发一些过程出来。截至目前,算是已经开了三个贴子未收尾,齐头并进吧。。。

一、机械臂3D打印图纸设计(来源网络)

可直接去原作者地址:图纸地址
本站下载:下载附件机械臂图纸.zip

Arduino 2.4G 遥控机械臂图3
Arduino 2.4G 遥控机械臂图2
Arduino 2.4G 遥控机械臂图4
Arduino 2.4G 遥控机械臂图5
Arduino 2.4G 遥控机械臂图1

二、硬件列表

1、Arduino Nano+扩展板

2、28byj-48步进电机+ULN2003 *3套

3、9克舵机*1

4、舵机延长线*1

5、轴承*2

6、螺丝一批

7、4mm钢轴

三、机械臂端代码
  1. #include <SoftwareSerial.h>
  2. #include <Servo.h>
  3. #include "AccelStepper.h"
  4. // 电机步进方式定义
  5. #define FULLSTEP 4    //半步进参数
  6. // 定义步进电机引脚
  7. #define baPin1  5     // 一号28BYJ48连接的ULN2003电机驱动板引脚 in1
  8. #define baPin2  6     // 一号28BYJ48连接的ULN2003电机驱动板引脚 in2
  9. #define baPin3  7    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in3
  10. #define baPin4  8    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in4
  11. #define saPin1  A0     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in1
  12. #define saPin2  A1     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in2
  13. #define saPin3  A2     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in3
  14. #define saPin4  A3     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in4
  15. #define ytPin1  10     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in1
  16. #define ytPin2  11     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in2
  17. #define ytPin3  12     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in3
  18. #define ytPin4  13     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in4
  19. #define Servo_Pin 9
  20. #define Blu_RX A4
  21. #define Blu_TX A5
  22. #define MINVAL 400
  23. #define MAXVAL 620
  24. long lastsendtime = 0;
  25. int val[8] = {512, 512, 512, 512, 512, 512, 0, 0};
  26. // 定义两个步进电机对象
  27. // 定义中ULN2003驱动板引脚顺序为 in1-in3-in2-in4
  28. // 1号电机设置为全步进运行,2号电机设置为全步进运行
  29. AccelStepper ba(FULLSTEP, baPin1, baPin3, baPin2, baPin4);
  30. AccelStepper sa(FULLSTEP, saPin1, saPin3, saPin2, saPin4);
  31. AccelStepper yt(FULLSTEP, ytPin1, ytPin3, ytPin2, ytPin4);
  32. Servo jia;  // create servo object to control a servo
  33. /////////////蓝牙定义部分///////////////////
  34. String string;
  35. char cmdMSP;
  36. SoftwareSerial mySerial(Blu_RX, Blu_TX);
  37. int ba_flag, sa_flag, yt_flag, jia_flag;
  38. int ba_speed = 300;
  39. int sa_speed = 300;
  40. int yt_speed = 300;
  41. int myangle = 87;
  42. int maxangle = 170;
  43. int minangle = 87;
  44. long lasttime;
  45. int flag[4];
  46. void BluSend()
  47. {
  48.   if (millis() - lastsendtime > 500)
  49.   {
  50.     Serial.print("A");
  51.     lastsendtime = millis();
  52.   }
  53. }
  54. void BluReceive() {
  55.   static enum _serial_state {
  56.     IDLE,
  57.     HEADER_START,
  58.     HEADER_M,
  59.     HEADER_ARROW,
  60.     HEADER_CMD,
  61.   } c_state = IDLE;
  62.   while (Serial.available() > 0)
  63.   {
  64.     char c = Serial.read(); // 读串口缓冲区
  65.     if (c_state == IDLE)
  66.     { //串口状态空闲 等待HEADER_START状态的到来
  67.       c_state = (c == '
  68. [/align]四、组装过程[/b][/size][/font][/align][font=新宋体]
  69. [/font][align=center][font=新宋体][media=x,500,375]https://www.ixigua.com/7031100524908937758?utm_source=xiguastudio[/media][/font][/align][font=新宋体]
  70. [/font][align=left][font=新宋体][size=4][b]五、效果演示[/b][/size][/font][/align][font=新宋体]
  71. [/font][align=center][font=新宋体][media=x,500,375]https://www.ixigua.com/7029505449263104520?utm_source=xiguastudio[/media][/font][/align][font=新宋体]
  72. [/font][align=center][align=left][b][font=新宋体][size=4]六、遥控器制作[/size][/font][/b][/align][/align][align=center][align=left][font=新宋体][size=4]遥控器外壳、内设及程序代码参考新贴内容更新:[/size][url=https://mc.dfrobot.com.cn/thread-311464-1-1.html]https://mc.dfrobot.com.cn/thread-311464-1-1.html[/url][/font][/align][/align][align=center][align=center][font=新宋体][size=6][b](未完待续)[/b][/size][/font][/align][/align][font=新宋体]
  73. [/font]
  74. ) ? HEADER_START : IDLE;    //判定是$字符吗?是则进入HEADER_START状态
  75.       if (c_state == IDLE)
  76.       {
  77.       }// evaluateOtherData(c); // evaluate all other incoming serial data
  78.     }
  79.     else if (c_state == HEADER_START)
  80.     {
  81.       c_state = (c == 'M') ? HEADER_M : IDLE;        //判定是M字符吗?是则进入HEADER_M状态
  82.     }
  83.     else if (c_state == HEADER_M)
  84.     {
  85.       c_state = (c == '>') ? HEADER_ARROW : IDLE;    //判定是>字符吗?是则进入HEADER_ARROW状态
  86.     }
  87.     else if (c_state == HEADER_ARROW)
  88.     {
  89.       string = "";
  90.       cmdMSP = c;                                    //接收 指令(code)
  91.       c_state = HEADER_CMD;                          //接收到指令,进入HEADER_CMD状态
  92.     }
  93.     else if (c_state == HEADER_CMD)
  94.     {
  95.       if (c != ';')
  96.         string += c;
  97.       else
  98.       {
  99.         c_state = IDLE;                         //返回IDLE状态
  100.         evaluateCommand();                    //数据处理程序
  101.       }
  102.     }
  103.   }
  104. }
  105. void evaluateCommand() {
  106.   //    Serial.print("receive cmd:");
  107.   //    Serial.println(cmdMSP);
  108.   //    Serial.println(string);
  109.   //  mySerial.print("receive cmd:");
  110.   //  mySerial.println(cmdMSP);
  111.   switch (cmdMSP)
  112.   {
  113.     case 'D':
  114.       val[0] = atoi(strtok(string.c_str(), ",")) ;
  115.       for (int i = 1; i < 8; i++)
  116.         val[i] = atoi(strtok(NULL, ","));
  117.       //      sa_flag = atoi(strtok(string.c_str(), ",")) ;
  118.       //      jia_flag = atoi(strtok(NULL, ","));
  119.       //      ba_flag = atoi(strtok(NULL, ","));
  120.       //      yt_flag = atoi(strtok(NULL, ","));
  121.       //
  122.       //      ba.setSpeed(ba_speed * ba_flag);
  123.       //      yt.setSpeed(yt_speed * yt_flag);
  124.       //      sa.setSpeed((-1)*sa_speed * sa_flag);
  125.       break;
  126.     default:
  127.       {
  128.       }
  129.   }
  130. }
  131. void dataDeal()
  132. {
  133.   for (int i = 0; i < 4; i++)
  134.   {
  135.     if (val[i] > MAXVAL)
  136.       flag[i] = 1;
  137.     else if (val[i] < MINVAL)
  138.       flag[i] = -1;
  139.     else
  140.       flag[i] = 0;
  141.   }
  142.   sa_flag = flag[0];
  143.   jia_flag = flag[1];
  144.   ba_flag = flag[2];
  145.   yt_flag = flag[3];
  146.   ba_speed = map(val[4], 0, 1023, 100, 600);
  147.   sa_speed = ba_speed;
  148.   yt_speed = ba_speed;
  149.   ba.setSpeed(ba_speed * ba_flag);
  150.   yt.setSpeed(yt_speed * yt_flag);
  151.   sa.setSpeed((-1)*sa_speed * sa_flag);
  152. }
  153. void setup()
  154. {
  155.   ba.setMaxSpeed(800);   // 设置电机最大速度为500
  156.   sa.setMaxSpeed(800);   // 设置电机最大速度为500
  157.   yt.setMaxSpeed(800);   // 设置电机最大速度为500
  158.   //  ba.setSpeed(ba_speed);      // 初始化电机速度为300
  159.   //  sa.setSpeed(300);      // 初始化电机速度为300
  160.   //  yt.setSpeed(300);      // 初始化电机速度为300
  161.   Serial.begin(9600);
  162.   mySerial.begin(9600);
  163.   jia.attach(Servo_Pin);
  164. }
  165. void loop()
  166. {
  167.   BluReceive();
  168.   BluSend();
  169.   dataDeal();
  170.   if (jia_flag)
  171.   {
  172.     if (millis() - lasttime > 5)
  173.     {
  174.       if (jia_flag == -1 && myangle < maxangle)
  175.       {
  176.         jia.write(++myangle);
  177.       }
  178.       else if (jia_flag == 1 && myangle > minangle)
  179.       {
  180.         jia.write(--myangle);
  181.       }
  182.       else
  183.       {
  184.         jia_flag = 0;
  185.       }
  186.       lasttime = millis();
  187.     }
  188.   }
  189.   if (ba_flag)
  190.   {
  191.     ba.runSpeed();
  192.   }
  193.   if (sa_flag)
  194.   {
  195.     sa.runSpeed();
  196.   }
  197.   if (yt_flag)
  198.   {
  199.     yt.runSpeed();
  200.   }
  201. }
复制代码

四、组装过程


五、效果演示


六、遥控器制作
遥控器外壳、内设及程序代码参考新贴内容更新:https://mc.dfrobot.com.cn/thread-311464-1-1.html


hnyzcj  版主

发表于 2021-11-17 06:36:48

哈哈
回复

使用道具 举报

hnyzcj  版主

发表于 2021-11-17 06:39:20

回复

使用道具 举报

bluseLi  见习技师

发表于 2021-11-17 16:02:56

感谢分享!!!
回复

使用道具 举报

bluseLi  见习技师

发表于 2021-11-17 16:06:43

下载不下来啊……
回复

使用道具 举报

justsoso_sl  初级技师
 楼主|

发表于 2021-11-22 22:14:36

bluseLi 发表于 2021-11-17 16:06
下载不下来啊……

已经将文件压缩上传
回复

使用道具 举报

hjXJySwwAJUn  学徒

发表于 2021-11-26 08:47:12


陈老师,请问关于实时水质检测小船的代码能咨询一下您吗?qq2140408201,麻烦您了!
回复

使用道具 举报

cn0nUZxUgiRv  学徒

发表于 2021-12-6 11:16:18

为什么我复制的代码,在arduino里面运行有错误啊
回复

使用道具 举报

justsoso_sl  初级技师
 楼主|

发表于 2021-12-15 10:30:20

cn0nUZxUgiRv 发表于 2021-12-6 11:16
为什么我复制的代码,在arduino里面运行有错误啊

需要加载步进电机的库
回复

使用道具 举报

涛声依旧2021  初级技师

发表于 2022-4-1 09:35:43

请问你这个打印机是什么类型的?是光固化还是FDM的
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail