资源描述
智能机器人小车创意设计制作指导手册江苏省天一中学人工智能社团指导老师:邓一波 俞金炎 二零一一年三月目 录一,机器人概述二,机器人小车硬件结构解析三,机器人小车编程语言及环境四,智能机器人小车安装,调试五,智能机器人小活动方案及创意案例第一章 机器人概述 1,机器人技术的发展1.1机器人的由来机器人 是20世纪才出现的新名词。1920年,捷克剧作家Capek在他的罗萨姆万能机器人公司(R.U.R)剧本中,第一次提出了机器人(robot)这个词。robot是从古代斯拉夫语robota一词演变而来的。robota本是强制劳动的意思,Capek在二十世纪工业革命后技术和生产快速发展的背景下,根据它造出具有奴隶机器含义的新词robot。它反映着人类希望制造出象人一样会思考,有劳动 的机器代替自己工作的愿望。但在当时,机器人一词也仅仅具有科幻意义,并不具备现实意义,真正使机器人成为现实是 20世纪工业机器人出现以后。 人类发展到20世纪,随着社会分工的细化,从事简单重复工作的人们强烈渴望有某种能代替自己工作的机器出现,在 这方面的研究,美国的英格伯格和德沃尔走在了前面。 1954年,电子学家德沃尔获得了一项可编程序机械手的专利,这是一种象人手臂的机械手,它按程序进行工作,这种程序可以根据不同工作需要来编制,因此,具有通用性和灵活性,由此,热衷于机器人研究的物理学家英格伯格想到,如果能制造出这种机器,可象人一样学习别人干活的动作,之后便能自动重复进行操作。于是,在1958年,英格伯格和德沃尔联手制造出第一台真正实用的工业机器人,并很快得到了应用。 随后,他们成立了世界上第一家机器人制造工厂尤尼梅逊公司,并将第一批机器人称为尤尼梅物,意思是万能自动,英格伯格因此被称为工业机器人之父,1984年,他还预言:我要使机器人擦地板,做饭,洗刷我的汽车和检查安全。机器人发展的三个发展阶段随着人们对机器的研究,机器人也在进步,按其发展过程机器人可分为三代:第一代是示教再现型机器人:尤尼梅特和沃尔萨特兰这两种最早的工业机器人是示教再现型机器人的典型代表。它由人操纵机械手做一遍应当完成的动作或通过控制器发出指令让机械手臂动作,在动作过程中机器人会自动将这一过程存入记忆装置。当机器人工作时,能再现人教给它的动作,并能自动重复的执行。这类机器人不具有外界信息的反馈能力,很难适应变化的环境。 第二代是有感觉的机器人:它们对外界环境有一定感知能力,并具有听觉、视觉、触觉等功能。机器人工作时,根据感觉器官(传感器)获得的信息,灵活调整自己的工作状态,保证在适应环境的情况下完成工作。如:有触觉的机械手可轻松自如地抓取鸡蛋,具有嗅觉的机器人能分辨出不同饮料和酒类。 第三代是具有智能的机器人:智能机器人是靠人工智能技术决策行动的机器人,它们根据感觉到的信息,进行独立思维、识别、推理,并作出判断和决策,不用人的参与就可以完成一些复杂的工作。日本研制的能演奏数首曲目?quot;瓦伯特2号机器人,已达到5岁儿童的智能水平。目前,智能机器人已在许多方面具有人类的特点,随着机器人技术不断发展与完善,机器人的智能水平将越来越接近人类。1.2 机器人的定义机器人(Robot)是自动执行工作的机器装置。它既可以接受人类指挥,又可以运行预先编排的程序,也可以根据以人工智能技术制定的原则纲领行动。它的任务是协助或取代人类工作的工作,例如生产业、建筑业,或是危险的工作。1.3 机器人学的进展机器人的偿还期理论促进对机器人产业的投资。日本后来居上,成为“机器人王国” 机器人产业在全世界迅速发展应用范围遍及工业、科技和国防各个领域。形成新的学科-机器人学 机器人向智能化方向发展2, 机器人结构与分类2.1 机器人系统的结构机器人一般由执行机构、驱动装置、检测装置和控制系统和复杂机械等组成。 执行机构即机器人本体,其臂部一般采用空间开链连杆机构,其中的运动副(转动副或移动副)常称为 关节,关节个数通常即为机器人的自由度数。根据关节配置型式和运动坐标形式的不同,机器人执行机构可分为直角坐标式、圆柱坐标式、极坐标式和关节坐标式等类型。出于拟人化的考虑,常将机器人本体的有关部位分别称为基座、腰部、臂部、腕部、手部(夹持器或末端执行器)和行走部(对于移动机器人)等。 驱动装置是驱使执行机构运动的机构,按照控制系统发出的指令信号,借助于动力元件使机器人进行动作。它输入的是电信号,输出的是线、角位移量。机器人使用的驱动装置主要是电力驱动装置,如步进电机、伺服电机等,此外也有采用液压、气动等驱动装置。 检测装置的作用是实时检测机器人的运动及工作情况,根据需要反馈给控制系统,与设定信息进行比较后,对执行机构进行调整,以保证机器人的动作符合预定的要求。作为检测装置的传感器大致可以分为两类:一类是内部信息传感器,用于检测机器人各部分的内部状况,如各关节的位置、速度、加速度等,并将所测得的信息作为反馈信号送至控制器,形成闭环控制。另一类是外部信息传感器,用于获取有关机器人的作业对象及外界环境等方面的信息,以使机器人的动作能适应外界情况的变化,使之达到更高层次的自动化,甚至使机器人具有某种“感觉”,向智能化发展,例如视觉、声觉等外部传感器给出工作对象、工作环境的有关信息,利用这些信息构成一个大的反馈回路,从而将大大提高机器人的工作精度。 控制系统有两种方式。一种是集中式控制,即机器人的全部控制由一台微型计算机完成。另一种是分散(级)式控制,即采用多台微机来分担机器人的控制,如当采用上、下两级微机共同完成机器人的控制时,主机常用于负责系统的管理、通讯、运动学和动力学计算,并向下级微机发送指令信息;作为下级从机,各关节分别对应一个CPU,进行插补运算和伺服控制处理,实现给定的运动,并向主机反馈信息。根据作业任务要求的不同,机器人的控制方式又可分为点位控制、连续轨迹控制和力(力矩)控制。2.2 机器人的分类诞生于科幻小说之中一样,人们对机器人充满了幻想。也许正是由于机器人定义的模糊,才给了人们充分的想象和创造空间。 家务型机器人:能帮助人们打理生活,做简单的家务活。 操作型机器人:能自动控制,可重复编程,多功能,有几个自由度,可固定或运动,用于相关自动化系统中。 程控型机器人:按预先要求的顺序及条件,依次控制机器人的机械动作。 示教再现型机器人:通过引导或其它方式,先教会机器人动作,输入工作程序,机器人则自动重复进行作业。 数控型机器人:不必使机器人动作,通过数值、语言等对机器人进行示教,机器人根据示教后的信息进行作业。 感觉控制型机器人:利用传感器获取的信息控制机器人的动作。 适应控制型机器人:能适应环境的变化,控制其自身的行动。 学习控制型机器人:能“体会”工作的经验,具有一定的学习功能,并将所“学”的经验用于工作中。 智能机器人:以人工智能决定其行动的机器人。 我国的机器人专家从应用环境出发,将机器人分为两大类,即工业机器人和特种机器人。所谓工业机器人就是面向工业领域的多关节机械手或多自由度机器人。而特种机器人则是除工业机器人之外的、用于非制造业并服务于人类的各种先进机器人,包括:服务机器人、水下机器人、娱乐机器人、军用机器人、农业机器人、机器人化机器等。在特种机器人中,有些分支发展很快,有独立成体系的趋势,如服务机器人、水下机器人、军用机器人、微操作机器人等。目前,国际上的机器人学者,从应用环境出发将机器人也分为两类:制造环境下的工业机器人和非制造环境下的服务与仿人型机器人,这和我国的分类是一致的。 空中机器人又叫无人机器,近年来在军用机器人家族中,无人机是科研活动最活跃、技术进步最大、研究及采购经费投入最多、实战经验最丰富的领域。80多年来,世界无人机的发展基本上是以美国为主线向前推进的,无论从技术水平还是无人机的种类和数量来看,美国均居世界之首位。3,机器人学与人工智能的关系 机器人学与人工智能有十分密切的关系。人工智能的近期目标在于研究智能计算机及其系统,以模仿和执行人类的某些智力功能,如判断、推理、理解、识别、规划、学习和其他问题求解。这一研究抓住了创造力的首要问题-人类智能。人工智能使目前主要用于数值计算的计算机变得更加富有生气,并用它来表达最复杂的生物世界-人脑智能。人们的努力远非获得完全成功,但是已经在许多研究领域取得进展。例如,在规划、博弈、问题求解、语言与语音理解、视觉图像识别、定理证明、知识表示与描述等方面,已取得不少研究成果。 1996年2月1017日,为了纪念世界上第一台电子计算机诞生50周年,IBM的“深蓝”同国际象棋世界冠军卡斯帕罗夫在美国费城举行六局大赛。结果 卡斯帕罗夫以4:2获胜。1997年5月311日, “深蓝”再次挑战卡斯帕罗夫,此时“深蓝”的运算速度达每秒2亿次,比上次提高了一倍。结果“深蓝”3.5:2.5获胜。目前对机器人学的研究主要还是以控制理论的反馈概念为基础的。也就是说,迄今为止,机器人上的智能是由于应用反馈控制而产生的。但是,反馈控制技术本身并不是建立在人工智能技术的基础上的,而属于古典工程控制理论范畴。 一方面,机器人学的进一步发展需要人工智能基本原理的指导,并采用各种人工智能技术; 另一方面,机器人学的出现与发展又为人工智能的发展带来了新的生机,产生了新的推动力,并提供一个很好的试验与应用场所。也就是说,人工智能想在机器人学上找到实际应用,并使问题求解、搜索规划、知识表示和智能系统等基本理论得到进一步发展。 粗略地说,由计算机(机器)来模仿人类的智能行为,就是人工智能,或称为机器智能。而下一代新的机器人就是应用各种人工智能技术的机器人,所以叫做智能机器人。智能机器人 尽管目前在工业上运行的90%以上的机器人都谈不上有什么智能,机器人执行的许多任务也根本不需要运用传感器; 但是,随着机器人技术的迅速发展和自动化程度的进一步提高,对机器人的功能提出了更高的要求,特别是需要各种具有不同程度智能的机器人和机器人化装置。 最近20年已生产出一批具有传感装置(如视觉、触觉和听觉等)的机器人以及少数具有与环境进行对话能力的交互机器人(interactive robot)。这些机器人就属于智能机器人,它们能够执行一些过去无法解决的工作任务。 智能机器人已在自主系统和柔性加工系统中得到日益广泛的应用。自主机器人能够设定自己的目标,规划并执行自己的动作,使自己不断适应环境的变化。柔性加工系统由机器人工段(robotic work cell)或柔性工段组成。每个机器人工段能够完全自动地完成一系列操作、装卸、运输或加工。把机器人工段与其他工段相连接,就形成一个柔性组合式机器人生产系统,简称柔性加工系统。第二章 机器人小车硬件结构解析1,智能机器人小车概述:TY-1智能机器人小车是由江苏省天一中学人工智能社团师生共同设计,研发,制作的一款多功能,智能化,可编程机器人。该机器人以小车作为基本活动载体,搭配一块功能强大的控制电路板,在配备各种传感器的情况下可实现足球,灭火,探险等多种可变复杂功能。另外,对比于当前许多商品机器人,该机器人又具有结构小巧,造价低廉的特点。所以,该机器人可作为中学生普及机器人知识,培养实践动手能力的良好载体。通过学生亲身参与到设计,制作的全过程中,使学生从更深的此层次上加深对机器人的理解,培养学生科学兴趣和爱好。该智能机器人小车外观如图一所示:图一TY-1智能机器人小车基本参数:整体尺寸:130mm*155mm*110mm(长*宽*高)整车重量:450g工作电压:DC 712V典型工作电压:DC 7.2V工作电流:300峰值电流:1A行动速度:20250mm/2,智能机器人小车结构解析: TY-1智能机器人小车基本构成主要包括小车车架、机器人控制板和传感器组成。TY-1智能机器人小车车架主要包括左右减速电、左右驱动轮子、车架固定板、万向轮、固定螺丝等几个部分组成。2.1减速电机:减速电机采用普通直流电机,结合机械减速箱制作而成。价格低廉。由于采用塑料齿轮,不适合高扭矩的场合,但用于小功率机器人小车非常适合。减速电机基本参数:1,工作电压: 3V12V DC(建议工作电压在6到8V左右)。 2,最大扭矩: 800gf cm min(3V时)。3,转速比: 1:48。 4,负载电流: 70mA (250mA MAX)(3V时)。5,转速15f/min(3V时)。2.2车轮:轮子直径约65MM,厚度约28MM,轮毂采用高强度塑料,轮胎采用黑色橡胶。2.3万向轮:万向轮采用具有滑动转向轴承的平面万向轮,转动灵活。轮子采用尼龙制造,经久耐磨,质量可靠。2.4电源:小车电源采用六节5号碱性电池,电池电压为9V。小车电源采用六节5号五号镍氢可充电电池,电池电压为7.2V。3,智能机器人小车控制板:控制板是机器人小车核心部件之一。小车的智能化主要是由控制板来实现的。控制板的主要作用是通过运行在板载微控制芯片中的用户程序,来完成检测、采集传感器所接受到的外界信号,并根据程序编制的控制算法对信号进行处理后来控制电机的转动,从而完成小车的运动控制。所以,微控制芯又是控制板的核心部件。它是一个小型的CPU,执行指令,完成机器人小车的控制任务。本控制板所采用的是美国Atmel公司生产的单周期,低功耗微控制芯片ATmega8。ATmega8单片机是高性能、低功耗的 8 位微处理器,8K 字节的系统内可编程Flash,512 字节的EEPROM,1K字节的片内SRAM,非常丰富的内部设备,在构成系统是不需要添加复杂的外围芯片设备,因此适合低成本智能小车的应用需要。ATmega8是基于增强的AVR RISC结构的低功耗8位CMOS微控制器。由于其先进的指令集以及单时钟周期指令执行时间, ATmega8 的数据吞吐率高达1 MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。AVR 内核具有丰富的指令集和32 个通用工作寄存器。所有的寄存器都直接与算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。ATmega8 有如下特点:8K 字节的系统内可编程Flash( 具有同时读写的能力,即RWW),512 字节 EEPROM,1K 字节 SRAM,32 个通用I/O 口线,32 个通用工作寄存器,三个具有比较模式的灵活的定时器/ 计数器(T/C), 片内/ 外中断,可编程串行USART,面向字节的两线串行接口, 10 位6 路 (8 路为TQFP 与MLF 封装)ADC,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及五种可以通过软件进行选择的省电模式。工作于空闲模式时CPU 停止工作,而SRAM、T/C、 SPI 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态; ADC 噪声抑制模式时终止CPU 和除了异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声; Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力。本芯片是以Atmel 高密度非易失性存储器技术生产的。片内ISP Flash 允许程序存储器通过ISP 串行接口,或者通用编程器进行编程,也可以通过运行于AVR 内核之中的引导程序进行编程。引导程序可以使用任意接口将应用程序下载到应用Flash存储区(ApplicationFlash Memory)。在更新应用Flash存储区时引导Flash区(Boot Flash Memory)的程序继续运行,实现了RWW 操作。 通过将8 位RISC CPU 与系统内可编程的Flash 集成在一个芯片内,ATmega8 成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而低成本的解决方案。ATmega8 具有一整套的编程与系统开发工具,包括:C 语言编译器、宏汇编、 程序调试器/ 软件仿真器、仿真器及评估板。3.1智能机器人小车控制板接口说明:智能机器人小车控制板实物如下图所示。控制板带有1个电源输入口,由于输入DC 712VDE 工作电压。1个九针串口,用于用户程序下载到板载控制器Atmega8。14个三线数字信号输入输出口,用于外接数字信号传感器或数字信号驱动设备。6个三线模拟信号输入口,用于外接模拟信号传感器的信号输入。2个电机接口,用于外接控制直流电机。2个二线电机控制接口,其中一线用于控制电机的转动方向,一线用于控制电机的转动速度(功率值)。智能机器人小车控制板接口详细说明:接口名称作用说明电源插座为控制板提供电源DC 712V,插头外内电极为正,外电极为负程序下载串口用户机器人程序下载速率9600波特,8位数据,1位停止位数字I/O口数字传感器信号输入,或输出数字控制信号。D0D13,三线接口,提供+5V、电源地和数字信号线。其中D9、D10、D11还具有PWM信号输出能力,用于控制电机等设备的功率值。如果微控制器用ATmega168替换,D3、D5、D6也具有PWM信号输出能力,其他相同。数字信号电平范围为0+5V。模拟I/O口外接模拟信号传感器的信号输入。A0A5, 三线接口,提供+5V、电源地和模拟信号线。模拟信号电平范围为0+5V。超够或许会损坏器件。电机接口外接控制直流电机J30 用于控制一号直流电机。J31用于控制二号直流电机。电机控制接口控制电机转动方向和转速MOTO1用于一号电机控制信号的输入,其中DIR1用于和数字接口连接,控制一号电机的转动方向(高电平为正,低电平为反)。PWM1用于和具有PWM输出功能的数字接口连接用于控制电机的转速(功率值)。变化范围为0255.。MOTO2同MOTO1.J32 ISP控制器Bootloader的烧写烧写启动程序SERIAL ON串口使能跳线在0-1之间时不允许串口工作,但可以停止串口电路,用于节能。跳线在1-2之间时允许串口工作,下载程序。J3AUTOSESET程序下载自动复位当加上跳线开关时用户程序在下载过程中可以实现在东南否则要手动进行。3.2智能机器人小车控制板原理说明:智能机器人小车电源部分如下图所示,电源插座P1接入外部电源,D1为防止电源反接二极管,C1、C3为滤波电容,VIN为电机驱动电源标签,电机驱动电源从该处引出。U1为LM7805五伏稳压集成块。C2 ,C4是输出滤波电容,+5V标签是控制板5V稳压电源的引出点。D2是电源指示发光二极管。智能机器人小车程序下载串口如右图所示,该电路是由分立元件构成的串口电路。其中J1为串口使能选择开关SERIAL ON,当跳线开关置于1-2之间时,串口电路切断+5V电源,串口电路不可使用,可以降低电源消耗。当跳线开关置于2-3之间时,串口电路接通+5V电源,串口电路可以正常使用,用于用户小车控制程序下载。J3为程序下载过程中的自动复位跳线开关,当加上跳线开关时用户程序在下载过程中可以实现在东南否则要手动进行。虽然该电路采用价格低廉的分立元件,单时间使用效果很好,工作非常稳定。智能机器人小车电机驱动电路如右图所示。该电路由电机驱动集成电路L293D结合一些外围电路构成。其中J30 MOTO1用于一号电机控制信号的输入,DIR1用于和数字接口连接,控制一号电机的转动方向(高电平为正,低电平为反)。PWM1用于和具有PWM输出功能的数字接口连接用于控制电机的转速(功率值)。变化范围为0255。MOTO2同MOTO1。智能机器人小车控制电路如下图所示,该电路以耗微控制芯片(单片机)ATmega8为核心。其中,J32为控制器Bootloader启动程序的烧写。J32 、J33为D0D13十四个数字I/O口,用于数字传感器信号输入,或输出数字控制信号。J34为A0A5模拟六个模拟I/O口外,用于外接模拟信号传感器的信号输入。S1为手动复位按钮。其他都是一些辅助电路,原理简单,不再赘述。4,智能机器人小车光电传感器:机器人小车实现各种复杂功能的基础是首先要实现小车的自动导航。在本活动中小车导航时是通过小车的巡线来实现的。下车巡线简单可靠,容易操作。本光电传感器通过发光二极管D2发射可见光,在物体表面反射后被光敏三极管接受到。控制板通过检测光敏三极管两端的电压值来判断物体表面的颜色。第三章 机器人小车编程语言及环境由于本次活动的机器人控制器所采用的微控制器型号和网络上广泛流行的Arduino开源互动平台项目完全一致,所以在机器人开发语言和编程环境上面完全可以借用该平台的一切资源。一来可以降低机器人小车设计制作的难度,更主要的是Arduino开源互动平台是一个资源非常广泛,支持者和爱好者众多的优秀平台。1,Arduino语言 Arduino语言是建立在C/C+基础上的,其实也就是基础的C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让我们不了解AVR单片机(微控制器)的朋友也能轻松上手。 在与Arduino DIYER接触的这段时间里,发现有些朋友对Arduino语言还是比较难入手,那么这里我就简单的注释一下Arduino语言(本人也是半罐子水,有错的地方还请各位指正)。 1.1, 基础C语言 1.1.1关键字:if.else 必须紧接着一个问题表示式(expression),若这个表示式为真,紧连着表示式后的代码就会被执行。若这个表示式为假,则执行紧接着else之后的代码. 只使用 if不搭配else是被允许的。 范例: if (val = 1) digitalWrite(LED,HIGH); for 用来明定一段区域代码重复指行的次数。范例: for (int i = 0; i 10; i+) (ciao); switch case if叙述是程序里的分叉路口,switch case 是更多选项的路口。Swith case 根据变量值让程序有更多的选择,比起一串冗长的if叙述,使用swith case可使程序代码看起来比较简洁。 范例 :switch (sensorValue) case 23: digitalWrite(13,HIGH); break; case 46: digitalWrite(12,HIGH); break; default: / 以上条件都不符合时,预设执行的动作 digitalWrite(12,LOW); digitalWrite(13,LOW); while 当while之后的条件成立时,执行括号内的程序代码。 范例 : / 当sensor值小于512,闪烁LED灯 sensorValue = analogRead(1); while (sensorValue 512) digitalWrite(13,HIGH); delay(100); digitalWrite(13,HIGH); delay(100); sensorValue = analogRead(1); do. while 和while 相似,不同的是while前的那段程序代码会先被执行一次,不管特定的条件式为真或为假。因此若有一段程序代码至少需要被执行一次,就可以使用dowhile架构。 范例 :do digitalWrite(13,HIGH); delay(100); digitalWrite(13,HIGH); delay(100); sensorValue = analogRead(1); while (sensorValue 512); break 让程序代码跳离循环,并继续执行这个循环之后的程序代码。此外,在break也用于分隔switch case 不同的叙述。 范例 : /当sensor值小于512,闪烁LED灯 do / 按下按钮离开循环 if (digitalRead(7) = HIGH) break; digitalWrite(13,HIGH); delay(100); digitalWrite(13,HIGH); delay(100); sensorValue = analogRead(1); while (sensorValue 512); continue 用于循环之内,它可以强制跳离接下来的程序,并直接执行下一个循环。 范例 : for (light = 0; light 140) & (x 200) continue; analogWrite(PWMpin, light); delay(10); return 函数的结尾可以透过return回传一个数值。 例如,有一个计算现在温度的函数叫 computeTemperature(),你想要回传现在的温度给temperature变量,你可以这样写: int temperature = computeTemperature(); int computeTemperature() int temperature = 0; temperature = (analogRead(0) + 45) / 100; return temperature; goto 1.1.2语法符号: ; (分号) Arduino 语言每一行程序都是以分号为结尾。这样的语法让你可以自由地安排代码,你可以将两个指令放置在同一行,只要中间用分号隔开。 (但这样做可能降低程式的可读性。) 范例: delay(100); (大括号) 大括号用来将程式代码分成一个又一个的区块,如以下范例所示,在loop()函数的前、后,必须用大括号括起来。范例: void loop() n(cial); 程式的注释就是对代码的解释和说明,编写注释有助于程式设计师(或其他人)了解代码的功能。 Arduino处理器在对程式码进行编译时会忽略注释的部份。 Arduino 语言中的编写注释有两种方式。/单行注释:这整行的文字会被处理器忽略/*多行注释: 在这个范围内你可以 。写一整首诗 */ 1.1.3运算符: = + 相加 - 相减 * 相乘 / 相除 % 余数除法 = 等于 !=不等于 大于 = 大于等于 & 交集 | 联集 ! 反相 + 累加递减 += -= *= /= 1.1.4Arduuino复合运算符 += , -= , *= , /= 对一个变量和另一个参数或变量完成一个数学运算。+=(以及其他)可以缩短语法长度。 Syntax语法 x += y; / 等价于 x = x + y; x -= y; / 等价于 x = x - y; x *= y; / 等价于 x = x * y; x /= y; / 等价于 x = x / y; Parameters参数 x:任何变量类型 y:任何变量类型或常数 Examples范例 x = 2; x += 4; / x现在为6 x -= 3; / x现在为3 x *= 10; / x现在为30 x /= 2; / x现在为15 Syntax语法 x+; / increment x by one and returns the old value of x / 将x的值加1并返回原来的x的值。 +x; / increment x by one and returns the new value of x / 将x的值加1并返回现在的x的值。 x- ; / decrement x by one and returns the old value of x / 将x的值减1并返回原来的x的值。 -x ; / decrement x by one and returns the new value of x / 将x的值减1并返回现在的x的值。 Parameters参数 x: an integer or long (possibly unsigned) x:一个整数或长整数(可以无符号) Returns返回 The original or newly incremented / decremented value of the variable. 返回变量原始值或增加/消耗后的新值。 Examples范例 x = 2; y = +x; / x now contains 3, y contains 3 / x现在为3,y为3 y = x-; / x contains 2 again, y still contains 3 / x现在仍然为2,y将为31.1.5数据类型: boolean 布林 布尔变数的值只能为真(true)或是假(false) char 字符 单一字符例如 A,和一般的计算机做法一样Arduino 将字符储存成一个数字,即使你看到的明明就是一个文字。 用数字表示一个字符时,它的值有效范围为 -128 到127。 注意:有两种主流的计算机编码系统ASCII 和UNICODE。ASCII 表示了127个字符, 用来在序列终端机和分时计算器之间传输文字。 UNICODE可表示的字符量比较多,在现代计算机操作系统内它可以用来表示多国语言。 在位数需求较少的信息传输时,例如意大利文或英文这类由拉丁文,阿拉伯数字和一般常见符号构成的语言,ASCII仍是目前主要用来交换信息的编码法。 byte 字节类型 储存的数值范围为0到255。如同字符一样字节型态的变量只需要用一个字节(8位)的内存空间储存。int 整数 整数数据型态用到2字节的内存空间,可表示的整数范围为 32,768 到 32,767; 整数变量是Arduino内最常用到的数据型态。unsigned int 无符号整数(绝对值) 无号整数同样利用2字节的内存空间,无号意谓着它不能储存负的数值,因此无号整数可表示的整数范围为0 到 65,535。long 长整数长整数利用到的内存大小是整数的两倍,因此它可表示的整数范围从 2,147,483,648 到 2,147,483,647。 unsigned long 无符号长整数 无号长整数可表示的整数范围为0 到 4,294,967,295。 float 浮点数 浮点数就是用来表达有小数点的数值,每个浮点数会用掉四字节的RAM,注意芯片内存空间的限制,谨慎的使用浮点数 。double 双字节浮点也叫双精度浮点数,可表达最大值为 1.3157 x 10308。 string 字符串 字符串用来表达文字信息,它是由多个ASCII字符组成(你可以透过序串端口发送一个文字讯息或者将之显示在液晶显示器上)。字符串中的每一个字符都用一个组元组空间储存,并且在字符串的最尾端加上一个空字符以提示Ardunio处理器字符串的结束。下面两种宣告方式是相同的。 例如: char string1 = Arduino;/7字符+1空字符 char string28 = Arduino; / 与上行相同 array 数组 一串变量可以透过索引去直接取得。假如你想要储存不同程度的LED亮度时,你可以宣告六个变量light01,light02,light03,light04,light05,light06,但其实你有更好的选择,例如宣告一个整数数组变量如下: int light6 = 0 , 20 , 50 , 75 , 100 array 这个字为没有直接用在变量宣告,而是和宣告数组。1.1.6 控制指令 数据类型转换: char() byte() int() long() float() 常量:在Arduino语言中事先定义了一些具特殊用途的保留字。 HIGH | LOW 表示数字IO口的电平,HIGH 表示高电平(1),LOW 表示低电平(0)。 HIGH 和LOW 也用来表示你开启或是关闭了一个Arduino的脚位(pin) INPUT | OUTPUT 表示数字IO口的方向,INPUT 表示输入(高阻态),OUTPUT 表示输出(AVR能提供5V电压 40mA电流)。 true | false true 表示真(1),false表示假(0)。 变数: 变量用来指定Arduino 内存中的一个位置,变量可以用来储存数据,程序人员可以透过脚本代码去不限次数的操作变数的值。 因为Arduino 是一个非常简易的微处理器,但你要宣告一个变量时必须先定义他的数据型态,好让微处理器知道准备多大的空间以储存这个变量值。 1.2, Arduino 语言结构 以上为基础c语言的关键字和符号,有c语言基础的都应该了解其含义,这里也不作过多的解释。 1.2.1结构:声明变量及接口名称(int val;int ledPin=13;)。void setup() 在程序开始时使用,在这个函数范围内放置初始化Arduino 板子的程式,主要程式开始撰写前, 使Arduino 板子装置妥当的指令可以初始化变量、管脚接口模式、启用库等(例如:pinMode(ledPin,OUTPUT);)。void loop() 在setup()函数之后,即初始化之后,loop() 让你的程序循环地被执行。使用它来运转Arduino。连续执行函数内的语句,这部份的程式会一直重复的被执行,直到Arduino 板子被关闭。 1.2.2功能数字 I/O pinMode(pin, mode) 数字IO口输入输出模式定义函数,将接口定义为输入或输出接口,用在setup()函数里,pin表示为013接口名称, mode表示为INPUT或OUTPUT。即“ pinMode(接口名称,OUTPUT或INPUT)”。 范例 : pinMode(7,INPUT); / 将脚位 7 设定为输入模式 digitalWrite(pin, value) 数字IO口输出电平定义函数,将数字接口值至高或低、开或关,pin表示为013,value表示为HIGH或LOW,即digitalWrite(接口名称, HIGH或LOW)。但脚位必须先透过pinMode明示为输入或输出模式digitalWrite才能生效。比如定义HIGH可以驱动LED。 范例 : digitalWrite(8,HIGH); /将脚位 8设定输出高电位 int digitalRead(pin) 数字IO口读输入电平函数,读出数字接口的值,pin表示为013,value表示为HIGH或LOW,即digitalRead(接口名称)。比如可以读数字传感器。当感测到脚位处于高电位时时回传HIGH,否则回传LOW。 范例 : val = digitalRead(7); / 读出脚位 7 的值并指定给 val 1.2.3模拟 I/O int analogRead(pin) 模拟IO口读函数,从指定的模拟接口读取值,Arduino对该模拟值进行10-bit的数字转换,这个方法将输入的0-5电压值转换为 0到1023间的整数值。pin表示为05(Arduino Diecimila为05,Arduino nano为07)。即“analogRead(接口名称)”,比如可以读模拟传感器(10位AD,05V表示为01023)。 范例 : val = analogRead(0); /读出类比脚位 0 的值并指定给 val变数 analogWrite(pin, value) 数字IO口PWM输出函数,给一个接口写入模拟值(PWM波)。改变PWM脚位的输出电压值。对于 ATmega168芯片的Arduino(包括Mini或BT),该函数可以工作于 3, 5, 6, 9, 10和 11号接口,即“analogWrite(接口名称, 数值)”,pin表示3, 5, 6, 9, 10, 11,value表示为0255。比如可用于电机PWM调速或音乐播放。 例如:输出电压2.5伏特(V),该值大约是128。 范例 : analogWrite(9,128); / 输出电压约2.5伏特(V)1.2.4 扩展 I/O shiftOut(dataPin, clockPin, bitOrder, value) SPI外部IO扩展函数,通常使用带SPI接口的74HC595做8个IO扩展,把资料传给用来延伸数位输出的暂存器,此函式通常使用在延伸数位的输出。函式使用一个脚位表示资料、一个脚位表示时脉。dataPin为数据口,clockPin为时钟口,bitOrder用来表示位元间移动的方式,为数据传输方向(MSBFIRSTMSBFIRSTMSBFIRSTMSBFIRST高位在前,LSBFIRSTLSBFIRSTLSBFIRSTLSBFIRST低位在前),value会以byte形式输出,表示所要传送的数据(0255),另外还需要一个IO口做74HC595的使能控制。 范例 : shiftOut(dataPin, clockPin, LSBFIRST, 255); unsigned long pulseIn(pin, value) 脉冲长度记录函数,设定读取脚位状态的持续时间,返回时间参数(us),例如使用红外线、加速度感测器测得某一项数值时,在时间单位内不会改变状态。pin表示为013,value为HIGH或LOW。比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停止计时,然后返回该时间。 范例 : time = pulsein(7,HIGH); / 设定脚位7的状态在时间单位内保持为HIGH 1.2.5时间函数 unsigned long millis() 返回时间函数(单位ms), 回传晶片开始执行到目前的毫秒,该函数是指,当程序运行就开始计时并返回记录的参数,该参数溢出大概需要50天时间。 范例: duration = millis()-lastTime; / 表示自lastTime至当下的时间 delay(ms) 延时函数(单位ms),延时一段时间,暂停晶片执行多少毫秒, delay(1000)为一秒。 范例: delay(500); /暂停半秒(500毫秒) delayMicroseconds(us) 延时函数(单位us)暂停晶片执行多少微秒。 delayMicroseconds(1000); /暂停1豪秒1.2.6数学函数 min(x, y) 求最小值 ,回传两数之间较小者 范例: val = min(10,20); / 回传10 max(x, y) 求最大值 ,回传两数之间较大者 范例: val = max(10,20); / 回传20 abs(x) 计算绝对值 ,回传该数的绝对值,可以将负数转正数。 范例: val = abs(-5); / 回传5 constrain(x, a, b) 约束函数,下限a,上限b,判断x变数位于a与b之间的状态。x若小于a回传a;介于a与b之间回传x本身;大于b回传b 范例: val = constrain(analogRead(0), 0, 255); / 忽略大于255的数 map(value, fromLow, fromHigh, toLow, toHigh) 约束函数,value必须在fromLow与toLow之间和fromHigh与toHigh之间。将value变数依照fromLow与fromHigh范围,对等转换至toLow与toHigh范围。时常使用于读取类比讯号,转换至程式所需要的范围值。 例如: val = map(analogRead(0),0,1023,100, 200); / 将analog0 所读取到的讯号对等转换至100,200之间的数值。 pow(base, exponent) 开方函数,base的exponent次方。回传一个数(base)的指数(exponent)值。 范例: double x = pow(y, 32); / 设定x为y的32次方 sq(x) 平方 sqrt(x) 开根号 回传double型态的取平方根值。 范例: double a = sqrt(1138); / 回传1138平方根的近似值 33. 1.2.7三角函数 sin (rad) 回传角度(radians)的三角函数sine值。 范例: double sine = sin(2); / 近似值 0. cos(rad) 回传角度(radians)的三角函数cosine值。 范例: double cosine = cos(2); /近似值-0. tan(rad) 回传角度(radians)的三角函数tangent值。 范例: double tangent = tan(2); /近似值-2. 1.2.8随机数函数 randomSeed(seed) 随机数端口定义函数,seed表示读模拟口analogRead(pin)函数 。 事实上在Arduino里的乱数是可以被预知的。所以如果需要一个真正的乱数,可以呼叫此函式重新设定产生乱数种子。你可以使用乱数当作乱数的种子,以确保数字以随机的方式出现,通常会使用类比输入当作乱数种子,藉此可以产生与环境有关的乱数(例如:无线电波、宇宙雷射线、电话和萤光灯发出的电磁波等)。 范例: randomSeed(analogRead(5); / 使用类比输入当作乱数种子 long random(max) 随机数函数,返回数据大于等于0,小于max。 范例: long randnum = random(11); / 回传 0 -10之间的数字 long random(min, max) 随机数函数,返回数据大于等于min,小于max。 范例: long randnum = random(0, 100); / 回传0 99 之间的数字 1.2.9外部中断函数attachInterrupt(interrupt, , mode) 外部中断只能用到数字IO口2和3,interrupt表示中断口初始0或1,表示一个功能函数,mode:LOWLOWLOWLOW低电平中断,CHANGECHANGECHANGECHANGE有变化就中断,RISINGRISINGRISINGRISING上升沿中断,FALLINGFALLINGFALLINGFALLING 下降沿中断。 detachInterrupt(interrupt) 中断开关,interrupt=1 开,interrupt=0 关。 1.2.10中断使能函数 interrupts() 使能中断 10noInterrupts() 禁止中断 1.2.11串口收发函数 (speed) 串口定义波特率函数,设置串行每秒传输数据的速率(波特率),可以指定Arduino从电脑交换讯息的速率,通常我们使用9600 bps。,speed表示波特率,如9600,19200等。在同计算机通讯时,使用下面这些值:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600或 115200 bps(每秒位元组)。你也可以在任何时候使用其它的值,比如,与0号或1号插口通信就要求特殊的波特率。用在setup()函数里 范例: (9600) int able() 判断缓冲器状态。回传有多少位元组(bytes)的资料尚未被read()函式读取,如果回传值是0代表所有序列埠上资料都已经被read()函式读取。 范例: int count = able(); int () 读串口并返回收到参数。()读取持续输入的数据。读取1byte的序列资料 范例: int data = (); () 清空缓冲器。 有时候因为资料速度太快,超过程式处理资料的速度,你可以使用此函式清除缓冲区内的资料。经过此函式可以确保缓冲区(buffer)内的资料都是最新的。 范例: (); (data) 从串行端口输出数据。(数据)默认为十进制等于(数据,DEC)。 (data, encoding) 经序列埠传送资料,提供编码方式的选项。(数据,数据的进制)如果没有指定,预设以一般文字传送。 范例: (75); / 列印出 75 (75, DEC); /列印出 75 (75, HEX);/ 4B (75 的十六进位) (75, OCT); / 113 (75 in的八进位) (75,
展开阅读全文