MaixCAM MaixPy 使用 GPIO

简介

使用 GPIO 可以控制引脚输入或者输出高低电平,用来读取信号或者输出控制信号,十分常用。

注意 MaixCAM 的引脚是 3.3V 耐受,请勿输入 5V 电压。

前置知识

请先学会使用pinmap 模块设置引脚功能。

要让一个引脚能使用 GPIO 功能,先用pinmap设置对应引脚功能为GPIO

选择合适的 GPIO 使用

首先我们需要知道设备有哪些引脚和 GPIO,如图:

设备型号 引脚简图 引脚复用说明
MaixCAM 板子丝印比如A19是引脚名,GPIOA19/PWM7是功能名
MaixCAM-Pro maixcam_pro_io 第一个名如A19是引脚名,对应GPIOA19/PWM7是功能名
MaixCAM2 maixcam2_io 第一个名如IO0_A2是引脚名,对应GPIO0_A2/SPI1_CS0是功能名

需要注意的是,引脚默认可能用做其它用途,最好避开这些引脚,请看pinmap 文档中的说明。

电路注意点

注意引脚的电压耐受能力和负载能力有限,设计电路时需要注意,避免比如经常有新手问为什么引脚不能直接让电机转动等基础问题。

  • 引脚电压耐压:除非有特殊说明,引脚都是3.3v电平,请勿外接5v电压。
  • 引脚输入输出电流:芯片引脚的输入输出电流有限,一般只拿来作为控制信号,对于大电流需求的器件请使用转换电路。

举例:控制 LED 灯,简单的电路如下:

LED 直接由引脚输出高电平供电,这是最直观的使用方式,但是要十分小心,芯片引脚的输出和输入电流有上限,也就是驱动能力(一般在芯片手册中会描述),
这里电流为3.3v/(LED+电阻 阻值) < 0.64mA, 所以能直接这样驱动,如果你的电路电流太大,就会驱动失败甚至导致芯片无法正常工作。

正确的做法是外接一个转换电路,让引脚只作为控制开关的信号,比如利用三极管/光耦/继电器转换等,这里不详细阐述,请自行扩展学习。

GPIO 输出模式

LED 的电路图如图所示,所以我们只需要给 A14(MaixCAM2IO0_A6) 引脚一个高电平 LED 就会导通并亮起来:

from maix import gpio, pinmap, time, sys, err

pin_name = "IO0_A6" if sys.device_id() == "maixcam2" else "A14"
gpio_name = "GPIO0_A6" if sys.device_id() == "maixcam2" else "GPIOA14"

err.check_raise(pinmap.set_pin_function(pin_name, gpio_name), "set pin failed")
led = gpio.GPIO(gpio_name, gpio.Mode.OUT)
led.value(0)

while 1:
    led.toggle()
    time.sleep_ms(500)
  • 首先根据板子型号获得引脚和功能名。
  • 使用pinmap设置了引脚的功能为GPIO
  • err.check_raise 用来检测set_pin_function的返回值,如果出错直接报错,防止我们手误写错了值。
  • 初始化 GPIO 对象,设置为输出模式。
  • 每隔0.5s翻转一次输出值,效果就是LED会交替闪烁。

更多 API 请看 GPIO API 文档

GPIO 作为输入模式

from maix import gpio, pinmap, time, err

err.check_raise(pinmap.set_pin_function("A19", "GPIOA19"), "set pin failed")
led = gpio.GPIO("GPIOA19", gpio.Mode.IN)

while 1:
    print(led.value())
    time.sleep_ms(1) # sleep to make cpu free

MaixCAM-Pro 使用照明 LED

MaixCAM / MaixCAM-ProMaixCAM2 都有一个 LED 小灯,即接到了引脚 A14IO0_A6
另外 MaixCAM-ProMaixCAM2 还板载了一个照明 LED,分别连接到了 B3IO0_A25 引脚,也是高电平开启低电平关闭:

from maix import gpio, pinmap, time, sys, err

pin_name = "IO1_A25" if sys.device_id() == "maixcam2" else "B3"
gpio_name = "GPIO1_A25" if sys.device_id() == "maixcam2" else "GPIOB3"

err.check_raise(pinmap.set_pin_function(pin_name, gpio_name), "set pin failed")
led = gpio.GPIO(gpio_name, gpio.Mode.OUT)
led.value(0)

while 1:
    led.toggle()
    time.sleep_ms(500)

更多例程

MaixPy examples

API 文档

更多 API 看 GPIO API 文档