2

首先来看一下硬件:
ESP32

由图可见,就是这么个小东西,和我的手指对比一下也没多大,想看高清大图可以网上找,我手机摄像头坏了。

硬件控制最基本的就是 GPIO 控制,所以首先得找到 GPIO 引脚图,这个步骤是准没错的,以下就是 GPIO 引脚图:
ESP32 GPIO 引脚图

另附官方文档源地址:ESP32-DevKitC V4 入门指南

备注,文档中我都是以我自己的开发板为基准的,我的板子是 ESP32-DevKitC V4,有不一样的需要自行找到自己的开发板文档。

首先得思考一个问题,就是,点亮 LED 的原理,灯要亮,那么肯定得有电流通过,如果从没有接触过开发板的,虽然也写了几年程序,一开始肯定是云里雾里的,实际上我一开始也是云里雾里的。

我们搞程序开发的都知道,计算机的底层都是以 0 1作为计算的,也就是高低电平,高电平就是1,低电平(没有电压电流)就是0。深入说的话这就是一门大学问了,这就涉及到数字电路设计以及逻辑门等相关的知识了,抛开这个不谈。对于这块 ESP32 开发板来说,高电平是3.3V,低电平就是0V。另外,这块开发板引脚图可见,有两个VCC输出,一个5V0一个3V3,那么,我懒得接电阻分压的情况下,不烧毁这块开发板,我就直接把LED正极接到3V3的引脚上,然后从图上找一个可以控制输出的 GPIO,用于程序控制。

接下来,找了个GPIO12LED的负极接入,然后再examples下新建led.rs,并粘贴以下代码;

#![no_std]
#![no_main]

use esp_backtrace as _;
use esp32_hal::{
    peripherals::Peripherals,
    prelude::*,
    IO,
};

#[entry]
fn main() -> ! {
    // 获取外围设备
    let peripherals = Peripherals::take();
    // 以 GPIO 多路复用创建 IO(输入输出)
    let io = IO::new(peripherals.GPIO, peripherals.IO_MUX);
    // 将 gpio12 将引脚配置为用作输出引脚
    let mut led = io.pins.gpio12.into_push_pull_output();
    loop {
        // 将此引脚电平设为低电平
        led.set_low().unwrap();
    }
}

然后配置 Cargo.toml,贴入以下配置:

[[example]]
name              = "led"

执行程序:

cargo run --example=led

然后就能看到灯亮了,我先拍个照,贴一下照片:
灯亮了
从我拍的照片可以看到这个要黄不绿的灯亮了。

那么以上代码咋来的,很简单,首先是官方文档,附上链接如下:esp-template 简介

这个文档讲解了一整套程序的文件结构,以及对文件结构中每个文件都进行了说明,最主要的是讲解了 main.rs 这个我们要写的 ESP32 程序需要由哪几部分构成,那么,我们首先照葫芦画瓢就行,理解这个程序结构很重要,不然依葫芦画瓢都画不像,复制粘贴都不知道怎么贴。

瓢画好了,然后就是找到 GPIO 操作部分的文档复制粘贴代码就差不多了,然后找到官方点灯程序,这个程序里注释写得挺好:点灯程序示例

主要看我这照葫芦画瓢得led.set_low().unwrap();,我这个地方这个引脚输出低电平,也就是说,我上文说过的这个引脚接LED的负极。那么,这个接负极,然后程序控制了这个引脚输出低电平,电流自然就是从正极的3V3高电平向低电平流动。这里容易混淆的是,我们一开始已经把LED的正极接入了 3V3 的正极,负极接入了这个 GPIO12 引脚,容易觉得这个时候灯是会亮的,实际上,这个时候这个引脚是断路的,也就是程序没有控制这个引脚输出,默认是断路的。

相当于来说,一个引脚存在三种状态:

  • 低电平

    • 这种情况下,如果用一根导线和VCC(正极)接起来,电流会向这个低电平方向流动
    • 如果接GND(接地),同样接低电平,不产生电流
  • 高电平

    • 这种情况下用一根导线和 GND连在一起,那么此处电流就会往GND方向流动
    • 如果接VCC,电平一致,不会产生电流流动
  • 断路

    • 这种情况就是默认的,不管接啥,电路不导通

所以,把这个梳理清楚之后,我换一种接线方式,把原本接 VCC 的接线端,换成接到现在的GPIO12,然后把原本接 GPIO12 的线换一下接到 GND 上。

然后把原本程序中的 led.set_low().unwrap(); 改成 led.set_high().unwrap();,然后看以下结果,灯照样是亮的:
反接改程序逻辑,灯继续亮

整体看来,不管是搞硬件程序还是说写服务端程序或者说写前端程序,实际上开发过程中不需要接触硬件最底层的的程序逻辑,在已封装好的框架上层,只要理顺逻辑,然后按照理顺好了的逻辑把自己需要的代码从官方文档,或者是从官方开源的库也好,复制粘贴过来就行,暂时看起来还算挺简单,对于接下来的方向就是先把遥控板系统做起来。


kumfo
6.7k 声望4.1k 粉丝

程序生存法则: