|
@@ -0,0 +1,147 @@
|
|
|
+# 2.完成点灯-GPIO控制
|
|
|
+
|
|
|
+你好,我是爱吃鱼香ROS的小鱼。上一节了解了MicroROS学习板的LED电路原理,最后得到结论是通过控制ESP_IO2的电平就可以控制电压,接下来我们就尝试利用Arduino的ESP_IO2对IO进行控制。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 一、GPIO控制介绍
|
|
|
+
|
|
|
+### 1.1 什么是GPIO
|
|
|
+
|
|
|
+首先我们了解下GPIO(General-purpose input/output),中文名通用型之输入输出的简称。
|
|
|
+
|
|
|
+- 输出模式,指GPIO是可以通过程序**控制其电压高低**,普通的GPIO只能输出(低电平0V)和高电平(3.3V,有的单片机是5V)。
|
|
|
+- 输入模式,指GPIO可以**读取其上的电压**,普通的GPIO只能读取低电平和高电平两种。比如当我们想测试一个按键是否被按下,就可以GPIO的输入功能。
|
|
|
+
|
|
|
+### 1.2 GPIO控制API
|
|
|
+
|
|
|
+Arduino提供了简单易用的API来控制IO的输入和输出。
|
|
|
+
|
|
|
+#### 1.2.1 引脚模式设置-`pinMode`
|
|
|
+
|
|
|
+该函数用于定义特定引脚的 GPIO 操作模式。
|
|
|
+
|
|
|
+```c++
|
|
|
+void pinMode(uint8_t pin, uint8_t mode);
|
|
|
+```
|
|
|
+
|
|
|
+- `pin`定义 GPIO 引脚编号。
|
|
|
+- `mode`设置操作模式。
|
|
|
+
|
|
|
+基本输入和输出支持以下模式:
|
|
|
+
|
|
|
+- **INPUT**将 GPIO 设置为不带上拉或下拉(高阻抗)的输入。
|
|
|
+- **OUTPUT**将 GPIO 设置为输出/读取模式。
|
|
|
+- **INPUT_PULLDOWN** 将 GPIO 设置为具有内部下拉列表的输入。
|
|
|
+- **INPUT_PULLUP** 将 GPIO 设置为带有内部上拉的输入。
|
|
|
+
|
|
|
+#### 1.2.2 数字输出-`digitalWrite`
|
|
|
+
|
|
|
+`digitalWrite`用于设置被配置为`OUTPUT`模式的引脚电平为`HIGH` 或 `LOW`。
|
|
|
+
|
|
|
+```c++
|
|
|
+void digitalWrite(uint8_t pin, uint8_t val);
|
|
|
+```
|
|
|
+
|
|
|
+- `pin`所设置的GPIO编号。
|
|
|
+- `val`将输出数字状态设置为`HIGH` 或`LOW` 。
|
|
|
+
|
|
|
+#### 1.2.3 数字输入-`digitalRead`
|
|
|
+
|
|
|
+`digitalRead`用于读取配置为`INPUT`模式的给定引脚的状态。
|
|
|
+
|
|
|
+```c++
|
|
|
+int digitalRead(uint8_t pin);
|
|
|
+```
|
|
|
+
|
|
|
+- `pin` 所设置的GPIO编号。
|
|
|
+
|
|
|
+此函数将返回所选引脚的逻辑状态为 `HIGH`或`LOW。`
|
|
|
+
|
|
|
+有了上面三个函数,我们就可以编写代码了。
|
|
|
+
|
|
|
+## 二、编写LED闪烁代码
|
|
|
+
|
|
|
+新建`example02_led`工程,接着输入下面的代码。
|
|
|
+
|
|
|
+```c++
|
|
|
+/**
|
|
|
+ * @file main.cpp
|
|
|
+ * @author fishros@foxmail.com
|
|
|
+ * @brief 使LED灯亮1s关闭1s,持续闪烁
|
|
|
+ * @version 0.1
|
|
|
+ * @date 2022-12-19
|
|
|
+ *
|
|
|
+ * @copyright Copyright (c) 2022
|
|
|
+ *
|
|
|
+ */
|
|
|
+#include <Arduino.h>
|
|
|
+
|
|
|
+void setup()
|
|
|
+{
|
|
|
+ // put your setup code here, to run once:
|
|
|
+ pinMode(2, OUTPUT); // 设置2号引脚模式为OUTPUT模式
|
|
|
+}
|
|
|
+
|
|
|
+void loop()
|
|
|
+{
|
|
|
+ // put your main code here, to run repeatedly:
|
|
|
+ digitalWrite(2, LOW); // 低电平,打开LED灯
|
|
|
+ delay(1000); // 休眠1000ms
|
|
|
+ digitalWrite(2, HIGH); // 高电平,关闭LED灯
|
|
|
+ delay(1000); // 休眠1000ms
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+这里我们让LED亮1s关闭1s,持续闪烁,代码很简单,不再讲解。
|
|
|
+
|
|
|
+编译下载代码到开发板,接着观察现象,你会发现蓝色LED灯在不断闪烁。
|
|
|
+
|
|
|
+## 三、通过串口控制LED
|
|
|
+
|
|
|
+我们继续更新下工程代码,实现通过串口指令来控制LED的亮灭。
|
|
|
+
|
|
|
+```c++
|
|
|
+#include <Arduino.h>
|
|
|
+
|
|
|
+void setup()
|
|
|
+{
|
|
|
+ Serial.begin(115200);
|
|
|
+ pinMode(2, OUTPUT); // 设置2号引脚模式为OUTPUT模式
|
|
|
+}
|
|
|
+
|
|
|
+void loop()
|
|
|
+{
|
|
|
+ // LED串口控制代码
|
|
|
+ if (Serial.available())
|
|
|
+ {
|
|
|
+ String command = Serial.readString();
|
|
|
+ if (command == "on")
|
|
|
+ {
|
|
|
+ digitalWrite(2, LOW); // 低电平,打开LED灯
|
|
|
+ }
|
|
|
+ else if (command == "off")
|
|
|
+ {
|
|
|
+
|
|
|
+ digitalWrite(2, HIGH); // 高电平,关闭LED灯
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* // LED闪烁代码
|
|
|
+ digitalWrite(2, LOW); // 低电平,打开LED灯
|
|
|
+ delay(1000); // 休眠1000ms
|
|
|
+ digitalWrite(2, HIGH); // 高电平,关闭LED灯
|
|
|
+ delay(1000); // 休眠1000ms
|
|
|
+ */
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+通过串口读取指令,收到on则打开LED,收到off关闭LED。
|
|
|
+
|
|
|
+将代码下载到开发板,接着打开串口监视器,输入指令进行测试。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 四、总结
|
|
|
+
|
|
|
+至此,我们成功完成了点灯,掌握了基本的GPIO输出控制,下一节我们尝试使用按键输入来控制LED灯。
|