基于Arduino的可移动抓取机械手设计

目 录

摘 要 I
Abstract II
引 言 1
1 系统总体设计方案 3
1.1 设计方案及流程 3
1.2 舵机的选择 5
1.3 遥控系统的选择 6
1.4 移动系统的选择 8
1.5 电源系统的选择 9
2 系统的硬件设计 11
2.1 整体的组成与安装 11
2.2 可移动的抓取机械手设计 15
2.3 Arduino开发平台 18
2.4 Arduino扩展板模块介绍 20
3 系统的软件设计 24
3.1 Arduino开发环境 24
3.2 软件设计流程 24
4 系统调试 29
4.1 系统硬件测试 29
4.2 系统软件测试 32
结 论 33
参考文献 34
附录1 源程序清单 36
致 谢 44

摘 要

本设计是基于Arduino的可移动的抓取机械手设计,开发平台使用的是Arduino。随机时间的推移,机械手变得越来越智能和人性化,智能化的机械手减少了生产需要的时间和金钱,从而减轻工人们的劳动强度给工人们增加了许多休息时间。现在机械手发展的工作效率越来越高、工作准确度越来越高、操作越来越简单,变的越来越智能和易用。
本设计的可移动机械手为四自由度,而且整体可以移动,机械手各个关节之间实现前后、上下、左右移动和钳子的打开和闭合,整体可以前后左右移动,从而实现对指定目标的抓取和运输到指定地点。硬件系统的核心部件是Arduino主板。使用PWM控制直流减速电机进行整体的移动的速度和方向,机械手部分的舵机连接在舵机控制板实现控制。软件在Arduino IDE中编写可移动机械手的程序,PS2手柄发送命令,手柄接收器负责接受手柄发送来的命令,Arduino输出脉宽不相同的信号来控制整体机械手部分的转动。操作步骤是:PS2手柄发送控制命令信号,遥控接收模块接收到来自手柄的指令信号在通过串口把信号传给Arduino主板,Arduino 主板判断应该实行什么操作后,将控制信号传给舵机驱动板驱动机械手部分的舵机转动,实现控制可移动机械手对指定一个物体的抓取。

关键词:Arduino;舵机;机械手;遥控

Abstract

Based on the design of the Arduino-based manipulator, the popular open source Arduiuo control system is adopted as the development platform. The mechanization and automation of the manipulator greatly improved the efficiency and standardization of the industry, and greatly saved the production cost and reduced the labor intensity of the workers. At present, the performance of manipulators is gradually developing toward high speed, high precision, high reliability and ease of operation. The focus is on high repeatability and high accuracy. The manipulator of this design has four degrees of freedom, and the joints can be rotated back and forth, up and down, left and right, and the closing of the pliers between the joints to achieve the grasping of the specified object. The hardware design uses the Arduino UNO hardware platform as the core component. It uses PWM technology to control the start and stop, speed and direction of the manipulator for the DC motor. The servo driver board simulates the manipulator control system of the human arm. The software design compiles the manipulator motion control program in the Arduino IDE. The ps2 handle and the receiving module send control commands and return to the command state. The steering angle of the steering gear is controlled by the Arduiuo control board to output signals of different pulse widths. The specific operation steps are: use the ps2 handle to send the control command, the remote control receiving module receives the command and transmits the signal to the Arduino UNO board through the serial port. After the Arduino UNO makes the judgment operation, it transmits the signal to the servo drive board to drive the servo to rotate The manipulator grabs the specified object.

Keywords: Arduino; steering gear; manipulator; remote control

引 言

随着时间推移社会不断进步科学技术不断的高速发展,机械手在我们生产生活方面越来越重要,各种各样的机械手被制作出来用于我们的生产生活。机械手在复杂、枯燥单一操作和各种恶劣和特种环境下,人类的效率和准确性远远不如机械手。机械手在生活处于一个重要的地位。生产质量和生产效率也因为机器具有一致的表现性所以得到了很大的提升。具有一致表现性的自动化也被叫做“刚性自动化”。刚性自动化有一个致命的缺点就是只能执行一个任务,改变执行任务类型就不得不去更换相对应的零件。刚性自动化的这个缺点以及相对来说的高成本性导致了一个全新的机器诞生:机械手。美国机器人工业学会将机械手定义为可以通过预先编订不同的程序去处理各种各样的任务,可以执行如搬运材料、零件、工具或者特定的设备等任务,具有可重复编程、多功能的特点[2]。
人类社会的经济和科技水平在不断的提高,机械手的开发成本也是在一直下降。国内人力劳动力成本一直再增加,在所有行业里,研发出代替人类的机械手也越来越成为提升行业竞争力的重要手段。本课题研究了可移动的抓取机械手设计,为了降低生产成本,提高生产效率并希望由此设计能更好地引导人们设计出符合各自行业应用方向的机械手。
机械手提高了生产效率,机械手比人的工作效率高出太多,机械手可以全天二十四小时不间断工作,但是人需要吃饭休息机器不需要,原先需要好几个人甚至好几十个人干的工作,现在有了机械手只需要一个机械手就可以完成这些工作。
机械手还可以代替人去一些危险性特别高的工作环境,比如在高温环境、高压环境、辐射环境等,用机械手代替人去这些环境工作,可以保护人类的安全。
机械手的工作精度和工作强度也是人无法比拟的,机械手可以做到比人更精确的工作,比如一些电焊机械手,机械手也可以做到人无法做到的,比如搬运大件货物等。
人们现在加大力度研究机械手就是因为它的这些特性,提高了生产的自动化水平,从而降低了生产时需要的成本。改善了工人们的工作条件,把危险的工作交给机械手来做,降低了工作人员的受伤几率,从而也是降低了生产需要的成本。三是减少了人力需求,不但生产效率变的比以前高而且降低了劳动人员开销,间接的降低了生产成本。
现在机械手研究是国内外的热点项目,在国外机械手是在各个国家经历二战之后所有产业百废待兴,从而机械手大幅度高速的发展。机械手的前身是主从式机器人,经过不断地发展演变成现在的机械手。研究的现状和趋势如下:机械结构向模块化、可重构化发展,由关节模块、连杆模块用重组方式构造机器人整机。[1]大体是两个方向:其一是现在的机械手传感器数量、控制器数量和控制算法变得愈来愈多;其二是与生产加工相联系,满足相对具体的任务的工业机器人,主要采用性价比高的模块,在满足工作要求的基础上,追求系统的经济、简洁、可靠,大量采用工业控制器,市场化、模块化的元件[22]。
本设计为基于Arduino的可移动机械手设计。Arduino为开发爱好者提供了更便利简洁的开发平台。整个平台由硬件和软件两个部分组成,其中硬件部分包含微控制器、电路板等,软件部分主要是在C/C++语言的基础上的IDE集成开发环境,开发人员可以快速适应从而开发自己需要的产品。Arduino的环境对开发人员比较友好,更便捷地完成项目的开发工作。因为Arduino的开源和简单降低了我们开发的时间。机械手的自由度是机械手设计的至关重要的参数的表现。控制系统是使用Arduino UNO编程设计的,从而实现可移动机械手的运动和手部的抓取功能。
第一章说明了系统的方案设计,主要阐述了系统的功能和设计目标,并根据设计目的选择合适的设备。
第二章介绍了可移动抓取机械手的硬件设计,其中包含各个模块的设计原理。本章重点介绍了可移动机械手的电路设计,以及手柄与设备之间的控制方法。
第三章讲述了系统的软件设计;简要介绍了系统的开发环境以及重要函数和系统流程图。
第四章是可移动机械手的调试部分,包括了系统的硬件测试以及软件测试,并就本设计出现的问题,做了简单的论述以及解决办法。

1 系统总体设计方案

1.1 设计方案及流程
1 .1. 1设计方案
机械手的抓取和机械臂移动是最主要的功能,对机械手的设计和实际应用非常重要。因为移动和抓取这两个功能实现的前提是基于机械结构的设计和伺服控制驱动的配合才能完成的。结构合理降低空间的使用,也减轻了机械手的重量,简化了机械手系统设计的复杂性使可靠性加强,所以模型构造对于机械手的性能是十分重要的。机械手的结构设计包括了关节自由度和关节的大小。本设计的机械手自由度数被设定为4个自由度。机械手有控制部分、驱动部分、执行部分。手腕、支架和底座是机械手的执行部分,用于调整机械手的位置和方向。底座是固定的,底座是承担这个设备的重量。控制部分使用Arduino,用于对机械手的整体运作控制,实现机械手抓取目标的功能。对可移动机械手建立平面模型,设计电路。机械手驱动部分是输出一个PWM波控制舵机的运动,从而控制每个关节的位置。如图1. 1所示为机械手的关节运动图。

在这里插入图片描述

图1.1 机械手臂关节运动图
移动部分是完成整体功能必不可少的一部分,移动系统需要能够承载机械手部分整体重量而且还等能自由移动,所以机械手的移动部分是十分重要的。所以移动部分使用双H桥电路驱动,能够同时驱动两个电机,使能ENA ENB之后,能够分别从IN1、IN2信号驱动电机1的转速和方向,可以IN3、IN4输入PWM信号驱动电机2的转速和方向[7]。
移动部分等效电路图如1.2所示。

在这里插入图片描述

图1.2 等效电路图

1 .1. 2设计总流程
机械手是自动化工业发展的产物。工业生产需要高机动和高灵活性的设备,它是机电设施产业的典范代表之一。机械结构和电气结构构成了机械手。机械系统是由连杆、旋转接头和其他单元串联连接形成的串联开链式结构。组成机械手的转动轴的连接点是相互平行或垂直的,轴与轴之间的连接是带动连杆相对运动。
电气系统就是其功能运作的控制中心,它由一个单片微机系统,一个伺服控制板和一个舵机系统组成。
微控制器系统包括主控制器、复位电路、晶体振荡电路、按键电路、电源模块等,是用来负责发出机械手的控制指令,驱动机械手准确的接受命令工作。
舵机控制板是基于Arduino平台的开源硬件板。伺服控制板主要是响应微控制器系统发出的控制命令,并放大控制器发出的控制信号信号驱动各舵机做出相应动作。
转向器系统包含了四个舵机:底座舵机、肩部舵机、肘部舵机、腕部舵机四个舵机,用于模仿人类手臂转动,肩部舵机,肘部舵机和腕部舵机四个舵机相互配合运动,确保了机械手的手臂四个自由的要求。
移动系统由4个直流减速电机和驱动器组成,用于负责整体的加速、减速、转向功能实现。
遥控系统是由手柄和接收器构成,控制整体的移动和机械手的动作。
电源系统是由锂电池组成,负责整体的供电。
本课题的软硬件实物的运作流程为:第一步,打开PS2手柄,发送控制命令。第二步,遥控接收模块收到指令经过串口把信号传给Arduino板。 第三步,把要执行的程序传给舵机驱动板和电机驱动板,驱动舵机和电机转动,实现机械手的设计任务。
1.2 舵机的选择
舵机是由一个小型直流电机,一个齿轮组一个可调电位器和一个控制板组成,通过闭环控制控制器机电机构的工作[3]。
选用舵机需要看设计所需要的的尺寸大小、强度要求和速度要求,一般舵机的尺寸越小,舵机传速速度越大,有大的强度输出。如果舵机尺寸是不变的[4],一般由两个因素来衡量舵机的性能,旋转500转所需的强度和时间。舵机的速度大约是0.18s,即就是它的工作最基本的要求是至少0.18s来旋转500次。力矩输出大小和齿轮的材料是决定性能的主要因素。因为当舵机在运行时,失速会导致舵机损坏。把塑料齿轮放在损坏的位置,这样就会减小损失。小型舵机是比较容易出故障的,因为它的齿轮很小,所以使用者要结合自身使用环境来选取合适的舵机。
选择和舵机的另一个条件是看舵机是否具有滚珠轴承。与其他轴承相比,有滚动轴承的舵机比没有滚珠轴承的舵机动力更强、更坚固耐磨、噪音小的优势比其他类型的舵机的适用性更强。
方案一:使用SG5010舵机。SG5010尺寸为41×20×38mm、重量41g、转动速度0. 20秒/60度、扭矩拉力5.2kg/cm、工作电压:4.8V。
方案二:使用MG958舵机。MG958尺寸为40.7×19.7×42.9mm、重量55g、转动速度0.18秒/60度、扭矩拉力18kg/cm、工作电压:4.8V。
方案三:使用MG90S舵机。MG90S尺寸为22.8×12.2×28.5mm、重量13.4g、转动速度0.10秒/60度、扭矩拉力1.8kg/cm、工作电压:4.8V。
综上所述SG5010虽然整体参数和性能达到需求,但是体积太大了不满足本设计需求。MG958是这里所有参数性能最好的,但是价格太过高昂。所以本设计选取了满足需求而且价格低廉的MG90S舵机。
本课题舵机部分的设计采用了MG90S型舵机,MG90S舵机的工作电压为5V,速度和扭矩都满足机械手部分的需求,转动角度小于180度,能够实现抓取物体和移动物体的要求。舵机实物图如图1.3所示
在这里插入图片描述

图1.3 MG90S舵机

1.3 遥控系统的选择
遥控系统能对相隔一定距离的被测对象进行控制,并使其产生相应的控制效果的系统。由信号产生装置、传输设备、执行装置组成。
方案一:使用蓝牙设备。蓝牙适用的设备多,而且工作频段广,抗干扰能力强,但是传输距离短,主要工作范围不超过5M,且价格也比较高。
方案二:使用PS2手柄。手柄虽然适用设备单一,工作频段单一,但是抗干扰能力强,传输距离长最高可达25M,价格也很便宜。
综上所述所以我选取PS2手柄。因为PS2手柄价格低廉,抗干扰能力强,最远距离可达25m完全满足本设计的要求。
PS2手柄遥控由PS2手柄与PS2专用手柄接收器组成,PS2手柄发送遥控需要按下的按键信息;PS2手柄专用接收器与微控制器相连,用来接收PS2手柄发来的按键信息,然后把手柄的按键信息传递给微控制器,微控制器也可通过PS2手柄专用接收器,向PS2手柄发送信息,用来配置手柄的发送模式。
接收器图片如1.4所示。
在这里插入图片描述

图1.4 接收器
接收器引脚序号如图1.5所示。
在这里插入图片描述

图1.5. 接收器引脚序号

通讯时序如图1.6所示。
在这里插入图片描述

图1.6. 通讯时序
在通信过程中,一串数据通信完成后CS端口才会由低电平转为高电平。
1.4 移动系统的选择
移动系统是由电机、电机驱动板和轮胎组成。负责让整体可以进行多角度的抓取,抓取后把物品运输到目标地点。
方案一:选取直流电机和L298N驱动板。直流电机是能将直流电能转换成机械能的旋转电机。它是能实现直流电能和机械能转换的电机。L298N是一种双H桥电机驱动芯片[6]。
方案二:选取直流减速电机和L293D驱动板。直流减速电机比直流电机转速更低力矩变大。L293D也是一种双H桥电机驱动芯片。
综上所述我们选取直流减速电机,因为本设计不需要速度方面的需求,而是需要较大转矩。所以选取直流减速电机。电机实物图为1.7
在这里插入图片描述

图1.7 电机实物图
电机驱动板的作用是控制直流减速电机,从而来实现对直流减速电机占空比的控制,来达到对直流减速电机怠速控制的方式。
虽然L298N在输出电流性能指标比L293D好,但是L293D的性能也能满足设计需求,而且价格比L298N低特别多,所以选取L293D。图1.8为L293D的实物图
在这里插入图片描述

图1.8. L293D实物图
1.5 电源系统的选择
在电路中,电源是整个电路的基础没有电一切的设备都将无法运行,电源是将其他的能量转化成为电路所需的电能,电源是向电子设备提供功率的装置,也称电源供应器,它提供所有部件所需要的电能。电源功率的大小,电流和电压是否稳定,将直接影响部件的工作性能和使用寿命[8]。
方案一:使用5号干电池来供电。5号电池直径15mm,高度45mm,电池电压1.5V,容量为1000mAh,不可充电。
方案二:使用18650锂电池。常见的18650锂电池电压为4.2V,容量2000 mAh。18650电池寿命理论为循环充电1000次以上。
综上所述可以选择5号电池来组成电池组来给设备供电,但是这样不但续航时间短,而且使用大量的一次性电池也不环保会造成环境污染。所以我选择18650锂电池。图1.9为18650锂电池实物图
在这里插入图片描述

图1.9 18650锂电池实物图

2 系统的硬件设计

2.1 整体的组成与安装
可移动机械手的主体结构是由一套亚克力外壳、4个MG90S舵机驱动机械手、4个DC3V-6V130直流减速电机驱动整体、Arduino UNO、Arduino扩展板、遥控模块、电源模块组成。
机械手部分是由4个MG90S舵机和亚克力外壳组成。机械手1号舵机位于机械手的底座上,控制底座旋转。2号舵机位于机械手的左侧,并控制机械手上下移动功能。3号舵机位于机械手的右侧,控制机械手的前后移动功能。4号舵机位于机械手的钳子部位,用于控制抓住物体时机械手的钳口的打开和关闭功能。关节的动作是依靠舵机的运动,所以本设计的机械手共有4个舵机,其中每一个舵机为一个活动枢纽关节。图2.1所示为机械手部分的实物图。
在这里插入图片描述

图2.1. 机械手部分
移动部分4个DC3V-6V130直流减速电机、亚克力底盘和4个轮子组成。每一个直流减速电机对应一个轮子,同时正反转动实现整体的前后移动,通过差速使一侧两个电机转动来实现转弯。图2.2所示为移动部分的实物图。
在这里插入图片描述

图2.2. 移动部分
Arduino UNO、Arduino扩展板、遥控模块电源模块组成依次组装在底盘上然后接线。图2.3为Arduino UNO,图2.4为Arduino扩展板,图2.5为遥控模块,图2.6为整体实物图。
在这里插入图片描述

图2.3. Arduino UNO部分
在这里插入图片描述

图2.4. Arduino 扩展板部分
在这里插入图片描述

图2.5. 遥控模块
在这里插入图片描述

图2.6. 整体图

2.2 可移动的抓取机械手设计
2 .2. 1机械手模型设计
本设计的可移动机械手的机械手部分是由四个舵机控制的机械手。舵机1控制底座部分负责机械手的旋转功能,舵机2控制机械手左部分机械手上下移动,舵机3控制机械手右部分的前后移动,舵机4控制机械手的爪子负责开合抓取物体。
2 .2. 2移动部分设计
本设计的移动部分是由两个L293D驱动芯片驱动四个DC3V-6V130直流减速电机。电机1控制左前轮,电机2左后轮,电机3右前轮,电机4右后轮。电机部分电路图如下图所示。
在这里插入图片描述

在这里插入图片描述

图2.7. 电机电路图

2 .2. 3控制系统设计
本设计的可移动机械手的控制系统使用Arduino。可移动的抓取机械手有四个关节和四个轮子,每个关节能够自由转动相应的角度,每个轮子负责整体的移动。手臂转动由四个转向齿轮驱动,实现对指定物体的抓取动作。轮子转动由四个直流减速电机驱动,实现各个方向的移动。
利用Arduino微控制器的PWM端口发生波形,编写和控制可移动的抓取机械手的运动和抓取程序和移动程序,完成对舵机和直流减速电机的控制调用。可移动的抓取机械手采取点控制的控制方式,简化了电路和构造复杂度。舵机不同时控制,从而降低了舵机执行命令时的影响,提高了整体的稳定性。电路图如图2.8所示

在这里插入图片描述

图2.8. 电路图

2.3 Arduino开发平台
2 .3. 1 Arduino硬件平台
Arduino体系由硬件和软件两个部分,硬件为Arduino主板,软件是Arduino IDE。ATmage微处理器和电路板组成Arduino主板。使用Arduino IDE来编译程序,在使用专用数据线把程序下载到Arduino主板。Arduino主板就会执行预先编写好的程序。
Arduino主板是一个简单开源的平台,微处理器是Arduino主板的核心部件,扩展接口多且可以重复编写程序。Arduino微控制器的特点是:I/O性能强大,可以用直流电源和USB供电,可外接红外探测、蓝牙、WiFi、马达驱动、LED、温度探测等模块。蓝牙和WiFi的可扩展性完成了与外部设备的无线通信[9]。如图2.9所示为Arduino控制器。
Arduino的主要特点有:
(1)软硬件开源,资料都可以在网上找到,根据需求进行编写程序;
(2)核心部件微处理器价格低廉;
(3)扩展性强,Arduino提供了丰富的接口[10]。
在这里插入图片描述

图2.9 Arduino控制器

2 .3. 2 Arduino最小系统介绍
ATmega328p是Arduino UNO的微控制器。它是由14个数字I/O引脚、6个模拟量输入、1个16MHz的陶瓷晶振、1个USB接口、1个电源模块、1个ICSP头和1个复位按键构成[11]。用USB数据线就可以传输数据。另外,Arduino UNO有一个复位保险丝,复位保险丝能保护电路不被烧毁。不可否认的是,随着技术的发展,大多数电脑都会有自身的内部保护系统,但保险丝提供了额外的保护层,双重防护让开发者可以在开发过程中万一遇到意外可以将损失降到最小。另外,当USB端口的电流大于500mA,这时将会触发保险丝,它就会强行断开电路。如下为Arduino最小系统的结构的详细介绍:
(1)9V直流电源输出,让Arduino控制板驱动舵机正常运作;
(2)一个USB端口,可以在端口下载程序或者为整体供电驱动一些低功耗设备;
(3)14个数字I/O,端口0、1分别接到Atmage328p的串行引脚,用于TTL串行数据的传输,端口2、3收取外部信号实现外部中断,端口3、5、6、9、10、11用于电机PWM调速,端口10、11、12和13可进行SPI通信,端口13接了一个LED灯,用于检测电平的变动[12];
(4)6个模拟I/O,端口4、5用于I2C通信[12];
(5)1个5V直流输出和1个3.3V直流输出,作为电路的直流电源;
(6)1个复位接口。
2.4 Arduino扩展板模块介绍
2. 4. 1 L293D驱动电路介绍
L293D四倍高电H桥驱动程序。L293D的驱动电流是0.8A,电压范围5V~25V。L293D兼容一切的TTL输入。每个输出都是推拉式驱动电路,启用 1,2 EN驱动器和 3,4 EN驱动器。1,2EN为1和2的使能端(高电平使能);3,4EN同理用适当的数据输入端,每对驱动程序的模式一个完整的H桥可逆驱动器适用于电磁阀或电机应用。 L293D外部输出为高速钳位二极管,应用电感的瞬态抑。VCC1和VCC2分开,提供逻辑输入,以尽量减少设备功耗[13]。L293D的工作温度是从5℃至65℃引脚图如图2.11所示
在这里插入图片描述

图2.11 引脚图
2 .4. 2 舵机的工作原理及控制方式
舵机,英文名Servo。直流电机、齿轮或齿轮组、电位器、控制电路是舵机的组成部分。舵机的控制原理是检测旋转轴输出角度发送到控制器,然后接收控制器发送来的脉冲信号从而来控制舵机。随着舵机转向轴的偏转,舵机内部的电阻发生变化,控制电路通过分析电阻的变化来驱动舵机。舵机里的齿轮把输出的转矩放大数倍。齿轮组末端连接电位计用于测量旋转轴的角度,舵机根据控制器发出的命令达到一个特定的角度。
齿轮组和直流电机就是一个舵机。在增加一个电位器和控制器,控制器控制舵机转动角度,电位器实时检测舵机防止发生过载,这样可以精确地传输控制舵机的转动位置。这种直流电机控制称为电机闭环控制。外部脉冲信号以脉宽为1~2ms之间的变化给舵机,正好舵机内部信号源的脉冲信号宽度也是1~2ms,极性和输入的脉冲信号是相反的这样的方式就可以计算出正、负的值,从而确定舵机的方向[4]。如图2.12为舵机内部实物图。
在这里插入图片描述

图2.12 舵机实物图
舵机的三条电线分别是电源线、地线和信号线。电源线是负责整体的供电,供电电压为5V。信号线用于传输脉冲信号,高频信号需要传输1~2ms,低频信号需要传输5~20ms,舵机为了保持自己位置,则必需每20ms接收一次高率信号。随着信号脉宽的改变,控制转向轴改变位置。输入脉冲信号的宽度通过舵机转向轴的旋转角度线性修改[4]。如图2.13为舵机信号图。
在这里插入图片描述

图2.13 舵机信号图
Arduino扩展板可以同时操控4个舵机,自动识别波特率,存储多种动态程序等功能。Arduino驱动板与舵机系统相连[14],分别是舵机地线、舵机电源线和舵机信号线,扩展版上的电源接口用来给舵机供电。如图2.14为扩展板实物图。
在这里插入图片描述

图2.14 扩展板实物图
本设计的可移动机械手需要四个舵机。舵机原理图的设计有4个接插件,每个有三个接口分别为,电源、地、信号端。如图2.15为舵机电路图。
在这里插入图片描述

图2.15 舵机电路图
2 .4. 3 遥控模块设计
遥控模块连接到Arduino扩展板上,而后打开手柄,接着手柄与接收器进行配对。连接方式为:遥控模块的电源接口接到Arduino扩展板的3.3V,GND接Arduino的GND,CLK接Arduino扩展板的P34,CS接Arduino扩展板的P35, CMD接Arduino扩展板的P37,DAT接Arduino扩展板的P36。Arduino IDE实现程序代码的编写,手柄与接收模块之间发送和返回字符指令来完成信息传输。DAT为数据线data引脚,CMD为命令command引脚,VCC为电源模块引脚,GND为地线引脚,CS为注意attention引脚,CLK为时钟clock引脚。接收模块如图2.16所示。接线图如图2.17所示。
在这里插入图片描述

图2.16 接收模块
在这里插入图片描述

图2.17 接线图

3 系统的软件设计

3.1 Arduino开发环境
Arduino IDE跨平台而且兼容性高。Arduino的软件和硬件都是开源的,用户可以随意的进行二次开发,而且上手十分简单,特别容易编写自己需要的程序。Arduino IDE的界面十分简洁,界面右上角的是串行监视按钮,可实时监测硬件和计算机之间的传输数据。界面底部的窗口会显示程序状态和错误信息。如图3.1为Arduino IDE的编程界面。
在这里插入图片描述

图3.1 Arduino IDE的编程界面
3.2 软件设计流程
Arduino控制板首先要进行初始化操作,定义引脚、函数,然后对串口进行判断处理,是否有数据传来[15]。控制端的软件流程图如图3.2所示。
加粗样式
图3.2 控制端软件流程图

基于Ardunio的程序都可以被分解为三个部分:结构、值和函数。Arduino语言包含但是不包括main主函数,有“setup()”和“loop()”两个函数。“Setup()”函数的功能就如同他的英文意思是主体程序初始化,“Setup()”函数用于系统上电、系统复位、设置波特率和获取时间等。“loop() ”函数则是在“setup() ”函数执行结束后,然后是程序的主体部分,“Setup()”函数初始化结束后开始运行循环程序就这样一直循环执行下去。本程序中Setup()函数的流程图如图3. 3所示, InitServoPort()函数的流程图如图3. 4所示。
在这里插入图片描述

图3.3 Setup() 函数流程图
在这里插入图片描述

图3.4 初始化舵机控制端口流程图
本设计使用了4个舵机,定义了4个舵机对象我们这里只说明了一个舵机的程序控制流程,完整的程序见后面附录1。第一我们要定义舵机对象:Servo servo 1;然后把舵机与和他主板上对应的引脚相连接:myservo l . attach(1) ;连接的是1号舵机,给舵机设置一个初始角度,舵机上电就会转到设置的初始角度这里给的初始角度是85度:myservo l . write(85);本设计采用4个舵机分别用来控制机械手的前后、上下、左右以及钳子部分的动作。软件的设计构思与流程如图3.5所示。
在这里插入图片描述

图3.5 舵机软件设计流程图
整体能完整的工作是必须得和遥控手柄之间相互通信配合来完成的。本设计中,手柄的作用是用来发送命令,接收器则是接收从手柄端发送过来的命令,进行双方的信息传输。所以在Arduino IDE中编译好整个代码,代码没有问题后, 下载到微控制器中,并连接好接收所有设备。
手柄时钟频率260KHz(4us)。在通信中,手柄的一组数据传输通信完毕后CS端口才会由低电平转为高电平,在通讯期间,CS端口是处于低电平状态。在时钟下降沿时,接收器完成通讯数据的发送和接收,发送数据和接收接收是同时完成的。当微控制器读取命令时,将会拉低CS端口电平,拉低电平之后发送一个0x01的命令;手柄接收到来着接收器的0x01命令会回复手柄处于的ID模式“0x41=绿灯模式,0x73=红灯模式”;在手柄发送自己的ID模式的同时,微控制器将传送0x42,请求数据;随后手柄发送出0x5A,告诉微控制器“数据来了”。idle:数据线空闲,该数据线无数据传送。一个通讯周期有9个字节(8位),这些数据是依次按位传送[16]。当有按键按下,对应位为“0”,其他位为“1”,例如当键“SELEC被按下时,Data[3]=11111110B。表3.1为数据意义对照表
表3.1 数据意义对照表
顺序 DO DI Bit0、Bit1、Bit2、Bit3、Bit4、Bit5、Bit6、Bit7
0 0x01 idel
1 0x42 ID
2 idel 0x5A
3 WW data SELECT、L3、R3、START、UP、RIGHT、DOWN、LEFT
4 YY data L2、R2、L1、R1、Δ、○、×、□
5 idel data PSS_RX(0x00=left、0xFF=right)
6 idel data PSS_RY(0x00=up、0xFF=down)
7 idel data PSS_LX(0x00=left、0xFF=right)
8 idel data PSS_LY(0x00=up、0xFF=down)

4 系统调试

4.1 系统硬件测试
在系统中,对于硬件电路的检测主要是看焊接时是否有毛刺、无光泽,电路是否有短路、开路、一些具有方向的元件是否方向弄错、电路设计错误等情况。
照着原理图检查是否有原件漏焊、器件是否出现在实物中和原件方向是否错误。如果发现没有或者对不上的情况下需及时的重新对照确定漏焊时及时的补焊。
对于短路、断路、虚焊这些情况,使用万用表来检测。将数字万用表的挡位旋转到蜂鸣档,如果电路短路,万用表会发出声音。这样我们就可以检测电路问题。在检测部位使用万用表,如果万用表响了,则线路正常,如果万用表不响,则说明电路有问题。电路没问题之后开始整体组装调试,调试过程如下。
机械手抬起如图4.1
在这里插入图片描述

图4.1 机械手抬起图
机械手落下如图4.2
在这里插入图片描述

图4.2 机械手落下图
机械手开启如图4.3
在这里插入图片描述

图4.3 机械手开启图

机械手闭合如图4.4
在这里插入图片描述

图4.4 机械手闭合图

机械手右转如图4.5
在这里插入图片描述

图4.5 机械手右转图

机械手左转如图4.6
在这里插入图片描述

图4.6 机械手左转图

整体移动如图4.8
在这里插入图片描述

图4.1 整体移动图

可移动机械手经过全方位移动和抓取测试,实物电路板与原理图一致,所有元器件的插接、方向均正确,本系统最终实现了所有硬件功能。

4.2 系统软件测试
系统的软件方面由Arduino IDE软件创建,由C、JAVA语言编号的程序,在该软件中生成.ino文件,并通过下载器将其下载到Arduino电路板观察整个系统的状态,然后重复修改调试代码,以得到更完美的程序。图4.9为调试成功
系统软件调试主要遇到以下问题:
(1)无法写入程序。
解决方法:发现主板型号设置错误修改主板型号为R3就解决了该问题。
(2)向Arduino内部写入程序发现无法遥控主体。
解决方法:通过使用Arduino IDE进行观察发现手柄的默认接收频率设置错误,然后在Arduino IDE修改了默认频率,并解决了该问题。
在这里插入图片描述

图4.9 软件调试成功图

结 论

本设计为基于Arduino的可移动的抓取机械手设计,具体设计步骤为:第一步确定所选的课题并且确定要研究的内容,第二步查询相关资料,制定相应的方案。第三步按任务书确定硬件配置,设计系统结构。第四步是设计电气原理图,按要求编写程序,并且软硬件联调实现机械手的设计功能。对于本设计的模块分为:亚克力板搭建的模型、Arduino UNO控制板、扩展板、舵机和电机以及接收模块构成。而最终的功能实现便是通过联调各个模块,实现功能设计,实现机械手的抓取。本设计因为前期设计方案的不完整性出现了很多问题,舵机不能正常控制机械臂转动到设定的位置及方向、舵机的抖动、手柄不能识别信号不能进行配对连接等问题。最后反复查阅大量资料后 这些设计上的问题都得以解决。
最终完成的可移动的抓取机械手设计,实现了移动到指定位置对物体的抓取功能,本设计的机械手可能实际的应用范围比较窄,也有很多不足,只能单一的实现对小型物体的抓取。所以后续还有更多改进的地方,机械手也还可以更加智能化,与声音、光、图像等传感器组合在一起。

参考文献

[1] 邓巍. 教学工业机器人计算机控制系统的设计[D]. 华北电力大学,2002. 73-79
[2] 张涛, 王炎. 基于微控制器和Arduino平台的六自由度可控机械手臂[J]. 电气自动化, 2016, 38(6) : 97-99
[3] 伯秀秀. 小型混合式无人机动力系统研究[D].安徽: 安徽大学,2018. 91-94
[4] 王俊杰. 基于Arduino和数字识别的机械臂书写数字技术研究[D].北京工业大学,2016. : 85-89
[5] 刘颖 ,李晓龙.单片机与PC手柄的通信[J].电子世界,2003(01): 38-39.
[6] 李秀玲,魏保立.机械手电机驱动模块设计[J].装备制造技术,2013(09): 25-27+34.
[7] 韩韶清. 路面平整度快速检测车的研究与设计[D].长安大学,2015.1-10
[8] 江宁聪,郭迪,周鑫宇,赖志耀,李慧霖.新型电力抗干扰电源的设计[J].数字通信世界,2018(11):174-175
[9] 蔡睿妍. 基于Arduino的舵机控制系统设计[J]. 计算机工程应用技术, 2012, 8(15) : 3719-3721
[10] 汪婉君. 基于Android/Arduino平台的智能蓝牙引路系统的设计与实现[D].西安电子科技大学,2014. 53-56
[11] 贺娅莉,谢娟娟.微信控制开关在卷闸门中的应用设计[J].科技风,2018(10):1.
[12] 马明. 基于可佩带传感器的人员自主定位技术研究[D].国防科学技术大学,2013. 45-56
[13] 唐勇,黄荣博,藏俊.牙科综合治疗机痰盂自动避让控制系统设计[J].数字技术与应用,2015(10):14.
[14] 王洪斌,李程,王跃灵,刘鹏飞.基于Arduino和蓝牙技术的六足机器人控制系统设计[J].黑龙江大学自然科学学报,2015,32(04):533-537
[15] 刘峰. 基于飞行摇杆无线控制的机器人手臂系统的设计与实现[D].云南大学,2016. 15-16
[16] 李传达. 移动侦察机器人设计与实现[D].云南大学,2017.
[17] 杨新. 电子设计从零开始[M]. 北京: 北京清华大学出版社, 2005.6:155-262
[18] 杨宝清. 实用电路手册[M]. 北京: 机械工业出版社, 2003.7: 621-627
[19] 姚福安. 电子电路设计与实践[M]. 山东: 山东科学技术出版社, 2002.1:105-118
[20] 张庆双. 电子元器件的选用与检测[M]. 北京: 机械工业出版社, 2002.10:1-110
[21] 康华光. 电子技术基础数字部分[M].北京: 高等教育出版社, 2008.2:17-33
[22] 冯毅. 摆动式机械手机构运动与PLC控制的研究[D].沈阳: 沈阳工业大学, 2011. 15-23

附录1 源程序清单

#include “PS2X_lib.h” //for v1.6
#include <Wire.h>
#include <Servo.h>
/******************************************************************

  • set pins connected to PS2 controller:
    • 1e column: original
    • 2e colmun: Stef?
  • replace pin numbers by the ones you use
    ******************************************************************/
    #define PS2_DAT 6
    #define PS2_CMD 5
    #define PS2_SEL 4
    #define PS2_CLK 3

/******************************************************************

  • select modes of PS2 controller:
    • pressures = analog reading of push-butttons
    • rumble = motor rumbling
  • uncomment 1 of the lines for each mode selection
    ******************************************************************/
    #define pressures true
    #define rumble true

PS2X ps2x; // create PS2 Controller Class

//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you connect the controller,
//or call config_gamepad(pins) again after connecting the controller.

int error = 0;
byte type = 0;
byte vibrate = 0;

int lx = 0;
int ly= 0;
int L_Speed = 0;
int R_Speed = 0;

Servo myservo1,myservo2,myservo3,myservo4; // create servo object to control a servo
const int SERVOS = 4; //舵机数4个

const int ACC = 10; // the accurancy of the potentiometer value before idle starts counting
int value[SERVOS], idle[SERVOS], currentAngle[SERVOS], MIN[SERVOS], MAX[SERVOS], INITANGLE[SERVOS], previousAngle[SERVOS],ANA[SERVOS];

int Left_motor=8; //左电机(IN3) 输出0 前进 输出1 后退
int Left_motor_pwm=9; //左电机PWM调速

int Right_motor_pwm=10; // 右电机PWM调速
int Right_motor=11; // 右电机后退(IN1) 输出0 前进 输出1 后退

void setup(){
Serial.begin(57600);

myservo1.attach(2); //手爪电机
myservo2.attach(7); //上臂电机
myservo3.attach(12); //下臂电机
myservo4.attach(13); //底座电机

//-----电机IO口定-
pinMode( 8, OUTPUT);
pinMode( 9, OUTPUT);
pinMode( 10, OUTPUT);
pinMode( 11, OUTPUT);
stop();
//手爪 Servo
MIN[0] = 10;
MAX[0] = 100;
INITANGLE[0] = 90;

//上臂电机
MIN[1] = 10; // This should bring the lever to just below 90deg to ground
MAX[1] = 140;
INITANGLE[1] = 90; // This should bring the lever parallel with the ground

//下臂电机
MIN[2] = 40;
MAX[2] = 170;
INITANGLE[2] = 90;

//底座电机
MIN[3] = 0;
MAX[3] = 170;
INITANGLE[3] = 90;

//初始化电机
myservo1.write(INITANGLE[0]);
myservo2.write(INITANGLE[1]);
myservo3.write(INITANGLE[2]);
myservo4.write(INITANGLE[3]);

currentAngle[0]=INITANGLE[0];
currentAngle[1]=INITANGLE[1];
currentAngle[2]=INITANGLE[2];
currentAngle[3]=INITANGLE[3];

delay(2000); //added delay to give wireless ps2 module some time to startup, before configuring it
Serial.print(“Search Controller…”);
//CHANGES for v1.6 HERE!!! *PAY ATTENTION
do{
//setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
if(error == 0){
Serial.println(“\nConfigured successful “);
break;
}else{
Serial.print(”.”);
delay(100);
}
}while(1);
type = ps2x.readType();
switch(type) {
case 0:
Serial.println("Unknown Controller type found ");
break;
case 1:
Serial.println("DualShock Controller found ");
break;
case 2:
Serial.println("GuitarHero Controller found ");
break;
case 3:
Serial.println("Wireless Sony DualShock Controller found ");
break;
}
//震动一,说明连接
ps2x.read_gamepad(true, 200); //开启震动
delay(500);
ps2x.read_gamepad(false, 200); //开启震动
delay(300);
ps2x.read_gamepad(true, 200); //开启震动
delay(500);
}

void loop() {
/* You must Read Gamepad to get new values and set vibration values
ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
if you don’t enable the rumble, use ps2x.read_gamepad(); with no values
You should call this at least once a second
*/
ps2x.read_gamepad(false, vibrate); //开启震动

if(ps2x.Button(PSB_START)){         //开始按键
  Serial.println("Start is being held");
  ps2x.read_gamepad(true, 200);
}
if(ps2x.Button(PSB_SELECT))
  Serial.println("Select is being held");      
if(ps2x.Button(PSB_PAD_UP))  //方向按键向上按下
{                 
  Serial.print("Up held this hard: ");
  Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
  forward();
   
}else if(ps2x.ButtonReleased(PSB_PAD_UP))  {   //方向按键向上释放
    stop();      
}
if(ps2x.Button(PSB_PAD_DOWN))   //方向按键向下按下
{            
  Serial.print("DOWN held this hard: ");
  Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
  back();
}
else if(ps2x.ButtonReleased(PSB_PAD_DOWN))//方向按键向下释放
{  
    stop();  
}
if(ps2x.Button(PSB_R1)){                          //侧面开关右R1
  R_Speed = 0;                 
}
if(ps2x.Button(PSB_L1)){                          //侧面开关左L1
  L_Speed = 0;               
} 
if(ps2x.Button(PSB_PAD_LEFT)) //方向按键左侧按下  
{                          
  left();
}else if(ps2x.ButtonReleased(PSB_PAD_LEFT))  //方向按键左侧释放
{    
   stop();
}
if(ps2x.Button(PSB_PAD_RIGHT))   //方向按键右侧按下
{                   
  Serial.println(ps2x.Analog(PSB_PAD_RIGHT));
    right();
}
else if(ps2x.ButtonReleased(PSB_PAD_RIGHT))  //方向按键右侧释放
{   

// Serial.println("PSB_PAD_RIGHT ");
stop();
}
vibrate = ps2x.Analog(PSAB_CROSS);
//this will set the large motor vibrate speed based on how hard you press the blue (X) button
{

}

if (ps2x.NewButtonState()) {        //will be TRUE if any button changes state (on to off, or off to on)
  if(ps2x.Button(PSB_L3))         //左侧L3
    Serial.println("L3 pressed");
  if(ps2x.Button(PSB_R3))         //右侧L3
    Serial.println("R3 pressed");
  if(ps2x.Button(PSB_L2))         //左侧L2
    Serial.println("L2 pressed");
  if(ps2x.Button(PSB_R2))         //右侧R2
    Serial.println("R2 pressed");
  if(ps2x.Button(PSB_TRIANGLE))
    Serial.println("Triangle pressed");   //三角形按键按下     
}
if(ps2x.ButtonPressed(PSB_CIRCLE))
{               
  //will be TRUE if button was JUST pressed
  Serial.println("Circle just pressed");
  openGripper(); 
}
if(ps2x.NewButtonState(PSB_CROSS)) {      // ×键新键改变
  Serial.println("X just changed");
  ps2x.read_gamepad(true, vibrate);       //获取震动值
 }
if(ps2x.ButtonPressed(PSB_SQUARE)) 
{             
  //will be TRUE if button was JUST released
  Serial.println("Square just released");
  closeGripper() ;
}
if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //print stick values if either is TRUE
  Serial.print("Stick Values:");
  Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  
  Serial.print(",");
  Serial.print(ps2x.Analog(PSS_LX), DEC); 
  Serial.print(",");
  Serial.print(ps2x.Analog(PSS_RY), DEC); 
  Serial.print(",");
  Serial.println(ps2x.Analog(PSS_RX), DEC);      
}     

value[0] = ps2x.Analog(PSS_LX);
value[1] = ps2x.Analog(PSS_RY);
value[2] = ps2x.Analog(PSS_LY);
value[3] = ps2x.Analog(PSS_RX);

for (int i = 0; i < SERVOS; i++)
{
if (value[i] > 130)
{
if (currentAngle[i] < MAX[i])
currentAngle[i]+=1;
// Serial.print(“value”);
// Serial.print(i);
// Serial.print(“:”);
// Serial.println(value[i]);
switch(i)
{

        case 0:  myservo1.write(currentAngle[i]);break;
        case 1:  myservo2.write(currentAngle[i]);break;
        case 2:  myservo3.write(currentAngle[i]);break;
        case 3:  myservo4.write(currentAngle[i]);break;
      }   
  } 
else if (value[i] < 120) 
{
  if (currentAngle[i] > MIN[i]) currentAngle[i]-=1;

// Serial.print(“value”);
// Serial.print(i);
// Serial.print(“:”);
// Serial.println(value[i]);
switch(i)
{
case 0: myservo1.write(currentAngle[i]);break;
case 1: myservo2.write(currentAngle[i]);break;
case 2: myservo3.write(currentAngle[i]);break;
case 3: myservo4.write(currentAngle[i]);break;
}
}
}
delay(10);
}

//Grab something
void openGripper() {
myservo1.write(MIN[0]);
delay(300);
}

//Let go of something
void closeGripper() {
myservo1.write(MAX[0]);
delay(300);
}

void forward()
{
digitalWrite(8, LOW);
digitalWrite(9, HIGH);

digitalWrite(11, LOW);
digitalWrite(10, HIGH);
}

void right()
{
digitalWrite(8, LOW);
digitalWrite(9, HIGH);

digitalWrite(11, LOW);
digitalWrite(10, LOW);
}

void back()
{
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);

digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
}

void left()
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);

digitalWrite(11, LOW);
digitalWrite(10, HIGH);
}

void stop()
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);

digitalWrite(11, LOW);
digitalWrite(10, LOW);
}
附录2总体电路图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

致 谢

这次设计不但锻炼了我的动手能力和独立思考能力,更让我学会了遇到问题时如何去冷静的思考和处理。现在社会的进步、工业的发展都离不开自动化。而可移动的抓取机械手的设计这个课题让我也时时在在的参与到了其中,为人类的工业自动化做出一点帮助,所以我相信可移动的抓取机械手的研制在未来会越来越完善,解放人类双手的机械化时代已经到来,人类工业的自动化也将越来越卓越。从踏入大学校园的那一刻起,到现在已经过了四个年头了,虽然我即将要离开这个承载了美好回忆与梦想的地方,回首这四年的学习生涯,我很庆幸在这里我与这些来自天南海北的同学一起留下了青春的影子, 我也遇到了很多可爱的老师,你们教会了我的不仅仅是学习上的知识,更是教会了我做人的道理。其中我感谢的恩师是沈洪洋和台闯老师,我在心里一直都很敬佩你们, 您一直都以身作则、治学严谨待人以宽并且设身处地为学生着想的高尚品格一直触动着我,引领着我,坚定了我学习与生活中的目标。四年的陪伴与教导将是我一生中最宝贵的财富。在学习上,您总是细微、耐心的给我指导,使在我学习的同时掌握了多项技能。
本篇论文的选题、研究及论文编写,您总是不辞劳苦地细心讲解与分析。无论学习还是生活,沈老师和台老师都愿意与学生分享他们的经验与感受,再次感谢恩师的栽培与教导。
感谢一直关心我、支持我的同学和朋友们。明天的我将更加自信的扬帆起航。

  • 24
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino全向移动小车的软件系统设计主要涉及以下几个方面: 1. 控制板程序设计 控制板程序设计是整个系统的核心部分,主要负责与硬件进行通信,控制电机转动以及读取传感器信息等功能。在程序设计中,需要考虑到小车的运动控制方式,如采用差速驱动还是全向驱动,以及小车的传感器种类和数量等因素。 2. 远程控制程序设计 远程控制程序设计是指通过无线通信方式,通过其他设备控制小车的运动。该程序需要支持多个控制方式,如手动控制、语音控制、手机APP控制等,同时需要对控制命令进行解析和转换,发送到控制板进行处理。 3. 传感器数据采集和处理程序设计 传感器数据采集和处理程序设计是指对小车上的传感器进行数据采集和处理,如超声波传感器测距、红外线传感器检测障碍物等。该程序需要实现数据的实时采集和处理,以及数据的可视化展示。 4. 自主导航程序设计 自主导航程序设计是指通过算法实现小车的自主导航功能,如SLAM算法、路径规划算法等。该程序需要根据传感器数据实时更新小车的位置和环境信息,同时根据目标位置规划路径并控制小车运动。 综上所述,Arduino全向移动小车的软件系统设计需要考虑到小车的运动控制、传感器数据采集和处理、远程控制和自主导航等方面,需要综合运用多种编程语言和算法实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值