目录
attachinterrupt(interrupt, function, mode)
介绍
arduino IDE 下载 Software | Arduino
开发板
arduino uno r3
仿真软件
Tinkercad | From mind to design in minutes
详解Arduino Uno开发板的引脚分配图及定义 详解Arduino Uno开发板的引脚分配图及定义 - Arduino专区 - 一板网电子技术论坛
video
【Arduino教學】實作07-伺服馬達SG-90_哔哩哔哩_bilibili
https://www.youtube.com/watch?v=BLrHTHUjPuw
https://www.youtube.com/watch?v=fJWR7dBuc18&list=PLGs0VKk2DiYw-L-RibttcvK-WBZm8WLEP&index=5
网站学习拓展
DFRobot官网-开源硬件,智能机器人和科创教育产品及服务提供商
Arduino资料
arduino教程 Arduino 教程_w3cschool
Arduino Uno开发板引脚
Arduino Uno开发板的引脚分配图包含14个数字引脚、6个模拟输入、电源插孔、USB连接和ICSP插头。引脚的复用功能提供了更多的不同选项,例如驱动电机、LED、读取传感器等。在这篇文章中,我们将介绍Arduino Uno引脚的功能。
Arduino Uno引脚分配图
Arduino Uno引脚 - 电源
Arduino Uno开发板可以使用三种方式供电:
● 直流电源插孔 -可以使用电源插孔为Arduino开发板供电。电源插孔通常连接到一个适配器。开发板的供电范围可以是5-20V,但制造商建议将其保持在7-12V之间。高于12V时,稳压芯片可能会过热,低于7V可能会供电不足。
● VIN引脚 - 该引脚用于使用外部电源为Arduino Uno开发板供电。电压应控制在上述提到的范围内。
● USB电缆 - 连接到计算机时,提供500mA/5V电压。
GND 接地
编辑
在电源插孔的正极与VIN引脚之间链接有一个极性保护的二极管,额定电流为1安培。
您使用的电源决定了可用于电路的功率。例如,使用USB为电路供电时,电流最大限制在500mA。考虑到该电源也用于为MCU、外围设备、板载稳压器和与其连接的组件供电。当通过电源插座或VIN为电路供电时,可用的最大电流取决于Arduino开发板上的5V和3.3V稳压器。
● 5v和3v3
根据制造商的数据手册,它们提供稳压的5V和3.3v,向外部组件供电。
● GND
在Arduino Uno引脚分配图中,可以看到有5个GND引脚,它们都是互连的。
GND引脚用于闭合电路回路,并在整个电路中提供一个公共逻辑参考电平。务必确保所有的GND(Arduino、外设和组件)相互连接并且有共同点。
● RESET - 复位Arduino开发板。
● IOREF - 该引脚是输入/输出参考。它提供了微控制器工作的参考电压。
Arduino Uno引脚 - 模拟输入
Arduino Uno有6个模拟引脚,它们作为ADC(模数转换器)使用。
这些引脚用作模拟输入,但也可用作数字输入或数字输出。
编辑
模数转换
ADC表示模拟到数字转换器。 ADC是用于将模拟信号转换为数字信号的电子电路。模拟信号的这种数字表示允许处理器(其是数字设备)测量模拟信号并在其操作中使用它。
Arduino引脚A0-A5能够读取模拟电压。在Arduino上,ADC具有10位分辨率,这意味着它可以通过1,024个数字电平表示模拟电压。 ADC将电压转换成微处理器可以理解的位。
一个常见的ADC例子是IP语音(VoIP)。每部智能手机都有一个麦克风,可将声波(语音)转换为模拟电压。这通过设备的ADC,转换成数字数据,通过互联网传输到接收端。
Arduino Uno引脚 - 数字引脚
Arduino Uno的引脚0-13用作数字输入/输出引脚。其中,引脚13连接到板载的LED指示灯;引脚3、5、6、9、10、11具有PWM功能。
需要注意的是:
● 每个引脚可提供/接收最高40 mA的电流。但推荐的电流是20毫安。
● 所有引脚提供的绝对最大电流为200mA。
编辑
数字电平意味着什么?
数字是一种表示1位电压的方式:0或1。Arduino上的数字引脚是根据用户需求设计为输入或输出的引脚。数字引脚可以打开或关闭。开启时,它们处于5V的高电平状态,当关闭时,它们处于0V的低电平状态。
在Arduino上,当数字引脚配置为输出时,它们设置为0或5V。
当数字引脚配置为输入时,电压由外部设备提供。该电压可以在0-5V之间变化,并转换成数字表示(0或1)。为了确定这一点,有2个阈值:
● 低于0.8v - 视为0。
● 高于2.0v - 视为1。
将组件连接到数字引脚时,确保逻辑电平匹配。如果电压在阈值之间,则返回值将不确定。
什么是PWM?
通常,脉宽调制(PWM)是一种调制技术,用于将消息编码为脉冲信号。 PWM由两个关键部分组成:频率和占空比。 PWM频率决定了完成单个周期(周期)所需的时间以及信号从高到低的波动速度。占空比决定信号在总时间段内保持高电平的时间。占空比以百分比表示。
在Arduino中,支持PWM的引脚产生约500Hz的恒定频率,而占空比根据用户设置的参数而变化。见下图:
编辑
PWM信号用于直流电机的速度控制,调光LED等。
通信协议
串行(TTL) - 数字引脚0和1是Arduino Uno的串行引脚。
它们由板载USB模块使用。
什么是串行通信?
串行通信用于在Arduino板和其他串行设备(如计算机,显示器,传感器等)之间交换数据。每块Arduino板至少有一个串口。串行通信发生在数字引脚0(RX)和1(TX)以及USB上。 Arduino也支持通过数字引脚与SoftwareSerial Library进行串行通信。这允许用户连接多个支持串行的设备,并保留主串行端口可用于USB。
软件串行和硬件串行 - 大多数微控制器都具有用于与其他串行设备进行通信的硬件。软件串行端口使用引脚更改中断系统进行通信。有一个用于软件串行通信的内置库。处理器使用软件串行来模拟额外的串行端口。软件串行唯一的缺点是它需要更多的处理,并且不能支持与硬件串行相同的高速。
SPI - SS / SCK / MISO / MOSI引脚是SPI通信的专用引脚。它们可以在Arduino Uno的数字引脚10-13和ICSP插头上找到。
串行外设接口(Serial Peripheral Interface,SPI)是一种串行数据协议,由微控制器用来与总线中的一个或多个外部设备进行通信,如连接。 SPI也可以用来连接2个微控制器。在SPI总线上,总是有一个设备表示为主设备,其余所有设备都表示为从设备。在大多数情况下,微控制器是主设备。 SS(从选择)引脚确定主器件当前正在与哪个器件通信。
启用SPI的器件始终具有以下引脚:
● MISO(主从输出) - 用于向主设备发送数据的线路
● MOSI(主机输出从机输入) - 发送数据到外围设备的主机线
● SCK(串行时钟) - 由主设备生成的用于同步数据传输的时钟信号。
I2C - SCL / SDA引脚是I2C通信的专用引脚。在Arduino Uno上,它们可以在模拟引脚A4和A5上找到。
I2C通信协议通常称为“I2C总线”。 I2C协议旨在实现单个电路板上组件之间的通信。使用I2C时,有2条通信线,称为SCL和SDA。
● SCL是用于同步数据传输的时钟线。
● SDA是用于传输数据的通讯线。
I2C总线上的每个器件都有一个唯一的地址,最多可以在同一条总线上连接255个器件。
Aref - 模拟输入的参考电压。
中断 - INT0和INT1。 Arduino Uno有两个外部中断引脚。
外部中断 - 外部中断是外部干扰出现时发生的系统中断。干扰可能来自用户或网络中的其他硬件设备。 Arduino中这些中断的常见用途是读取编码器产生的方波或外部事件唤醒处理器的频率。
Arduino有两种形式的中断:
● 外部输入
● 引脚状态变化
ATmega168 / 328上有两个外部中断引脚,称为INT0和INT1。 INT0和INT1分别映射到引脚2和3。相反,引脚变化中断可以在任何引脚上激活。
Arduino Uno引脚定义 - ICSP插头
ICSP表示在线串行编程。该名称源自在系统编程(ISP)。 Arduino相关的制造商,如Atmel,开发了自己的在线串行编程插头。这些引脚使用户能够编程Arduino开发板上的固件。 Arduino开发板上有6个ICSP引脚,可通过编程电缆连接到编程器设备。
Arduino语法
No.001 Arduino 基础语法 - 简书 (jianshu.com)
1| Arduino 基础语法
关键字:if、if…else、for、switch、case、while、do…while、break、continue、return、goto。
语法符号:每条语句以“;”结尾,每段程序以“{}”括起来。
数据类型:boolean、char、int、unsigned int、long、unsigned long、float、double、string、array、void。
常量:HIGH或者LOW,表示数字I/O引脚的电平,
HIGH表示高电平(1),LOW表示低电平(0);
INPUT或者OUTPUT,表示数字I/O引脚的方向,
INPUT表示输入(高阻态),OUTPUT表示输出(AVR能提供5V电压,40mA电流);
TRUE或者FALSE,TRUE表示真(1),FALSE表示假(0)。
程序结构:主要包括两部分,即void setup()和void loop()。
其中,前者是声明变量及引脚名称(如int val;int ledPin = 13 ) ,在程序开始时使用,初始化变量和引脚模式,调用库函数如pinMode(ledPin,OUTPUT)等,而void loop()用在setup()函数之后,不断地循环执行,是Arduino的主体。
2.| 数字I/O 引脚的操作函数
pinMode(pin, mode)
pinMode函数用于配置引脚以及设置输出或输入模式,是一个无返回值函数。该函数有两个参数:pin和mode。pin参数表示要配置的引脚;mode参数表示设置该引脚的模式为INPUT(输入)或OUTPUT(输出)。
INPUT用于读取信号,OUTPUT用于输出控制信号。pin的范围是数字引脚013,也可以把模拟引脚(A0A5)作为数字引脚使用,此时编号为14的引脚对应模拟引脚0,编号为19的引脚对应模拟引脚5。该函数一般会放在setup()里,先设置再使用。
digitalWrite(pin, value)
该函数的作用是设置引脚的输出电压为高电平或低电平,也是一个无返回值的函数。
pin参数表示所要设置的引脚;value参数表示输出的电压为HIGH(高电平)或LOW(低电平)。
注意:使用前必须先用pinMode设置。
digitalRead(pin)
该函数在引脚设置为输入的情况下,可以获取引脚的电压情况:HIGH(高电平)或者LOW(低电平)。
数字I/O引脚操作使用例程:
int button =9;// 设置引脚9为按钮输入引脚int LED=13;// 设置引脚13为LED输出引脚,内部连接开发板上的LEDvoidsetup(){pinMode(LED, OUTPUT);// 设置为输出模式 pinMode(button, INPUT);// 设置为输入模式}voidloop(){if(digitalRead(button)== Low)// 判断按钮引脚是否为低电平digitalWrite(LED, HIGH);// 引脚13为高电平,LED灯亮elsedigitalWrite(LED, LOW);// 否则输出为低电平}
3. 模拟I/O引脚的操作函数
analogReference(type)
该函数用于配置模拟引脚的参考电压。
它有三种类型:
DEFAULT是默认模式,参考电压是5V;
INTERNAL是低电压模式,使用片内基准电压源2.56V;
EXTERNAL是扩展模式,通过AREF引脚获取参考电压。
注意:若不使用本函数,默认是参考电压5V。若使用AREF作为参考电压,需接一个5kΩ的上拉电阻。
analogRead(pin)
用于读取引脚的模拟量电压值,每读取一次需要花100μs的时间。参数pin表示所要获取模拟量电压值的引脚,返回为int型。它的精度为10位,返回值为0~1023。
注意:函数参数pin的取值范围是05,对应开发板上的模拟引脚A0A5。
analogWrite(pin,value)
该函数是通过PWM(Pulse-Width Modulation,脉冲宽度调制)的方式在引脚上输出一个模拟量。PWM输出的一般形式,也就是在一个脉冲的周期内高电平所占的比例。它主要应用于LED亮度控制、直流电机转速控制等方面。
Arduino中的PWM的频率大约为490Hz,Arduino UNO开发板支持以下数字引脚(不是模拟输入引脚)作为PWM模拟输出:3、5、6、9、10、11。开发板带PWM输出的都有“~”号。
注意:PWM输出位数为8位,即0~255。
模拟I/O引脚的操作函数例程如下:
int sensor = A0;// 规定传感器引脚int LED=11;// 规定输出引脚voidsetup(){
Serial.begin(9600);// 设置采样频率}voidloop(){int v;
v =analogRead(sensor);// 读取模拟量引脚的数据, 值域[0,1023]
Serial.println(v, DEC);// 打印数字analogWriter(LED, v/4);// 写入的值域[0,255]}
4| 高级I/O 引脚的操作函数
PulseIn(pin,state,timeout)函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或者LOW。如果是HIGH,该函数首先等待引脚变为高电平,然后开始计时,直到变为低电平停止计时。返回脉冲持续的时间,单位为毫秒,如果超时没有读到时间,则返回0。
例程说明:做一个按钮脉冲计时器,测量按钮的持续时间,谁的反应最快,即谁按按钮时间最短。按钮接在引脚3。程序如下:
int button =3;int count;voidsetup(){pinMode(button, INPUT);}voidloop(){
cout =pulseIn(button, HIGH);if(count !=0){
Serial.println(count,DEC);
count =0;}}
5| 时间函数
delay()
该函数是延时函数,参数是延时的时长,单位是ms(毫秒)。应用延时函数的典型例程是跑马灯的应用,使用Arduino开发板控制4个LED依次点亮。程序如下:
voidsetup(){pinMode(6,OUTPUT);// 定义引脚pinMode(7,OUTPUT);pinMode(8,OUTPUT);pinMode(9,OUTPUT);}voidloop(){int i;for(i =6; i<=9; i++){digitalWrite(i,HIGH);//设置数字信号量为高电平delay(1000);//持续为1sdigitalWrite(i, LOW);// 设置数字信号量为低电平delay(1000);// 持续1s}}
delayMicroseconds()
delayMicroseconds()也是延时函数,不过单位是μs(微秒),1ms=1000μs。该函数可以产生更短的延时。
millis()
millis()为计时函数,应用该函数可以获取单片机通电到现在运行的时间长度,单位是ms。系统最长的记录时间为9h22min,超出则从0开始。返回值是unsigned long型。
该函数适合作为定时器使用,不影响单片机的其他工作(而使用delay函数期间无法进行其他工作)。计时时间函数使用示例(延时10s后自动点亮LED)程序如下:
int LED=13;unsignedlong i,j;voidsetup(){pinMode(LED,OUTPUT);
i =millis();// 读入初始值}voidloop(){
j =milis();// 不断读入当前时间值if((j-i)>10000){// 如果延时超过10s,点亮LEDdigitWrite(LED, HIGH);}elsedigitalWrite(LED, LOW);}
micros()
micros() 也是计时函数,该函数返回开机到现在运行的时间长度,单位为μs。返回值是unsigned long型,70min溢出。程序如下:
unsignedlong time;voidsetup(){
Serial.begin(9600);}voidloop(){
Serial.print("Time:");
time =micros();
Serial.println(time);delay(1000);}
以下例程为跑马灯的另一种实现方式:
int LED=13;unsignedlong i,j;voidsetup(){pinMode(LED, OUTPUT);
i =micros();}voidloop(){
j =micros();if((j-i)>10000){ 、// 如果延时超过10s,点亮LEDdigitalWrite(LED, HIGH);}elsedigitalWrite(LED, LOW);}
6| 中断函数
什么是中断?实际上在人们的日常生活中,中断很常见,如图1所示。
图1 中断程序
你在看书,电话铃响,于是在书上做个记号,去接电话,与对方通话;门铃响了,有人敲门,你让打电话的对方稍等一下,去开门,并在门旁与来访者交谈,谈话结束,关好门;回到电话机旁,继续通话,接完电话再回来从做记号的地方接着看书。
同样的道理,在单片机中也存在中断概念。在计算机或者单片机中中断是由于某个随机事件的发生,计算机暂停主程序的运行,转去执行另一程序(随机事件),处理完毕又自动返回主程序继续运行的过程。也就是说,高优先级的任务中断了低优先级的任务。在计算机中中断包括如下几部分:
①中断源——引起中断的原因,或能发生中断申请的来源;
②主程序——计算机现行运行的程序;
③中断服务子程序——处理突发事件的程序。
attachinterrupt(interrupt, function, mode)
该函数用于设置中断,函数有3个参数,分别表示中断源、中断处理函数和触发模式。中断源可选0或者1,对应2或者3号数字引脚。中断处理函数是一段子程序,当中断发生时执行该子程序部分。
触发模式有四种类型:LOW(低电平触发)、CHANGE(变化时触发)、RISING(低电平变为高电平触发)、FALLING(高电平变为低电平触发)。
例程功能如下:
volatileint state1 = LOW, state2= LOW;int LED1 =4;int LED2=5;int LED3=13;voidsetup(){pinMode(LED1,OUTPUT);pinMode(LED2, OUTPUT);pinMoed(LED3, OUTPUT);}voidloop(){digitalWrite(LED3,HIGH);delay(500);digitalWrite(LED3, LOW);delay(500);attachInterrupt(0, LED1_Change, LOW);//低电平触发attachInterrupt(1, LED2_Change, CHANGE);//任意电平变化触发}voidLED1_Change(){
state1 =!state1;digitalWrite(LED1, state1);delay(100);}voidLED2_Change(){
state2 =!sate2;digitalWrite(LED2, state2);delay(100);}
例程2:
volatileint state1=LOW, state2=LOW;int LED1 =4;int LED2 =5;int LED3 =13;voidsetup(){pinMode(LED1, OUTPUT);pinMode(LED2, OUTPUT);pinMode(LED3, OUTPUT);attachInterrupt(0, LED1_Change, ROSING);//电平上升沿触发attachInterrupt(1, LED2_Change,FALLING);//电平下降沿触发}voidloop(){digitalWrite(LED3, HIGH);delay(500);digitalWrite(LED3, LOW);delay(500);}voidLED1_Change(){
state1 =!state1;digitalWrite(LED1, state1);delay(100);}voidLED2_Change(){
state2 =!state2;digitalWrite(LED2, state2);delay(500);}
detachInterrupt(interrupt)
该函数用于取消中断,参数interrupt表示所要取消的中断源。
7| 串口通信函数
串行通信接口(serial interface)使数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信的接口,如图3所示。
串行通信接口
串行通信接口出现在1980年前后,数据传输率是115~230Kb/s。串行通信接口出现的初期是为了实现计算机外设的通信,初期串口一般用来连接鼠标和外置Modem、老式摄像头和写字板等设备。由于串行通信接口(COM)不支持热插拔及传输速率较低,因此目前部分新主板和大部分便携计算机已开始取消该接口,串口多用于工控和测量设备以及部分通信设备中,包括各种传感器采集装置、GPS信号采集装置、多个单片机通信系统、门禁刷卡系统的数据传输、机械手控制和操纵面板控制直流电机等,特别是广泛应用于低速数据传输的工程应用,主要函数如下:
Serial.begin()
该函数用于设置串口的波特率,即数据的传输速率,指每秒钟传输的符号个数。一般的波特率有9600、19200、57600、115200等。例如:Serial.begin(57600)
Serial.available()
该函数用来判断串口是否收到数据,函数的返回值为int型,不带参数。
Serial.read()
该函数不带参数,只将串口数据读入。返回值为串口数据,int型。
Serial.print()
该函数向串口发送数据。可以发送变量,也可以发送字符串。
Serial.print("Hello world");
Serial.print(x, DEC);// 以十进制发送变量x
Serial.print(x, HEX);//以十六进制发送变量x
Serial.println()
该函数与Serial.print()类似,只是多了换行功能。
串口通信函数使用例程:
int x=0;voidsetup(){
Serial.begin(9600);}voidloop(){if(Serial.available()){
x = Serial.read();
Serial.print("I have received:");
Serial.println(x, DEC);}delay(200);
Arduino实例
查看板子是否连接
选择型号
选择端口
测试
LED灯闪烁
arduino板L的灯闪烁
void setup() {
// put your setup code here, to run once:
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(12,HIGH);
digitalWrite(11,LOW);
delay(1000);
digitalWrite(12,LOW);
digitalWrite(11,HIGH);
delay(1000);
}
LED 工作原理 元器件科普:LED发光二极管 - 知乎
n型 没有空穴
LED灯长脚接正极 ,面包板上接同排
按钮
void setup() {
// initialize the LED pin as an output:
pinMode(13, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(7, INPUT);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(7);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(13, HIGH);
} else {
// turn LED off:
digitalWrite(13, LOW);
}
}
黄色线接5V,
按键按一下,串口监视器显示一下
int pushButton = 7;
int buttonState = 0;//假设代数buttonState为按钮状态,先为0
int beforeState = 0;
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the pushbutton's pin an input:
pinMode(pushButton, INPUT);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
buttonState = digitalRead(pushButton);//7号引脚的状态(1或0)
// print out the state of the button:
if(buttonState==1 and beforeState==0){
Serial.println("hi");
Serial.println(buttonState);
}
beforeState = buttonState;
delay(1); // delay in between reads for stability
}
可变电阻
int sensor = A0;
int sensorRead = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
sensorRead = analogRead(sensor);
Serial.println(sensorRead);
delay(200);
}
伺服马达
改变阻值,舵机转动
74HC595
扩充脚位 159974