Arduino介绍

Arduino是一个能够用来感应和控制现实物理世界的一套工具。 它由一个基于单片机并且开放源码的硬件平台,和一套为Arduino板编写程序的开发环境组成

性能

Digital I/O数字输入/输出端口 0 - 13

Analog I/O模拟输入/输出端口 0 - 5

支持ICSP下载,支持TX/RX。(ICSP:In Circuit Serial Programmable 在线串行编程

输入电压:USB接口供电或者5V-12V外部电源供电

输出电压:支持 3.3V5V DC输出

处理器:使用Atmel Atmega168 328处理器,因其支持者众多,已有公司开发出来32位的MCU平台支持Arduino

我们所用的Arduino控制板是Arduino Uno,如下图:

Arduino基础知识

数据类型

名称 描述
char,unsigned char 字符型,无符号字符型
int,unsigned int 整型,无符号整型
long,unsigned long 长整型,无符号长整型
boolean 布尔类型(只有真/假)
byte 字节类型(特有的跟unsigned char功能一样)
float 单精度浮点型
string 字符串类型
String 对象
array 排列
word

数据类型转换:

char()、byte()、int()、long()、float()

常量

名称 描述
HIGH 引脚高电平1(数字IO口的电平
LOW 引脚低电平0(数字IO口的电平
INPUT 输入(数字IO口的方向
OUTPUT 输出(数字IO口的方向
true
false

程序结构

Arduino程序可以分为三个主要部分: 结构、值(变量和常量)和函数

Arduino程序不像C语言那样使用 main() 当做函数入口,但是程序中编写的 setuploop 函数,都在main函数中调用了 loop 的循环执行,是通过for循环实现的,且每次loop结束后,都会进行串口事件判断,也正是因为这种设计, 串口事件不能实时响应

1
2
3
4
5
6
7
8
9
10
11
12
13
void setup()
{
int val;
int ledPin = 13; //声明变量及接口名称的语句
//初始化函数,在程序开始时使用,可以初始化变量、接口(引脚)模式、调用库函数等(例如:pinMode(ledPin,OUTUPT);)
}

/*有的Arduino程序没有loop程序这时候需要到main.cpp把loop注释掉或者新建一个loop函数但是里面什么都不放以便main函数调用否则会编译错误*/
void loop()
{
//循环执行体,无限循环
//主函数,在setup()初始化之后,loop() 中的程序语句循环地被执行,使用它来运转Arduino
}

Arduino基本函数

数字 I/O接口函数

数字引脚pin为0~13

函数 参数 描述
pinMode (pin, mode) 定义数字IO口是输入或输出模式,mode表示为 INPUT(输入)OUTPUT(输出)
digitalWrite (pin, value) 定义数字IO口输出电平,value表示为 HIGH(高电平) LOW(低电平)
digitalRead (pin) 读取数字IO口输入电平,value表示为 HIGH(高电平)LOW(低电平)

模拟 I/O接口函数

模拟引脚 pin 为A0~A5,Arduino UNO用于PWM的数字引脚 pin 为3、5、6、9、10、11

函数 参数 描述
analogRead (pin) 读取模拟IO口输入信号,pin表示为A0~A5(Arduino nano为A0~A7)
analogWrite (pin, value) 模数IO口输出用户写的模拟量(PWM波),Arduino上标示 ~ 的数字IO口可使用该函数,value表示为0~255

用于PWM脉宽调制时,对ATmega168芯片的Mini或BT或UNO Arduino,pin可用接口3、5、6、9、10、11;对ATmega8芯片的USB和serial Arduino,pin可用接口9、10、11

扩展 I/O接口函数

函数 参数 描述
shiftOut (dataPin, clockPin, bitorder, value) SPI外部IO扩展函数dataPin数据口clockPin时钟口bitOrder数据传输方向(MSBFIRST高位在前,LSBFIRST低位在前),value表示所要传送的数据(0~255)
unsigned long pulseIn (pin, value) 脉冲长度记录函数,返回时间参数(us),pin表示为0~13valueHIGHLOW

shiftOut (dataPin, clockPin, bitOrder, value) SPI外部IO扩展函数,通常使用带SPI接口的74HC5958个IO扩展,另外还需要一个IO口74HC595的使能控制

unsigned long pulseIn (pin, value) 脉冲长度记录函数,比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停止计时,然后返回该时间

时间函数

函数 参数 描述
unsigned long millis 返回时间函数(单位ms),该函数是指当程序运行就开始计时并返回记录的参数
delay (ms) 延时函数(单位ms)
delayMicroseconds (us) 延时函数(单位us)

数学函数

函数 参数 描述
min (x, y) 求最小值
max (x, y) 求最大值
abs (x) 求绝对值
constrain (x, a, b) 约束函数,x须在下限a与上限b之间才能返回
map (value, fromLow, fromHigh, toLow, toHigh) 约束函数,value 须在 fromLow 与 toLow 之间和 fromHigh 与 toHigh 之间
pow (base, exponent) 开方函数,base的 exponent 次方
sq (x) 平方函数
sqrt (x) 平方根函数

随机数函数

函数 参数 描述
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,表示一个功能函数,modeLOW低电平中断,CHANGE有变化就中断,RISING上升沿中断,FALLING 下降沿中断
detachInterrupt (interrupt) 中断开关,interrupt=1 开,interrupt=0 关

中断使能函数

函数 描述
interrupts() 使能中断
noInterrupts() 禁止中断

串口收发函数

函数 参数 描述
Serial.begin (speed) 设置串口波特率,用于setup()内。speed表示波特率(串口每秒传输数据的速率)
Serial.read() 读取串口输入,返回收到的参数
Serial.print (data,数据进制) 串口输出数据,默认Serial.print(data),即Serial.print(data,DEC),DEC表示十进制
Serial.println (data,数据进制) 串口输出数据并带回车换行符
Serial.available() 判断串口缓冲器buffer状态
Serial.flush() 清空串口缓冲器buffer

官方库文件

名称 描述
EEPROM EEPROM读写程序库
Ethernet 以太网控制器程序库
LiquidCrystal LCD控制程序库
Servo 舵机控制程序库
SoftwareSerial 任何数字IO口模拟串口程序库
Stepper 步进电机控制程序库
Wire TWI/I2C总线程序库
Matrix LED矩阵控制程序库
Sprite LED矩阵图象处理控制程序库

面包板的使用

面包板是实验室中用于搭接电路的重要工具,下面就面包板的结构和使用方法的介绍

面包板外观

常见的面包板最小单元面包板分上、中、下三部分, 上面和下面部分一般是由一行或两行的插孔构成的窄条,中间部分是由中间一条隔离凹槽和上下各 5 行的插孔构成的宽条

窄条上下两行之间电气不连通。每 5 个插孔为一组一整条之间都互相连通,但是上下之间不连通

中间部分宽条是由中间一条隔离凹槽上下各 5 行的插孔构成。在同一列中的 5 个 插孔是互相连通的,列和列之间以及凹槽上下部分则是不连通的。外观及结构如图:

LED闪烁实验

本次实验此次利用Arduino开发板的I/O口和外接直插LED灯来完成控制LED灯闪烁

LED灯实验原理图

Arduino开发板数字接口10与红色发光二极管LED相连,为避免电流过大会烧毁LED,此处串联一个220Ω的限流电阻

接线实物图

这里右边的黄线(接在10号引脚)与LED灯的正极接在面包板的同一列上,表示arduino开发板与LED的正极相连,然后LED的负极电阻连接在同一列上,电阻的另外一端与左边的黄线连接在同一列,然后黄线与开发板的GND相连,表示LED灯和电阻串联在一起,这样子电路就连接好啦!

电路连接好了,接下来就是写LED闪烁的程序了

1
2
3
4
5
6
7
8
9
10
11
12
int ledPin = 13;                    //定义数字接口10
void setup()
{
pinMode(ledPin, OUTPUT); //定义LED所连数字接口10为输出
}
void loop()
{
digitalWrite(ledPin, HIGH); //点亮LED灯(高电平点亮)
delay(1000); //延时1s(1000ms)
digitalWrite(ledPin, LOW); //熄灭LED灯(低电平熄灭)
delay(1000); //延时1s(1000ms)
}

光敏电阻实验

光敏电阻器,也称光感电阻,是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强,电阻减小,入射光弱,电阻增大

光敏电阻调节蜂鸣器

接线原理图

这里因为找不到蜂鸣器元器件,所以就改成了LED,在实际连线只需要把LED替换成蜂鸣器就好

Arduino Uno开发板数字接口6连接光敏电阻一端,光敏电阻另一端连接蜂鸣器正极(+)蜂鸣器负极(-)连接Arduino Uno开发板公共地端GND

实验程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void setup()
{
pinMode(6, OUTPUT);
}
void loop()
{
while(1)
{
char i, j;
while(1)
{
for(i = 0; i < 80; i++) //输出一定频率的声音
{
digitalWrite(6, HIGH); //高低电平不断交替,使蜂鸣器发出声音
delay(1);
digitalWrite(6, LOW);
delay(1);
}
for(i = 0; i < 100; i++) //输出另一频率的声音
{
digitalWrite(6, HIGH);
delay(2);
digitalWrite(6, LOW);
delay(2);
}
}
}
}

将程序下载到Arduino开发板之后,可以用手电筒等发光物体照射或用手间歇地阻挡光敏电阻,可以听到有光照时蜂鸣器声音大,没有光时蜂鸣器声音小

光敏电阻调节LED灯

接线原理图

这里先看绿色那根线,一端连接开发板的A0管脚,一端与光敏电阻连接在同一列,光敏电阻的另外一端黑色那根线连接在同一列黑色线另外一端连接在面包板的正极,再看另外一根黑色线,一端连接在面包板的正极,一端与开发板的GND相连,这样子光敏电阻就连接好啦,如图所示:看蓝色那根线

再来看绿色那根线也与电阻连接在同一列上,电阻另外一端连接在面包板的负极,同样看左边那根红色的线,一端连接在面包板的负极,一端连接在开发板的5V管脚上,这样子右边那个电阻就连接好啦,如图所示:看蓝色那根线

最后看黄色那根线,一端连接在开发板的11号管脚上,一端与LED灯的正极连接在同一列LED的负极电阻的一端连接在同一列,表示LED与电阻串联电阻的另外一端连接在面包板的正极,然后再看左边黑色那根线,一端连接在面包板的正极,一端连接在开发板的GND管脚上,这样子LED与电阻就连接好啦,如图所示:看蓝色那根线

实验程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int potpin = 0;                 //定义模拟接口A0连接光敏电阻
int ledpin = 11; //定义数字接口11连接LED小灯,输出PWM值调节LED的亮度
int val = 0; //定义变量val
void setup()
{
pinMode(ledpin, OUTPUT); //定义Arduino数字接口11为输出
Serial.begin(9600); //设置Arduino开发板串口波特率为9600
}
void loop()
{
val = analogRead(potpin); //读取传感器的模拟值并赋值给val变量
Serial.println(val); //通过串口显示val变量的数值并换行
analogWrite(ledpin, val); //打开LED,设置亮度值(PWM输出最大值为255)
delay(10); //延时10ms
}