一、K210 Maix Bit芯片介绍
1、K210 Maix Bit实物图
2、K210 Maix Bit的板载功能
(1)强大的处理器:
① 双核 64 位 RISC-V 处理器
② 内置多种硬件加速单元
(2)存储功能:
① 片上 SRAM
② 板载 Flash
(3)显示相关功能:
① LCD 连接器
② 显示控制引脚
(4)摄像头连接功能:
① DVP 摄像头连接器
(5)通信接口:
① USB 转串口功能
② GPIO 引脚
(6)其他功能:
① 一键下载电路
② RGB 灯
③ 麦克风
④ 复位按钮
3、K210 Maix Bit的引脚资源
(1)总体数量和类型4:
具有8个通用GPIO(General Purpose Input/Output)和32个高速GPIOHS(High-Speed GPIO)。无论是通用GPIO还是高速GPIO,每个IO都可以分配到FPioa(现场可编程IO阵列)上的48个管脚之一。
(2)已被默认使用的引脚4:
① gpiohs31:连接 LCD 的直流(DC)信号。
② gpiohs30:连接 LCD 的复位(RST)信号。
③ gpiohs29:用于 SD 卡的 SPI 片选信号。
④ gpiohs28:连接麦克风的 LED 时钟信号。
⑤ gpiohs27:连接麦克风的 LED 数据信号。
(3)其他具有特定功能的引脚组2:
① 0-3号引脚:为 JTAG(Joint Test Action Group)引脚,常用于芯片的调试和测试。
② 4、5号引脚:为默认串口引脚,可用于与其他设备进行串口通信。
③ 12-14号引脚:连接RGB灯,可通过编程控制灯光的显示。
④ 16号引脚:为BOOT键引脚,连接了10kΩ的上拉电阻。
⑤ 18-20号引脚:连接麦克风,用于音频的采集。
⑥ 26-28号引脚:通过SPI协议实现对TF卡的读写功能。
(4)引脚的电气特性:
① IO引脚的电压一般为3.3V。
② RESET引脚的电压为1.8V。
4、K210 Maix Bit的原理图
二、K210 Maix Bit芯片的测试流程
1、基本功能测试
(1)电源测试:将开发板连接到电源,检查开发板是否能够正常通电,电源指示灯是否亮起。测量芯片的供电电压是否在正常范围内。
(2)串口通信测试:通过串口连接开发板和电脑,使用串口调试工具发送和接收数据,检查串口通信是否正常。
(3)GPIO 测试:使用代码或相关工具测试芯片的 GPIO引脚功能。
2、特定功能模块测试
(1)初始化摄像头:使用sensor.reset()函数初始化摄像头,设置合适的频率和像素格式。
(2)图像采集测试:编写程序控制摄像头进行图像采集,检查是否能够正确获取图像数据。可以使用sensor.snapshot()函数拍摄一张照片,并将图像数据保存到内存或存储设备中,然后查看保存的图像是否完整、清晰。
(3)图像识别测试:如果要测试芯片的图像识别功能,加载预先训练好的图像识别模型,使用摄像头采集的图像作为输入,运行图像识别程序,检查芯片是否能够正确识别图像中的目标物体或特征。
三、实验步骤
1、准备材料
K210 Maix Bit开发板、Maixpy软件
2、代码编写
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
def lcd_show_except(e):
import uio
err_str = uio.StringIO()
sys.print_exception(e, err_str)
err_str = err_str.getvalue()
img = image.Image(size=(224,224))
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)
def main(model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
try:
sensor.reset()
except Exception as e:
raise Exception("sensor reset fail, please check hardware connection, or hardware damaged! err: {}".format(e))
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(sensor_hmirror)
sensor.set_vflip(sensor_vflip)
sensor.run(1)
lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)
anchors = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
try:
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
img.draw_rectangle(obj.rect())
img.draw_string(0, 200, "t:%dms" %(t), scale=2)
lcd.display(img)
except Exception as e:
raise e
finally:
if not task is None:
kpu.deinit(task)
if __name__ == "__main__":
try:
main( model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False)
# main(model_addr="/sd/m.kmodel")
except Exception as e:
sys.print_exception(e)
lcd_show_except(e)
finally:
gc.collect()
3、实现效果