作为刚接触 K210 的小白,我踩了不少坑,也整理了一套超实用的入门流程。这篇教程会从最基础的硬件验证开始,一步步教你搭环境、跑代码,遇到的报错也会帮你提前解决,跟着做就能上手!

一、先做硬件验证:确认 SD 卡能正常使用

刚拿到 K210 模块,第一步先确认 SD 卡能用,避免后续实验卡壳。操作特别简单:把 SD 卡插进模块的卡槽里,通电后如果模块能识别到 SD 卡(比如在后续代码中能读取 / 保存文件,或设备管理器里有对应提示),就说明 SD 卡没问题。如果识别不到,先排查这 3 点:

  1. SD 卡是否插紧了?拔下来重新插一次,确保卡完全卡进卡槽。
  2. SD 卡格式对不对?K210 只支持 FAT32 格式,用电脑右键格式化,选择 FAT32 再试。
  3. SD 卡本身是不是坏的?换一张已知能用的 SD 卡测试,排除卡的问题。

二、必备资源:K210 学习必看的官网 & 资料(直接戳链接)

新手不用到处找资料,我整理了最常用的官方资源,存好这些链接就够了:

三、开发环境搭建:5 分钟装好 CanMV(小白也能搞定)

K210 常用 CanMV 作为开发环境,操作很简单,跟着步骤来:

  1. 先下载 CanMV 软件:去勘智官网(前面给的链接)找到「CanMV IDE」,根据自己的系统(Windows/macOS)下载对应版本。
  2. 安装软件:Windows 双击安装包,一路点「下一步」;macOS 拖到应用程序文件夹即可,不用复杂设置。
  3. 连接硬件:用 USB 线把 K210 模块连到电脑,电脑会自动安装驱动(如果没装,去官网下载对应驱动)。
  4. 测试连接:打开 CanMV,点击左上角「连接」按钮(像插头一样的图标),如果提示「连接成功」,就说明环境搭好了;如果连不上,看下面报错解决。

常见报错解决

  • 报错「找不到设备」:先检查 USB 线是不是坏的(换一根能传数据的线,别用只能充电的),再看设备管理器里有没有「串口设备」,没有的话重新装驱动。
  • 报错「端口被占用」:关闭其他可能占用串口的软件(比如 Arduino、串口助手),再重新连接。

四、基础实验例程:每段代码都能直接跑,报错提前解决

下面每个实验都附完整代码,复制到 CanMV 里就能用,遇到过的报错也会标注解决方法,放心跟着做!

1.0 基础实验:打开摄像头,让画面显示在 LCD 上

这个实验是入门必备,先让摄像头跑起来,感受一下 K210 的视觉功能。

import sensor, image, time,lcd

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

clock = time.clock()

while(True):
    clock.tick()
    img = sensor.snapshot()
    print(clock.fps())
    lcd.display(img)

运行步骤

  1. 把代码复制到 CanMV 的编辑区,保存为「camera_init.py」。
  2. 点击「下载」按钮(箭头图标),把代码传到 K210 里。
  3. 通电后,LCD 屏会显示摄像头画面,串口监视器会打印帧率。

常见报错解决

  • 报错「No module named 'lcd'」:检查是不是没接 LCD 屏?或者 LCD 屏的接线错了,对照前面的引脚图重新接线。
  • 画面一直糊:把 sensor.skip_frames(time = 2000) 里的 2000 改成 5000(让摄像头多等几秒稳定),或者调整摄像头的焦距(有些模块的摄像头可以旋转调焦)。

特别提醒:K210 没有自带 USB 通讯模块,用的是 USB 转串口芯片,传摄像头画面时容易占资源,导致帧率低或串口断开。解决方法:在 CanMV 里关掉「摄像头预览」(右上角预览窗口关掉),或者把代码保存为「main.py」下载到芯片里(这样不用连电脑,通电就能跑)。

1.1 基础实验:点亮 RGB 灯,实现颜色循环

RGB 灯是入门常用的外设,这个实验教你控制灯的颜色,理解引脚控制逻辑。

from modules import ybrgb
import time

# 创建 RGB 控制对象
RGB = ybrgb()

# 循环切换颜色(红、绿、蓝、白、熄灭)
while True:
    RGB.set(1, 0, 0)  # 红色
    time.sleep(0.5)
    RGB.set(0, 1, 0)  # 绿色
    time.sleep(0.5)
    RGB.set(0, 0, 1)  # 蓝色
    time.sleep(0.5)
    RGB.set(1, 1, 1)  # 白色(全亮)
    time.sleep(0.5)
    RGB.set(0, 0, 0)  # 熄灭
    time.sleep(0.5)

运行步骤

  1. 先确认 RGB 灯模块接好了(对照引脚图,VCC 接 3.3V,GND 接 GND,控制引脚接对应口)。
  2. 复制代码到 CanMV,下载后通电,RGB 灯会按顺序变色。

常见报错解决

  • 报错「No module named 'modules'」:没导入自定义库!去前面给的「调用自定义 Python 库教程」,把 ybrgb 库传到 K210 的「modules」文件夹里。
  • 灯不亮:先检查接线是不是松了,再确认 RGB 灯的电压对不对(别接 5V,会烧灯),如果还是不亮,换个 RGB 灯模块试试。

1.2 基础实验:读取按键状态,实现按键检测

按键是常用的输入设备,这个实验教你读取按键的「按下 / 松开」状态,后面可以用来做控制(比如按一下拍照)。

from modules import ybkey
import time

# 创建按键检测对象
KEY = ybkey()

# 循环检测按键状态(每100ms)
while True:
    state = KEY.is_press()  # 读取按键状态(0=释放,1=按下)
    print("key press:", state)
    time.sleep_ms(100)

运行步骤

  1. 接好按键模块(VCC 接 3.3V,GND 接 GND,信号脚接对应引脚)。
  2. 复制代码下载到 K210,打开串口监视器,按按键时会看到打印「key press: 1」,松开是「0」。

常见报错解决

  • 不管按不按,都显示「1」:按键模块可能接反了,或者引脚接错了,重新对照引脚图接线。
  • 没反应:检查按键是不是坏的(用万用表测一下按下时有没有通),或者库没导入对(确认 ybkey 库在 modules 文件夹里)。

1.3 基础实验:用定时器实现定时触发

定时器可以让程序在指定时间自动执行任务(比如每隔 100ms 打印一句话),这个实验会教你正确配置定时器,避开常见的参数报错。

from machine import Timer
import time

# 定时器回调函数(中断中执行,避免耗时操作)
def on_timer(timer):
    print("This is on_timer callback")

## 配置定时器参数
# 报错提示少两个参数 
#timer = Timer(
    #id=Timer.TIMER0,                # 定时器ID [TIMER0~TIMER2]
    #channel=Timer.CHANNEL0,         # 通道 [CHANNEL0~CHANNEL3]
    #mode=Timer.MODE_PERIODIC,       # 模式:周期性(MODE_PERIODIC/MODE_ONE_SHOT/MODE_PWM)
    #period=100,                     # 周期100ms
    #unit=Timer.UNIT_MS,             # 时间单位:毫秒(可选NS/US/MS/S)
    #callback=on_timer,              # 回调函数
    #arg=None,                       # 传递给回调函数的参数
    #start=True,                     # 立即启动定时器
    #priority=1,                     # 中断优先级 [1~7],值越小优先级越高
    #div=0                           # 分频系数 [0~255]
#)
#下面的正确 能跑
timer = Timer(Timer.TIMER0, Timer.CHANNEL0,mode=Timer.MODE_PERIODIC, period=100,unit=Timer.UNIT_MS, callback=on_timer, arg=None)


# 主循环(每200ms打印一次)
last_time = time.ticks_ms()
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

运行步骤

  1. 不用接额外外设,直接复制代码下载到 K210。
  2. 打开串口监视器,会看到每隔 100ms 打印「This is on_timer callback」,每隔 200ms 打印「This is main loop」。

常见报错解决

  • 之前报错「少两个参数」:是因为定时器参数格式错了!原来的代码把参数写在括号里分行,容易漏参数,现在改成「参数名 = 值」的格式,不会错。
  • 定时器没反应:检查定时器 ID 和通道是不是对的(K210 支持 TIMER0~TIMER2,CHANNEL0~CHANNEL3),换个 ID 试试。

1.6 基础实验:读取触摸板坐标,实现触摸轨迹绘制

如果你的 K210 模块带触摸屏,这个实验教你读取触摸坐标,还能在屏上画触摸轨迹,很直观。

import touchscreen as ts
import lcd
import image
import time

# 初始化LCD和触摸板
lcd.init()
ts.init()

# 创建空白图像并添加提示文字
img = image.Image()
img.draw_string(100, 0, "Please touch the screen",
                color=(0, 0, 255),  # 蓝色文字
                scale=2,           # 字体放大
                mono_space=False)  # 非等宽字体

# 显示初始图像
lcd.display(img)

# 触摸状态跟踪变量
status_last = ts.STATUS_IDLE
x_last, y_last = 0, 0

def process_touch():
    global status_last, x_last, y_last

    while True:
        # 读取触摸状态和坐标
        status, x, y = ts.read()

        # 状态变化时打印信息
        if status_last != status:
            #print(f"状态: {status}, X: {x}, Y: {y}")
            print("状态: {}, X: {}, Y: {}".format(status, x, y))
            status_last = status

        # 绘制触摸轨迹
        if status == ts.STATUS_MOVE:
            img.draw_line(x_last, y_last, x, y,
                         color=(255, 255, 255),  # 白色轨迹
                         thickness=3)           # 线宽
        elif status == ts.STATUS_PRESS:
            img.draw_line(x, y, x, y,           # 单点绘制
                         color=(255, 0, 0),     # 红色起始点
                         thickness=5)

        # 更新显示和坐标记录
        lcd.display(img)
        x_last, y_last = x, y

        time.sleep(0.01)  # 降低CPU占用

if __name__ == "__main__":
    try:
        process_touch()
    except KeyboardInterrupt:
        print("触摸实验结束")

运行步骤

  1. 确认触摸屏接好(对照引脚图,别接错线),通电后下载代码。
  2. 用手指触摸屏幕,会看到红色的起点和白色的轨迹,串口监视器会打印触摸状态和坐标。

常见报错解决

  • 触摸没反应:先检查触摸屏接线是不是松了,再确认 ts.init() 有没有写(没初始化读不到触摸),如果还是没反应,换个触摸屏试试。
  • 轨迹画不出来:检查 img 是不是全局变量(没加 global 会画在局部图像上,显示不出来),或者 LCD 初始化错了(重新写 lcd.init())。

1.7 基础实验:摄像头显示 + 帧率打印(优化版)

这个实验在「打开摄像头」的基础上,增加了帧率显示(直接画在 LCD 屏上),还优化了稳定性,不容易断开。

import sensor
import lcd
import time

# 初始化LCD显示屏
lcd.init()

# 初始化摄像头
sensor.reset()                      # 重置摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA)   # 设置分辨率为QVGA(320x240)
sensor.run(1)                       # 启动摄像头
sensor.skip_frames(10)              # 跳过前10帧等待图像稳定

# 创建帧率计算时钟
clock = time.clock()

def camera_display():
    try:
        while True:
            clock.tick()                    # 开始计时
            img = sensor.snapshot()         # 捕获图像

            # 计算并显示帧率
            fps = clock.fps()
            #img.draw_string(0, 0, f"FPS: {fps:.1f}",
            img.draw_string(0, 0, "FPS: {:.1f}".format(fps),
                          color=(255, 0, 0),  # 红色文字
                          scale=2)           # 放大字体

            lcd.display(img)                # 显示图像
            #print(f"当前帧率: {fps:.1f}")    # 串口输出帧率
            print("当前帧率: {:.1f}".format(fps))    # 串口输出帧率

    except KeyboardInterrupt:
        print("摄像头显示终止")

if __name__ == "__main__":
    camera_display()

运行步骤

  1. 接好 LCD 屏和摄像头,下载代码后通电。
  2. LCD 屏左上角会显示当前帧率(比如 25.0 FPS),串口也会同步打印,能直观看到画面流畅度。

常见报错解决

  • 帧率很低(低于 10 FPS):关掉 CanMV 的摄像头预览(前面提过,占资源),或者把分辨率改成 sensor.QQVGA(160x120),帧率会变高。
  • 画面有雪花:摄像头没对焦好,旋转摄像头镜头调焦,直到画面清晰;或者环境光太暗,加个补光灯。

由于K210芯片自身没有带USB通讯模块,而是使用USB转串口芯片,在传输摄像头画面时占用一定资源,导致帧率下降,并且容易丢数据,造成串口断开,所以建议禁用IDE的摄像头预览功能,或者直接下载main.py程序文件到芯片内部使用。

1.8 基础实验:SD 卡读写文件,实现图像保存和读取

这个实验教你用 SD 卡保存摄像头拍的照片,还能读取 SD 卡里的照片显示在 LCD 上,是后续做项目(比如拍照存档)的基础。

import sensor
import lcd
import image
import time

# 初始化硬件
def hardware_init():
    lcd.init()                          # 初始化LCD
    sensor.reset()                      # 重置摄像头
    sensor.set_pixformat(sensor.RGB565) # 设置像素格式
    sensor.set_framesize(sensor.QVGA)   # 设置分辨率
    sensor.run(1)                       # 启动摄像头
    sensor.skip_frames(10)              # 跳过初始帧
    print("硬件初始化完成")

# SD卡文件操作
def sdcard_operation():
    img_path = "/sd/image-1.jpg"       # SD卡文件路径

    try:
        # 捕获并保存图像
        img = sensor.snapshot()
        print("正在保存图像...")
        img.save(img_path)             # 保存到SD卡
        print("图像已保存到: {}".format(img_path))

        # 读取并显示图像
        print("正在读取图像...")
        img_read = image.Image(img_path)
        lcd.display(img_read)
        print("图像显示完成")

    except Exception as e:
        print("操作失败: {}".format(e))
        print("请检查:")
        print("1. SD卡是否正确插入")
        print("2. SD卡格式是否为FAT32")
        print("3. SD卡是否可用")

if __name__ == "__main__":
    hardware_init()
    sdcard_operation()

    # 保持显示5秒
    time.sleep(5)
    lcd.clear()
    print("实验结束")

运行步骤

  1. 把 SD 卡插进 K210 卡槽,接好摄像头和 LCD 屏。
  2. 下载代码后通电,串口会打印「硬件初始化完成」,然后自动保存图像、读取图像,LCD 会显示保存的照片。
  3. 实验结束后,把 SD 卡拔下来插电脑上,能看到里面多了一张「image-1.jpg」,就是刚才拍的照片。

常见报错解决

  • 报错「No such file or directory」:要么没插 SD 卡,要么路径写错了(必须是 /sd/xxx.jpg),检查路径和 SD 卡。
  • 报错「Permission denied」:SD 卡是只读模式,把 SD 卡上的「写保护开关」关掉(有些 SD 卡侧面有开关,拨到另一边)。
  • 保存的图像是黑的:摄像头没初始化好,把 sensor.skip_frames(10) 里的 10 改成 20,让摄像头多等一会儿稳定。

五、总结:小白入门 K210 的关键技巧

  1. 先确认硬件没问题:SD 卡、接线、外设(RGB 灯、按键)都先测好,避免代码没错但硬件不行。
  2. 代码先复制跑通,再改参数:比如想让 RGB 灯亮久一点,把 time.sleep(0.5) 改成 time.sleep(1),慢慢熟悉函数用法。
  3. 遇到报错别慌:先看报错信息里的关键词(比如「No module」就是缺库,「No such file」就是路径错),对照教程里的解决方法试。

后面可以基于这些基础实验做进阶项目,比如用按键控制拍照、用触摸屏选择功能,慢慢积累就能上手复杂的 AI 项目啦!
遇到有问题可以在评论区提问哦!!!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐