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
哈哈 https://www.thingiverse.com/thing:2838859 感谢分享!!! 下载不下来啊…… bluseLi 发表于 2021-11-17 16:06
下载不下来啊……
已经将文件压缩上传 hnyzcj 发表于 2021-11-17 06:36
哈哈
陈老师,请问关于实时水质检测小船的代码能咨询一下您吗?qq2140408201,麻烦您了! 为什么我复制的代码,在arduino里面运行有错误啊 cn0nUZxUgiRv 发表于 2021-12-6 11:16
为什么我复制的代码,在arduino里面运行有错误啊
需要加载步进电机的库 请问你这个打印机是什么类型的?是光固化还是FDM的
页:
[1]