Kaynağa Gözat

feat(chapt13): 完成点灯GPIO控制篇

鱼香ROS 2 yıl önce
ebeveyn
işleme
2da0d5dbcf

+ 147 - 0
docs/humble/chapt13/basic/2.完成点灯-GPIO控制.md

@@ -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。
+
+将代码下载到开发板,接着打开串口监视器,输入指令进行测试。
+
+![image-20221219032300866](2.%E5%AE%8C%E6%88%90%E7%82%B9%E7%81%AF-GPIO%E6%8E%A7%E5%88%B6/imgs/image-20221219032300866.png)
+
+## 四、总结
+
+至此,我们成功完成了点灯,掌握了基本的GPIO输出控制,下一节我们尝试使用按键输入来控制LED灯。

BIN
docs/humble/chapt13/basic/2.完成点灯-GPIO控制/imgs/image-20221219032300866.png