一.直流电机控制实验
1.源代码
int dianJiPin=9;//定义数字9接口接电机驱动IN1的控制口
void setup()
{
pinMode(dianJiPin,OUTPUT);//定义电机驱动IN1的控制口为输出接口
}
void loop()
{
digitalWrite(dianJiPin,LOW);//关闭电机
delay(1000);//延时
digitalWrite(dianJiPin,HIGH);//打开电机
delay(1000);//延时
}
2.电路图
注意:这个电路图中详细画出了ULN2003电机驱动器的内部结构,而我们现在手上的是已经集成好的ULN2003电机驱动器,所以使用过程可以参考下面的实物图。
- 电机正极连接到ULN2003的输出端口之一
- 电机负极连接到电源的负极
- ULN2003电机驱动器使用四个引脚进行连接
3.电机驱动器
Arduino的引脚主要是用于控制数字电路,输出的电压范围通常在0-5V之间,最大输出电流也较小,一般为20mA左右。而直流电机需要比较高的电压和电流才能正常工作。如果直接将直流电机连接到Arduino的引脚上,则很可能会导致Arduino输出的信号不稳定或者烧毁。
此外,直流电机还需要通过改变电压和电流的方向来实现正反转和调速等功能,这也需要使用特殊的电路进行控制。因此,一般情况下我们需要使用电机驱动器等外部元件来控制直流电机。
电机驱动器是一种电子元件或电路,它可以将控制信号转换为足够高的电压和电流来驱动电机。在控制电机时,电机驱动器通常会提供多个端口,包括电源、地、输入信号和输出信号等。我们需要将电源和地连接到适当的电源和地点,将输入信号连接到Arduino的输出引脚上,然后将输出信号连接到电机的正负极上。通过控制Arduino输入信号的高低电平,电机驱动器可以控制电机的方向和转速,实现对电机的精确控制。
我们本次实验用的是ULN2003电机驱动器,其模样如下:
4.ULN2003
ULN2003电机驱动器有16个引脚,其中8个是输出引脚,用于控制电机的运行方向和速度;另外8个是输入引脚,包括4个电源引脚和4个输入信号引脚。
具体来说,ULN2003电机驱动器的可接引脚如下:
- COM(引脚9):公共接地引脚,需要连接到电路的地线。
- IN1(引脚10)和IN2(引脚11):输入控制引脚,用于控制电机正转或反转。
- IN3(引脚12)和IN4(引脚13):输入控制引脚,也用于控制电机正转或反转。
- VCC(引脚16):正极电源输入引脚,需要连接到电源的正极。
- GND(引脚8、15):负极电源输入引脚,需要连接到电源的负极。
- OUT1(引脚1)、OUT2(引脚2)、OUT3(引脚3)和OUT4(引脚4):输出控制引脚,用于控制电机的运行状态。
总体而言,ULN2003电机驱动器的输入引脚用于控制电机的运行方向和速度,输出引脚则将控制信号转换为高电平或低电平的电压信号,从而控制电机的运行状态。同时,VCC和GND引脚则提供电源给驱动器和电机。
5.总结
本次实验的代码并不难理解,重要的是了解这些器件和连接方式,原理图才是重点。
二.霍尔传感器实验
1.源代码
int i;//定义变量i
void setup()
{
pinMode(2,OUTPUT);//设置数字2引脚为输出模式
Serial.begin(9600); // 初始化串口通信
}
void loop()
{
i=analogRead(14);//读取A0口的模拟值
Serial.println(i);//串口显示出来模拟值量
if(i>512)//如果大于512(2.5V)
{
digitalWrite(2,HIGH);//点亮led灯
}
else//否则
{
digitalWrite(2,LOW);//熄灭led灯
}
}
2.电路图
3.霍尔传感器
A3144系列单极高温霍尔效应集成传感器是由稳压电源,霍尔电压发生器,差分放大器,施密特触发器和输出放大器组成的磁敏传感电路,其输入为磁感应强度,输出是一个数字电压讯号。它是一种单磁极工作的磁敏电路,适用于矩形或者柱形磁体下工作.可应用于汽车工业和军事工程中. 它的封装形式为TO-92SP 典型应用场合:直流无刷风机/转速检测/无触点开关/汽车点火器/位置控制/隔离检测/安全报警装置。
不要想其他复杂的,就把它理解为一个磁感应传感器,同其他传感器一样理解,只不过输入为磁感应强度即可。所以检测的时候你需要有一个吸铁石,他才会产生信号。
三.步进电机实验
1.源代码
#include <Stepper.h>//步进电机库
// 这里设置步进电机旋转一圈是多少步
#define STEPS 100
//设置步进电机的步数和引脚。接线为IN1--8 IN2--9 IN3--10 IN4--11
Stepper stepper(STEPS, 8, 10, 9, 11);
void setup()
{
// 设置电机的速度
stepper.setSpeed(180);
}
void loop()
{
stepper.step(2048);//正转
stepper.step(-2048);//反转
}
2.电路图
3.步进电机
步进电机和直流电机是两种不同的电机类型,它们有以下几点区别:
- 工作原理:步进电机是一种精密定位电机,通过按照一定步距进行脉冲控制,实现精确的转动角度。而直流电机则是通过通电使得电机转子产生磁场与永磁体交互作用而转动。
- 转速和转矩:步进电机在低速运转时具有较高的转矩,但随着转速增大,其转矩不断下降。而直流电机在整个工作范围内都具有较好的转矩特性,在高速运转时依然可以保持较高的输出功率。
- 控制方式:步进电机需要通过外部的控制信号来驱动,控制精度高,可以实现非常精细的定位。直流电机通常采用调速器等方式进行控制。
- 适用场景:由于步进电机精度高、可控性强,因此常被应用在需要进行精确定位或者精确控制的场景中,如印刷机械、数控机床等;而直流电机则广泛应用在家电、汽车等领域中,是一种普遍的电机类型。
既然都是电机,那么可以将电力转换为旋转运动或线性运动,从而驱动各种机械设备,和直流电机一样理解,只不过控制方式不同而已。
4.<Stepper.h>
库
<Stepper.h>
是一个用于Arduino编程的库,它提供了控制步进电机的函数和方法。步进电机是一种通常用于需要定向和精准控制的应用的电机类型,例如打印机、数控机床和机器人等。Stepper.h
库通过通过设置步进电机的转速和步进角度来控制步进电机的运动。它还可以控制电机的方向和加减速度。使用Stepper.h
库,开发人员可以轻松地将步进电机集成到他们的Arduino项目中,从而实现更精确和可靠的控制。可以参考红外解码实验用的<IRremote.h>
库,一样理解。
5.Stepper类
在Arduino编程语言中,Stepper
是一个类(class),用于控制步进电机。
Stepper
类的构造函数如下:
Stepper(steps, pin1, pin2, pin3, pin4)
参数说明:
steps
:步进电机的步数,即步进电机一圈所需的步数。pin1
、pin2
、pin3
、pin4
:控制步进电机旋转的 4 个引脚的数字引脚号。
例如这里Stepper stepper(STEPS, 8, 10, 9, 11)
这段代码用于在 Arduino 编程语言中控制一个 4 相步进电机。具体来说:
- 第一行代码使用了 C语言预处理器指令
#define
定义了一个名为 STEPS 的常量,表示步进电机一圈的步数为 100 步。 - 第二行代码创建了一个名为 “stepper” 的步进电机对象。这个对象基于之前定义的常量 STEPS 和 4 个数字引脚号(8、10、9 和 11)。
其中,这四个数字引脚分别连接到步进电机的 IN1、IN3、IN2 和 IN4 引脚,用于控制步进电机运动。具体来说:
- 第二个参数 8 是连接到步进电机的 “步” 引脚的数字引脚号(IN1)。
- 第三个参数 10 是连接到步进电机的 “方向” 引脚的数字引脚号(IN3)。
- 第四个参数 9 是连接到步进电机的 “使能” 引脚的数字引脚号(IN2)。
- 第五个参数 11 是连接到步进电机的另一个 “使能” 引脚的数字引脚号(IN4)。
该代码的含义是:创建一个名为 “stepper” 的步进电机对象,将步进电机的一圈步数设置为 100 步,并将 4 个数字引脚连接到相应的引脚上,以便控制步进电机的运动。
6..setSpeed()
函数
在Arduino的Stepper库中,.setSpeed()
是一个用于设置步进电机速度的函数。其语法为:
stepper.setSpeed(speed);
其中,stepper是一个Stepper类的实例对象,speed是一个整数值,表示步进电机的速度,单位是RPM(每分钟旋转次数)。
该函数将根据指定的速度设置步进电机的运动速度和方向,并返回void(无返回值)。如果需要更改步进电机的速度,只需再次调用.setSpeed()
函数即可。
请注意,具体的步进电机速度可能会受到供电电压、负载和其他因素的影响,因此需要进行适当的调整来确保精确的运动控制。
7..step()
函数
在Arduino的Stepper库中,step()是一个用于控制步进电机运动的函数。其语法为:
stepper.step(steps)
其中,stepper是一个Stepper类的实例对象,steps是一个整数值,表示步进电机要前进或后退的步数。正数表示顺时针方向旋转,负数表示逆时针方向旋转。
该函数将告诉步进电机前进或后退多少步,并返回void(无返回值)。在调用step()函数之前,需要先初始化步进电机对象,并使用setSpeed()
函数设置步进电机的速度。此外,还可以使用其他函数来设置步进电机的加速度、减速度、最大速度等参数。
请注意,step()函数只是告诉步进电机要移动多少步,而不会跟踪当前位置或目标位置。因此,在使用step()函数时需要编写适当的代码来跟踪电机的位置和方向。同时,在高速运动下,步进电机可能会产生振荡或失步,因此需要进行适当的调试和控制。
四.LCD1602液晶屏显示程序
1.提前看
LCD1602液晶屏有两种,一种是带IIC的串行连接的,一种是不带IIC并行连接的。这两种液晶屏功能都是一样的,只是串行的后面加了IIC转换驱动器,使得接线变得简单,液晶屏背面有黑色的器件就说明是串行的液晶屏,反之则是并行的液晶屏。
2.源代码1
#include <LiquidCrystal_I2C.h>//LCD1602 IIC液晶屏库
LiquidCrystal_I2C lcd(0x27,16,2); //设置LCD1602设备地址0x27
void setup()
{
lcd.init(); // 初始化LCD
lcd.backlight(); //设置LCD背景灯亮
}
void loop()
{
lcd.setCursor(0,0); //液晶显示第一行位置
lcd.print(" I love arduino"); //显示对应的字符
lcd.setCursor(0,1); //液晶显示第二行位置
lcd.print(" CSDN 666"); //显示对应的字符
}
3.电路图1
4.源代码2
#include <LiquidCrystal.h>//LCD1602液晶屏库
LiquidCrystal lcd(7, 6,14 , 15, 16, 17);//对应的接口连接分别是 RS E D4 D5 D6 D7
void setup() {
lcd.begin(16, 2);//LCD1602初始化
}
void loop() {
lcd.setCursor(0,0); //液晶显示第一行位置
lcd.print(" I love arduino"); //显示对应的字符
lcd.setCursor(0,1); //液晶显示第二行位置
lcd.print(" welcome to"); //显示对应的字符
}
5.电路图2
6.1602液晶接口引脚定义和标号
接口说明:
1、两组电源 一组是模块的电源 一组是背光板的电源 一般均使用5V供电。本次试验背光使用5V供电也可以工作。
2、VL是调节对比度的引脚(有的叫VO)。本次实验使用10KΩ的电位器来设定对比度。
3、RS 是很多液晶上都有的引脚 是命令/数据选择引脚 该脚电平为高时表示将进行数据操作;为低时表示进行命令操作。
4、R/W 也是很多液晶上都有的引脚 是读写选择端 该脚电平为高是表示要对液晶进行读操作;为低时表示要进行写操作。
5、E 同样很多液晶模块有此引脚 通常在总线上信号稳定后给一正脉冲通知把数据读走,在此脚为高电平的时候总线不允许变化。
6、D0—D7 8 位双向并行总线,用来传送命令和数据。
7、BLA是背光源正极,BLK是背光源负极。
7.液晶屏库
这两个库都是用于驱动液晶显示器的Arduino库。
<LiquidCrystal.h>
库可以驱动基于并行接口的液晶显示器,如常见的16x2和20x4字符液晶显示器。此库需要至少6个数字引脚来连接到Arduino板,因为它使用了数据总线(D4~D7)和控制线(RS、EN、RW)。
而 <LiquidCrystal_I2C.h>
则是为I2C接口的液晶屏提供了一个简单的抽象层,这种液晶显示器通常是基于PCF8574 I/O扩展器。使用I2C可以节省大量的Arduino引脚,并且这个库还支持多个I2C地址,可以同时驱动多个液晶显示器。
Arduino中很多功能的实现都需要导入其对应的库,现在我们已经遇到很多个库了,就算不能明白这是个什么意思,也能知道它大概是个什么东西,要表达什么。
8.源代码1理解
这段代码使用LiquidCrystal_I2C库来控制一个LCD1602 IIC液晶屏。在setup()函数中,通过调用lcd.init()和lcd.backlight()函数初始化并打开LCD的背光灯。在loop()函数中,使用lcd.setCursor()函数设置光标位置,并用lcd.print()函数将需要显示的文本输出到液晶屏上。
具体地,第一行输出"I love arduino",第二行输出" CSDN 666",前面有三个空格以保证整个文本居中显示。这里使用了16列2行的LCD1602设备,所以每行最多可以显示16个字符,超过这个长度的字符将会被截断。
9.源代码2理解
这段代码使用LiquidCrystal库来控制一个LCD1602液晶屏。在定义LiquidCrystal对象时,通过传递6个参数来指定以下接口连接:
- RS引脚连接到 Arduino的数字引脚 7
- E引脚连接到 Arduino的数字引脚 6
- D4引脚连接到 Arduino的数字引脚 14
- D5引脚连接到 Arduino的数字引脚 15
- D6引脚连接到 Arduino的数字引脚 16
- D7引脚连接到 Arduino的数字引脚 17
在setup()函数中,通过调用lcd.begin()函数初始化LCD1602,并设置其显示行数和列数(16列2行)。
在loop()函数中,使用lcd.setCursor()函数设置光标位置,并用lcd.print()函数将需要显示的文本输出到液晶屏上。具体地,第一行输出"I love arduino",第二行输出" welcome to",前面有三个空格以保证整个文本居中显示。因为是16列2行的LCD1602设备,所以每行最多可以显示16个字符,超过这个长度的字符将会被截断。
五.温湿度显示实验
1.提前看
由于本次实验是把温湿度显示是基于上次实验的基础,而上次实验有两种LCD1602液晶屏,为了简便,提前声明这里使用LCD1602液晶屏选用不带IIC并行连接的这一种,另外一种就不解释,只在最后附上源代码。
2.源代码
#include <LiquidCrystal.h>//LCD1602液晶屏库
#include <dht11.h>//dht11温湿度传感器库
LiquidCrystal lcd(7, 6,14 , 15, 16, 17);//对应的接口连接分别是 RS E D4 D5 D6 D7
dht11 DHT11;//定义变量
// 设置 DHT 引脚 为 Pin 8
#define DHT11PIN 8
void setup() {
lcd.begin(16, 2);//LCD1602初始化
}
void loop() {
int chk = DHT11.read(DHT11PIN);//读取温湿度的值
lcd.setCursor(0,0); //液晶显示第一行位置
lcd.print("Humidity:");//显示字符串
lcd.print((int)DHT11.humidity);//显示湿度的值
lcd.print("%");//显示字符串
lcd.setCursor(0,1); //液晶显示第二行位置
lcd.print("Temperature:");//显示字符串
lcd.print((int)DHT11.temperature);//显示温度的值
lcd.print("C");//显示字符串
}
3.电路图
4.温湿度传感器
DHT11温湿度传感器包括一个电阻式感湿元件和一个NTC测温元件。响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗。
5.注意说明
这里与其他传感器不同,这段代码使用了DHT11温湿度传感器库和LiquidCrystal库来读取DHT11传感器的温度和湿度,并将结果显示在1602液晶屏上。输出显示的是温度和湿度值,而不是0到1024的数字。
关于这个库的函数大家应该会自己探索了,同前面几个库一样理解,这里不解释了。
六.说明
接上一篇博客,Arduino学习笔记5!