跳转至

Learn GPIO

GPIO是通用目的的输入输出引脚,可以配置很多功能,因为每个GPIO引脚都有许多寄存器,例如4个控制寄存器,2个数据寄存器,1个复位寄存器,1个时钟寄存器,2个复用功能寄存器。
树莓派,ESP32, arduino(Atmel328p)都有GPIO引脚。

GPIO 的几种模式

  • 输出: 点亮灯泡。又分为推挽(PUSH_PULL) 这是默认的输出模式(高/低电平); 开漏(OPEN_DRAIN)用得少,这是只能将引脚设置成低电平,要靠外部电路实现高电平,应用在例如i2c总线。
  • 输入: 按钮控制。又分为内部上拉 PULL_UP 引脚默认高电平; 内部下拉 PULL_DOWN 引脚默认低电平。

GPIO 输出数字信号和PWM

无论是PUSH_PULL还是OPEN_DRAIN,GPIO引脚只有高电平和低电平两种状态,这也叫数字信号,例如下面的发送摩斯码。 PWM信号实际是高低电平的串行信号组(例如__------),ESP32的所有GPIO支持输出PWM信号,但推荐使用 GPIO 4, 5, 12–14, 18–19, 21–23, 25–27, 32–33。 PWD信号用来驱动步进电机。

GPIO 输出模拟信号

模拟信号(analog)可以驱动喇叭播放声音,ESP32中只有GPIO 25-26 支持输出模拟信号。

from machine import DAC, Pin

dac = DAC(Pin(25))     # Use GPIO25
dac.write(128)         # Output ~1.65V (128/255 × 3.3V)

GPIO 按钮实现发送摩斯码

from machine import Pin
import time

button = Pin(15, Pin.IN, Pin.PULL_UP)
morse = ""
press_start = 0
last_event_time = time.ticks_ms()

MORSE_TABLE = {
    ".-":"A","-...":"B","-.-.":"C","-..":"D",".":"E",
    "..-.":"F","--.":"G","....":"H","..":"I",".---":"J",
    "-.-":"K",".-..":"L","--":"M","-.":"N","---":"O",
    ".--.":"P","--.-":"Q",".-.":"R","...":"S","-":"T",
    "..-":"U","...-":"V",".--":"W","-..-":"X","-.--":"Y",
    "--..":"Z", "": " "
}

def decode(morse_code):
    return MORSE_TABLE.get(morse_code, "?")

while True:
    now = time.ticks_ms()

    if button.value() == 0:  # Press detected
        press_start = now
        while button.value() == 0:
            time.sleep(0.01)
        press_duration = time.ticks_diff(time.ticks_ms(), press_start)
        symbol = "." if press_duration < 300 else "-"
        morse += symbol
        last_event_time = time.ticks_ms()
        print("Symbol:", symbol)

    # Check for end of character
    if morse and time.ticks_diff(now, last_event_time) > 1000:
        char = decode(morse)
        print("Char:", char)
        morse = ""

    time.sleep(0.01)

引用

https://blog.51cto.com/u_4029519/13530340 https://blog.csdn.net/makeryzx/article/details/78915955

评论