X0429089B24NR02P0011 4.3 机械产品融入Arduino电子控制的创新设计-控制伺服电机与程序_第1页
X0429089B24NR02P0011 4.3 机械产品融入Arduino电子控制的创新设计-控制伺服电机与程序_第2页
X0429089B24NR02P0011 4.3 机械产品融入Arduino电子控制的创新设计-控制伺服电机与程序_第3页
X0429089B24NR02P0011 4.3 机械产品融入Arduino电子控制的创新设计-控制伺服电机与程序_第4页
X0429089B24NR02P0011 4.3 机械产品融入Arduino电子控制的创新设计-控制伺服电机与程序_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4.3机械产品融入Arduino电子控制的创新设计-控制伺服电机与程序串口通讯串口控制舵机多个舵机的控制程序开发课程总结一二三四五目录一串口通讯串行端口用于Arduino和个人电脑或其他设备进行通信。所有Arduino控制器都有至少一个串行端口(也称为UART或者USART)。个人电脑可以通过USB端口与Arduino的引脚0(RX)和引脚1(TX)进行通信。所以当Arduino的引脚0和引脚1用于串行通信功能时,Arduino的引脚0和引脚1是不能做其他用的。你也可以通过Arduino开发环境软件中的串口监视器来与Arduino控制器进行串口通信,你只需要点击ArduinoIDE软件中的“串口监视器”按钮(如下图所示)就可以打开串口监视器。一串口通讯串行通讯是常用的通讯协议,arduino内含多种串行通讯函数可供用户选用,下列为常见的串行通讯函数以及介绍。常用串行通讯函数available()函数可用于检查设备是否接收到数据。该函数将会返回等待读取的数据字节数。Serial.begin()通讯波特率设置Serial.end()终止串行通讯,释放RX和TX引脚print()以人类可读的ASCII码形式向串口发送数据println()以人类可读的ASCII码形式向串口发送数据,类似print()指令,但是有换行。readread()函数可用于从设备接收到数据中读取一个字节的数据。write()写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数字请使用print()代替。一串口通讯串行通讯函数示例程序。在setup函数生命串口波特率,通过while循环判断串口缓存是否有接受接收到收据,如果串口缓存有数据则通过read函数读取并且对读取的数据保存到serialData字符变量中存储,最后通过Serial.println()函数输出读取的值。voidsetup(){//启动串口通讯Serial.begin(9600);}

voidloop(){while(Serial.available()){//当串口接收到信息后charserialData=Serial.read();//将接收到的信息使用read读取Serial.println((char)serialData);//然后通过串口监视器输出read函数读取的信息}}二串口控制舵机Arduino官方自带了非强强大的Serveo库可供使用,当了解了舵机的控制原理之后我们可以不需要使用到官方库文件,直接通过控制IO接口的脉冲频率控制舵机角度,甚至有需要可以制作自己独有的库文件。一下示例程序控制一个舵机从0-180°往复旋转。#include<Servo.h>//舵机库头文件Servomyservo;//声明舵机对象myservo

intpos=0;//定义舵机角度变量posvoidsetup(){myservo.attach(9);//声明舵机控制引脚}voidloop(){for(pos=0;pos<=180;pos+=1){舵机0°-180°旋转myservo.write(pos);//舵机输出角度posdelay(15);//等待15毫秒}for(pos=180;pos>=0;pos-=1){//舵机180°-0°旋转myservo.write(pos);//舵机输出角度posdelay(15);//等待15毫秒}}二串口控制舵机如果只需要舵机旋转到指定角度只需要简单的几句即可完成。直接更改pos变量的值即可完成舵机的角度控制,利用串口控制舵机旋转只需要使用对串口获取的值给到pos即可完成串口控制舵机角度。#include<Servo.h>//舵机库头文件Servomyservo;//声明舵机对象myservo

intpos=0;//定义舵机角度变量posvoidsetup(){myservo.attach(9);//声明舵机控制引脚}voidloop(){myservo.write(pos);//舵机输出角度pos}二串口控制舵机以下程序是使用串口控制舵机旋转,首先加载舵机库文件,定义舵机对象,启用串口通讯并设置波特率,不断循环判断串口缓存是否有数据,当串口缓存有数据取整数数据赋值于舵机角度变量,最后控制舵机旋转至角度至#include<Servo.h>//加载舵机库

ServomyServo;//创建Servo对象myServo

voidsetup(){myServo.attach(6);

定义舵机对象myServe控制引脚Serial.begin(9600);//启动串口通讯,传输波特率9600}

voidloop(){if(Serial.available()>0){

//检查串口缓存是否有数据等待传输intpos=Serial.parseInt();

//解析串口数据中的整数信息并赋值给变量posmyServo.write(pos);//使用pos变量数值设置伺服电机

delay(15);}}

二串口控制舵机二串口控制舵机舵机与Arduino开发板的连接如下图所示。舵机与开发板之间需要共地,控制线路需要跟程序定义引脚连接否则无法控制舵机。三多个舵机的控制MeArm机械臂一共使用四个舵机,Arduino开发板需要同时对四个舵机进行控制。因此在使用c串口控制的时候需要对舵机进行区分,串口的数据发送需要发送需要控制的舵机编号以及舵机角度。四个舵机分别为:clawfArmrArmbase三多个舵机的控制#include<Servo.h>

Servobase,fArm,rArm,claw;//建立4个电机对象

intdataIndex=0;//舵机标志变量voidsetup(){base.attach(11);//base伺服电机连接引脚11电机代号'b'rArm.attach(10);//rArm伺服电机连接引脚10电机代号'r'fArm.attach(9);//fArm伺服电机连接引脚9电机代号'f'claw.attach(6);//claw伺服电机连接引脚6电机代号'c'Serial.begin(9600);}在与一个舵机的控制一样,需要调用舵机库,对象增加至四个,分别定义每个舵机的控制线路端子编号。三多个舵机的控制voidloop(){if(Serial.available()){

charservoName=Serial.read();intdata=Serial.parseInt();switch(servoName){

//舵机编号判断case'b'://电机指令b,设置base电机角度base.write(data);break;case'r'://电机指令r,设置rArm电机角度rArm.write(data);break;case'f'://电机指令f,设置fArm电机角度fArm.write(data);break;case'c'://电机指令c,设置claw电机角度claw.write(data);break;}}}多个舵机的控制loop函数,首先判断串口是否有缓存,当有缓存的时候将字符赋值给servoName变量,将整数复制给data变量。通过switch函数判断servoName变量对应的字符是哪一个舵机,最后控制相应的舵机旋转。四程序开发该程序首先声明舵机库头文件,创建四个舵机对象,分别名字为base、fArm、rArm与claw。设置好每个舵机的最大角度与最小角度值,放置舵机因转角过大或过小导致撞击其他版块导致损坏。设置舵机运行舒服,当需要修改舵机速度是只需要修改DSD变量的值。Setup函数声明每个舵机分别所连接的控制引脚号,以及舵机初始化角度。Loop函数首先使用if判断语句查看串口缓存是否有数据,当有数据时读取数据保存至serialCmd字符变量保存,直至串口所有数据读取完成。四程序开发读取完成后调用armDataCmd(serialCmd)函数,并把读取完成的字符变量传入该函数对其数据进行处理,提取出所需控制的舵机名字,旋转角度等信息,该函数首先对传入的serialCmd字符变量进行对比判断第一个字符是否正确的舵机名称代码,如果是用户非法输入代码串口发送错误信息,如果是舵机控制代码将角度数据保存至int类型的servoData变量储存。数据提取完成后调用servoCmd(serialCmd,servoData,DSD)函数,并且把舵机代号、旋转目标角度、旋转速度作为参数传入该函数使用。调用函数后输出代号、角度及速度数据至串口。首先需要对电机目标角度进行判断查看是否在安全角度范围内,当超出范围串口输出错误信息,在范围内记录舵机名子以及该舵机初始角度。舵机转动时先判断当前角度大于还是小于目标值,当前角度大于目标值舵机角度减少,当前角度小于目标值舵机角度增大。并且使用设置数值控制舵机的控制速度。四程序开发四程序开发#include<Servo.h>//使用servo库Servobase,fArm,rArm,claw;//创建4个servo对象//存储电机极限值(const指定该数值为常量,常量数值在程序运行中不能改变)constintbaseMin=0;constintbaseMax=180;constintrArmMin=45;constintrArmMax=180;constintfArmMin=35;constintfArmMax=120;constintclawMin=25;constintclawMax=100;intDSD=15;//DefaultServoDelay(默认电机运动延迟时间)

四程序开发voidsetup(){base.attach(11);//base伺服舵机连接引脚11舵机代号'b'delay(200);//稳定性等待rArm.attach(10);//rArm伺服舵机连接引脚10舵机代号'r'delay(200);//稳定性等待fArm.attach(9);//fArm伺服舵机连接引脚9舵机代号'f'delay(200);//稳定性等待claw.attach(6);//claw伺服舵机连接引脚6舵机代号'c'delay(200);//稳定性等待

base.write(90);//初始化舵机角度delay(10);//稳定性等待fArm.write(90);delay(10);rArm.write(90);delay(10);claw.write(90);delay(10);

Serial.begin(9600);//启用串口通讯}四程序开发voidloop(){if(Serial.available()>0){//判断串口缓存charserialCmd=Serial.read();//读取串口缓存字符数据armDataCmd(serialCmd);//调用armDataCmd函数并传入串口缓存字符}}四程序开发voidarmDataCmd(charserialCmd){//Arduino根据串行指令执行相应操作

//指令示例:b45底盘转到45度角度位置o输出机械臂舵机状态信息

if(serialCmd=='b'||serialCmd=='c'||serialCmd=='f'||serialCmd=='r'){intservoData=Serial.parseInt();servoCmd(serialCmd,servoData,DSD);//机械臂舵机运行函数(参数:舵机名,目标角度,延迟/速度)}else{switch(serialCmd){case'o'://输出舵机状态信息reportStatus();break;

case'i':armIniPos();break;

default://未知指令反馈Serial.println("UnknownCommand.");}}}armDataCmd函数四程序开发voidservoCmd(charservoName,inttoPos,intservoDelay){Servoservo2go;//创建servo对象

intfromPos;//建立变量,存储电机起始运动角度值

switch(servoName){case'b':if(toPos>=baseMin&&toPos<=baseMax){servo2go=base;fromPos=base.read();//获取当前电机角度值用于“电机运动起始角度值”break;}else{Serial.println("+Warning:BaseServoValueOutOfLimit!");return;}

armDataCmd函数四程序开发case'c':if(toPos>=clawMin&&toPos<=clawMax){servo2go=claw;fromPos=claw.read();//获取当前电机角度值用于“电机运动起始角度值”break;}else{Serial.println("+Warning:ClawServoValueOutOfLimit!");return;}

case'f':if(toPos>=fArmMin&&toPos<=fArmMax){servo2go=fArm;fromPos=fArm.read();//获取当前电机角度值用于“电机运动起始角度值”break;}else{Serial.println("+Warning:fArmServoValueOutOfLimit!");return;}armDataCmd函数四程序开发case'r':if(toPos>=rArmMin&&toPos<=rArmMax){servo2go=rArm;fromPos=rArm.read();//获取当前电机角度值用于“电机运动起始角度值”break;}else{Serial.println("+Warning:rArmServoValueOutOfLimit!");return;}}

armDataCmd函数四程序开发//指挥电机运行if(fromPos<=toPos){//如果“起始角度值”小于“目标角度值”for(inti=fromPos;i<=toPos;i++){servo2go.write(i);delay(servoDelay);}}else{//否则“起始角度值”大于“目标角度值”for(inti=fromPos;i>=toPos;i--){servo2go.write(i);delay(servoDelay);}}}

armDataCmd函数四程序开发voidreportStatus(){//舵机状态信息Serial.println("");Serial

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论