arduino学习笔记.docx
《arduino学习笔记.docx》由会员分享,可在线阅读,更多相关《arduino学习笔记.docx(19页珍藏版)》请在冰豆网上搜索。
arduino学习笔记
Arduino学习笔记
arduino学习笔记1-什么是arduino?
要了解arduino就先要了解什么是单片机,arduino平台的基础就是AVR指令集的单片机。
1、什么是单片机?
它与个人计算机有什么不同?
一台能够工作的计算机要有这样几个部份构成:
中央处理单元CPU(进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。
在个人计算机(PC)上这些部份被分成若干块芯片,安装在一个被称之为主板的印刷线路板上。
而在单片机中,这些部份全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如模拟量/数字量转换(A/D)和数字量/模拟量转换(D/A)等。
2、单片机有什么用?
实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用酷睿处理器吗?
应用的关键是看是否够用,是否有很好的性能价格比。
如果一台冰箱都需要用酷睿处理起来进行温度控制,那价格就是天价了。
单片机通常用于工业生产的控制、生活中与程序和控制有关(如:
电子琴、冰箱、智能空调等)的场合。
下图就是一个Atmega328P-PU单片机,基于AVR指令集的8位处理器,频率20MHz,存储器空间32KB。
什么是Arduino?
Arduino是一个能够用来感应和控制现实物理世界的一套工具。
它由一个基于单片机并且开放源码的硬件平台,和一套为Arduino板编写程序的开发环境组成。
Arduino可以用来开发交互产品,比如它可以读取大量的开关和传感器信号,并且可以控制各式各样的电灯、电机和其他物理设备。
Arduino项目可以是单独的,也可以在运行时和你电脑中运行的程序(例如:
Flash,Processing,MaxMSP)进行通讯。
Arduino板你可以选择自己去手动组装或是购买已经组装好的;Arduino开源的IDE可以免费下载得到。
Arduino的编程语言就像似在对一个类似于物理的计算平台进行相应的连线,它基于处理多媒体的编程环境。
为什么要使用Arduino?
有很多的单片机和单片机平台都适合用做交互式系统的设计。
例如:
ParallaxBasicStamp,Netmedia’sBX-24,Phidgets,MIT’sHandyboard和其它等等提供类似功能的。
所有这些工具,你都不需要去关心单片机编程繁琐的细节,提供给你的是一套容易使用的工具包。
Arduino同样也简化了同单片机工作的流程,但同其它系统相比Arduino在很多地方更具有优越性,特别适合老师,学生和一些业余爱好者们使用:
便宜-和其它平台相比,Arduino板算是相当便宜了。
最便宜的Arduino版本可以自己动手制作,即使是组装好的成品,其价格也不会超过200元。
跨平台-Arduino软件可以运行在Windows,MacintoshOSX,和Linux操作系统。
大部分其它的单片机系统都只能运行在Windows上。
简易的编程环境-初学者很容易就能学会使用Arduino编程环境,同时它又能为高级用户提供足够多的高级应用。
对于老师们来说,一般都能很方便的使用Processing编程环境,所以如果学生学习过使用Processing编程环境的话,那他们在使用Arduino开发环境的时候就会觉得很相似很熟悉。
软件开源并可扩展-Arduino软件是开源的,对于有经验的程序员可以对其进行扩展。
Arduino编程语言可以通过C++库进行扩展,如果有人想去了解技术上的细节,可以跳过Arduino语言而直接使用AVRC编程语言(因为Arduino语言实际上是基于AVRC的)。
类似的,如果你需要的话,你也可以直接往你的Arduino程序中添加AVR-C代码。
硬件开源并可扩展-Arduino板基于Atmel的ATMEGA8和ATMEGA168/328单片机。
Arduino基于CreativeCommons许可协议,所以有经验的电路设计师能够根据需求设计自己的模块,可以对其扩展或改进。
甚至是对于一些相对没有什么经验的用户,也可以通过制作试验板来理解Arduino是怎么工作的,省钱又省事。
Arduino基于AVR平台,对AVR库进行了二次编译封装,把端口都打包好了,寄存器啦、地址指针之类的基本不用管。
大大降低了软件开发难度,适宜非专业爱好者使用。
优点和缺点并存,因为是二次编译封装,代码不如直接使用AVR代码编写精练,代码执行效率与代码体积都弱于AVR直接编译。
性能:
DigitalI/O数字输入/输出端口0—13。
AnalogI/O模拟输入/输出端口0-5。
支持ICSP下载,支持TX/RX。
输入电压:
USB接口供电或者5V-12V外部电源供电。
输出电压:
支持级5VDC输出。
处理器:
使用AtmelAtmega168328处理器,因其支持者众多,已有公司开发出来32位的MCU平台支持arduino。
目前arduino的控制板最新的为ArduinoUno,如下图:
国内使用比较多的为ArduinoDuemilanove2009,主要原因是Uno的usb控制芯片封装方式改变,制造成本上升,其他变化不大,性价比还是ArduinoDuemilanove2009比较好。
因其开源特性,生产arduino控制板的厂商众多,同样的Duemilanove2009就有很多种颜色。
对于一些对电路板大小要求比较严格的地方,arduino团队提供了arduinoNano,此板体积做的非常小。
如下图:
arduino板子上基本端口如图描述,对几个比较特殊的端口下面详细说明下:
VIN端口:
VIN是inputvoltage的缩写,表示有外部电源时的输入端口。
AREF:
Referencevoltagefortheanaloginputs(模拟输入的基准电压)。
使用analogReference()命令调用。
ICSP:
也有称为ISP(InSystemProgrammer),就是一种线上即时烧录,目前比较新的芯片都支持这种烧录模式,包括大家常听说的8051系列的芯片,也都慢慢采用这种简便的烧录方式。
我们都知道传统的烧录方式,都是将被烧录的芯片,从线路板上拔起,有的焊死在线路板上的芯片,还得先把芯片焊接下来才能烧录。
为了解决这种问题,发明了ICSP线上即时烧录方式。
只需要准备一条R232线(连接烧录器),以及一条连接烧录器与烧录芯片针脚的连接线就可以。
电源的+5V,GND,两条负责传输烧录信息的针脚,再加上一个烧录电压针脚,这样就可以烧录了。
arduino学习笔记2
通过Arduino编译器查看串口数据
最简单的例子:
voidsetup()
{
(9600);.else
for
switchcase
while
do...while
break
continue
return
goto
语法符号:
;
{}
Debounce -forreadingnoisydigitalinputs.frombuttons)
Firmata -forcommunicatingwithapplicationsonthecomputerusingastandardserialprotocol.
GLCD -graphicsroutinesforLCDbasedonthe KS0108 orequivalentchipset.
LCD -control LCDs (using8datalines)
LCD4Bit -control LCDs (using4datalines)
LedControl -forcontrollingLEDmatricesorseven-segmentdisplayswitha MAX7221 or MAX7219.
LedControl -analternativetotheMatrixlibraryfordrivingmultiple LEDs withMaximchips.
Messenger -forprocessingtext-basedmessagesfromthecomputer
Metro -helpyoutimeactionsatregularintervals
MsTimer2 -usesthetimer2interrupttotriggeranactioneveryNmilliseconds.
OneWire -controldevices(fromDallasSemiconductor)thatusetheOneWireprotocol.
PS2Keyboard -readcharactersfroma PS2 keyboard.
Servo -providessoftwaresupportforServomotorsonanypins.
Servotimer1 -provideshardwaresupportforServomotorsonpins9and10
SimpleMessageSystem -sendmessagesbetweenArduinoandthecomputer
SSerial2Mobile -sendtextmessagesoremailsusingacellphone(viaATcommandsoversoftwareserial)
TextString -handlestrings
TLC5940 -16channel12bitPWMcontroller.
X10 -SendingX10signalsoverACpowerlines
/****************************************/
arduino学习笔记4数据类型
有多种类型的变量,如下所述
boolean 布尔
char 字符
byte 字节
int 整数
unsignedint无符号整数
long 长整数
unsignedlong无符号长整数
float 浮点
double 双字节浮点
string 字符串
array 数组
arduino学习笔记5Arduuino复合运算符
+=,-=,*=,/=
Description描述
Performamathematicaloperationonavariablewithanotherconstantorvariable.The+=(etal)operatorsarejustaconvenientshorthandfortheexpandedsyntax,listedbelow.
对一个变量和另一个参数或变量完成一个数学运算。
+=(以及其他)可以缩短语法长度。
Syntax语法
x+=y;
返回变量原始值或增加/消耗后的新值。
Examples范例
x=2;
y=++x;
乱数函式
产生乱数
randomSeed(seed)
事实上在Arduino里的乱数是可以被预知的。
所以如果需要一个真正的乱数,可以呼叫此函式重新设定产生乱数种子。
你可以使用乱数当作乱数的种子,以确保数字以随机的方式出现,通常会使用类比输入当作乱数种子,藉此可以产生与环境有关的乱数(例如:
无线电波、宇宙雷射线、电话和萤光灯发出的电磁波等)。
范例:
randomSeed(analogRead(5));Digitalcontrolisusedtocreateasquarewave,asignalswitchedbetweenonandoff.Thison-offpatterncansimulatevoltagesinbetweenfullon(5Volts)andoff(0Volts)bychangingtheportionofthetimethesignalspendsonversusthetimethatthesignalspendsoff.Thedurationof"ontime"iscalledthepulsewidth.Togetvaryinganalogvalues,youchange,ormodulate,thatpulsewidth.Ifyourepeatthison-offpatternfastenoughwithanLEDforexample,theresultisasifthesignalisasteadyvoltagebetween0and5vcontrollingthebrightnessoftheLED.
脉冲宽度调制或PWM,是通过数字均值获得模拟结果的技术。
数字控制被用来创建一个方波,信号在开和关之间切换。
这种开关模式通过改变“开”时间段和“关”时间段的比值完全模拟从开(5伏特)和关(0伏特)之间的电压。
“开时间“的周期称为脉冲宽度。
为了得到不同的模拟值,你可以更改,或调节脉冲宽度。
如果你重复这种开关模式速度足够快,其结果是一个介于0和5V之间的稳定电压用以控制LED的亮度。
Inthegraphicbelow,thegreenlinesrepresentaregulartimeperiod.ThisdurationorperiodistheinverseofthePWMfrequency.Inotherwords,withArduino'sPWMfrequencyatabout500Hz,thegreenlineswouldmeasure2millisecondseach.Acallto analogWrite()isonascaleof0-255,suchthatanalogWrite(255)requestsa100%dutycycle(alwayson),andanalogWrite(127)isa50%dutycycle(onhalfthetime)forexample.
下图中,绿色线表示一个固定的时间期限。
此持续时间或周期是PWM的频率的倒数。
换言之,Arduino的PWM频率约为500Hz,每个绿线之间表示2毫秒。
一个analogWrite()的调用区间为0-255,例如analogWrite(255)需要100%占空比(常开),和analogWrite(127)是50%占空比(上一半的时间)。
Onceyougetthisexamplerunning,grabyourarduinoandshakeitbackandforth.Whatyouaredoinghereisessentiallymappingtimeacrossthespace.Tooureyes,themovementblurseachLEDblinkintoaline.AstheLEDfadesinandout,thoselittlelineswillgrowandshrinkinlength.Nowyouareseeingthepulsewidth.
一旦你运行这个例子中,抓住你的Arduino来回摇晃。
你这么做的实质上是时间跨越时空的映射。
对我们的眼睛,每个运动模糊成一条线的LED闪烁。
由于LED消失和缩小,那些小行的长度会增长和收缩。
现在你就可以看到脉冲宽度。
arduino学习笔记13Arduino的模拟输入
Description介绍
Readsthevaluefromthespecifiedanalogpin.TheArduinoboardcontainsa6channel(8channelsontheMiniandNano,16ontheMega),10-bitanalogtodigitalconverter.Thismeansthatitwillmapinputvoltagesbetween0and5voltsintointegervaluesbetween0and1023.Thisyieldsaresolutionbetweenreadingsof:
5volts/1024unitsor,.0049voltsmV)perunit.Theinputrangeandresolutioncanbechangedusing analogReference().
Ittakesabout100microsecondss)toreadananaloginput,sothemaximumreadingrateisabout10,000timesasecond.
从指定的模拟引脚读取值。
Arduino主板有6个通道(Mini和Nano有8个,Mega有16个),10位AD(模数)转换器。
这意味着输入电压0-5伏对应0-1023的整数值。
这就是说读取精度为:
5伏/1024个单位,约等于每个单位伏(毫伏)。
输入范围和进度可以通过analogReference()进行修改。
模拟输入的读取周期为100微秒(秒),所以最大读取速度为每秒10,000次。
Syntax语法
analogRead(pin)
Parameters参数
pin:
thenumberoftheanaloginputpintoreadfrom(0to5onmostboards,0to7ontheMiniandNano,0to15ontheMega)
pin:
读取的模拟输入引脚号(大多数主板是0-5,Mini和Nano是0-7,Mega是0-15)
Returns返回值
int(0to1023)
整数型 int(0到1023)
Note备注
Iftheanaloginputpinisnotconnectedtoanything,thevaluereturnedbyanalogRead()willfluctuatebasedonanumberoffactors.thevaluesoftheotheranaloginputs,howcloseyourhandistotheboard,etc.).
如果模拟输入引脚没有连接到任何地方,analogRead()的返回值也会因为某些因素而波动(如其他模拟输入,你的手与主板靠的太近)
Example例子
intanalogPin=3;CanbeusedtolightaLEDatvaryingbrightnessesordriveamotoratvariousspeeds.Afteracallto analogWrite(),thepinwillgenerateasteadysquarewaveofthespecifieddutycycleuntilthenextcallto analogWrite() (oracallto digitalRead() or digitalWrite() onthesamepin).ThefrequencyofthePWMsignalisapproximately490Hz.
将模拟值(PWM波)输出到管脚。
可用于在不同的光线亮度调节发光二极管亮度或以不同的速度驱动马达。
调用analogWrite()后,该引脚将产生一个指定占空比的稳定方波,直到下一次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())。
PWM的信号频率约为490赫兹。
OnmostArduinoboards(thosewiththe ATmega168 or ATmega328),thisfunctionworksonpins3,5,6,9,10,and11.OntheArduinoMega,itworksonpins2through13.OlderArduinoboardswithan ATmega8 onlysupportanalogWrite()onpins9,10,and11.YoudonotneedtocallpinMode()tosetthepinasanoutputbeforecallinganalogWrite().
在大多数Arduino板(带有ATmega168或ATmega328),这个函数工作在引脚3,5,6,9,10和11。
在ArduinoMega,它适用于2-13号引脚。
老的带有ATmega8的Arduino板只支持9,10,11引脚上使用。
你并不需要在调用analogWrite()之前为设置输入引脚而调用pinMode()。
The analogWrite functionhasnothingwhatsoevertodowiththeanalogpinsorthe analogRead function.
这个analogWrite方法与模拟引脚或者analogRead方法毫不相干
Syntax语法
analogWrite(pin,value)
Parameters参数
pin:
thepintowriteto.
pin:
输出的引脚号
value:
thedutycycle:
between0(alwaysoff)and255(alwayson).
value:
占用空:
从0(常关)到255(常开)
Returns返回值
nothing
NotesandKnownIssues备注和已知问题
ThePWMoutputsgeneratedonpin