justsoso_sl 发表于 2021-11-16 23:51:21

Arduino 2.4G 遥控机械臂

本帖最后由 justsoso_sl 于 2021-11-26 00:48 编辑

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

二、硬件列表
1、Arduino Nano+扩展板
2、28byj-48步进电机+ULN2003 *3套
3、9克舵机*1
4、舵机延长线*1
5、轴承*2
6、螺丝一批
7、4mm钢轴
三、机械臂端代码#include <SoftwareSerial.h>
#include <Servo.h>
#include "AccelStepper.h"

// 电机步进方式定义
#define FULLSTEP 4    //半步进参数

// 定义步进电机引脚

#define baPin15   // 一号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define baPin26   // 一号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define baPin37    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define baPin48    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in4


#define saPin1A0   // 二号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define saPin2A1   // 二号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define saPin3A2   // 二号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define saPin4A3   // 二号28BYJ48连接的ULN2003电机驱动板引脚 in4

#define ytPin110   // 二号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define ytPin211   // 二号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define ytPin312   // 二号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define ytPin413   // 二号28BYJ48连接的ULN2003电机驱动板引脚 in4

#define Servo_Pin 9

#define Blu_RX A4
#define Blu_TX A5


#define MINVAL 400
#define MAXVAL 620

long lastsendtime = 0;
int val = {512, 512, 512, 512, 512, 512, 0, 0};

// 定义两个步进电机对象
// 定义中ULN2003驱动板引脚顺序为 in1-in3-in2-in4
// 1号电机设置为全步进运行,2号电机设置为全步进运行
AccelStepper ba(FULLSTEP, baPin1, baPin3, baPin2, baPin4);
AccelStepper sa(FULLSTEP, saPin1, saPin3, saPin2, saPin4);
AccelStepper yt(FULLSTEP, ytPin1, ytPin3, ytPin2, ytPin4);
Servo jia;// create servo object to control a servo

/////////////蓝牙定义部分///////////////////
String string;
char cmdMSP;

SoftwareSerial mySerial(Blu_RX, Blu_TX);

int ba_flag, sa_flag, yt_flag, jia_flag;
int ba_speed = 300;
int sa_speed = 300;
int yt_speed = 300;

int myangle = 87;
int maxangle = 170;
int minangle = 87;
long lasttime;

int flag;


void BluSend()
{
if (millis() - lastsendtime > 500)
{
    Serial.print("A");
    lastsendtime = millis();
}
}
void BluReceive() {
static enum _serial_state {
    IDLE,
    HEADER_START,
    HEADER_M,
    HEADER_ARROW,
    HEADER_CMD,
} c_state = IDLE;
while (Serial.available() > 0)
{
    char c = Serial.read(); // 读串口缓冲区
    if (c_state == IDLE)
    { //串口状态空闲 等待HEADER_START状态的到来
      c_state = (c == '
四、组装过程
https://www.ixigua.com/7031100524908937758?utm_source=xiguastudio
五、效果演示
https://www.ixigua.com/7029505449263104520?utm_source=xiguastudio
六、遥控器制作遥控器外壳、内设及程序代码参考新贴内容更新:https://mc.dfrobot.com.cn/thread-311464-1-1.html(未完待续)

) ? HEADER_START : IDLE;    //判定是$字符吗?是则进入HEADER_START状态
      if (c_state == IDLE)
      {
      }// evaluateOtherData(c); // evaluate all other incoming serial data
    }
    else if (c_state == HEADER_START)
    {

      c_state = (c == 'M') ? HEADER_M : IDLE;      //判定是M字符吗?是则进入HEADER_M状态
    }
    else if (c_state == HEADER_M)
    {

      c_state = (c == '>') ? HEADER_ARROW : IDLE;    //判定是>字符吗?是则进入HEADER_ARROW状态
    }
    else if (c_state == HEADER_ARROW)
    {
      string = "";
      cmdMSP = c;                                    //接收 指令(code)
      c_state = HEADER_CMD;                        //接收到指令,进入HEADER_CMD状态
    }
    else if (c_state == HEADER_CMD)
    {
      if (c != ';')
      string += c;
      else
      {
      c_state = IDLE;                         //返回IDLE状态
      evaluateCommand();                  //数据处理程序
      }
    }
}
}


void evaluateCommand() {
//    Serial.print("receive cmd:");
//    Serial.println(cmdMSP);
//    Serial.println(string);
//mySerial.print("receive cmd:");
//mySerial.println(cmdMSP);
switch (cmdMSP)
{
    case 'D':
      val = atoi(strtok(string.c_str(), ",")) ;
      for (int i = 1; i < 8; i++)
      val = atoi(strtok(NULL, ","));

      //      sa_flag = atoi(strtok(string.c_str(), ",")) ;
      //      jia_flag = atoi(strtok(NULL, ","));
      //      ba_flag = atoi(strtok(NULL, ","));
      //      yt_flag = atoi(strtok(NULL, ","));
      //
      //      ba.setSpeed(ba_speed * ba_flag);
      //      yt.setSpeed(yt_speed * yt_flag);
      //      sa.setSpeed((-1)*sa_speed * sa_flag);
      break;

    default:
      {

      }
}
}

void dataDeal()
{
for (int i = 0; i < 4; i++)
{
    if (val > MAXVAL)
      flag = 1;
    else if (val < MINVAL)
      flag = -1;
    else
      flag = 0;
}
sa_flag = flag;
jia_flag = flag;
ba_flag = flag;
yt_flag = flag;
ba_speed = map(val, 0, 1023, 100, 600);
sa_speed = ba_speed;
yt_speed = ba_speed;
ba.setSpeed(ba_speed * ba_flag);
yt.setSpeed(yt_speed * yt_flag);
sa.setSpeed((-1)*sa_speed * sa_flag);
}

void setup()
{
ba.setMaxSpeed(800);   // 设置电机最大速度为500
sa.setMaxSpeed(800);   // 设置电机最大速度为500
yt.setMaxSpeed(800);   // 设置电机最大速度为500
//ba.setSpeed(ba_speed);      // 初始化电机速度为300
//sa.setSpeed(300);      // 初始化电机速度为300
//yt.setSpeed(300);      // 初始化电机速度为300

Serial.begin(9600);
mySerial.begin(9600);

jia.attach(Servo_Pin);
}

void loop()
{
BluReceive();
BluSend();
dataDeal();
if (jia_flag)
{
    if (millis() - lasttime > 5)
    {
      if (jia_flag == -1 && myangle < maxangle)
      {
      jia.write(++myangle);
      }
      else if (jia_flag == 1 && myangle > minangle)
      {
      jia.write(--myangle);
      }
      else
      {
      jia_flag = 0;
      }
      lasttime = millis();
    }
}
if (ba_flag)
{

    ba.runSpeed();
}
if (sa_flag)
{

    sa.runSpeed();
}
if (yt_flag)
{

    yt.runSpeed();
}
}
四、组装过程
https://www.ixigua.com/7031100524908937758?utm_source=xiguastudio
五、效果演示
https://www.ixigua.com/7029505449263104520?utm_source=xiguastudio
六、遥控器制作遥控器外壳、内设及程序代码参考新贴内容更新:https://mc.dfrobot.com.cn/thread-311464-1-1.html

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

哈哈

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

https://www.thingiverse.com/thing:2838859

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

hnyzcj 发表于 2021-11-17 06:36
哈哈

陈老师,请问关于实时水质检测小船的代码能咨询一下您吗?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的
页: [1]
查看完整版本: Arduino 2.4G 遥控机械臂