《arduino入门基础经典编辑.doc》由会员分享,可在线阅读,更多相关《arduino入门基础经典编辑.doc(59页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.-目录一、 制作第一个电路 单led闪烁2二、 hello world经典例程9三、 Arduino基础10四、Arduino的数字输出11五、 Arduino的串口输入14六、Arduino的串口输出16七、Arduino的模拟输入18八、Arduino的模拟输出20九、6LED灯闪烁实验23十、蜂鸣器实验29十一、1位数码管实验32十二、按键实验34十三、光控LED实验37十四、1602实验39十五、lm35温度传感器实验42十六、舵机控制实验45十七、红外遥控接收实验48十八、红外遥控控制舵机实验50十九、LED点阵实验52二十、74HC595实验54ASCII表57ATMEGA328
2、引脚图58一、制作第一个电路 单led闪烁做任何一个电路之前,一定要先了解电路中原件的参数,其工作电压,工作电流等。第一个实验咱们用到的LED从网上查找资料得知,其工作电压一般为1.5-2.0V,工作电流一般为10-20ma,反向击穿电压为5V。控制板逻辑电路供电为5V。根据以上参数假设LED工作电压选用1.7,工作电流选用15ma,限流电阻=(总电压-LED电压)/电流,所以限流电阻=(5-1.7)/0.015=220。首先需要从arduino官方网站下载其编译软件,地址是http:/arduino.cc/en/Main/Software笔者使用的平台为win7 32位,如果大家使用的是其他
3、平台,按照对应的下载就可以。下载回来的软件包解压缩后的目录结构如下图,arduino.exe是程序的启动文件,driver目录是控制板usb芯片驱动,usb接上控制板后如果要寻找驱动,把目录指定到这里就可以。本次实验用到的器材为一个面包板,一个LED,一个1k的电阻,两根导线,如下图:本次实验的连接方法如下图,LED两个针脚有一长一短,短的是连接GND,长的是连接正极。在LED的长引脚前,需要添加一个220的限流电阻。连接数字5号接口。实物连接如下图:通过面包板把个个电子器件连接好以后,接上USB线,设置好控制板型号、端口号。程序语言先不详解,大家先照猫画虎对着抄,后面通过各个实验,将对不同命
4、令进行详解。编写程序前,先需要选择控制板的型号。如下图:控制板型号选择好后,选择串口位置,笔者电脑的串口为COM15:串口具体是多少号可以到设备管理中进行查看,如下图:先把程序复制进去:int ledPin=5; /设定控制LED的数字IO脚void setup() pinMode(ledPin,OUTPUT);/设定数字IO口的模式,OUTPUT 为输出void loop() digitalWrite(ledPin,HIGH); /设定PIN5脚为HIGH = 5V左右 delay(2000); /设定延时时间,2000 = 2秒 digitalWrite(ledPin,LOW); /设定P
5、IN5脚为LOW = 0V delay(2000); /设定延时时间,2000 = 2秒 图中int;void setup等褐色的文字是系统命令,OUTPUT等蓝色文字是命令的功能开关,黑色文字是变量。程序写好以后点击编译按钮进行编译。编译完成后会显示出来编译后的文件大小,本次编译出来的程序大小为1068字节。然后把编译好的程序下载到arduino控制板上,点击下载按钮。下载完成后会有提示本次实验效果如下,闪烁着光芒的灯。总结:int;void setup等褐色文字是系统命令,OUTPUT等蓝色文字是系统命令的功能开关,黑色文字是变量。在intledpin=5中;设置了LED的数字IO脚,le
6、dpin仅仅是5号数字端口自定义出来的名字,变成xxx等都可以。对于多脚IO操作的程序中,为每一个引脚定义名字是有必要性的,程序复杂后方便功能识别。二、hello world经典例程通过Arduino编译器查看串口数据最简单的例子:void setup()Serial.begin(9600); / 打开串口,设置波特率为9600 bpsvoid loop()Serial.println(“Hello world!”);delay(1000);如果电路安装正确,按照示例代码运行、上传,然后点击编译器的Serial Monitor按钮,就可以看到Serial Monitor输出Hello worl
7、d!。三、 Arduino基础在学语言之间,还要做的一个功课就是要明白程序的构架,这个也同样简单,大体可分为几个部分。1、声明变量及接口名称(int val;int ledPin=13;)。2、setup()函数在程序开始时使用,可以初始化变量、接口模式、启用库等(例如:pinMode(ledPin,OUTUPT);)。3、loop()在setup()函数之后,即初始化之后,loop() 让你的程序循环地被执行。使用它来运转Arduino。接下来就开始学习一下几个基本函数。1、pinMode(接口名称,OUTPUT或INPUT)将接口定义为输入或输出接口,用在setup()函数里。2、digi
8、talWrite(接口名称, HIGH或LOW)将数字接口值至高或低。3、digitalRead(接口名称)读出数字接口的值。4、analogWrite(接口名称, 数值)给一个接口写入模拟值(PWM波)。对于 ATmega168芯片的Arduino(包括Mini或BT),该函数可以工作于 3, 5, 6, 9, 10和 11号接口。老的 ATmega8芯片的USB和 serial Arduino仅仅支持 9, 10和11号接口。5、analogRead(接口名称)从指定的模拟接口读取值,Arduino对该模拟值进行10-bit的数字转换,这个方法将输入的0-5电压值转换为 0到1023间的整
9、数值。6、delay()延时一段时间,delay(1000)为一秒。7、Serial.begin(波特率)设置串行每秒传输数据的速率(波特率)。在同计算机通讯时,使用下面这些值:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600或 115200。你也可以在任何时候使用其它的值,比如,与0号或1号插口通信就要求特殊的波特率。用在setup()函数里8、Serial.read()读取持续输入的数据。9、Serial.print(数据,数据的进制)从串行端口输出数据。Serial.print(数据)默认为十进制等于Serial
10、.print(数据,DEC)。10、Serial.println(数据,数据的进制)从串行端口输出数据,跟随一个回车和一个换行符。这个函数所取得的值与 Serial.print()一样。以上几个函数是常用基本函数,还有很多以后会慢慢学习四、 Arduino的数字输出Arduino的数字I/O被分成两个部分,其中每个部分都包含有6个可用的I/O管脚,即管脚2 到管脚7和管脚8到管脚13。除了管脚13上接了一个1K的电阻之外,其他各个管脚都直接连接到ATmega上。我们可以利用一个6位的数字跑马灯,来对 Arduino数字I/O的输出功能进行验证,以下是相应的原理图:电路中在每个I/O管脚上加的那
11、个1K电阻被称为限流电阻,由于发光二极管在电路中没有等效电阻值,使用限流电阻可以使元件上通过的电流不至于过大,能够起到保护的作用。该工程对应的代码为:int startPin = 2;int endPin = 7;int index = 0;void setup()for (int i = startPin; i = endPin; i +) pinMode(i, OUTPUT);void loop()for (int i = startPin; i = endPin; i +) digitalWrite(i, LOW);digitalWrite(startPin + index, HIGH)
12、;index = (index + 1) %(endPin-startPin+1);delay(100);下载并运行该工程,连接在Arduino数字I/O管脚2到管脚7上的发光二极管会依次点亮0.1秒,然后再熄灭:这个实验可以用来验证数字I/O输出的正确性。Arduino上一共有十二个数字I/O管脚,我们可以用同样的办法验证其他六个管脚的正确性,而这只需要对上述工程的第一行做相应的修改就可以了:五、 Arduino的串口输入串行通信是在实现在PC机与微控制器进行交互的最简单的办法。之前的PC机上一般都配有标准的 RS-232或者RS-422接口来实现串行通信,但现在这种情况已经发生了一些改变,
13、大家更倾向于使用USB这样一种更快速但同时也更加复杂的方式来实现串行通信。尽管在有些计算机上现在已经找不到RS-232或者RS-422接口了,但我们仍可以通过USB/串口或者PCMCIA/串口这样的转换器, 在这些设备上得到传统的串口。通过串口连接的Arduino在交互式设计中能够为PC机提供一种全新的交互方式,比如用PC机控制一些之前看来非常复杂的事情,像声音和视频等。很多场合中都要求Arduino能够通过串口接收来自于PC机的命令,并完成相应的功能,这可以通过Arduino语言中提供的 Serial.read()函数来实现。在这一实验中我们同样不需要任何额外的电路,而只需要用串口线将Ard
14、uino和PC机连起来就可以了,相应的Arduino工程代码为:int ledPin = 13;int val;void setup() pinMode(ledPin, OUTPUT);Serial.begin(9600);void loop() val = Serial.read();if (-1 != val) if (H = val) digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); 把工程下载到Arduino模块中之后,在Arduino集成开发环境中打开串口监视器并将波特率设置为9600,然后向Ardu
15、ino模块发送字符H,如下图所示:该工程运行起来之后会不断调用Serial.read()函数从串口获得数据。Arduino语言提供的这个函数是不阻塞的,也就是说不论串口上是否真的有数据到达,该函数都会立即返回。Serial.read()函数每次只读取一个字节的数据,当串口上有数据到达的时候,该函数的返回值为到达的数 据中第一个字符的ASCII码;当串口上没有数据到达的时候,该函数的返回值则为-1。Arduino语言的参考手册中没 有对Serial.read()函数做过多的说明,我的一个疑问是如果PC机一次发送的数据太多,Arduino是否提供相应的串口缓存功能来保证数据不会丢失?Arduino
16、语言中提供的另外一个函数Serial.available()或许能够帮助我们用实验来进行验证:int ledPin = 13;int val;void setup() pinMode(ledPin, OUTPUT);Serial.begin(9600);void loop() val = Serial.read();if (-1 != val) if (H = val) digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW);Serial.print(Available: ); Serial.println(Seria
17、l.available(), DEC); 函数Serial.available()的功能是返回串口缓冲区中当前剩余的字符个数,按照Arduino提供的该函数的说明,串口缓冲区中最多能缓冲128个字节。我们可以一次给Arduino模块发送多个字符,来验证这一功能:在这一实验中,每当Arduino成功收到一个字符H,连接在数字I/O端口管脚13上的发光二极管就会闪烁一次:六、Arduino的串口输出在许多实际应用场合中我们会要求在Arduino和其它设备之间实现相互通信,而最常见通常也是最简单的办法就是使用串行通信。在串行通信中,两个设备之间一个接一个地来回发送数字脉冲,它们之间必须严格遵循相应的
18、协议以保证通信的正确性。在PC机上上最常见的串行通信协议是RS-232串行协议,而在各种微控制器(单片机)上采用的则是TTL串行协议。由于这两者的电平有很大的不同,因此在实现PC机和微控制器的通信时,必须进行相应的转换。完成RS-232电平和TTL电平之间的转换一般采用专用芯片,如MAX232等,但在 Arduino上是用相应的电平转换电路来完成的。根据Arduino的原理图我们不难看出,ATmega的RX和TX引脚一方面直接接到了数字I/O端口的0号和1号管脚,另一方面又通过电平转换电路接到了串口的母头上。因此,当我们需要用Arduino与PC机通信时,可以用串口线将两者连接起来;当我们需要
19、用 Arduino与微控制器(如另一块Arduino)通信时,则可以用数字I/O端口的0号和1号管脚。串行通信的难点在于参数的设置,如波特率、数据位、停止位等,在Arduino语言可以使用Serial.begin()函数来简化这一任务。为了实现数据的发送,Arduino则提供了Serial.print()和Serial.println()两个函数,它们的区别在于后者会在请求发送的数 据后面加上换行符,以提高输出结果的可读性。在这一实验中没有用到额外的电路, 我们只需要用串口线将Arduino和PC机连起来就可以了,相应的代码为:void setup() Serial.begin(9600);v
20、oid loop() Serial.println(Hello World!); delay(1000);在将工程下载到Arduino模块中之后,在Arduino集成开发环境的工具栏中单击“Serial Monitor”控制,打开串口监视器:接着将波特率设置为9600,即保持与工程中的设置相一致:如果一切正常,此时我们就可以在Arduino集成开发环境的Console窗口中看到串口上输出的数据了:为了检查串口上是否有数据发送,一个比较简单的办法是在数字I/O端口的1号管脚(TX)和5V电源之间接一个发光二极管,如下面的原理图所示:这样一旦Arduino在通过串口向PC机发送数据时,相应的发光二
21、极管就会闪烁,实际应用中这是一个非常方便的调试手段;七、 Arduino的模拟输入从指定的模拟引脚读取值。Arduino主板有6个通道(Mini和Nano有8个,Mega有16个),10位AD(模数)转换器。这意味着输入电压0-5伏对应0-1023的整数值。这就是说读取精度为:5伏/1024个单位,约等于每个单位0.049伏(4.9毫伏)。输入范围和进度可以通过analogReference()进行修改。模拟输入的读取周期为100微秒(0.0001秒),所以最大读取速度为每秒10,000次。pin:读取的模拟输入引脚号(大多数主板是A0-A5,Mini和Nano是A0-A7,Mega是A0-A
22、15)Returns 返回值int (0 to 1023)整数型 int(0到1023)如果模拟输入引脚没有连接到任何地方,analogRead()的返回值也会因为某些因素而波动(如其他模拟输入,你的手与主板靠的太近)int analogPin = A5; int val = 0; void setup() Serial.begin(9600); void loop() val = analogRead(analogPin); Serial.println(val); Delay(1000);八、Arduino的模拟输出脉冲宽度调制或PWM,是通过数字均值获得模拟结果的技术。数字控制被用来创建
23、一个方波,信号在开和关之间切换。这种开关模式通过改变“开”时间段和“关”时间段的比值完全模拟从开(5伏特)和关(0伏特)之间的电压。“开时间“的周期称为脉冲宽度。为了得到不同的模拟值,你可以更改,或调节脉冲宽度。如果你重复这种开关模式速度足够快,其结果是一个介于0和5V之间的稳定电压用以控制LED的亮度。下图中,绿色线表示一个固定的时间期限。此持续时间或周期是PWM的频率的倒数。换言之,Arduino的PWM频率约为500Hz,每个绿线之间表示2毫秒。一个analogWrite()的调用区间为0- 255,例如analogWrite(255)需要100占空比(常开),和analogWrite(
24、127)是50占空比(上一半的时间)。一旦你运行这个例子中,抓住你的Arduino来回摇晃。你这么做的实质上是时间跨越时空的映射。对我们的眼睛,每个运动模糊成一条线的LED闪烁。由于LED消失和缩小,那些小行的长度会增长和收缩。现在你就可以看到脉冲宽度。将模拟值(PWM波)输出到管脚。可用于在不同的光线亮度调节发光二极管亮度或以不同的速度驱动马达。调用analogWrite()后,该引脚将产生一个指定占空比的稳定方波,直到下一次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())。PWM的信号频率约为490赫兹。在大多数Arduino板(带
25、有ATmega168或ATmega328),这个函数工作在引脚3,5,6,9,10和11。在ArduinoMega,它适用于2-13号引脚。老的带有ATmega8的Arduino板只支持9,10,11引脚上使用。你并不需要在调用analogWrite()之前为设置输入引脚而调用pinMode()。这个analogWrite方法与模拟引脚或者analogRead方法毫不相干analogWrite(pin, value)Parameters 参数pin:输出的引脚号value:占用空:从0(常关)到255(常开)引脚5和6的PWM输出将产生高于预期的占空比。这是因为millis()和delay()
26、函数,它们共享同一个内部定时器用于产生PWM输出所产生的相互作用。这提醒我们引脚5和6在多数低占空比的设置(如0- 10)的情况下0数值的结果并没有完全关闭。int ledPin =3; int analogPin =A5; int val = 0; void setup() pinMode(ledPin, OUTPUT); void loop() val = analogRead(analogPin); analogWrite(ledPin, val / 4); 九、6LED灯闪烁实验通过上一节学习,知道了怎样让一个led进行闪烁,下面的实验会对六个led进行控制,先看硬件连接图。按照上面的
27、硬件连接方法接好后,咱们来测试两段程序,看看其中的差别。通过这两段程序介绍一下arduino的语言轮廓。 /设置控制Led的数字IO脚int Led1 = 1;int Led2 = 2;int Led3 = 3;int Led4 = 4;int Led5 = 5;int Led6 = 6;/led灯花样显示样式1子程序void style_1(void)unsigned char j;for(j=1;j=1;j-) digitalWrite(j,LOW); delay(200);void setup()unsigned char i;for(i=1;i=6;i+)/依次设置16个数字引脚为输出
28、模式 pinMode(i,OUTPUT);/设置第i个引脚为输出模式void loop() style_1();/样式1 /设置控制Led的数字IO脚int Led1 = 1;int Led2 = 2;int Led3 = 3;int Led4 = 4;int Led5 = 5;int Led6 = 6;/led灯花样显示样式1子程序void style_1(void)unsigned char j;for(j=1;j=1;j-) digitalWrite(j,LOW); delay(200);void setup()unsigned char i;for(i=1;i=6;i+)/依次设置16
29、个数字引脚为输出模式 pinMode(i,OUTPUT);/设置第i个引脚为输出模式void loop() style_1();/样式1通过下载测试,发现第一段程序是led 1-6逐个点亮,然后从6-1再逐个熄灭如此循环。第二段程序是6个灯同时亮,然后再6-1逐个熄灭如此循环。下面对产生不同效果的代码进行分析。下面这段代码代表的for语句循环的是,是把j点亮,然后再延迟200毫秒,然后再循环。形成的效果就是6个灯相隔200毫秒逐步被点亮。 for(j=1;j=6;j+) digitalWrite(j,HIGH); delay(200); 下面这段代码其实是不规范写法,for命令表达要求一定要有
30、循环,如果没有标出,编译时就会自动对下一句加上。如果代码量很大,出问题是查找起来会非常辛苦。 for(j=1;j=6;j+) digitalWrite(j,HIGH); delay(200); 正确的写法应该是下面这个样子 for(j=1;j=6;j+) digitalWrite(j,HIGH); delay(200); 六个灯逐个被点亮,然后再延时200毫秒进入下一句。因为六灯逐个点亮的速度非常快,所以看上去像一起亮的。void(无类型)在arduino中是数据类型的一种,通常用来代表一个事件。如果控制过程比较简单void一般无需定义,直接使用 void setup()/ .void loo
31、p()/ . 复制代码代表事件的开始与事件的循环。如果控制过程比较复杂,一般就要设置多个子事件,把复杂的过程进行分解,每一个子事件定义为一个void数据。把以下代码上传上去,看看led灯是如何工作的。 /设置控制Led的数字IO脚int Led1 = 1;int Led2 = 2;int Led3 = 3;int Led4 = 4;int Led5 = 5;int Led6 = 6;/led灯花样显示样式1子程序void style_1(void)unsigned char j;for(j=1;j=1;j-)/每隔200ms依次熄灭61引脚相连的led灯 digitalWrite(j,LOW)
32、;/熄灭j引脚相连的led灯 delay(200);/延时200ms/灯闪烁子程序void flash(void) unsigned char j,k;for(k=0;k=1;k+)/闪烁两次 for(j=1;j=6;j+)/点亮16引脚相连的led灯 digitalWrite(j,HIGH);/点亮与j引脚相连的led灯 delay(200);/延时200ms for(j=1;j=1;j-) digitalWrite(j,HIGH);/点亮灯 digitalWrite(j+k,HIGH);/点亮灯 delay(400);/延时400ms k +=2;/k值加2k=5;/设置k值为5for(j
33、=1;j=3;j+) digitalWrite(j,LOW);/熄灭灯 digitalWrite(j+k,LOW);/熄灭灯 delay(400);/延时400ms k -=2;/k值减2/led灯花样显示样式3子程序void style_3(void)unsigned char j,k;/led灯花样显示样式3子程序k=5;/设置k值为5for(j=1;j=1;j-) digitalWrite(j,HIGH);/点亮灯 digitalWrite(j+k,HIGH);/点亮灯 delay(400);/延时400ms digitalWrite(j,LOW);/熄灭灯 digitalWrite(j
34、+k,LOW);/熄灭灯 k +=2;/k值加2void setup()unsigned char i;for(i=1;i=6;i+)/依次设置16个数字引脚为输出模式 pinMode(i,OUTPUT);/设置第i个引脚为输出模式void loop() style_1();/样式1flash();/闪烁style_2();/样式2flash();/闪烁style_3();/样式3flash();/闪烁 十、蜂鸣器实验本次实验所用的为下图所示的这种小型无源蜂鸣器通过上网查询参数,得到其工作电压为5V,和arduino控制板数字端口输出电压一致,所以不需要接电阻。可直接接上使用。先简单介绍一下这