基于Arduino的麦克纳姆轮绘图小车_第1页
基于Arduino的麦克纳姆轮绘图小车_第2页
基于Arduino的麦克纳姆轮绘图小车_第3页
基于Arduino的麦克纳姆轮绘图小车_第4页
基于Arduino的麦克纳姆轮绘图小车_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、南京师范大学电气与自动化工程学院毕业设计论文摘 要智能小车是移动机器人学的一个重要分支,是当今从业余爱好者到研究人员中最受欢迎的项目之一,应用广泛,在文化与生活中也起到越来越大的作用。从长远来看,它未来不管在民用还是军事亦或是太空开发等领域有着不错的前景与发展空间,随着时代的发展,人工智能也日益受人们所青睐。本文主要设计任务的制作一辆基于Arduino的麦克纳姆轮绘图小车,并编写合适的程序使得用户可以通过安卓手机蓝牙来控制小车的移动以及笔架的升降,从而达到绘图目的。文章对小车的车体设计及整体框架进行了描述,对小车的各个模块也进行了相应介绍。文章介绍了本次所使用的ATmega328开发板与麦克纳

2、姆轮的运动原理,通过对Arduino平台和keil软件的使用编写了控制小车运作的主程序与控制笔架升降的STC单片机程序。文章末尾为本次设计所遇到的问题以及对应心得的描写,也有对本次毕业设计的一些改进的想法。本次毕业设计所完成的智能小车基本达到预期所想,具有很大的推广价值,可以实现可靠的全向移动能力,性能可靠。关键词:Arduino 麦克纳姆轮 蓝牙控制 智能小车 IAbstractSmart car is an important branch of mobile robotics . It is today's researchers from amateur to one of t

3、he most popular items, widely used, in culture and also play a more and more important role in the life. In the long run, its future development both in civil and military or space, and other fields has a good prospects and development space, with the development of The Times, artificial intelligenc

4、e is increasingly popular with people.In this paper, the main design task of making a glossy mu wheel drawing based on the Arduino car, and write the right program that allows users to android bluetooth to control the movement of the car and the rise and fall of pen rack, so as to achieve mapping pu

5、rpose. This paper describes the vehicle body design and the overall frame, and introduces the module of the car.ATmega328 used by this article introduces the development board and the department's kinematic principle of wheel, through the use of the Arduino platform and keil software the write o

6、peration is to control the car pen rack main program and control of the elevator on STC microcontroller program. At the end of the article, there are some Suggestions for the design of this design.This graduate design complete intelligent car achieves the expected, has great popularization value, ca

7、n realize omnidirectional mobile ability, reliable performance and reliability.Key words: Arduino Mecanum wheel bluetooth control smart car II目 录第一章 绪论11.1 选题背景及意义11.2 国内外研究现状11.3 课题的主要研究内容2第二章 硬件介绍32.1 Arduino介绍32.1.1 Arduino开发板的选择32.1.2 Arduino拓展板62.2 麦克纳姆轮介绍62.2.1 麦克纳姆轮原理72.2.2 麦克纳姆轮运动分析72.2.3 全向

8、运动的实现92.3 蓝牙模块的选择122.4 L293驱动控制板13第三章 程序的调用及编写143.1 类库的编写及调用143.1.1 简介143.1.2 库文件的改用143.2 Arduino主程序的编写173.3 STC单片机程序的编写20第四章 程序的烧录254.1 Arduino的烧录254.2 STC单片机的烧录26第五章 小车模型及操作流程285.1 小车的最终成品285.2 流程示意29第六章 总结与不足306.1 课题总结306.2 问题与不足31致谢32参考文献33第1章 绪论1.1 选题背景及意义如今,多智能体系统(Multi-Agent System)已经被给予越来越多的

9、研究和重视。智能小车作为其体系的重要组成部分,拥有广泛的应用前景和期望,成为了当前许多高校和电子竞赛所热衷的课题,可见其研究意义之大。本课题结合了当前热门的智能小车以及创客热衷的Arduino设计开发平台,再配合上将来拥有巨大商业和工业价值的Mecanum轮,通过蓝牙遥控实现无线控制进而达到全向绘图功能的智能小车。智能化是现代社会的产物,是未来的方向,是当前科技发展的目标,它可以起到比人为更为高效和安全的效果。自1978年,“智能模拟”就成为国家科学技术发展规划的主要研究课题。大力发展智能化,可以实现对资源的充分利用,进而获得最大收益,提高工业生产效率,还可以大大减少事故发生的概率,适合以后向

10、慢慢从高端走向生活化。智能小车,是现代的先进技术的综合体,属于移动轮式机器人的一种。目前常见的轮式机器人遍布于医疗、军事、生活等各领域,发展面之广。然而目前常见的轮式机器人有其很多的弊端,在执行许多工作中往往会因为环境空间过于狭小进行无法移动,丧失机动性。近年来,全向移动的机器人以其特有的优越性越来越受到人们的关注及国内外研究机构的重视,Mecanum轮能在狭隘的空间里快速完成多种作业,对轮式移动小车具有极大的研究价值。1.2 国内外研究现状基于Mecanum轮的全向机器人在国外已经发展多年,国内的研究还十分少见。在使用全向移动的技术后,可以显著提高小车的机动性和灵活性,在狭隘的空间作业时,有

11、着显著的优势。在Mecanum轮发明后,世界许多发达国家诸如美国等大量应用于工业、民用、军事领域,包括叉车、运输车、竞赛智能车等。1996年美国的Airtrax公司就作为第一个采用该技术公司,将其运用于车辆商业化。图1-1为Airtrax公司的Sidewinder系列叉车,它们可以实现在狭窄的空间里全方位移动,灵活自由,极大的提高了企业生产效率,具有极大的经济效益。图1-1 Airtrax公司系列叉车同时,随着国外对Mecanum轮的研究及应用,诸多国内学者也对其进行了许多深入的研究及讨论。研究的领域包括运动学、运动效率的研究、全向轮的布局及原理探究等,并在此基础上提出了一系列的成果。其中,P

12、atrick Muir运用矩阵变换的方法建立了Mecanum运动学模型,并运用于反馈算法设计。1.3 课题的主要研究内容本课题的主要研究任务是研制一辆基于Arduino开发板的,Mecanum轮由4个直流电机控制的,由NMB 微型步进推杆电机驱动的笔架结构,从而实现绘图功能的智能小车。其中,小车由四轮底盘、Mecanum全向轮设计、笔架结构、蓝牙模块、Arduino开发板、电机驱动板等构成。本文内容一共分为六章,安排如下:第1章 绪论:介绍课题背景,并探讨智能小车以及Mecanum轮在国内外的研究现状,以此来讨论课题意义。第2章 硬件介绍:主要介绍本次设计所用到的硬件及一些简单的原理分析及使用

13、介绍。第3章 程序的调用及编写:主要描写了本次小车所用到的主要程序及编写思路和构成的框架。第4章 程序的烧录:将本次设计所用到的一些软件部分进行使用说明,描述了我烧录程序的一些基本步骤。第5章 小车模型及操作流程:介绍了小车最终的成品以及操作小车的流程示意。第6章 总结与不足第二章 硬件介绍近年来单片机的种类众多,既有一直流行的 8位机:51单片机、AVR、PIC等系列,还有日趋受欢迎的 16位机、 MSP420等系列,还有 ARM CortoxM系列,这些的单片机都有其各自的优势,使用者可以根据自己的喜好,除此以外还有更接近 MCU的DSP系列。 而且我认为:关于所谓单片机的应用学习,最核心

14、的是要去自己理解以个 MCU,然后再根据控制需求来分配 MCU资源,编写对应程序,这样才是学习的关键所在。2.1 Arduino介绍马西莫·班兹原是意大利伊夫雷亚的一家设计学校的老师。他学校的学生们经常抱怨没有好用的微控制器。到2005年冬天,马西莫·班兹与David Cuartielles一起说起了这个问题。于是2人开始一起设计电路板,三天后,电路板宣布完工。Massimo Banzi根据自己喜欢去的一家叫做di Re Arduino的酒吧,这个酒吧是在1000年前以意大利国王Arduin的名字所命名的。他为了纪念这个就把,将这块电路板命名为Arduino,这就是Ardu

15、ino名字的由来。后来Banzi、Cuartielles和Mellis将这个设计图发到了网上。那时版权法虽然可以监管许多开源软件,但却很难作用于硬件上面,所以他们后来便采用了一种叫做Creative Commons(CC)的方式来公开设计图来维持自己的自由开源理念。通过这样的授权,任何人都可以使用他们的设计板。人们可以自由的使用或者开发Arduino开发板,甚至都不需要开发团队的授权。但是,一旦你发布了自己的引用设计,那么你就需要声明原先的开发团队。如果你相应修改电路板。那么必须用一用的CC授权方式,这样就可以保证新的版本也可以有一用的自由和开发。Arduino这个名字是被唯一所保留的,被注册

16、成了商标,不允许在未经许可的情况下使用。随着Arduino的发展,今年来有了众多的衍生控制器产生,这也是Arduino的自由开放所带来的成果。2.1.1 Arduino开发板的选择Arduino控制器是一个在一个微控制器专为机器人应用。作用与Arduino开源平台,它支撑上千的开放源代码,并易于扩展与大多数Arduino Shields。板上的微控制器使用Arduino编程语言编程(基于接线)和Arduino开发环境(基于处理)。 Arduino项目可以独立或他们可以在计算机上运行的软件进行通信 (例如Flash,处理,MaxMSP等)。本次设计小车采用的开发板型号是Arduino Atmeg

17、a 168/328,如图2-1所示图2-1 Atmega 168/328Atmega 168 / 328开发板具有14通道数字输入输出,6通道的PWM(PIN1 1,pin10,pin9,pin6,PIN3)8通道10位模拟I/O,也支持USB接口通信,有自动感应的开关电源输入,烧录方面也支持ICSP头程序直接下载,串行借口TTL电平,支持AREF和male/female针头,有着用于APC220射频模块集成插座。在直流电源方面支持USB供电或外部的7v交流电压,直流12V电压。直流输出:5V/3.3V DC和外部电源输出尺寸:90x80mm。硬件简介:- 调节电动机的电源输入端(6v-12v

18、);- 不受管制的伺服电源输入端子(供给调节4v-7.2V);- 伺服输入功率选择跳线口;- 串行接口模块headerforapc220模块;- 两直流电机端子处理电机电流制定2a;- IIC / TWI端口SDA,SCL,5V,GND;- 模拟端口与8个模拟输入;- 输入与内部电源电压;- 通用I/O端口13个I/O线;- 4,5,6,7可以用来控制电机;- 复位按钮。ATmega328的微控制器板有14个数字输入/输出引脚(其中6可作为PWM输出),6个模拟输入,一个16 MHz的晶体振荡器,一个USB接口,一个电源插座,一个扩展报头,和一个复位按钮。它包含所有需要的 D支持微控制器;只需

19、将它连接到计算机与USB电缆或电源它与交流到直流适配器或电池开始。具有以下功能。a.记忆功能:ATmega328具有32KB的记忆容量(0.5KB用于引导)。除此之外它也有2 KB的SRAM和1 KB的EEPROM(可读取和写入与EEPROM库)。b.输入和输出PinMode:14个不同的数字引脚的Duemilanove可以作为输入或输出,使用pinmode(),digitalwrite()和digitalread()功能可以实现引脚的引用。他们的工作电压固定在5V。每个引脚可以提供或接收 40 mA最大并具有内部上拉电阻(断开默认)20-50欧姆。此外,一些引脚有专门的功能: 系列引脚:0号

20、引脚(RX)和1号引脚(TX)。用于接收(RX)和传输(TX)TTL串行数据。这些引脚连接到相应的引脚的FTDI USB TTL串口芯片。 外部中断:2号引脚和3号引脚。这些引脚可配置触发中断,在一个低值,上升或下降沿,或改变价值。看到attachinterrupt()功能详情。 脉宽调制:3,5,6,9,10,11号引脚。提供与analogwrite() 8位PWM输出功能。 SPI:10(SS),11(2)、12(MISO),13(SCK)。这些引脚支持SPI通信使用SPI。c.通信:Arduino 开发板上有许多设施可以通过计算机与另外的Arduino微控制器进行通信。ATmega328

21、提供UART TTL(5V)串行通信,可通过数字引脚0(RX)和1(TX)进行通信。板上的串口通信在Atmega8u2渠道USB和作为一个虚拟COM端口一起出现在计算机上的软件上。8u2固件使用标准的USB COM驱动程序,不需要外部驱动程序。然而,在Windows中,一个inffile是必须安装的。当计算机发送数据时,RX和TX发光二极管在板上会闪烁时,数据是通过USB传输到串行芯片和USB连接到计算机。2.1.2 Arduino拓展板图2-2 ATmega168和Atmega 328拓展板ATmega168和Atmega 328的IO拓展板如图2-2所示,支持RS485接口可驱动4个电机。

22、这个Arduino兼容的I/O扩展通过精心的设计从而达到与Arduino板之间的一个简单的连接(如Arduino Duemilanove)和其他设备,如传感器、RS485 器件。在本质上,它扩大了Arduino控制器的数字I/O和模拟输入引脚与电源和接地端。它是用arduino mega兼容,是一个完美的伴侣。特征:1.支持XBee(XBee-Pro);2.一个独特的RS485输出,支持RS485设备;3.独立的PWM引脚,这是与标准伺服连接器兼容;4.支持蓝牙模块APC220模块;5.外部电源与车载电源之间的自动切换;6. 支持SD卡(读写-我们的SD卡模块是必要的);7. 支持IIC /

23、I2C /双连接。2.2 麦克纳姆轮介绍麦克纳姆轮最早为瑞典Macanum公司所提出的,目前应用十分广泛。他也可以成为斜齿轮,轮齿是由可以旋转的鼓形锟子所组成的。麦克纳姆轮的轮子结构相对来说比较繁杂,无论对于环境或者是生产工艺都要求较高。但是,它无论在工业还是军事领域都有极为广泛的运用和前景,这点让它具有很大的上升和研究空间。2.2.1 麦克纳姆轮原理麦克纳姆轮的设计体系,广泛运用于各类工程实际运作当中,属于目前技术相对较为成熟的一种轮体设计结构。它有别于传统的车轮,它由设计轴线相差四十五度的轮毂和辊子所构成。数个辊子由一定的精度设计搭建在一起,与车轮的圆周重合,从而使得车轮实现自由滚动的目的

24、。当车轮以一定速度滚动时,辊子会与车轮圆周一起实现侧向运动。通过将多个麦克纳姆轮搭建在一起,从而实现小车在平面内按照指令实现多个方向的移动和转动。一般情况来说,安装麦克纳姆轮的小车通常由多个电机通过同步驱动的方式,加以微调从而来达到小车的全方向移动。麦克纳姆轮的自由度是影响其全向移动的关键。麦克纳姆轮具有2个自由度:第一个是车轮本身围绕其轴线的转动;第二个是辊子绕其轴线转动。因此,麦克纳姆轮在旋转的时候,除了能主动运动之外,在辊子的轴线上也具备被动运动的能力。当轮子绕着固定的车轴转动时,其辊子会绕成一个圆柱面,进而实现连续的滚动,当各个轮子按照一定的组合一起运动时,可以实现在平面上的三自由度运

25、动。如图2-3为麦克纳姆轮结构件的图示。图2-3 麦克纳姆轮结构件图2.2.2 麦克纳姆轮运动分析 本次毕业设计采用四个麦克纳姆轮按照正方四轮接法,为了方便分析运动原理,建立了如图2-4所示坐标系。图2-4 麦克纳姆轮小车底盘坐标系如图所示,L表示车身的长度,l为宽度,车速为V(包括Vx与Vy),Wz为车身绕Z轴的角速度。图中参数满足以下关系: (2-1a) (2-1b) (2-1c) (2-1d)其中ai-i轮辊子轴线与轮轴线夹角(i=1,2,3,4)若考虑矢量方向性,沿着XY轴分解公式可得: (2-2a) (2-2b) (2-2c) (2-2d)联立以上方程可得小车的逆运动学方程: (2-

26、3a) (2-3b) (2-3c) (2-3d)当小车的平移速度和转动角速度已知时,运用以上逆运动学方式,就可得各个轮子的转速,再对以上公式进行矩阵变换,便可得到正运动学方程: (2-4a) (2-4b) (2-4c) 2.2.3 全向运动的实现 本次毕业设计搭建小车底盘麦克纳姆轮搭建方式如图2-5所示。图2-5 小车示意图 从示意图分析小车的运动方式其实很直观,当轮1,2,3,4,按照一定角速度向前或向后转动时,小车可实现向前移动,如图2-6所示。图2-6 小车前后移动当轮四个轮子速度相同,而轮1、3与轮2、4运动方向相反时,小车即可实现左右移动,如图2-7所示。图2-7 小车左右移动 当轮

27、1、3速度与方向相同而轮2、4不动或者轮2、4速度与方向相同而轮1、3不动时,小车可实现斜45度方向移动,如图2-8所示。图2-8 小车斜45度移动当4个轮子速度相同,而轮1、4与轮2、3方向相反时,小车会做原地旋转运动,如图2-9所示。图2-9 小车原地旋转2.3 蓝牙模块的选择本次设计使用的蓝牙模块是hc-06型号,如图2-10所示图2-10 蓝牙模块hc-06这里简单介绍一下其接线方式:1. GND:GND为电源接地口,接地或者链接电源负极;2. 5V/3.3V:电源正极接入口;3. RX: RX是蓝牙传感器的读取口,接入串口的TX口;4. TX: TX是蓝牙传感器的写入口,接入串口的R

28、X口;以上为4个接线口的说明,在安卓手机端下载蓝牙SPP助手来给蓝牙模块发送指令从而达到控制小车的目的,如图2-11位SPP界面。图2-11 SPP界面2.4 L293驱动控制板本次选用的L293驱动控制板来控制推杆步进电机,笔架与控制板一起构成绘图模块,如图2-12为L293驱动控制板的原理图。图2-12 L293驱动控制板原理图由接线图可知L293的P4端和P5端的3号引脚连接在STC12C2052AD的P1.6和P1.7数字引脚上,所以因此我想到可以通过Arduino开发板上的数字引脚与L293控制板上的数字引脚相连接,通过Arduino ide平台通过设置开发板上的数字引脚的高低电平和

29、STC单片机程序上通过数字引脚上的高低电平相互配合,从而达到控制电机推杆升降的目的。 第三章 程序的调用及编写3.1 类库的编写及调用3.1.1 简介Arduino之所以能成为全球流行的硬件开发平台,得益于其开放自由的特点,能大大激发开发者的创意与效率,而这是与Arduino的类库机制密切相关的。类库可以说是作为Arduino开发平台的大脑,类库的引用可以大大提高代码的编写效率以及程序的简洁与可读性。类库的存放地点一般在Arduino源文件的libraries文件中,在主程序的编写中可以引用。本次所使用的类库是MotorWheel电机类库,用于控制4个直流伺服电机的运作,具体库文件如图3-1所

30、示。图3-1 MotorWheel类库的库文件3.1.2 库文件的改用本次毕业设计所调用的是类库中的Omni4WD库文件。库文件因其使用的方便而受到许多开发者的欢迎,但同时也存在诸多的问题。在库的引用时,若直接引用很容易出现硬件冲突的问题,最常见的有定时器的共用、引脚的冲突、参数的不协调等问题,所以在调用一个库文件时首先要做的就是读懂程序以及做适当的修改。本次修改后使用的库文件详见附录1。接下来的内容中,我会对要使用到的部分主要的小车移动函数结构进行说明。unsigned char Omni4WD:setSwitchMotorsStat(unsigned char switchMotorsSt

31、at) if(MOTORS_FB<=switchMotorsStat && switchMotorsStat<=MOTORS_BF)_switchMotorsStat=switchMotorsStat;return getSwitchMotorsStat();unsigned char Omni4WD:switchMotors() if(getSwitchMotorsStat()=MOTORS_FB) setSwitchMotorsStat(MOTORS_BF); else setSwitchMotorsStat(MOTORS_FB); 此段为电机正反运作的初始化程

32、序,当接受高电压时电机正向转动,低电压时电机反向转动。unsigned char Omni4WD:setCarStat(unsigned char carStat) if(STAT_UNKNOWN<=carStat && carStat<=STAT_UPPERRIGHT) return _carStat=carStat; else return STAT_UNKNOWN;此段为定义小车启动的初始化程序。wheelULSetSpeedMMPS(speedMMPS*sin(rad)+speedMMPS*cos(rad)-omega*WHEELSPAN);wheelLLS

33、etSpeedMMPS(speedMMPS*sin(rad)-speedMMPS*cos(rad)-omega*WHEELSPAN);wheelLRSetSpeedMMPS(-(speedMMPS*sin(rad)+speedMMPS*cos(rad)+omega*WHEELSPAN);wheelURSetSpeedMMPS(-(speedMMPS*sin(rad)-speedMMPS*cos(rad)+omega*WHEELSPAN);此段为文章.2.2节所示公式的小车速度的计算与定义,所得结果保留在SpeedMMPS中,在下面的小车前进公式中用到。int Omni4WD:setCarAdv

34、ance(int speedMMPS) setCarStat(STAT_ADVANCE);return setCarMove(speedMMPS,PI/2,0);小车的前进函数,在主函数的调用时可用 “Omni.setCarAdvance();”来调用。int Omni4WD:setCarBackoff(int speedMMPS) setCarStat(STAT_BACKOFF);return setCarMove(speedMMPS,PI*3/2,0);小车的后退函数,在主函数的调用时可用 “Omni.setCarBackoff();”来调用。int Omni4WD:setCarLeft(

35、int speedMMPS) setCarStat(STAT_LEFT);return setCarMove(speedMMPS,PI,0);小车的左移函数,在主函数的调用时可用 “Omni.setCarLeft();”来调用。int Omni4WD:setCarRight(int speedMMPS) setCarStat(STAT_RIGHT);return setCarMove(speedMMPS,0,0);小车的右移函数,在主函数的调用时可用 “Omni.setCarRight();”来调用。int Omni4WD:setCarUpperLeft(int speedMMPS) setC

36、arStat(STAT_UPPERLEFT);return setCarMove(speedMMPS,PI*3/4,0);小车的45度角左前移函数,在主函数的调用时可用 “Omni.setCarUpperLeft();”来调用。int Omni4WD:setCarLowerLeft(int speedMMPS) setCarStat(STAT_LOWERLEFT);return setCarMove(speedMMPS,PI*5/4,0);小车的45度角左后移函数,在主函数的调用时可用 “Omni.setCarLowerLeft();”来调用。int Omni4WD:setCarLowerRi

37、ght(int speedMMPS) setCarStat(STAT_LOWERRIGHT);return setCarMove(speedMMPS,PI*7/4,0);小车的45度角右后移函数,在主函数的调用时可用 “Omni.setCarLowerRight();”来调用。int Omni4WD:setCarUpperRight(int speedMMPS) setCarStat(STAT_UPPERRIGHT);return setCarMove(speedMMPS,PI/4,0);小车的右45度角前移函数,在主函数的调用时可用 “Omni.setCarUpperRight();”来调用

38、。3.2 Arduino主程序的编写有了上一节所讲的库函数的基础上,主程序的编写方面就变得更高效且根据可读性了。Arduino程序可以分为三个主要部分:结构、变量/常量和功能。Arduino有两个重要的结构:setup()和loop()。他们是必不可少的。setup()的功能是当开始编写程序时,使用它初始化变量,引脚模式,开始使用库等设置功能,并且只运行一次。每次开机将重置开发板上的功能设置。不过在这个之前本次设计还会使用到很多类库的调用。在创建setup()函数,初始化和设置初始值后执行loop()功能。Loop如同名字一样,会连续循环,并允许程序更改和响应,以此来控制Arduino电路板。

39、通常在loop()中设置主程序来完成如驱动模块或者采集数据等功能。本次编写的主程序,能通过手机蓝牙每发送一个不同的字符,使得小车车轮及笔架部分会作出相应的动作,配合库函数的使用,可以使程序简洁且高效。下面我会详细说明本次设计所用的主程序框架。#include <PinChangeInt.h>#include <PinChangeIntConfig.h>#include <EEPROM.h>#define _NAMIKI_MOTOR /定义常量#include <fuzzy_table.h>#include <PID_Beta6.h>#

40、include <MotorWheel.h> /调用控制电机运作的主要库文件#include <Omni4WD.h>#include <fuzzy_table.h>#include <PID_Beta6.h> /以上为本次编程所用到的库文件/ / wheel1 / wheel4 Left / Right / wheel2 / wheel3 Right / Left /小车的轮子设计示意irqISR(irq4,isr4);MotorWheel wheel4(3,2,4,5,&irq4);irqISR(irq3,isr3);MotorWhee

41、l wheel3(11,12,14,15,&irq3);irqISR(irq2,isr2);MotorWheel wheel2(9,8,16,17,&irq2);irqISR(irq1,isr1);MotorWheel wheel1(10,7,18,19,&irq1); /对每个麦克纳姆轮所用的引脚设置及初始化Omni4WD Omni(&wheel1,&wheel2,&wheel3,&wheel4); /引用程序,电机初始化int up = 6; int down =13; /由以上的各个电机定义的数字引脚,6与13为开发板上剩余的可用引

42、脚,本次关于配合L293控制板控制推杆步进电机的引脚设置为6与13引脚 void setup() TCCR1B=TCCR1B&0xf8|0x01; / Pin9,Pin10 的PWM 为31250HzTCCR2B=TCCR2B&0xf8|0x01; / Pin3,Pin11 的PWM 为31250Hz Omni.PIDEnable(0.31,0.01,0,10); / PWM的初始化设置Serial.begin(9600); /设置波特率为9600 pinMode(up, OUTPUT); /定义6号引脚为输出引脚pinMode(down, OUTPUT); /定义13号引脚为

43、输出引脚void loop() while(Serial.available() /当串口有输出时做出反应 char c=Serial.read(); if(c='w') Serial.println("Adance"); Omni.setCarAdvance(); Omni.setCarSpeedMMPS(30,1000); Omni.delayMS(500,false); /当串口接收w时,小车执行前进命令 if(c='s') Serial.println("Back"); Omni.setCarBackoff();

44、Omni.setCarSpeedMMPS(30,1000); Omni.delayMS(500,false); /当串口接收s时,小车执行后退命令 if(c='a') Serial.println("Left"); Omni.setCarLeft(); Omni.setCarSpeedMMPS(30,1000); Omni.delayMS(500,false); /当串口接收a时,小车执行左移命令 if(c='d') Serial.println("Right"); Omni.setCarRight(); Omni.set

45、CarSpeedMMPS(30,1000); Omni.delayMS(500,false); /当串口接收d时,小车执行右移命令 if(c='q') Serial.println("Upleft"); Omni.setCarUpperLeft(); Omni.setCarSpeedMMPS(30,1000); Omni.delayMS(500,false); /当串口接收q时,小车执行左上45度角移动命令 if(c='e') Serial.println("Upright"); Omni.setCarUpperRight

46、(); Omni.setCarSpeedMMPS(30,1000); Omni.delayMS(500,false); /当串口接收e时,小车执行右上45度角移动命令 if(c='z') Serial.println("Lowleft"); Omni.setCarLowerLeft(); Omni.setCarSpeedMMPS(30,1000); Omni.delayMS(500,false); /当串口接收z时,小车执行左下45度角移动命令 if(c='c') Serial.println("Lowright"); O

47、mni.setCarLowerRight(); Omni.setCarSpeedMMPS(30,1000); Omni.delayMS(500,false); /当串口接收c时,小车执行右下45度角移动命令 if(c='x') Serial.println("stop"); Omni.setCarStop(); Omni.delayMS(500,false); /当串口接收x时,小车执行停止命令 if(c='r') digitalWrite(up, HIGH); delay(3000); digitalWrite(up, LOW); dela

48、y(500); /当串口接收r时,笔架上升 if(c='t') digitalWrite(down,HIGH); delay(3000); digitalWrite(down, LOW); delay(500); /当串口接收t时,笔架下降 3.3 STC单片机程序的编写前面2节是关于Arduino开发板的程序编写,本节是关于STC单片机程序的编写,烧录进L293驱动板以达到控制推杆步进电机运作的目的。在编写前,第一个重要的工作就是对L293驱动板的接线图进行仔细的研究,然后再进行程序的编写。从上图2-12来看L293的P4端和P5端的3号引脚连接在STC12C2052AD的P

49、1.6和P1.5数字引脚上,所以因此我想到可以通过Arduino开发板上的数字引脚与L293控制板上的数字引脚相连接,通过Arduino ide平台通过设置开发板上的数字引脚的高低电平和STC单片机程序上通过数字引脚上的高低电平相互配合,从而达到控制电机推杆升降的目的。#include<STC12C2052AD.H> /头文件#include <intrins.h>/51基本运算(包括_nop_空函数)sbit S1=P15;/定义点动正转按键控制端口sbit S2=P16;/定义点动反转按键控制端口sbit A1=P13;/定义A线圈端口sbit B1=P12;/定义

50、B线圈端口sbit C1=P11;/定义C线圈端口sbit D1=P10;/定义D线圈端口#define Coil_A1 A1=0;B1=1;C1=1;D1=1; /A线圈通电#define Coil_B1 A1=1;B1=0;C1=1;D1=1; /B线圈通电#define Coil_C1 A1=1;B1=1;C1=0;D1=1; /C线圈通电#define Coil_D1 A1=1;B1=1;C1=1;D1=0; /D线圈通电#define Coil_OFF A1=1;B1=1;C1=1;D1=1; /全部断电 unsigned char Speed;/速度调节变量unsigned int b=2000;/中断初值变量bit Flag1;/启停标志位bit Flag2;/正反转标志位void DelayMs (unsigned int a)/1T单片机大致1ms延时unsigned int i;/无符号整型局部变量while(a-!=0)for(i=0;i<600;i+);void KeyScan()if(S1=1)/P1.5收到高电平,正转DelayMs(10);/延时10ms,防抖if(S1=1)/确认高电平Flag1=1;/启动标志Flag2=1;/正转标志else if(S2=1)/P1.

温馨提示

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

评论

0/150

提交评论