分享

【玩转开源】基于Arduino的同步机械臂

 昵称31613414 2017-04-06


机械臂应用背景


机械臂是机器人技术中最广泛运用到的自动化机械装置,在多种领域中均有其丰富的应用。机械臂的优点众多,其中最为显著的是其精确性和高效性。然而因自动化机械臂非常依赖于控制指令,不同的操作环境也需要不同的控制指令,对于非专业使用者来说操作过于繁琐复杂,因此机械臂在民用领域并不常见。


为了使得机械臂的控制变得简单直观,有人提出了同步操纵者动作的机械臂控制概念,但因其机械结构和算法的复杂性,这种结构的机械装置目前多存在于影视作品中。

图1-1 电影《阿凡达》中的同步机器人 图片摘自新浪网

在这篇教程中,我们会使用电位器来监控一个普通台灯悬臂的运动姿态,通过一些基于Arduino的编程将这些动作复制至一个舵机控制的机械臂,从而达到同步的效果。


图1-2基于Arduino的自制同步机械臂


控制思路


同步悬臂系统由操控臂和受控臂组成。安装在操控臂上的电位器能够感测到悬臂的姿态并远程同步至由舵机控制的受控臂,使之复制控制臂动作。通过人体工程学的按钮和形态设计,操控臂能够简单直观地由手控制,从而实现复杂精确的远程操作功能。


制作材料


3D打印件零件



图2-1 夹持器导轨底座


图2-2 夹持器连动杆


图2-3夹持器电位器舵盘


图2-4 夹持器滑动块


图2-5 机械臂底部转轴连杆


图2-6 底部电位器舵盘


图2-7 舵盘连轴杆



其他材料



图2-8 四自由度机械臂


图2-9 万向悬臂


图2-10 0-50Kohm电位器*4


图2-11 固定阻值电阻若干

图2-12 220V-5V 2A电源适配器


导线,热塑管,魔术贴捆绑带,USB数据线,1MM粗硬铁丝


需要工具



热熔胶枪,万用表,螺丝刀,热风枪,电烙铁


装配步骤


控制臂电位器安装


控制臂由四个关节组成,分别是基座关节(控制整臂左右旋转),下关节(控制下半臂前后摇摆),上关节(控制上半臂前后摇摆),夹持器关节(有连杆)

安装上下关节电位器及其连动杆相对简单。

以上关节为例,为了能够让连杆与电位器同步转动,要在连杆孔中安装一根固定杆。利用3D打印件的可塑性,可以用电烙铁加热一根1cm长,1mm宽的硬铁丝再将其缓慢按入材料中。注意连杆应该按图3-1所示从凸起的一面按入约2-3mm。


图3-1 铁丝固定位置


随后把悬臂一侧的弹簧从固定轴上卸下,将连杆套入并确保其能在固定轴上正常滑动。


图3-2将连杆套入机械臂的固定轴


之后将电位器用热熔胶固定在关节旁。


图3-3上关节电位器固定位置


最后按图3-4将连杆末端的套筒套入电位器转动轴,注意将铁丝卡入电位器轴的卡槽以确保其能随之转动。

图3-4 将连杆套入电位器转动轴


重复以上步骤来安装下关节定位器,同样用热熔胶将电位器固定在下关节转轴旁,套上连接干即可。


图3-5下关节电位器固定位置


接下来安装夹持器的电位器和传动装置,首先用同样的方法安装电位器舵盘上的固定杆并将其套在电位器转轴上。


图3-6 将连接杆套入夹持器上电位器的转动轴


参考图3-7组装夹持器部件,先将滑动块插入导轨再用连杆将其连接至电位器舵盘即可。


图3-7 夹持器组装参考图


安装好传动部分后,可以在夹持器中间插入一根带弹簧的圆珠笔芯使得滑动块在按压之后能够回弹。


图3-8 回弹装置安装


最后安装底座电位器,同样用热熔胶将电位器固定至图3-9所示位置。


图3-9 底部电位器安装位置


之后将两块3D打印的零件分别固定在机械臂和电位器上。因3D打印件会有一定的公差,安装时若有困难可以适当用热风枪加热材料使其软化。完成安装后用两根铁丝分别连接舵盘两头的小孔,使两者能够平行连动。


图3-10 底部连动舵盘安装


安装完电位器后,在每个电位器上连接两根用于检测电压的信号线。一根信号线连接至电位器中间的针脚,另一根连接至两边任意针脚。为了焊接方便,可将线头插入电位器针脚前端的小孔中。焊接完成后用适当热熔胶塑封防止短路。为了方便区分,可以使用不同颜色的信号线分别连接至对应电位器。


图3-11导线焊接示意图


最后将信号线沿着臂身固定,可使用热熔胶黏贴或魔术贴捆绑,以防止导线与支架互相缠绕。注意导线安装位置不能影响到悬臂运动功能。导线在底座部分整理汇合,用热塑管合流,引出8个线脚。


图3-12 用捆绑带整理导线


至此,悬臂的电位器已全部安装完毕。


图3-13控制臂电位器安装参考图


舵机控制的机械臂安装部分可参考DFrobot 6自由度机械臂DFLG6DOF安装教程,这里因只用到四个自由度,可以将控制夹持器转向的舵机和支撑杆部位的一个舵机卸下。



电路原理


为了测量电位器的阻值变化,我们使用了分压电路。 在串联的电位器和固定电阻两端加上固定的信号电压之后,电位器的阻值变化会引固定电阻的电压变化。

图4-1 电路示意图


为了使得电位器阻值-电压的关系趋近与线性,可以用以下方式求出固定电阻的合适阻值。


参数名称:

R:固定电阻的阻值

r:电位器的阻值

V:固定信号电压

v:固定电阻两端电压


把分压电路的电压公式v=V*(r/(r+R)),带入到曲率公式


并对以固定阻值电阻大小为变量对其求导变可得出曲率变化和阻值的关系。公式中的x为r,y为V*(r/(r+R))。


使得上述方程等于0,所得出的R能让电位器阻值-电压的关系最接近于线性。



程序及调试



程序部分


完整程序如下:

#include

Servo Base;

Servo Joint1;

Servo Joint2;

Servo Grabber;

const int analogInPin1 =A1; // Analog input pin that thepotentiometer is attached to

const int analogInPin2 =A2; // Analog input pin that thepotentiometer is attached to

const int analogInPin3 =A3; // Analog input pin that thepotentiometer is attached to

const int analogInPin4 =A4; // Analog input pin that thepotentiometer is attached to

int sensorValue1 = 0; // value read from the pot

int sensorValue2 = 0; // value read from the pot

int sensorValue3 = 0; // value read from the pot

int sensorValue4 = 0; // value read from the pot

void setup() {

// initialize serial communications at 9600bps:

Serial.begin(9600);

Base.attach(3);

Joint1.attach(4);

Joint2.attach(5);

Grabber.attach(6);

}

void loop() {

// read the analog in value:

sensorValue1 = analogRead(analogInPin1);

sensorValue2 = analogRead(analogInPin2);

sensorValue3 = analogRead(analogInPin3);

sensorValue4 = analogRead(analogInPin4);

// print the results to the serial monitor:

Serial.print('\nBase Joint:' );

Serial.print(sensorValue1);

Serial.print(' Bottom Joint =' );

Serial.print(sensorValue2);

Serial.print(' Upper Joint =' );

Serial.print(sensorValue3);

Serial.print(' Grabber =' );

Serial.print(sensorValue4);

// map the results to servo control parameter

Base.write(map(sensorValue1, 200, 500, 45,150));

Joint1.write(map(sensorValue2, 680, 300, 130,50));

Joint2.write(map(sensorValue3, 800, 400, 30,140));

Grabber.write(map(sensorValue4, 250, 320,180, 80));

}

代码部分仅用到Arduino自带示例中舵机驱动的库,Servo.h。 代码仅涉及到赋值和映射,所以关于C语言原理部分不多赘述。


映射机制


映射机制主要涉及到3个步骤:

1. 通过芯片版的模拟信号输入口读取固定电阻两端的电压。反馈读数应介于是0-1023之间的整数,分别对应0-5V的信号电压。

对应代码:


sensorValue1 = analogRead(analogInPin1);

sensorValue2 = analogRead(analogInPin2);

sensorValue3 = analogRead(analogInPin3);

sensorValue4 = analogRead(analogInPin4);

此段代码作用为读取各个模拟口数值并赋值给对应整形参数。


2. 基于舵机初始的安装朝向,将悬臂处于不同位置所对应电位器的电压值映射至想要的舵机角度参数值。


3. 最后将参数值以PWM的形式从数字输出口输出,以控制舵机运动。

对应代码:


Base.write(map(sensorValue1, 200, 500, 45, 150));

Joint1.write(map(sensorValue2, 680, 300, 130, 50));

Joint2.write(map(sensorValue3, 800, 400, 30,140));

Grabber.write(map(sensorValue4, 250, 320,180, 80));

代码中的map() 函数用于将模拟接口读数映射至舵机角度参数,XXX.write() 函数将控制参数输出值对应数字信号口舵机。


参数设定及调试方法


机械臂的控制参数仅涉及到程序中映射函数部分。


根据映射机制,参数设定可按如下步骤进行:

连接好电路后,将主控板通过USB数据线连接至电脑,打开arduino IDE程序,复制完整程序至窗口中,选择对应主控板型和COM端口号并上传代码。


程序正常运行之后打开串口监视器,注意监视器频率应与代码 Serial.begin(9600); 中的频率一致。监视器滚动的数据即是和电位器串联固定电阻的电压读数,从左至右分别对应于底座关节,下关节,上关节和夹持器。


图5-1 串口监视器


因读数与悬臂转轴角度的关系可以近似为线性,我们可以简单的取一些悬臂运动角度的关键点来确定映射函数中的参数。这里关键点可以选择中点或是端点。举个例子,将机械臂沿底座关节旋转至最左端并记录下数值,再旋转至最右端并记录下数值,这两个数值就可以作为映射函数中的映射端的两个极点参数。


接下来将悬臂分别拉伸至这些关键点,根据舵机的安装的初始位置在映射函数中输入对应舵机角度参数使得舵机达到这些角度即可。若出现舵机因工作角度限制无法到达要求的角度,可将舵机轴从舵盘中取出,重新调整方向插入后再作尝试。


因关系非完全线性,如果要求更高的映射精度,可以使用分段映射的方法作拟合。


视频请点击“查看原文”查看


本文由Luna编辑整理 转载请注明出处!



DFRobot创客社区

邀你一起分享创造的喜悦!


每周二:原创创客小趣文
带你了解Maker的乐趣和有趣资讯

每周四:原创开源教程
带你轻松玩转有趣的开源项目
————————————————




快来分享你的项目

www.dfrobot.com.cn


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多