欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析3
目录
- 👉🏻arduino开发板
- 引脚
- USB
- 串行总线
- 串行总线和并行总线的优缺点对比
- 👉🏻如何点亮LED灯(代码实现)
- 👉🏻串口
- 概念
- Serial库
- 👉🏻按键使用
- 👉🏻定时器
- Tiker库
- 👉🏻电位器
- 🍅ADC
- 👉🏻舵机
- Servo库
- attach
- 微秒和角度的换算
- 🥢舵机与电位器联动
- 👉🏻蜂鸣器
- 👉🏻OLED显示屏
- 原理以及代码实现效果
- 👉🏻电机
- 步进电机和直流电机的优缺点
- 为什么Arduino芯片引脚不能直接接步进电机或直流电机?但可以直接接舵机?🤔
- 如何提示驱动能力?
- 直流电机实现转/停
- 实现反转——双H桥电路
- 步进电机实现转停
👉🏻arduino开发板
当涉及到Arduino开发板上的功能区时,通常指的是Arduino Uno R3板上的各个部件和接口。下面是Arduino Uno R3板上的主要功能区及其功能和用途的简要介绍:
-
电源接口:
- DC电源插口:用于连接外部直流电源。
- USB接口:用于通过USB线连接到计算机或供电设备。
-
数字输入/输出引脚(Digital I/O):
- 数字引脚(Digital Pins):可以作为输入或输出使用,用于连接外部数字设备(例如按钮、LED等)。
- 引脚13上的LED指示灯:默认情况下,当引脚13设为输出时,该LED会亮起。
-
模拟输入引脚(Analog Input):
- 模拟引脚(Analog Pins):用于接收模拟信号(如传感器读数)。Arduino Uno R3板上有6个模拟引脚(A0-A5)。
-
电源引脚(Power Pins):
- 5V引脚:提供5V的电源。
- 3.3V引脚:提供3.3V的电源。
- GND引脚:地引脚,用于连接电路的地。
-
ICSP接口:
- ICSP引脚(In-Circuit Serial Programming):用于进行Arduino的ISP(In-System Programming)编程或用作其他SPI通信设备的接口。
-
Reset按钮:
- 重置按钮:按下此按钮可重置Arduino开发板。
-
USB-Serial转换器:
- 该转换器允许通过USB连接将Arduino与计算机进行通信,并供电Arduino开发板。
-
器件安装区:
- ATMega328P微控制器芯片:芯片上包含与Arduino Uno R3一起使用的固件,处理输入和输出。
- 晶振:提供主要的时钟信号。
-
其他:
- 芯片电源指示灯:显示芯片是否正常工作。
- 芯片复位电路:用于在复位按钮按下时将芯片重置为默认状态。
这些功能区提供了连接各种外部设备、输入/输出信号和供电的接口,使得Arduino开发板成为一个强大而灵活的开发平台。通过编写相应的程序,结合这些功能区的使用,可以实现各种电子项目和原型设计。
引脚
在Arduino开发板上,引脚是用来连接外部设备、传输信号和接收输入的接口。每个引脚都有自己的作用和功能,不同引脚具有不同的用途。以下是Arduino Uno R3开发板上常见的引脚及其作用的简要介绍:
-
数字引脚(Digital Pins):
- 用于数字输入或输出。
- 可以用来连接按钮、LED灯、继电器等数字设备。
- 默认情况下,数字引脚可以输出高电平(5V)或低电平(0V)。
-
模拟引脚(Analog Pins):
- 用于接收模拟信号输入。
- 可以连接模拟传感器(如温度传感器、光敏电阻等)和其他模拟设备。
- Arduino Uno R3板上有6个模拟引脚(A0-A5)。
-
电源引脚(Power Pins):
- 5V引脚:提供5V的电源输出。
- 3.3V引脚:提供3.3V的电源输出。
- GND引脚:地引脚,用于连接电路的地。
-
TX和RX引脚(Transmission and Reception):
- TX引脚(发送引脚):用于通过串口发送数据。
- RX引脚(接收引脚):用于通过串口接收数据。
- 这两个引脚通常与与计算机进行串口通信或连接其他串口设备(如蓝牙模块)时使用。
需要注意的是,每个引脚的电压、电流和功能限制可能不同。在编程和电路设计时,需要仔细查阅Arduino文档和规格说明来了解每个引脚的具体特性和用法。
USB
USB是通用串行总线(Universal Serial Bus)的缩写,它是计算机系统中常用的一种外部设备连接标准。USB最初由英特尔、微软、康柏、IBM和NEC等公司联合开发,用于取代过时的串口和并口等连接接口,以实现计算机和外部设备的快速、可靠和方便的连接。
USB接口通过使用一根数据线和一根电源线来传输数据和供电。与过去的串口和并口不同,USB接口不需要用户手动进行 IRQ设置、DMA配置等,这更加方便了用户的使用。此外,USB标准还支持热插拔功能,用户可以在不关闭计算机的情况下连接、断开USB设备。
USB接口可以与许多不同类型的设备通信,包括打印机、扫描仪、键盘、鼠标、数码相机、闪存驱动器、移动硬盘、音频设备、游戏控制器等等。使用USB接口,各种不同的设备都可以通过相同的物理连接方式与计算机通信,进而极大地方便了用户的使用和管理。
当前,USB标准已经经历了多次更新和改进,不断提高其传输速度、功率和功能等方面的性能。USB 3.2规范的传输速度已经高达10 Gbps,越来越多的设备开始采用USB接口进行连接。
串行总线
串行总线(Serial Bus)是一种数据传输方式,指的是在通信过程中,数据位按顺序一个接一个地通过单个线路进行传输。与之相对的是并行总线(Parallel Bus),它使用多个并行的数据线同时传输多个数据位。
串行总线相对于并行总线有以下几个特点:
-
线缆少:串行总线只需要一条数据线来传输数据,而并行总线需要多条数据线来同时传输多个数据位,因此串行总线在物理连接上更简单,线缆数量更少,减少了系统成本和复杂度。
-
传输距离长:由于串行总线只需要一条数据线,它的传输距离可以比较长,可以达到数十米甚至更远。而并行总线由于数据线间的干扰和传输速率等问题,传输距离相对较短。
-
传输速率高:串行总线可以通过增加传输速率来提高数据传输的效率,因为它只需一个数据线。而并行总线受限于数据线之间的同步问题以及电磁干扰等因素,很难进一步提高传输速率。
串行总线在计算机领域的应用非常广泛,如USB
、串口(RS-232
)、以太网
等都采用了串行传输方式。串行总线的优点在于灵活性、可靠性和适用范围广,能够满足不同设备之间数据传输的需求。
串行总线和并行总线的优缺点对比
串行总线和并行总线各自具有一些特点,下面我们来对比它们的优缺点:
-
线缆数量:串行总线只需要一条数据线传输数据,而并行总线需要多条数据线传输,因此串行总线在物理连接上更简单、线缆数量更少,减少了系统成本和复杂度。
-
传输速率:并行总线能够同时传输多个数据位,所以其传输速率较高。而串行总线由于只有一条数据线,每次只能传输一个数据位,所以其传输速率相对较低,但随着技术的发展,现在串行总线的传输速率已经可以达到很高,比如USB 3.2规范的传输速率已经高达10 Gbps。
-
传输距离:由于并行总线数据线之间的相互影响,传输距离受到限制,而串行总线只有一条数据线,传输距离可以比较长,可以达到数十米甚至更远。
-
抗干扰能力:并行总线在高速传输时会受到电磁干扰的影响,而串行总线则不易受到电磁干扰的影响。
-
成本和复杂度:并行总线需要更多的硬件资源支持多条数据线传输,所以它需要更多的成本和设计复杂度。而串行总线只需要一条数据线,更加灵活且简化了设计成本。
-
传输效率:在短距离、低速率的数据传输中,使用并行总线的传输效率可能会更高。但是,在高速、长距离的数据传输中,使用串行总线往往更加高效。
👉🏻如何点亮LED灯(代码实现)
#include <Arduino.h>
#define LED_PIN 18
void setup() {pinMode(LED_PIN,OUTPUT);//将引脚设置为输出
}void loop() {digitalWrite(LED_PIN,HIGH);//先设置高电平,发亮delay(1000);//延迟1秒digitalWrite(LED_PIN,LOW);//再设置低电平,不发亮delay(1000);//延迟1秒}
👉🏻串口
概念
串口
是一种通信接口,通常用于连接计算机和其他设备(如传感器、控制器、通信模块等)。它通过一对数据线(TX和RX),实现两个设备之间的数据交换。串口具有简单、稳定、成本低等优点,在嵌入式系统和物联网等领域得到广泛应用。
串口波特率
是指串口通信中,每秒钟传输的数据位数(二进制位数),通常用“波特(Baud)”来表示。波特率越高,每秒钟能够传输的数据位数就越多,因此传输速度就越快。
在实际应用中,常用的串口波特率有9600bps、115200bps等。其中,9600bps是应用最为广泛的通用波特率,而115200bps则是高速通讯时常用的波特率。
需要注意的是,两个设备在进行串口通信时,必须使用相同的波特率。如果波特率不匹配,将会导致数据传输失败或出现乱码等问题。
串口和串行总线的关系 🫶🏻
串口和串行总线是紧密相关的概念,可以理解为串行总线是一种通信的方式,而串口则是实现串行总线通信的接口或端口。
串口(Serial Port)是一种用于串行数据传输的物理接口,常见的有RS-232、RS-485等标准。它通常由若干个引脚组成,包括发送线(Tx)、接收线(Rx)、地线(GND)等。通过这些引脚,串口可以将数据以串行的方式逐位传输。串口通信可以用于连接设备间以进行数据交换,如计算机与打印机、调制解调器、传感器等。
串行总线是一种数据传输方式,指的是在通信过程中,数据位按顺序一个接一个地通过单个线路进行传输。串行总线可以利用串口进行数据传输,但不仅仅局限于串口。例如,USB、以太网等通信接口也属于串行总线的范畴。串行总线通过串行化的方式传输数据,具有线缆少、传输距离长、传输速率高等特点。
因此,串口是实现串行总线通信的一种具体形式或接口,它提供了硬件层面上的串行数据传输能力。串口一般都遵循特定的协议和标准,如RS-232协议,以确保数据的正确传输和收发的同步。
Serial库
当使Arduino进行串口通信时,你可以使用Serial库提供的功能来发送和接收数据。以下是一些常用的Serial库函数和用法:
-
Serial.begin(baudRate): 初始化串口通信,并设置波特率为baudRate(比特率)。
示例:Serial.begin(9600); // 初始化串口通信,波特率为9600bps -
Serial.print(data) / Serial.println(data): 发送数据到串口。可以发送数字、字符或字符串。
示例:Serial.print(123); // 发送数字123
Serial.println(“Hello!”); // 发送字符串"Hello!",并换行 -
Serial.available(): 返回接收缓冲区中可用的字节数。
示例:int numBytes = Serial.available(); // 获取可用字节数 -
Serial.read(): 从串口接收一个字节的数据并返回。注意返回值是一个整数(0-255),如果没有数据可读,则返回-1。
示例:int data = Serial.read(); // 读取一个字节的数据 -
Serial.write(data): 将一个字节的数据发送到串口。
示例:Serial.write(65); // 发送字母’A’ -
Serial.setTimeout(time): 设置读取数据的超时时间(毫秒),如果超过该时间未接收到数据,Serial.read()函数会返回-1。
示例:Serial.setTimeout(1000); // 设置超时时间为1秒 -
Serial.flush(): 刷新串口的发送缓冲区,并等待所有已发送的数据被发送完毕。
示例:Serial.flush(); // 刷新串口缓冲区
这些函数只是Serial库提供的一些基本功能,你可以根据不同的需求进行灵活应用。同时还可以使用串口调试工具(如Arduino IDE的串口监视器)来观察和调试串口通信过程中的数据。
👉🏻按键使用
Arduino的按键运行原理是通过读取按键输入信号,判断按键的状态,从而触发相应的代码执行。在通常情况下,我们使用数字输入引脚(Digital Input Pin)作为按键的输入信号端口,在按下按钮时会将该引脚连接到地,产生一个低电平信号,通过检测输入引脚的电平来判断按键当前的状态。
按键的使用方法一般可以分为两种:软件防抖
和硬件防抖
。
-
软件防抖:由于按键在按下或松开时可能会产生不稳定的信号,因此需要对按键进行软件防抖处理,避免出现误触发等问题。软件防抖的核心是对按键信号进行去抖动处理,常见的方法是通过延时、计数等方式来实现。
-
硬件防抖:除了在软件层面上进行防抖处理,还可以在硬件层面上进行防抖,常见的方法是通过添加电容或者RC网络等组件来降低按键发生的电压变化,从而达到去抖动的目的。
按键的使用步骤如下:
-
将按键连接到数字输入引脚,同时通过上拉电阻将输入引脚电平拉高(如D2接上10K上拉电阻);
-
在Arduino编程环境中设置输入引脚为输入模式(Input Mode);
-
使用digitalRead()函数读取输入引脚的电平,判断按键状态;
-
加入软件/硬件防抖程序,使得按键信号稳定,避免误操作;
-
在程序中编写相关逻辑,触发相应的代码执行。
示例代码如下:
const int buttonPin = 2; // 按键连接到D2
int buttonState = 0; // 按键状态变量void setup() {pinMode(buttonPin, INPUT_PULLUP); // 设置D2为输入模式并启用内部上拉电阻Serial.begin(9600); // 开启串口调试
}void loop() {buttonState = digitalRead(buttonPin); // 读取按键状态if (buttonState == LOW) { // 判断按键是否按下Serial.println("Button pressed!"); // 输出串口信息delay(100); // 延时去抖动处理}
}
这个简单的程序就可以实现在按键按下时输出一条串口消息,实现了简单的按键检测功能。
👉🏻定时器
Ticker库可以让开发者在Arduino上方便地创建周期性的定时器任务,而不需要手动调用delay()函数或编写复杂的定时器中断程序。使用Ticker库,可以将时间间隔和回调函数传递给Ticker对象,然后Ticker对象会根据时间间隔自动调用回调函数。
下面是一个基于Ticker库的短暂LED闪烁示例:
#include <Ticker.h>Ticker blinker;void blink() { // 回调函数static boolean state = false;digitalWrite(LED_BUILTIN, state);state = !state;
}void setup() {pinMode(LED_BUILTIN, OUTPUT);blinker.attach(0.5, blink); // 每隔0.5秒调用一次blink()
}void loop() {
}
在该示例中,初始化blinker对象,并将blink ()回调函数和0.5秒的时间间隔传递给它。然后,在setup()函数中启动blinker定时器,它将以500ms的时间间隔调用blink()函数。
在blink()函数中,使用一个static变量来保持LED的状态(高/低电平),并通过digitalWrite()切换LED的状态。每次blink()函数被调用时,状态变量会被翻转,LED也会随之翻转。
注意:由于Ticker库是在setup()函数中启动的,因此loop()函数不应该执行任何处理,否则会干扰blinker定时器的操作。
Tiker库
在Ticker库中,有一些常用的方法可以用来配置周期性定时器和一次性定时器:
-
attach():设置周期性定时器的时间间隔和回调函数。例如,blinker.attach(0.5, blink); 将设置一个每隔0.5秒调用一次 blink() 的定时器。
-
attach_ms():与 attach() 类似,但接受以毫秒为单位的时间参数。例如,blinker.attach_ms(500, blink); 将设置一个每隔500毫秒调用一次 blink() 的定时器。
-
once():设置一次性定时器,并在指定延迟后调用回调函数。例如,blinker.once(2, blink); 将设置一个2秒钟后调用一次 blink() 的定时器。
-
once_ms():与 once() 类似,但接受以毫秒为单位的时间参数。
-
interval():获取周期性定时器的时间间隔。
-
changeInterval():修改周期性定时器的时间间隔。例如,blinker.changeInterval(1); 将把blink()的调用间隔改为1秒。
-
stop():停止定时器并禁用回调函数。
-
start():启动已经停止的定时器。
这些方法提供了灵活的方式来配置和控制Ticker对象的行为。例如,attach_ms() 和 once_ms() 允许开发者以毫秒为单位设置时间间隔,这比attach() 和 once() 方法提供了更高的灵活性。而 changeInterval() 方法则允许开发者在运行时改变周期性定时器的时间间隔。
👉🏻电位器
当涉及到 Arduino 的电位器原理和实现时,主要涉及到两个方面:电位器的工作原理和如何将电位器连接到 Arduino 板上。
电位器(又称变阻器)是一种可调电阻,通过改变电位器上的滑动触点位置,可以改变电位器两个固定端之间的电阻值。电位器通常由一个可旋转的旋钮和一个固定的终点组成。
电位器的工作原理如下:
- 电位器的两个固定端之间有一个可变的电阻元件,通常是一条螺旋线。
- 滑动触点连接在电位器电阻元件的不同位置,因此其电阻值取决于触点与固定端之间的距离。
- 当旋转电位器的旋钮时,滑动触点会沿着电阻元件移动,从而改变整体电阻值。
将电位器连接到 Arduino 板上需要以下步骤:
- 将电位器的一个固定端连接到 Arduino 板上的5V引脚或其他合适的电压源。
- 将电位器的另一个固定端连接到地(GND)引脚。
- 将电位器的滑动触点连接到 Arduino 板上的一个模拟输入引脚(例如A0)。
连接完毕后,可以通过 Arduino 的模拟输入引脚读取电位器的数值。使用analogRead()
函数可以获取该引脚的模拟数值,该数值对应于电位器滑动触点的位置,可用作后续的计算或控制操作。
以下是一个简单示例,展示如何读取连接到 Arduino A0 引脚的电位器数值并将其打印到串口监视器:
void setup() {Serial.begin(9600); // 初始化串口通信
}void loop() {int sensorValue = analogRead(A0); // 读取A0引脚的模拟数值Serial.println(sensorValue); // 将数值打印到串口监视器delay(100); // 延迟100毫秒
}
通过上传上述代码到 Arduino 板上,你将能够在串口监视器中看到电位器的数值变化。
🍅ADC
ADC是模拟到数字转换器(Analog-to-Digital Converter)的缩写。
在电子领域中,存在着两种类型的信号:模拟信号和数字信号。模拟信号是连续变化的信号,可以取无限个可能的值,而数字信号是离散的信号,只能取特定的离散值。
ADC是一种用于将模拟信号转换为数字信号的设备或模块。它将来自传感器、模拟电路或其他模拟源的连续变化的模拟信号转换为具有特定离散值的数字信号,以便于数字系统进行处理、存储和分析。
基本上,ADC将模拟信号的幅度进行离散化,将其分成固定数量的离散级别,并将其表示为二进制形式。转换后的数字信号可以由微控制器、数字信号处理器(DSP)、计算机等数字系统进行处理。
ADC通常由一个样本和保持电路(Sample and Hold)用于捕获连续的模拟信号样本,并一个数字化电路用于将模拟信号的电压值转换为数字形式。
Arduino板上的模拟输入引脚通过内置的ADC模块实现了模拟到数字转换,并允许开发者读取外部模拟信号的数值。
👉🏻舵机
当涉及到 Arduino 的舵机实现时,需要了解舵机的工作原理以及如何将舵机连接到 Arduino 板上。
舵机是一种用于控制角度的电机设备。它具有内置的反馈机制,可以精确地控制输出轴的位置。舵机通常用于模型、机器人和其他需要精确控制旋转角度的应用中。
舵机的工作原理如下:
- 舵机由电机、控制电路和反馈装置组成。
- 控制电路接收来自 Arduino 的控制信号。
- 控制电路根据信号呈现给电机所需的电压和电流。
- 反馈装置会感知输出轴的当前位置并将信息返回给控制电路。
- 控制电路与反馈装置协调工作,使得舵机的输出轴保持在期望的位置。
将舵机连接到 Arduino 板上需要以下步骤:
- 将舵机的
电源引脚
(通常为红色线)连接到 Arduino 板上的5V引脚或外部电源。 - 将舵机的
地线
(通常为黑色线)连接到 Arduino 板上的GND引脚。 - 将舵机的
控制信号引脚
(通常为白色或黄色线)连接到 Arduino 板上的数字输出引脚。
连接完毕后,可以使用 Arduino 的软件库来控制舵机。Arduino 舵机库(Servo Library)提供了简单的API来控制舵机位置。
以下是一个简单示例,展示如何使用 Arduino 控制舵机转动到特定角度:
#include <Servo.h>Servo myServo; // 创建一个舵机对象void setup() {myServo.attach(9); // 将舵机信号线连接到数字引脚9
}void loop() {myServo.write(90); // 将舵机转动到90度的位置delay(1000); // 延迟1秒钟myServo.write(180); // 将舵机转动到180度的位置delay(1000); // 延迟1秒钟
}
通过上传上述代码到 Arduino 板上,你将能够看到舵机在不同角度之间旋转。
这只是一个简单的示例,你可以根据需要使用 Servo 库来实现更复杂的舵机控制,例如设置舵机速度、实现连续旋转等。
Servo库
当涉及到 Arduino 的舵机控制时,可以使用 Servo 库来简化开发过程。Servo 库提供了一组函数和方法,使得控制舵机变得更加容易。
使用 Servo 库的步骤如下:
- 导入 Servo 库:在代码的顶部添加
#include <Servo.h>
来导入 Servo 库。 - 创建 Servo 对象:使用
Servo
类创建一个舵机对象,例如Servo myServo;
。 - 连接舵机信号引脚:在
setup()
函数中使用attach()
方法将舵机的信号线连接到指定的数字引脚,例如myServo.attach(9);
将舵机连接到数字引脚 9。 - 控制舵机位置:使用
write()
方法将舵机转动到特定的角度,例如myServo.write(90);
将舵机转动到 90 度的位置。 - 其他可选操作:通过 Servo 库,还可以设置舵机的最小角度、最大角度、速度等参数,以及实现连续旋转等功能。
以下是 Servo 库常用函数的示例:
attach(pin)
:将舵机信号线连接到指定的数字引脚。
myServo.attach(9); // 将舵机连接到数字引脚 9
write(angle)
:将舵机转动到特定角度。
myServo.write(90); // 将舵机转动到 90 度的位置
writeMicroseconds(microseconds)
:通过微秒数控制舵机位置,可以实现更精确的控制。
myServo.writeMicroseconds(1500); // 将舵机转动到特定的微秒数位置
read()
:读取当前舵机的角度值。
int angle = myServo.read(); // 读取当前舵机的角度值并保存到变量 angle 中
attached()
:检查舵机是否已连接到引脚。
bool isAttached = myServo.attached(); // 检查舵机是否已连接到引脚,并保存结果到变量 isAttached 中
attach
在 Servo 库中,attach()
方法还接受其他两个可选的参数,分别是 min
和 max
。这些参数用于设置舵机的最小角度和最大角度。
attach(pin, min, max)
:将舵机信号线连接到指定的引脚,并设置舵机的最小角度和最大角度。
pin
:要连接舵机信号线的数字引脚。min
:舵机的最小角度值,默认为 544 微秒(对应约 0 度)。max
:舵机的最大角度值,默认为 2400 微秒(对应约 180 度)。
使用这些参数,你可以根据舵机的具体规格进行调整,确保舵机在正确的角度范围内工作。
以下是一个使用 attach()
方法设置最小角度和最大角度的示例:
#include <Servo.h>Servo myServo;void setup() {myServo.attach(9, 600, 2400); // 将舵机连接到数字引脚 9,并设置最小角度为 600 微秒,最大角度为 2400 微秒
}void loop() {myServo.write(90); // 将舵机转动到 90 度的位置delay(1000);myServo.write(180); // 将舵机转动到 180 度的位置delay(1000);
}
在上述示例中,舵机的角度范围被设置为 0 到 180 度,并且最小角度和最大角度对应的微秒数分别为 600 和 2400 微秒。
微秒和角度的换算
微秒(microseconds)和角度之间的换算关系取决于舵机的具体规格。不同舵机的工作范围和精度可能会有所不同。
通常情况下,舵机的角度范围是从 0 度到 180 度,对应了 Servo 库中 write()
方法的参数范围。某些舵机可能具有更大的角度范围,例如 0 度到 270 度。
舵机控制信号使用脉冲宽度调制(PWM)技术来确定舵机角度。典型的舵机控制信号周期为 20 毫秒(ms),其中脉冲高电平的持续时间决定了舵机的位置。
脉冲宽度是指脉冲信号中高电平的持续时间,通常用时间单位表示,例如微秒(μs)或毫秒(ms)。
在电子学中,脉冲信号是一种周期性的信号,由一个特定时间长度的高电平(称为脉冲宽度)和一个低电平组成。这种信号在许多领域都有应用,例如
舵机控制
、遥控器
、数字信号处理
等。脉冲信号被广泛应用于舵机控制中。在舵机控制中,脉冲信号的高电平持续时间决定了舵机的位置。具体而言,舵机接收到一个高电平脉冲信号后,会将舵机转动到对应的位置,并保持该位置直到下一个信号到来。
例如,在 Servo 库中,write() 方法发送一个脉冲信号,其中高电平的持续时间决定了舵机的位置。默认情况下,脉冲的周期是 20 毫秒 (ms),高电平的持续时间对应的是 0 到 180 度之间的角度值。
需要注意的是,脉冲宽度的单位可能因应用领域而异。在舵机控制中,通常使用微秒(μs)作为脉冲宽度的单位。在其他应用中,可能会使用毫秒(ms)、纳秒(ns)等不同的单位。
在 Servo 库中,默认的最小角度对应的脉冲宽度是 544 微秒(μs),最大角度对应的脉冲宽度是 2400 μs。这个范围可以根据舵机的规格进行调整,但一般情况下都在这个范围内。
微秒和角度之间的换算关系可以使用以下公式计算:
angle = map(pulseWidth, minPulseWidth, maxPulseWidth, minAngle, maxAngle)
其中:
angle
是目标角度值pulseWidth
是舵机控制信号的脉冲宽度(微秒)minPulseWidth
是最小脉冲宽度(微秒)maxPulseWidth
是最大脉冲宽度(微秒)minAngle
是最小角度值maxAngle
是最大角度值
使用这个公式,你可以将微秒值转换为对应的角度值,或者将角度值转换为微秒值。
需要注意的是,具体的舵机规格可能会有所不同,因此在实际应用中,最好参考舵机的技术规格表来获取准确的微秒和角度之间的换算关系。
🥢舵机与电位器联动
#include <Arduino.h>
#include <ESP32Servo.h>#define PIN_SERVO 23
#define PIN_SENSOR 12Servo servo;int angle = 0;void setup() {// put your setup code here, to run once:Serial.begin(9600);Serial.print("setup\n"); //set the resolution to 10 bits (0-1023)analogReadResolution(10);//频率设置50Hz 1s 50个脉冲 每个脉冲20msservo.setPeriodHertz(50); // 例如,如果范围是1000us到2000us, 1000us等于0的角,1500us等于90度,2000us等于1800 度。servo.attach(PIN_SERVO,1000,2000);
}void loop() {// put your main code here, to run repeatedly:int val=analogRead(PIN_SENSOR);//函数的使用率比较高,将某一区间的值转换为另外区间的值。//数值转换,将[0,1023]产生的模拟值转换成[0,180]中的值int angle=map(val,0,1023,0,180);Serial.printf("val = %d angle = %d\n",val,angle);//servo.write(45)表示舵机旋转到45°的位置servo.write(angle);//原理,通过计算脉冲宽度转换为控制角度,脉冲频率转换为控制速度delay(100);
}
👉🏻蜂鸣器
Arduino蜂鸣器是一种能够发出声音的电子元件,它的实现原理是通过控制蜂鸣器内部的振荡器产生特定频率的振荡信号,使得蜂鸣器发出相应频率的声音。
蜂鸣器通常由一个振荡器和一个扬声器组成。振荡器产生高频振荡信号,而扬声器将这个信号转换为声音。Arduino可以通过控制输出引脚上的电平来控制蜂鸣器的工作状态。
下面是Arduino中使用蜂鸣器的基本实现步骤:
-
连接蜂鸣器到Arduino:将蜂鸣器的正极连接到一个数字输出引脚上,将负极连接到GND(地)引脚上。
-
初始化输出引脚:在Arduino代码中,首先需要设置所使用的引脚为输出模式,以便向蜂鸣器发送控制信号。例如,可以使用
pinMode(pin, OUTPUT)
函数进行设置,其中pin
是引脚编号。 -
控制蜂鸣器的振荡频率:通过改变输出引脚的电平状态,可以控制蜂鸣器的振荡频率。在Arduino中,可以使用
digitalWrite(pin, HIGH)
将引脚电平设为高电平,使用digitalWrite(pin, LOW)
将引脚电平设为低电平,来产生特定频率的振荡信号。通过控制高电平和低电平的时间间隔,可以改变发出的声音的音高。
下面是一个简单的Arduino代码示例,用于控制蜂鸣器发出一段间隔时间相等的音调:
int buzzerPin = 9; // 设置蜂鸣器连接的引脚void setup() {pinMode(buzzerPin, OUTPUT); // 将引脚设置为输出模式
}void loop() {digitalWrite(buzzerPin, HIGH); // 设置引脚电平为高delay(1000); // 延迟1秒digitalWrite(buzzerPin, LOW); // 设置引脚电平为低delay(1000); // 延迟1秒
}
在上述示例中,当程序运行时,蜂鸣器会发出一段间隔时间相等的嘀嗒声,每个周期为2秒(1秒高电平+1秒低电平)。
需要注意的是,具体的蜂鸣器实现可能会有所不同,根据蜂鸣器型号和规格,控制方式和参数可能会有差异。因此,在实际应用中,最好参考蜂鸣器的技术说明书或相关文档来了解具体的控制方式和参数。
☁️蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器
- 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。
- 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。
- 蜂鸣器有正负极,顶部印有+号的为正极,若蜂鸣器引脚没剪,则长的为正极。
👉🏻OLED显示屏
原理以及代码实现效果
Arduino的OLED显示屏是一种基于有机发光二极管(Organic Light-Emitting Diode,OLED)技术的显示设备,它具有低功耗、高对比度和快速响应等特点。OLED显示屏可以通过控制每个像素点的发光来实现图形和文本的显示。
OLED显示屏的实现原理如下:
-
工作原理:OLED显示屏由许多小型的发光二极管组成,每个像素点都是一个独立的发光二极管。当电流通过像素点时,发光二极管会自发地发光,从而实现亮度可调的显示效果。
-
驱动电路:OLED显示屏需要一个驱动电路来控制像素点的发光。这个驱动电路通常由
显存
、行选通电路
和列选通电路
组成。显存用于存储显示内容,行选通电路用于选择要显示的行,列选通电路用于选择要显示的列。通过依次选通每一行和每一列,可以实现逐像素点的控制。 -
数据传输:为了控制OLED显示屏,需要将要显示的数据传输给驱动电路。数据可以通过串行总线(如I2C或SPI)或并行总线进行传输。一般来说,使用
I2C总线
是较为常见的方式。 -
显示内容:通过控制驱动电路和传输数据,可以实现在OLED显示屏上显示各种图形和文本。Arduino可以通过编写相应的代码来指定要显示的内容,例如绘制图形、显示字符等。
以下是一个简单的Arduino代码示例,用于驱动OLED显示屏显示一些文本:
#include <Wire.h> // 引入Wire库,用于I2C通信
#include <Adafruit_GFX.h> // 引入Adafruit_GFX库,用于图形操作
#include <Adafruit_SSD1306.h>// 引入Adafruit_SSD1306库,用于驱动SSD1306 OLED显示屏// 定义 OLED 的地址和尺寸
#define OLED_ADDR 0x3C
#define OLED_WIDTH 128
#define OLED_HEIGHT 64// 创建 Adafruit_SSD1306 对象 display,使用默认的 I2C 总线对象 Wire 和 OLED 地址 OLED_ADDR
Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, OLED_ADDR);void setup() {// 初始化 OLED 显示屏display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);// 清除显示内容display.clearDisplay();// 设置文本颜色为白色display.setTextColor(WHITE);// 设置文本尺寸为 1display.setTextSize(1);
}void loop() {// 清除显示内容display.clearDisplay();// 设置光标位置为 (0, 0)display.setCursor(0, 0);// 在 OLED 显示屏上打印 "Hello, World!" 文本display.println("Hello, World!");// 更新显示内容display.display();// 延迟 1 秒delay(1000);
}
需要注意的是,不同型号和规格的OLED显示屏可能有不同的驱动芯片和库函数。因此,在实际使用中,应根据具体的OLED型号和规格来选择相应的库和函数。
什么是GND,VCC,SCL,SDA🤔
GND、VCC、SCL和SDA是一些常见的电路连接标识,常用于I2C总线通信和其他电路连接中。
-
GND(Ground)代表地线或接地,通常用于连接电路的地引脚,为电路提供参考零电位。
-
VCC(Voltage Common Collector)代表电源正极,通常用于连接电路的正电源引脚,为电路提供正电压。
-
SCL(Serial Clock)是I2C总线的时钟线,用于同步数据传输的时序。
-
SDA(Serial Data)是I2C总线的数据线,用于传输数据。
在I2C通信中,SCL和SDA是必须的信号线,用于设备之间的数据交换。而GND和VCC则是为了提供电源和信号的参考。
👉🏻电机
当谈到 Arduino 的电机时,有两种常见的类型:直流(DC)电机和步进电机。
- 直流(DC)电机:
直流电机是最常见的电机类型之一。它们可以使用直流电源供电,并通过改变电流方向来控制转动方向。直流电机通常由两个部分组成:电枢和旋转部分,如电刷、转子和磁铁。它们可以用于各种应用,包括机器人、车辆、风扇和打印机等。
Arduino 控制直流电机通常需要使用驱动器模块或集成电路,因为直流电机需要大电流以及反向电流保护。使用 Arduino 控制直流电机可以通过 PWM(脉宽调制)
信号来调节功率和速度,并使用数字输出引脚来控制方向。
- 步进电机:
步进电机是一种精确控制的电机,常用于需要准确位置和转动角度的应用。步进电机通过将电流施加到一组绕组上来实现转动。其中最常见的是四相步进电机,每个阶段有两个绕组。控制步进电机通常需要一个驱动器模块,该模块通过向每个绕组提供适当的电流序列来控制电机的转动。
通过 Arduino 控制步进电机需要控制每个绕组的电流和频率。这可以通过 PWM
控制电流并调整顺序来实现。每个电机步进角度与绕组数和驱动信号频率有关。通过调整频率和步进数,可以控制步进电机的位置和速度。
总结:
直流电机适用于需要简单控制的应用,而步进电机适用于需要精确位置和控制的应用。在 Arduino 中,通过驱动器模块或集成电路可以控制直流电机和步进电机的转动方向和速度。
步进电机和直流电机的优缺点
直流(DC)电机和步进电机各有优缺点,下面是它们的主要特点:
直流(DC)电机:
优点:
- 直流电机结构简单、成本低廉,容易使用和安装。
- 启动和停止响应快,转速范围广,可以提供高扭矩。
- 支持双向运动,可以通过改变电流方向来改变转动方向。
缺点:
- 需要外部驱动器或集成电路来控制,例如 H-桥驱动器。
- 直流电机通常需要较高的电流,因此需要额外的保护电路。
- 由于直流电机是基于电刷和电刷寿命有限,可能需要定期维护和更换电刷。
步进电机:
优点:
- 步进电机可以实现精确的位置控制,旋转角度可分为很小的步进。
- 不需要闭环反馈系统,即使在失去步进信号的情况下也能保持位置。
- 动态响应快,可适用于需要准确定位和高精度运动的应用。
缺点:
- 步进电机功率相对较小,通常不适用于需要高扭矩的应用。
- 需要专门的驱动器来控制电机,驱动器成本相对较高。
- 当步进电机以较高速度运转时,可能会产生震动和噪音。
- 步进电机在失步(步进信号丢失)或负载超过其能力时可能会出错。
为什么Arduino芯片引脚不能直接接步进电机或直流电机?但可以直接接舵机?🤔
这要从舵机的构造说起,控制芯片+电机组成,Arduino实际接的是控制芯片引脚,而不是电机本身。
而步进电机和直流电机内部是没有控制芯片的,如果使用Arduino直接接电机,因为Arduino芯片引脚驱动能力弱而驱动不起甚至损坏芯片,ESP32每个IO的最大电流为40mA,一般步进电机跑起来可能需要几百mA到几A。
驱动能力可以理解为引脚的可以输出的力气,如果力气过小,当然推不动电机运行。
如何提示驱动能力?
三极管可以用于提升电路的驱动能力,特别是在需要放大电流或控制较大负载时。下面是使用三极管提升驱动能力的一般步骤:
-
确定驱动需求:首先确定需要提升驱动能力的电路或负载。这可能是一个需要较高电流的负载,例如电机或高功率装置。
-
选择合适的三极管:根据需要提升的电流和其他电路要求,选择一个适当的三极管。确保选取的三极管具有足够的电流承载能力和放大系数。
-
驱动电路设计:根据驱动需求和所选三极管的特性,设计驱动电路。这通常包括将三极管配置为放大器或开关。
-
连接电路:将驱动电路与所需的负载连接起来。确保电路中的电源和地线正确连接,并注意电路中的保护和过载保护。
-
控制信号:根据需要,通过输入适当的控制信号来控制三极管的开关行为。这可以通过外部电路或使用微控制器等来实现。
-
测试和调整:进行测试并根据需要调整电路。确保三极管的驱动能力满足负载要求,并检查电路的性能和稳定性。
直流电机实现转/停
下面是一个示例的Arduino代码实现,用于控制直流电机的转动和停止:
// 定义引脚
const int IN1_PIN = 2;
const int IN2_PIN = 3;void setup() {// 初始化引脚模式pinMode(IN1_PIN, OUTPUT);pinMode(IN2_PIN, OUTPUT);
}// 控制电机正转
void motorForward() {digitalWrite(IN1_PIN, HIGH);digitalWrite(IN2_PIN, LOW);
}// 控制电机停止
void motorStop() {digitalWrite(IN1_PIN, LOW);digitalWrite(IN2_PIN, LOW);
}void loop() {motorForward(); // 电机开始转动delay(3000); // 持续转动3秒motorStop(); // 停止电机
}
以上代码使用Arduino的digitalWrite()
函数来设置引脚的高低电平状态以控制电机的转动和停止。首先,通过定义IN1_PIN
和IN2_PIN
变量来指定控制电机的两个引脚。然后,在setup()
函数中,使用pinMode()
函数将这两个引脚设置为输出模式。
在motorForward()
函数中,通过调用digitalWrite()
函数将IN1_PIN
引脚设置为高电平,将IN2_PIN
引脚设置为低电平,以使电机正转。在motorStop()
函数中,将这两个引脚都设置为低电平,使电机停止转动。
在loop()
函数中,通过调用motorForward()
函数来启动电机转动,使用delay()
函数来控制电机转动的持续时间,然后调用motorStop()
函数来停止电机。
请根据实际硬件连接和需求进行适当的引脚设置和修改。确保在运行代码之前正确设置引脚模式,并根据需要配置其他参数,如引脚编号、电机驱动方式等。
实现反转——双H桥电路
双H桥驱动器
(Dual H-Bridge Driver)是一种常用于控制直流电机转向和速度的电路模块。它通常由四个开关管(MOSFET或BJT)组成,能够控制电机的正转、反转和停止。当两个开关管配对工作时,可以控制电机的转向,并且可以通过调整开关管的导通时间和导通方式来控制电机的速度。
双H桥驱动器一般具有两个输入端和两个输出端,其中每个输出端与电机的一个引脚相连。输入端用于控制电机的转向和速度,常见的控制信号包括PWM信号(脉宽调制)和方向信号。
在使用双H桥驱动器控制直流电机时,你需要将其连接到Arduino或其他微控制器,然后通过控制引脚的高低电平来控制电机的转向和速度。具体连接方式和控制方法可能根据你所使用的双H桥驱动器型号而有所不同,因此建议参考双H桥驱动器的数据手册或说明书了解具体的连接和控制细节
🫧以下是一个示例的Arduino代码,展示如何通过双H桥驱动器控制电机的正转和反转:
// 定义引脚
const int IN1_PIN = 2;
const int IN2_PIN = 3;void setup() {// 初始化引脚模式pinMode(IN1_PIN, OUTPUT);pinMode(IN2_PIN, OUTPUT);
}// 控制电机正转
void motorForward() {digitalWrite(IN1_PIN, HIGH);digitalWrite(IN2_PIN, LOW);
}// 控制电机反转
void motorReverse() {digitalWrite(IN1_PIN, LOW);digitalWrite(IN2_PIN, HIGH);
}// 控制电机停止
void motorStop() {digitalWrite(IN1_PIN, LOW);digitalWrite(IN2_PIN, LOW);
}void loop() {motorForward(); // 电机正转delay(3000); // 持续转动3秒motorReverse(); // 电机反转delay(3000); // 持续转动3秒motorStop(); // 停止电机delay(2000); // 停止2秒
}
在上述代码中,我们通过定义IN1_PIN
和IN2_PIN
两个引脚来控制电机的正转和反转。通过调用digitalWrite()
函数将IN1_PIN
设置为高电平,IN2_PIN
设置为低电平,可以使电机正转。通过调用digitalWrite()
函数将IN1_PIN
设置为低电平,IN2_PIN
设置为高电平,可以使电机反转。
在loop()
函数中,我们先调用motorForward()
函数使电机正转,然后使用delay()
函数控制转动的持续时间。接着,调用motorReverse()
函数使电机反转,再次使用delay()
函数控制转动的持续时间。最后,调用motorStop()
函数停止电机,并使用delay()
函数暂停一段时间。
步进电机实现转停
要使用Arduino控制步进电机实现旋转和停止,你需要连接步进电机驱动器(如A4988
或DRV8825
)到Arduino,并编写代码来控制步进电机的运动。下面是一个示例的Arduino代码,展示了如何控制步进电机的转动和停止:
// 引入步进电机库
#include <Stepper.h>// 定义步进电机引脚
#define STEPS 200 // 步进电机一圈的步数
#define DIR_PIN 2 // 步进电机方向引脚
#define STEP_PIN 3 // 步进电机脉冲引脚// 创建步进电机对象
Stepper stepper(STEPS, DIR_PIN, STEP_PIN);void setup() {// 设置步进电机速度stepper.setSpeed(300); // 设置步进电机速度为300步/秒
}void loop() {// 控制步进电机旋转stepper.step(200); // 旋转200步(正转)delay(2000); // 停顿2秒stepper.step(-200); // 旋转200步(反转)delay(2000); // 停顿2秒stepper.step(0); // 停止步进电机delay(2000); // 停顿2秒
}
在上述代码中,我们首先导入Stepper
库,并定义了步进电机的引脚。STEPS
表示步进电机一圈的步数,DIR_PIN
是控制方向的引脚,STEP_PIN
是控制步进脉冲的引脚。
在setup()
函数中,我们设置步进电机的速度为300步/秒(可以根据实际需求进行调整)。
在loop()
函数中,我们使用stepper.step()
函数来控制步进电机的运动。参数正值表示顺时针旋转,负值表示逆时针旋转,0表示停止。通过调用stepper.step()
函数并指定旋转的步数,我们可以控制步进电机的转动。使用delay()
函数控制每个动作之间的停顿时间。
如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长