|
嘉楠K230 AI开发板测评2--GPIO、LED、按键、定时器
[复制链接]
- GPIO介绍
K230开发板总共引出了46个引脚,有常见的通用GPIO口、4路PWM、2路串口、1路SPI、I2C、I2S和4路的ADC,提供5V和3.3V的电源输出引脚对外供电,用常见的type-c引脚对开发板供电,方便简洁,GPIO引脚图如图1所示。
图 1 K230 GPIO引脚图
- 点亮第一个LED
CanMV K230有一个与GPIO直接连接的可控制LED蓝灯,其连接到GPIO52,其原理图如图2所示,从电路图可以看出,当GPIO口为高电平时,蓝灯被点亮。
图 2 LED灯原理图
由于K230功能多,在引脚有限的情况下,会复用引脚功能,通过FPIO库(也叫现场可编程IO阵列,库介绍网址2.8 FPIOA 模块API手册 — K230 CanMV (canaan-creative.com))实现对引脚的不同功能的选择。
代码编写流程如下:
首先引入FPIO模块,对GPIO52引脚的功能设置为IO口功能。引入Pin对象设置IO口,通过Pin(id, mode, pull) 设置IO口的引脚,模式与电阻配置,value([X])设置输出电平。
完整代码如下:
'''
实验名称:点亮LED蓝灯
版本:v1.0
作者:01Studio
实验平台:01Studio CanMV K230
教程:wiki.01studio.cc
'''
from machine import Pin #导入Pin模块
from machine import FPIOA
import time
#将GPIO52配置为普通GPIO
fpioa = FPIOA()
fpioa.set_function(52,FPIOA.GPIO52)
LED=Pin(52,Pin.OUT) #构建led对象,GPIO52,输出
LED.value(1) #点亮LED,也可以使用led.on() |
实验结果如图3所示:
图 3 点亮led灯
- 按键
按键是最常见的输入设备,通过检测按键被按下之后,改变LED灯的亮灭状态。按键对应的IO口引脚原理图如下图4所示,按键的一段接到GPIO21,另一端接到GND,所以按键在没按下的时候输入高电平1,按下的时候输入低电平0。
图 4 按键原理图
按键按下时的电平变化如下图5所示,会发生抖动,有可能会造成误判,因此需要延时函数来进行消抖。常见的方法就是当检测到按键值为0时,延时一段时间,大约10ms,再次判断按键引脚至仍然是0,是的话说明按键被按下,延时使用time模块(time – time related functions — MicroPython latest documentation)。
图 5 按键一次出现的电平变化
首先将IO21配置为GPIO功能(使用FPIO模块),需要将按键的GPIO21引脚配置为输入模式(使用pin模块),当K230检测到按键被按下时led灯点亮,松开时led灯熄灭,代码编写流程图如图6所示。
图 6 按键代码流程图
完整代码如下所示:
'''
实验名称:按键
版本:v1.0
作者:01Studio
实验平台:01Studio CanMV K230
说明:通过按键改变LED的亮灭状态
'''
from machine import Pin
from machine import FPIOA
import time
#将GPIO52、GPIO21配置为普通GPIO模式
fpioa = FPIOA()
fpioa.set_function(52,FPIOA.GPIO52)
fpioa.set_function(21,FPIOA.GPIO21)
LED=Pin(52,Pin.OUT) #构建LED对象,开始熄灭
KEY=Pin(21,Pin.IN,Pin.PULL_UP) #构建KEY对象
state=0 #LED引脚状态
while True:
if KEY.value()==0: #按键被按下
time.sleep_ms(10) #消除抖动
if KEY.value()==0: #确认按键被按下
state=not state #使用not语句而非~语句
LED.value(state) #LED状态翻转
print('KEY')
while not KEY.value(): #检测按键是否松开
pass |
实验结果如图7所示,当按键KEY每次被按下时,LED灯的亮灭状态发生反转。
图 7 按键控制LED灯结果图
- 定时器
定时器常常用来计时,通过定时器来周期性的执行各种任务。
引用machine的Timer模块(2.11 Timer 模块API手册 — K230 CanMV (canaan-creative.com))用定时器让LED灯周期性每秒闪烁一次。
首先构造函数tim = machine.Timer(id),接着初始化tim.init(mode, freq, period, callback)就可以轻松调用定时器模块。
代码编写流程如图8所示,定时器到达预定设计时间后,产生中断,跟外部中断的编程方式类似。
图 8 定时器调用代码流程图
完整代码如下:
'''
实验名称:定时器
版本:v1.0
作者:01Studio
实验平台:01Studio CanMV K230
说明:通过定时器让LED周期性每秒闪烁1次。
'''
from machine import Pin,Timer
import time
led=Pin(52,Pin.OUT)
Counter = 0
Fun_Num = 0
def fun(tim):
global Counter
Counter = Counter + 1
print(Counter)
led.value(Counter%2)
#使用软件定时器,编号-1
tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC,callback=fun) #周期为1000ms
while True:
time.sleep(0.01) #避免CPU满跑 |
实验结果:可以看到LED灯每隔一秒闪烁一次
|
|