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