要了解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?
有很多的单片机和单片机平台都适合用做交互式系统的设计。例如:Parallax Basic Stamp, Netmedia’s BX-24,Phidgets,MIT’s Handyboard 和其它能提供类似功能的。 所有这些工具,你都不需要去关心单片机编程繁琐的细节,提供给你的是一套容易使用的工具包。 Arduino同样也简化了同单片机工作的流程,但同其它系统相比Arduino在很多地方更具有优越性,特别适合老师,学生和一些业余爱好者们使用:
- 便宜 - 和其它平台相比,Arduino板算是相当便宜了。最便宜的Arduino版本可以自己动手制作,即使是组装好的成品,其价格也不会超过200元。
- 跨平台 - Arduino软件可以运行在Windows,Macintosh OSX,和Linux操作系统。大部分其它的单片机系统都只能运行在Windows上。
- 简易的编程环境 - 初学者很容易就能学会使用Arduino编程环境,同时它又能为高级用户提供足够多的高级应用。对于老师们来说,一般都能很方便的使用Processing 编程环境,所以如果学生学习过使用Processing 编程环境的话,那他们在使用Arduino开发环境的时候就会觉得很相似很熟悉。
- 软件开源并可扩展 - Arduino软件是开源的,对于有经验的程序员可以对其进行扩展。Arduino编程语言可以通过C 库进行扩展,如果有人想去了解技术上的细节,可以跳过Arduino语言而直接使用AVR C 编程语言(因为Arduino语言实际上是基于AVR C的)。类似的,如果你需要的话,你也可以直接往你的Arduino程序中添加AVR-C 代码。
- 硬件开源并可扩展 - Arduino板基于 Atmel 的ATMEGA8 和ATMEGA168/328 单片机。Arduino基于Creative Commons 许可协议,所以有经验的电路设计师能够根据需求设计自己的模块,可以对其扩展或改进。甚至是对于一些相对没有什么经验的用户,也可以通过制作试验板来理解Arduino是怎么工作的,省钱又省事。
Arduino基于AVR平台,对AVR库进行了二次编译封装,把端口都打包好了,寄存器啦、地址指针之类的基本不用管。大大降低了软件开发难度,适宜非专业爱好者使用。优点和缺点并存,因为是二次编译封装,代码不如直接使用AVR代码编写精练,代码执行效率与代码体积都弱于AVR直接编译。
性能:
Digital I/O 数字输入/输出端口0—13。
Analog I/O 模拟输入/输出端口0-5。
支持ICSP下载,支持TX/RX。
输入电压:USB接口供电或者5V-12V外部电源供电。
输出电压:支持3.3V级5V DC输出。
处理器:使用Atmel Atmega168 328处理器,因其支持者众多,已有公司开发出来32位的MCU平台支持arduino。
目前arduino的控制板最新的为Arduino Uno,如下图:
国内使用比较多的为Arduino Duemilanove 2009,主要原因是Uno的usb控制芯片封装方式改变,制造成本上升,其他变化不大,性价比还是Arduino Duemilanove 2009比较好。
因其开源特性,生产arduino控制板的厂商众多,同样的Duemilanove 2009就有很多种颜色。
对于一些对电路板大小要求比较严格的地方,arduino团队提供了arduino Nano,此板体积做的非常小。如下图:
arduino板子上基本端口如图描述,对几个比较特殊的端口下面详细说明下:
VIN端口:VIN是input voltage的缩写,表示有外部电源时的输入端口。
AREF:Reference voltage for the analog inputs(模拟输入的基准电压)。使用analogReference()命令调用。
ICSP:也有称为ISP(In System Programmer),就是一种线上即时烧录,目前比较新的芯片都支持这种烧录模式,包括大家常听说的8051系列的芯片,也都慢慢采用这种简便的烧录方式。我们都知道传统的烧录方式,都是将被烧录的芯片,从线路板上拔起,有的焊死在线路板上的芯片,还得先把芯片焊接下来才能烧录。为了解决这种问题,发明了ICSP线上即时烧录方式。只需要准备一条R232线(连接烧录器),以及一条连接烧录器与烧录芯片针脚的连接线就可以。电源的 5V,GND,两条负责传输烧录信息的针脚,再加上一个烧录电压针脚,这样就可以烧录了。arduino学习笔记2通过Arduino编译器查看串口数据最简单的例子:
void setup()
{
Serial.begin(9600); // 打开串口,设置波特率为9600 bps
}
void loop()
{
int val;
val=analogRead(5);//传感器接到模拟口5,数值根据自己的需要可变
Serial.println(val,DEC);//从串口发送字符串并换行
delay(100);
}
如果电路安装正确,按照示例代码运行、上传,然后点击编译器的Serial Monitor按钮,就可以看到从代码定义的输入口(这儿是模拟口5)获取的数据了。arduino学习笔记3 arduino语言
- Arduino语言是建立在C/C 基础上的,其实也就是基础的C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让我们不了解AVR单片机(微控制器)的朋友也能轻松上手。
在与Arduino DIYER接触的这段时间里,发现有些朋友对Arduino语言还是比较难入手,那么这里我就简单的注释一下Arduino语言(本人也是半罐子水,有错的地方还请各位指正)。
/*************基础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
/****************************************/
arduino学习笔记4 数据类型有多种类型的变量,如下所述
boolean 布尔
char 字符
byte 字节
int 整数
unsigned int 无符号整数
long 长整数
unsigned long 无符号长整数
float 浮点
double 双字节浮点
string 字符串
array 数组
= , -= , *= , /=
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 type
x:任何变量类型
y: any variable type or constant
y:任何变量类型或常数
Examples范例
x = 2;
x = 4; // x now contains 6 // x现在为6
x -= 3; // x now contains 3 // x现在为3
x *= 10; // x now contains 30 // x现在为30
x /= 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为3
y = x--; // x contains 2 again, y still contains 3 // x现在仍然为2,y将为3
在学语言之间,还要做的一个功课就是要明白程序的构架,这个也同样简单,大体可分为几个部分。
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学习笔记7函数输入输出函数
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回传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学习笔记8数字输入在数字电路中开关(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号 管脚上: