arduino如何运行程序(arduino运行程序自己停了)

当前位置:首页 > 运势 发布时间:2023-05-13编辑:来源:www.ss230.com阅读数: 手机阅读

arduino如何运行程序

arduino学习笔记

Arduino语言是建立在C/C++基础上的,其实也就是基础的C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让我们不了解AVR单片机(微控制器)的朋友也能轻松上手。

/*************基础C语言*************/

关键字:

if

if...else

for

switch case

while

do... while

break

continue

return

goto

语法符号:

;

{}

//

/* */

运算符:

=

+

-

*

/

%

==

!=

<

>

>=

&&

!

++

--

+=

-=

*=

/=

数据类型:

boolean

布尔类型

char

byte

字节类型

int

unsigned int

long

unsigned long

float

double

string

array

void

数据类型转换:

char()

byte()

int()

long()

float()

常量:

HIGH

LOW

表示数字IO口的电平,

HIGH

表示高电平(1),

LOW

表示低电平(0)。

INPUT

OUTPUT

表示数字IO口的方向,

INPUT

表示输入(高阻态),

OUTPUT

表示输出(AVR能提供5V电压 40mA电流)。

true

false

true

表示真(1),

false

表示假(0)。

/******************************************/

以上为基础c语言的关键字和符号,有c语言基础的都应该了解其含义,这里也不作过多的解释。

/*************Arduino 语言*************/

结构

void

setup

() 初始化变量,管脚模式,调用库函数等

void

loop

() 连续执行函数内的语句

功能

数字 I/O

pinMode

(pin, mode) 数字IO口输入输出模式定义函数,pin表示为0~13, mode表示为INPUT或OUTPUT。

digitalWrite

(pin, value) 数字IO口输出电平定义函数,pin表示为0~13,value表示为HIGH或LOW。比如定义HIGH可以驱动LED。

int

digitalRead

(pin) 数字IO口读输入电平函数,pin表示为0~13,value表示为HIGH或LOW。比如可以读数字传感器。

模拟 I/O

int

analogRead

(pin) 模拟IO口读函数,pin表示为0~5(Arduino Diecimila为0~5,Arduino nano为0~7)。比如可以读模拟传感器(10位AD,0~5V表示为0~1023)。

analogWrite

(pin, value) -

PWM

数字IO口PWM输出函数,Arduino数字IO口标注了PWM的IO口可使用该函数,pin表示3, 5, 6, 9, 10, 11,value表示为0~255。比如可用于电机PWM调速或音乐播放。

扩展 I/O

shiftOut

(dataPin, clockPin, bitOrder, value) SPI外部IO扩展函数,通常使用带SPI接口的74HC595做8个IO扩展,dataPin为数据口,clockPin为时钟口,bitOrder为数据传输方向(MSBFIRST高位在前,LSBFIRST低位在前),value表示所要传送的数据(0~255),另外还需要一个IO口做74HC595的使能控制。

unsigned long

pulseIn

(pin, value) 脉冲长度记录函数,返回时间参数(us),pin表示为0~13,value为HIGH或LOW。比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停止计时,然后返回该时间。

时间函数

unsigned long

millis

() 返回时间函数(单位ms),该函数是指,当程序运行就开始计时并返回记录的参数,该参数溢出大概需要50天时间。

delay

(ms) 延时函数(单位ms)。

delayMicroseconds

(us) 延时函数(单位us)。

数学函数

min

(x, y) 求最小值

max

(x, y) 求最大值

abs

(x) 计算绝对值

constrain

(x, a, b) 约束函数,下限a,上限b,x必须在ab之间才能返回。

map

(value, fromLow, fromHigh, toLow, toHigh) 约束函数,value必须在fromLow与toLow之间和fromHigh与toHigh之间。

pow

(base, exponent) 开方函数,base的exponent次方。

sq

(x) 平方

sqrt

(x) 开根号

三角函数

sin

(rad)

cos

(rad)

tan

(rad)

随机数函数

randomSeed

(seed) 随机数端口定义函数,seed表示读模拟口analogRead(pin)函数 。

long

random

(max) 随机数函数,返回数据大于等于0,小于max。

long

random

(min, max) 随机数函数,返回数据大于等于min,小于max。

外部中断函数

attachInterrupt

(interrupt, , mode) 外部中断只能用到数字IO口2和3,interrupt表示中断口初始0或1,表示一个功能函数,mode:LOW低电平中断,CHANGE有变化就中断,RISING上升沿中断,FALLING下降沿中断。

detachInterrupt

(interrupt) 中断开关,interrupt=1 开,interrupt=0 关。

中断使能函数

interrupts

() 使能中断

noInterrupts

() 禁止中断

串口收发函数

Serial.begin

(speed) 串口定义波特率函数,speed表示波特率,如9600,19200等。

int

Serial.available

() 判断缓冲器状态。

int

Serial.read

() 读串口并返回收到参数。

Serial.flush

() 清空缓冲器。

Serial.print

(data) 串口输出数据。

Serial.println

(data) 串口输出数据并带回车符。

/**********************************/

/************Arduino语言库文件*************/

官方库文件

EEPROM

- EEPROM读写程序库

Ethernet

- 以太网控制器程序库

LiquidCrystal

- LCD控制程序库

Servo

- 舵机控制程序库

SoftwareSerial

- 任何数字IO口模拟串口程序库

Stepper

- 步进电机控制程序库

Wire

- TWI/I2C总线程序库

Matrix

- LED矩阵控制程序库

Sprite

- LED矩阵图象处理控制程序库

非官方库文件

DateTime

- a library for keeping track of the current date and time in software.

Debounce

- for reading noisy digital inputs (e.g. from buttons)

Firmata

- for communicating with applications on the computer using a standard serial protocol.

GLCD

- graphics routines for LCD based on the KS0108 or equivalent chipset.

LCD

- control LCDs (using 8 data lines)

LCD 4 Bit

- control LCDs (using 4 data lines)

LedControl

- for controlling LED matrices or seven-segment displays with a MAX7221 or MAX7219.

LedControl

- an alternative to the Matrix library for driving multiple LEDs with Maxim chips.

Messenger

- for processing text-based messages from the computer

Metro

- help you time actions at regular intervals

MsTimer2

- uses the timer 2 interrupt to trigger an action every N milliseconds.

OneWire

- control devices (from Dallas Semiconductor) that use the One Wire protocol.

PS2Keyboard

- read characters from a PS2 keyboard.

Servo

- provides software support for Servo motors on any pins.

Servotimer1

- provides hardware support for Servo motors on pins 9 and 10

Simple Message System

- send messages between Arduino and the computer

SSerial2Mobile

- send text messages or emails using a cell phone (via AT commands over software serial)

TextString

- handle strings

TLC5940

- 16 channel 12 bit PWM controller.

X10

- Sending X10 signals over AC power lines

/********************数据类型********************/

有多种类型的变量,如下所述

boolean 布尔char 字符byte 字节int 整数unsigned int 无符号整数long 长整数unsigned long 无符号长整数float 浮点double 双字节浮点string 字符串array 数组

/******************** Arduuino复合运算符********************/

+= , -= , *= , /=Description描述Perform a mathematical operation on a variable with another constant or variable. The += (et al) operators are just a convenient shorthand for the expanded syntax, listed below.对一个变量和另一个参数或变量完成一个数学运算。+=(以及其他)可以缩短语法长度。

Syntax语法x += y; // equivalent to the expression x = x + y; // 等价于 x = x + y;x -= y; // equivalent to the expression x = x - y; // 等价于 x = x - y;x *= y; // equivalent to the expression x = x * y; // 等价于 x = x * y;x /= y; // equivalent to the expression x = x / y; // 等价于 x = x / y;

Parameters参数x: any variable typex:任何变量类型

y: any variable type or constanty:任何变量类型或常数

Examples范例x = 2;x += 4; // x now contains 6 // x现在为6x -= 3; // x now contains 3 // x现在为3x *= 10; // x now contains 30 // x现在为30x /= 2; // x now contains 15 // 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为3y = x--; // x contains 2 again, y still contains 3 // x现在仍然为2,y将为3

/******************** Arduino基础*******************/

在学语言之间,还要做的一个功课就是要明白程序的构架,这个也同样简单,大体可分为几个部分。

1、声明变量及接口名称(int val;int ledPin=13;)。

2、setup()——函数在程序开始时使用,可以初始化变量、接口模式、启用库等(例如:pinMode(ledPin,OUTUPT);)。

3、loop()——在setup()函数之后,即初始化之后,loop() 让你的程序循环地被执行。使用它来运转Arduino。

接下来就开始学习一下几个基本函数。

1、pinMode(接口名称,OUTPUT或INPUT)将——接口定义为输入或输出接口,用在setup()函数里。

2、digitalWrite(接口名称, 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间的整数值。

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.print(数据,DEC)。

10、Serial.println(数据,数据的进制)——从串行端口输出数据,跟随一个回车和一个换行符。这个函数所取得的值与 Serial.print()一样。

以上几个函数是常用基本函数,还有很多以后会慢慢学习

/******************** Arduino函数*******************/

输入输出函数

arduino运行程序自己停了

Arduino 内含了一些处理输出与输入的切换功能,相信已经从书中程式范例略知一二。

pinMode(pin, mode)

将数位脚位(digital pin)指定为输入或输出。

范例 :

pinMode(7,INPUT); // 将脚位 7 设定为输入模式

digitalWrite(pin, value)

将数位脚位指定为开或关。脚位必须先透过pinMode明示为输入或输出模式digitalWrite才能生效。

范例 :

digitalWrite(8,HIGH); //将脚位 8设定输出高电位

int digitalRead(pin)

将输入脚位的值读出,当感测到脚位处于高电位时时回传HIGH,否则回传LOW。

范例 :

val = digitalRead(7); // 读出脚位 7 的值并指定给 val

int analogRead(pin)

读出类比脚位的电压并回传一个 0到1023 的数值表示相对应的0到5的电压值。

范例 :

val = analogRead(0); //读出类比脚位 0 的值并指定给 val变数

analogWrite(pin, value)

改变PWM脚位的输出电压值,脚位通常会在3、5、6、9、10与11。Value变数范围0-255,例如:输出电压2.5伏特(V),该值大约是128。

范例 :

analogWrite(9,128); // 输出电压约2.5伏特(V)

unsigned long pulseIn(pin, value)

设定读取脚位状态的持续时间,例如使用红外线、加速度感测器测得某一项数值时,在时间单位内不会改变状态。

范例 :

time = pulsein(7,HIGH); // 设定脚位7的状态在时间单位内保持为HIGH

shiftOut(dataPin, clockPin, bitOrder, value)

把资料传给用来延伸数位输出的暂存器,函式使用一个脚位表示资料、一个脚位表示时脉。bitOrder用来表示位元间移动的方式(LSBFIRST最低有效位元或是MSBFIRST最高有效位元),最后value会以byte形式输出。此函式通常使用在延伸数位的输出。

范例 :

shiftOut(dataPin, clockPin, LSBFIRST, 255);

时间函数

控制与计算晶片执行期间的时间

unsigned long millis()

回传晶片开始执行到目前的毫秒

范例:

duration = millis()-lastTime; // 表示自"lastTime"至当下的时间

delay(ms)

暂停晶片执行多少毫秒

范例:

delay(500); //暂停半秒(500毫秒)

delay Microseconds(us)

暂停晶片执行多少微秒

范例:

delayMicroseconds(1000); //暂停1毫秒

数学函式

三角函数以及基本的数学运算

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)

判断x变数位于a与b之间的状态。x若小于a回传a;介于a与b之间回传x本身;大于b回传

范例:

val = constrain(analogRead(0), 0, 255); // 忽略大于255的

map(value, fromLow, fromHigh, toLow, toHigh)

将value变数依照fromLow与fromHigh范围,对等转换至toLow与toHigh范围。时常使用于读取类比讯号,转换至程式所需要的范围值。

例如:

val = map(analogRead(0),0,1023,100, 200); // 将analog0 所读取到的讯号对等转换至100 – 200之间的数值。

double pow(base, exponent)

回传一个数(base)的指数(exponent)值。

范例:

double x = pow(y, 32); // 设定x为y的32次方

double sqrt(x)

回传double型态的取平方根值。

范例:

double a = sqrt(1138); // 回传1138平方根的近似值 33.73425674438

double sin(rad

回传角度(radians)的三角函数sine值。

范例

double sine = sin(2); // 近似值 0.90929737091

double cos(rad)

回传角度(radians)的三角函数cosine值。

范例

double cosine = cos(2); //近似值-0.41614685058

double tan(rad)

回传角度(radians)的三角函数tangent值。

范例:

double tangent = tan(2); //近似值-2.18503975868

乱数函式

产生乱数

randomSeed(seed)

事实上在Arduino里的乱数是可以被预知的。所以如果需要一个真正的乱数,可以呼叫此函式重新设定产生乱数种子。你可以使用乱数当作乱数的种子,以确保数字以随机的方式出现,通常会使用类比输入当作乱数种子,藉此可以产生与环境有关的乱数(例如:无线电波、宇宙雷射线、电话和萤光灯发出的电磁波等)。

范例:

randomSeed(analogRead(5)); // 使用类比输入当作乱数种子

long random(max)

long random(min, max)

回传指定区间的乱数,型态为long。如果没有指定最小值,预设为0

范例:

long randnum = random(0, 100); // 回传0 – 99 之间的数字

long randnum = random(11); // 回传 0 -10之间的数字

序列通讯

你可以在第五章看见一些使用序列埠与电脑交换讯息的范例,以下是函式解释。

Serial.begin(speed)

你可以指定Arduino从电脑交换讯息的速率,通常我们使用9600 bps。当然也可以使用其他的速度,但是通常不会超过115,200 bps(每秒位元组)。

范例:

Serial.begin(9600)

Serial.print(data)

Serial.print(data, encoding)

经序列埠传送资料,提供编码方式的选项。如果没有指定,预设以一般文字传送。

范例:

Serial.print(75); // 列印出 "75"

Serial.print(75, DEC); //列印出 "75"

Serial.print(75, HEX); // "4B" (75 的十六进位)

Serial.print(75, OCT); // "113" (75 in的八进位

Serial.print(75, BIN); // "1001011" (75的二进位)

Serial.print(75, BYTE); // "K" (以byte进行传送,显示以ASCII编码方式)

Serial.println(data)

Serial.println(data, encoding)

与Serial.print()相同,但会在资料尾端加上换行字元( )。意思如同你在键盘上打了一些资料后按下Enter。

范例

Serial.println(75); //列印出"75 "

Serial.println(75, DEC); //列印出"75 "

Serial.println(75, HEX); // "4B "

Serial.println(75, OCT); // "113 "

Serial.println(75, BIN); // "1001011 "

Serial.println(75, BYTE); // "K "

int Serial.available()

回传有多少位元组(bytes)的资料尚未被read()函式读取,如果回传值是0代表所有序列埠上资料都已经被read()函式读取。

范例:

int count = Serial.available();

int Serial.read()

读取1byte的序列资料

范例:

int data = Serial.read();

Serial.flush()

有时候因为资料速度太快,超过程式处理资料的速度,你可以使用此函式清除缓冲区内的资料。经过此函式可以确保缓冲区(buffer)内的资料都是最新的。

范例:

Serial.flush();

/******************** Arduino数字输入*******************/

在数字电路中开关(switch)是一种基本的输入形式,它的作用是保持电路的连接或者断开。Arduino从数字I/O管脚上只能读出高电平(5V)或者低电平(0V),因此我们首先面临到的一个问题就是如何将开关的开/断状态转变成Arduino能够读取的高/低电平。解决的办法是通过上 /下拉电阻,按照电路的不同通常又可以分为正逻辑(Positive Logic)和负逻辑(Inverted Logic)两种。

在正逻辑电路中,开关一端接电源,另一端则通过一个10K的下拉电阻接地,输入信号从开关和电阻间引出。当开关断开的时候,输入信号被电阻“拉”向地,形成低电平(0V);当开关接通的时候,输入信号直接与电源相连,形成高电平。对于经常用到的按压式开关来讲,就是按下为高,抬起为低。

在负逻辑电路中,开关一端接地,另一端则通过一个10K的上拉电阻接电源,输入信号同样也是从开关和电阻间引出。当开关断开时,输入信号被电阻“拉”向电源,形成高电平(5V);当开关接通的时候,输入信号直接与地相连,形成低电平。对于经常用到的按压式开关来讲,就是按下为低,抬起为高。

为了验证Arduino数字I/O的输入功能,我们可以将开关接在Arduino的任意一个数字I/O管脚上(13除外),并通过读取它的接通或者断开状态,来控制其它数字I/O管脚的高低。本实验采用的原理图如下所示,其中开关接在数字I/O的7号管脚上,被控的发光二极管接在数字I/O的13号 管脚上:

相应的代码为:

int ledPin = 13;int switchPin = 7;int value = 0;void setup() {pinMode(ledPin, OUTPUT);pinMode(switchPin, INPUT);}void loop() {value = digitalRead(switchPin);if (HIGH == value) {// turn LED offdigitalWrite(ledPin, LOW);} else {// turn LED ondigitalWrite(ledPin, HIGH);}}

由于采用的是负逻辑电路,开关按下时用digitalRead()函数读取到的值为LOW,此时再用digitalWrite()函数将发光二极管所在的管脚置为高,点亮发光二极管。同理,当开关抬起时,发光二极管将被熄灭,这样我们就实现了用开关来控制发光二极管的功能。

arduino学习笔记9 Arduino的数字输出

Arduino的数字I/O被分成两个部分,其中每个部分都包含有6个可用的I/O管脚,即管脚2 到管脚7和管脚8到管脚13。除了管脚13上接了一个1K的电阻之外,其他各个管脚都直接连接到ATmega上。我们可以利用一个6位的数字跑马灯,来对 Arduino数字I/O的输出功能进行验证,以下是相应的原理图:

电路中在每个I/O管脚上加的那个1K电阻被称为限流电阻,由于发光二极管在电路中没有等效电阻值,使用限流电阻可以使元件上通过的电流不至于过大,能够起到保护的作用。

该工程对应的代码为:

int BASE = 2;int NUM = 6;int index = 0;void setup(){for (int i = BASE; i< BASE + NUM; i ++) {pinMode(i, OUTPUT);}}void loop(){for (int i = BASE; i< BASE + NUM; i ++) {digitalWrite(i, LOW);}digitalWrite(BASE + index, HIGH);index = (index + 1) % NUM;delay(100);}下载并运行该工程,连接在Arduino数字I/O管脚2到管脚7上的发光二极管会依次点亮0.1秒,然后再熄灭:

这个实验可以用来验证数字I/O输出的正确性。Arduino上一共有十二个数字I/O管脚,我们可以用同样的办法验证其他六个管脚的正确性,而这只需要对上述工程的第一行做相应的修改就可以了:

int BASE = 8;

/******************** Arduino的串口输入******************/

串行通信是在实现在PC机与微控制器进行交互的最简单的办法。之前的PC机上一般都配有标准的 RS-232或者RS-422接口来实现串行通信,但现在这种情况已经发生了一些改变,大家更倾向于使用USB这样一种更快速但同时也更加复杂的方式来实现串行通信。尽管在有些计算机上现在已经找不到RS-232或者RS-422接口了,但我们仍可以通过USB/串口或者PCMCIA/串口这样的转换器, 在这些设备上得到传统的串口。

通过串口连接的Arduino在交互式设计中能够为PC机提供一种全新的交互方式,比如用PC机控制一些之前看来非常复杂的事情,像声音和视频等。很多场合中都要求Arduino能够通过串口接收来自于PC机的命令,并完成相应的功能,这可以通过Arduino语言中提供的 Serial.read()函数来实现。

在这一实验中我们同样不需要任何额外的电路,而只需要用串口线将Arduino和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,然后向Arduino模块发送字符H,如下图所示:

该工程运行起来之后会不断调用Serial.read()函数从串口获得数据。Arduino语言提供的这个函数是不阻塞的,也就是说不论串口上是否真的有数据到达,该函数都会立即返回。Serial.read()函数每次只读取一个字节的数据,当串口上有数据到达的时候,该函数的返回值为到达的数 据中第一个字符的ASCII码;当串口上没有数据到达的时候,该函数的返回值则为-1。

Arduino语言的参考手册中没 有对Serial.read()函数做过多的说明,我的一个疑问是如果PC机一次发送的数据太多,Arduino是否提供相应的串口缓存功能来保证数据不会丢失?Arduino语言中提供的另外一个函数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(Serial.available(), DEC);}}}函数Serial.available()的功能是返回串口缓冲区中当前剩余的字符个数,按照Arduino提供的该函数的说明,串口缓冲区中最多能缓冲128个字节。我们可以一次给Arduino模块发送多个字符,来验证这一功能:

在这一实验中,每当Arduino成功收到一个字符H,连接在数字I/O端口管脚13上的发光二极管就会闪烁一次:

/******************** Arduino的串口输出******************/

在许多实际应用场合中我们会要求在Arduino和其它设备之间实现相互通信,而最常见通常也是最简单的办法就是使用串行通信。在串行通信中,两个设备之间一个接一个地来回发送数字脉冲,它们之间必须严格遵循相应的协议以保证通信的正确性。

在PC机上上最常见的串行通信协议是RS-232串行协议,而在各种微控制器(单片机)上采用的则是TTL串行协议。由于这两者的电平有很大的不同,因此在实现PC机和微控制器的通信时,必须进行相应的转换。完成RS-232电平和TTL电平之间的转换一般采用专用芯片,如MAX232等,但在 Arduino上是用相应的电平转换电路来完成的。

根据Arduino的原理图我们不难看出,ATmega的RX和TX引脚一方面直接接到了数字I/O端口的0号和1号管脚,另一方面又通过电平转换电路接到了串口的母头上。因此,当我们需要用Arduino与PC机通信时,可以用串口线将两者连接起来;当我们需要用 Arduino与微控制器(如另一块Arduino)通信时,则可以用数字I/O端口的0号和1号管脚。

串行通信的难点在于参数的设置,如波特率、数据位、停止位等,在Arduino语言可以使用Serial.begin()函数来简化这一任务。为了实现数据的发送,Arduino则提供了Serial.print()和Serial.println()两个函数,它们的区别在于后者会在请求发送的数 据后面加上换行符,以提高输出结果的可读性。

在这一实验中没有用到额外的电路, 我们只需要用串口线将Arduino和PC机连起来就可以了,相应的代码为:

void setup() {Serial.begin(9600);}void loop() {Serial.println("Hello World!");delay(1000);}

在将工程下载到Arduino模块中之后,在Arduino集成开发环境的工具栏中单击“Serial Monitor”控制,打开串口监视器:

接着将波特率设置为9600,即保持与工程中的设置相一致:

如果一切正常,此时我们就可以在Arduino集成开发环境的Console窗口中看到串口上输出的数据了:

为了检查串口上是否有数据发送,一个比较简单的办法是在数字I/O端口的1号管脚(TX)和5V电源之间接一个发光二极管,如下面的原理图所示:

这样一旦Arduino在通过串口向PC机发送数据时,相应的发光二极管就会闪烁,实际应用中这是一个非常方便的调试手段;-)

arduino脉冲宽度调制

Pulse Width Modulation, or PWM, is a technique for getting analog results with digital means. Digital control is used to create a square wave, a signal switched between on and off. This on-off pattern can simulate voltages in between full on (5 Volts) and off (0 Volts) by changing the portion of the time the signal spends on versus the time that the signal spends off. The duration of "on time" is called the pulse width. To get varying analog values, you change, or modulate, that pulse width. If you repeat this on-off pattern fast enough with an LED for example, the result is as if the signal is a steady voltage between 0 and 5v controlling the brightness of the LED.

脉冲宽度调制或PWM,是通过数字均值获得模拟结果的技术。数字控制被用来创建一个方波,信号在开和关之间切换。这种开关模式通过改变“开”时间段和“关”时间段的比值完全模拟从开(5伏特)和关(0伏特)之间的电压。“开时间“的周期称为脉冲宽度。为了得到不同的模拟值,你可以更改,或调节脉冲宽度。如果你重复这种开关模式速度足够快,其结果是一个介于0和5V之间的稳定电压用以控制LED的亮度。

In the graphic below, the green lines represent a regular time period. This duration or period is the inverse of the PWM frequency. In other words, with Arduino's PWM frequency at about 500Hz, the green lines would measure 2 milliseconds each. A call to

analogWrite

() is on a scale of 0 - 255, such that analogWrite(255) requests a 100% duty cycle (always on), and analogWrite(127) is a 50% duty cycle (on half the time) for example.

下图中,绿色线表示一个固定的时间期限。此持续时间或周期是PWM的频率的倒数。换言之,

Arduino

的PWM频率约为500Hz,每个绿线之间表示2毫秒。一个analogWrite()的调用区间为0- 255,例如analogWrite(255)需要100%占空比(常开),和analogWrite(127)是50%占空比(上一半的时间)。

Once you get this example running, grab your arduino and shake it back and forth. What you are doing here is essentially mapping time across the space. To our eyes, the movement blurs each LED blink into a line. As the LED fades in and out, those little lines will grow and shrink in length. Now you are seeing the pulse width.

一旦你运行这个例子中,抓住你的Arduino来回摇晃。你这么做的实质上是时间跨越时空的映射。对我们的眼睛,每个运动模糊成一条线的LED闪烁。由于LED消失和缩小,那些小行的长度会增长和收缩。现在你就可以看到脉冲宽度。

Arduino的模拟输入

Description 介绍

Reads the value from the specified analog pin. The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts / 1024 units or, .0049 volts (4.9 mV) per unit. The input range and resolution can be changed using

analogReference

().

It takes about 100 microseconds (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second.

从指定的模拟引脚读取值。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次。

Syntax 语法

analogRead(pin)

Parameters 参数

pin: the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano, 0 to 15 on the Mega)

pin:读取的模拟输入引脚号(大多数主板是0-5,Mini和Nano是0-7,Mega是0-15)

Returns 返回值

int (0 to 1023)

整数型 int(0到1023)

Note 备注

If the analog input pin is not connected to anything, the value returned by analogRead() will fluctuate based on a number of factors (e.g. the values of the other analog inputs, how close your hand is to the board, etc.).

如果模拟输入引脚没有连接到任何地方,analogRead()的返回值也会因为某些因素而波动(如其他模拟输入,你的手与主板靠的太近)

上一篇dnf幸运冒险家活动(地下城幸运冒险家活动)

下一篇2012年十二生肖运程大事提醒

运势本月排行

运势精选