目录
前言
先简单介绍一下K210模块及其特点:
1. K210是基于RISC-V精简指令集的一款MCU,在众多特色中,芯片架构包含了一个自研的神经网络硬件加速器KPU属于最大特色,可以高性能地进行卷积神经网络运算。在MCU的AI计算方面,K210芯片的算力非常给力~!
2. K210芯片内部拥有双核CPU,指令集为RISC-V 64位,每个核心内置独立FPU,可以单独进行浮点运算。
3. K210芯片自带计算卷积人工神经网络加速器KPU,以及处理麦克风阵列的APU,能够进行高性能机器视觉和听觉处理。
架构图如下:
一、模块实物简介
1. 按键K1:硬件连接到IO16,可自定义按键功能。
2. RGB灯:可编程显示红、绿、蓝、白等颜色。
3. TF卡槽:用于插入TF卡,金手指朝向模块,保存程序和模型等文件。
4. 固定铜柱:总共四个固定铜柱,M3尺寸。
5. K210核心模组:包含K210芯片最小运行系统。
6. 摄像头:采集图像。
7. 模组接口:连接K210核心模组和底板。
8. RST按键:复位按键,用于重启K210芯片。
9. 外扩串口:连接其他串口设备,输出自定义数据。
10. microUSB接口:下载固件、串口调试、连接IDE等。
11. CH340芯片:与microUSB接口连接,将USB信号转化成TTL信号 。
二、基础实验例程
使用CanMV IDE开发软件,MicroPython编程语言。
1.点亮RGB灯实验
设置RGB颜色,其中参数r控制红灯开关,参数g控制绿灯开关,参数b控制蓝灯开关,输入0表示关 闭,输入1表示开启。
RGB.set(r, g, b)
代码如下:
from modules import ybrgb
import time
#创建ybrgb对象,并命名为RGB
RGB = ybrgb()
#新建一个while循环,让RGB灯每隔0.5秒切换一个颜色。
while True:
RGB.set(1, 0, 0)
time.sleep(.5)
RGB.set(0, 1, 0)
time.sleep(.5)
RGB.set(0, 0, 1)
time.sleep(.5)
RGB.set(1, 1, 1)
time.sleep(.5)
RGB.set(0, 0, 0)
time.sleep(.5)
可以看到RGB灯每隔0.5秒切换一种颜色,按照红色、绿色、蓝色、白色和熄灭的步骤进行。
2.按键功能实验
读取按键K1是否被按下,返回0表示释放状态,返回1表示按下状态。
state = KEY.is_press()
代码如下:
from modules import ybkey
import time
KEY = ybkey()
#每100毫秒读取一次按键状态,并打印调试信息。
while True:
state = KEY.is_press()
print("key press:",state)
time.sleep_ms(100)
3. 定时器实验
创建Timer对象,并命名为timer。
timer = machine.Timer(id, channel, mode=Timer.MODE_ONE_SHOT, period=1000,
unit=Timer.UNIT_MS, callback=None, arg=None, start=True, priority=1, div=0)
参数内容为:
id:Timer ID,[0~2] (Timer.TIMER0~TIMER2)
channel:Timer 通道,[Timer.CHANNEL0~Timer.CHANNEL3]
mode:Timer 模式,MODE_ONE_SHOT 或者 MODE_PERIODIC 或者 MODE_PWM
period:Timer 周期,在启动定时器后period时间,回调函数将会被调用,(0,~)
unit:设置周期的单位,默认为毫秒(ms),Timer.UNIT_S 或者 Timer.UNIT_MS 或者 Timer.UNIT_US 或者 Timer.UNIT_NS
callback:定时器回调函数,定义了两个参数,一个是定时器对象Timer,第二个是在定义对象时希望传的参数arg,更多请看arg参数解释
注意:回调函数是在中断中调用的,所以在回调函数中请不要占用太长时间以及做动态分配开关中断等动作。
arg : 希望传给回调函数的参数,作为回调函数的第二个参数
start : 是否在对象构建成功后立即开始定时器,True :立即开始; False :不立即开启,需要调 start() 函数来启动定时器
priority : 硬件定时器中断优先级, 与特定的CPU相关, 在K210中,取值范围是[1,7], 值越小优先级越高
div : 硬件定时器分频器,取值范围[0,255], 默认为0, clk_timer(定时器时钟频率) = clk_pll0 (锁相环0频率)/2^(div+1)
注意:回调函数是在中断中调用的,打印调试信息会占用较长CPU时间,这里只是作为演示,实际开 发过程中请勿在中断打印调试信息。
代码如下:
from machine import Timer
import time
def on_timer(timer):
print("This is on_timer callback")
timer = Timer(Timer.TIMER0, Timer.CHANNEL0,
mode=Timer.MODE_PERIODIC, period=100,
unit=Timer.UNIT_MS, callback=on_timer, arg=None)
#新建一个last_time变量,用来储存当前系统的时间戳,单位是毫秒。
last_time = time.ticks_ms()
#新建一个while循环,让系统每隔200毫秒打印一次调试信息。并在程序结束或者退出时将定时器关
#闭掉。
try:
while True:
if time.ticks_ms() - last_time >= 200:
last_time = time.ticks_ms()
print("This is main loop")
except:
timer.deinit()
del timer
点开底部的串行终端,就可以看到打印出来的调试信息。由于定时器是每100毫秒打印一次数据,而 while循环是每200秒打印一次数据,所以最终看起来的效果是每打印一次loop信息,就会打印两次定时器信息。 最后在结束程序时需要调用deinit函数让定时器恢复默认,否则定时器回调函数不会自动停止。
4.PWM呼吸灯实验
由于PWM信号需要来源自定时器,所以新建一个定时器对象,设置参数为定时器0,通道0,PWM 模式。
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
通过指定的参数新建一个 PWM 对象。
pwm = machine.PWM(tim, freq, duty, pin, enable=True)
tim : 每个PWM依赖一个定时器来产生波形, 所以这里需要传一个定时器对象,这个定时器对象必须初始化时指定定时器 ID 和通道号
freq :PWM 波形频率
duty :PWM 占空比, 指高电平占整个周期的百分比,取值:[0,100]
pin :PWM 输出引脚。 实际物理引脚IO编号。
enable :是否立即开始产生波形,默认位 True ,及对象生成后立即开始在指定的引脚上产生 PWM 波形
代码如下:
from machine import Timer, PWM
import time
#如果需要修改RGB灯的颜色,请修改LED_PIN的值,其中对应的颜色IO引脚为红色RED=27, 绿色
#GREEN=26, 蓝色BLUE=29。
LED_PIN = 26
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
pwm = PWM(tim, freq=500000, duty=50, pin=LED_PIN)
duty=0
add = True
#新建一个while循环,修改占空比duty的值,使其循环变化从0加到100,再从100减为0,然后每次
#将变化后的duty输出为PWM占空比。
while True:
if add:
duty += 5
else:
duty -= 5
if duty > 100:
duty = 100
add = False
elif duty < 0:
duty = 0
add = True
time.sleep(0.05)
pwm.duty(duty)
PWM输出依赖于定时器,目前K210总共有3个定时器,每个 定时器有4个通道,所以最多可以输出12个PWM信号。PWM占空比为输出高电平时间与周期的比值 。
5.LCD显示实验
初始化lcd显示屏。
lcd.init()
把屏幕设置为蓝色背景,在屏幕左上角显示“Hello World”。
lcd.clear(lcd.BLUE)
lcd.rotation(0)
lcd.draw_string(30, 30, "Hello World", lcd.WHITE, lcd.BLUE)
time.sleep(1)
其中, lcd.clear(color) 的参数color为设置颜色,可选BLACK(黑色)、NAVY(藏青色)、 DARKGREEN(墨绿色)、DARKCYAN(深青色)、MAROON(褐红色)、PURPLE(紫色)、 OLIVE(橄榄色)、LIGHTGREY(浅灰色)、DARKGREY(深灰色)、BLUE(蓝色)、GREEN(绿 色)、CYAN(青色)、RED(红色)、MAGENTA(品红色)、YELLOW(黄色)、WHITE(白色)、 ORANGE(橘黄色)、GREENYELLOW(黄绿色)、PINK(粉红色)。
lcd.rotation(dir) 的参数dir为设置旋转方向,dir=0为正面显示,dir=1表示屏幕顺时针旋转90度, dir=2表示屏幕顺时针旋转180度,dir=3表示屏幕顺时针旋转270度。
lcd.draw_string(x, y, "contents", color_text, color_background)的参数x,y表示文字的开始坐标,“contents”表示显示的字符串,color_text表示字符串的显示颜色,color_background表示字符串背景颜色。
time.sleep(1) 表示延迟1秒,保证有足够时间显示内容。
代码如下:
import lcd
import time
lcd.init()
#屏幕背景为蓝色
lcd.clear(lcd.BLUE)
#正面显示
lcd.rotation(0)
lcd.draw_string(30, 30, "Hello World", lcd.WHITE, lcd.BLUE)
time.sleep(1)
持续更新,欢迎关注~