从零玩转CanMV-K230(9)-Timer、RTC、ADC、WDT、File


前言

本章介绍K230常用外设的使用方法,相关内容的详细介绍可以参考K210的教程,这里主要展示K230的使用代码


一、Timer

定时器(Timer)的作用在于生成精确的计时,当达到预设的时间点时,提醒我们进行特定的操作。
Timer类位于machine模块下,因此在使用该类时,需要从machine模块中进行引用。

构造函数

timer = Timer(index, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)

【参数】

index: Timer号,取值:[-1,5],-1代表软件定时器

mode: 运行模式,单次或周期,可选参数

freq: Timer运行频率,支持浮点,单位Hz,可选参数,优先级高于period

period: Timer运行周期,单位ms,可选参数

callback: 超时回调函数,必须设置,要带一个参数

arg: 超时回调函数参数,可选参数

注意: [0-5]硬件Timer暂不可用

初始化

Timer.init(mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)

初始化定时器参数

【参数】

mode: 运行模式,单次或周期,可选参数

freq: Timer运行频率,支持浮点,单位Hz,可选参数,优先级高于period

period: Timer运行周期,单位ms,可选参数

callback: 超时回调函数,必须设置,要带一个参数

arg: 超时回调函数参数,可选参数

【返回值】

无

销毁函数

Timer.deinit()

释放Timer资源

【参数】

无

【返回值】

无

示例代码

from machine import Timer
import time

def fun(i):
   print("Timer callback")

#使用软件定时器,编号-1
tim = Timer(-1)
tim.init(mode=Timer.PERIODIC, period=100, callback=fun) #周期为100ms

while True:

    time.sleep(0.01) #避免CPU满跑

二、RTC

RTC全称是Real Time Clock,可以用来进行精准的时间计时,我们现在常用的万年历或数字时钟常常就是使用类似的芯片DS1302等等实现计时的功能。K230内置一个RTC,但是这块板子上没有额外的电池,所以要想让RTC一直工作的话,需要板子一直进行上电。

RTC类位于machine模块下,因此我们在使用这个类的时候要从machine模块中进行引用。

RTC的主要功能就是获取实时的时间,当然也可以使用函数进行重新设定时间。

构造函数

rtc = RTC()

【参数】

无

init

rtc.init(year,mon,day,hour,min,sec,microsec)

【参数】

year: 年

mon: 月

day: 日

hour: 时

min: 分

sec: 秒

microsec: 微秒

【返回值】

无

datetime

print(rtc.datetime())

【参数】

无

【返回值】

year: 年

mon: 月

day: 日

hour: 时

min: 分

sec: 秒

microsec: 微秒

示例代码

代码如下(示例):

from machine import RTC
import time

rtc = RTC()

if rtc.datetime()[1] != 10:
    rtc.datetime((2024, 12, 30, 0, 0, 0, 0, 0))

while True:

    print(rtc.datetime())

    time.sleep(1)

三、ADC

物理世界中的大部分的信号都是模拟量,但是随着单片机的发展,越来越多需要数字信号的处理,因此将模拟信号转换成为数字信号就显得尤为重要。

K230内置了一个ADC,其具有6个通道(该开发板引出了四个ADC通道,分别是0-4,其中0和1的量程为0-3.6V,2和3的量程为0-1.8V),采样分辨率为12bit,采样的速率可以达到1MHz。

ADC类位于machine模块下,因此我们在使用这个类的时候要从machine模块中进行引用。

API

adc = ADC(channel)

【参数】

channel: ADC通道号,取值:[0,5]

ADC.read_u16()

获取通道采样值

【参数】

无

【返回值】

返回当前ADC通道采样值,[0-4095]

ADC.read_uv()

获取通道电压值

【参数】

无

【返回值】

返回当前ADC通道电压值,[0-1800000]

示例代码

from machine import ADC
import time

adc = ADC(0)

while True:

    print(adc.read_u16())
    print('%.2f'%(adc.read_uv()/1000000*2), "V")

    time.sleep(1)

四、WDT

看门狗是单片机用来防止软件程序跑飞,从而出现问题的一种内部机制。其本质可以看作是一个定时器,当开启看门狗后,定时器开始运行,在定时器到达设定的重启时间之前要进行喂狗(即重置一下定时器),若超过设定的时间没有进行喂狗,就会通过软件复位的方式,将程序进行复位,从而避免了程序跑飞出现的问题。
K230内部包含两个WDT硬件模块,用于在应用程序崩溃且最终进入不可恢复状态时重启系统。一旦开始,当硬件运行期间没有定期进行喂狗(feed)就会在超时后自动复位。

API

wdt = WDT(id=1, timeout=5)

【参数】

id: WDT号,取值:[0,1],默认1

timeout: 超时值,单位s,默认5

注意: WDT0暂不可用

WDT.feed()

喂狗操作

【参数】

无

【返回值】

无

示例代码

from machine import WDT
import time

wdt = WDT(1,3)

for i in range(3):

    time.sleep(1)
    print(i)

    wdt.feed()

while True:

    time.sleep(0.01)

五、File

在其他的单片机中我们要是想断电后保存一些数据的话,通常会使用EEPROM或者Flash进行数据的存储。在K230中自带一个文件系统,因此我们直接使用K230的文件系统就可以实现数据的存储和获取。

K230进行文件操作的方式和Python的文件操作方式是一样的。K230的文件路径为/sdcard,所创建的文件,直接存储在这个路径下即可。

示例代码

f = open('/sdcard/1.txt', 'w')
f.write('EEWORLD')
f.close()

f = open('/sdcard/1.txt', 'r')
text = f.read()
print(text)
f.close()

总结

本章提供了Timer、RTC、ADC、WDT、File的基本用法,供参考,后面我们开始K230在AI领域的应用例程。

<think>好的,我需要帮助用户解决如何使用CanMV IDE对K230进行编译,使其能够通过Kmodel模型进行异常图片检测的问题。首先,我需要回顾之前提供的关于CanMV IDE异常检测的信息,确保这次回答保持一致性和准确性。 用户请求的是完整的代码示例,所以我需要提供一个结构清晰、步骤明确的代码框架。可能需要包括硬件初始化、模型加载、图像捕获、推理执行、异常检测逻辑以及错误处理等部分。此外,要确保代码符合MicroPython的语法,并适配K210或K230芯片的特性。 首先,我需要确认K230是否兼容CanMV框架。虽然之前的信息主要针对K210,但K230可能属于同一系列或类似架构,所以假设适配方法类似。接下来,考虑模型部署的步骤,用户提到了Kmodel,这是Kendryte的模型格式,需要确保模型转换和加载的正确性。 然后,要处理异常检测的具体实现。可能需要使用YOLO或其他目标检测模型,或者自定义的异常检测模型。需要解释模型输入输出的格式,例如输入图像尺寸、输出层解析等。同时,代码中需要包含图像预处理、模型推理、结果后处理(如计算置信度、判断异常)等步骤。 还要考虑硬件相关的初始化,比如摄像头、GPIO(如LED指示灯)的设置。另外,内存管理对于嵌入式设备非常重要,可能需要加入垃圾回收机制,避免内存溢出错误。 用户可能遇到的常见问题包括模型加载失败、摄像头初始化错误、内存不足等,代码中应包含异常处理(try-except块)和调试信息输出。此外,可能需要指导用户如何将代码部署到设备,使用CanMV IDE的编译和烧录功能。 最后,需要验证代码的正确性,确保每个步骤都有注释,并给出实际应用中的调整建议,比如模型路径、图像尺寸、阈值调整等。可能还需要提到如何训练和转换Kmodel模型,但用户主要问的是推理部分的代码,所以这部分可能简要带过或提供参考链接。 总结步骤: 1. 硬件初始化(摄像头、LED) 2. 加载Kmodel模型 3. 图像捕获与预处理 4. 模型推理 5. 结果解析与异常判断 6. 异常处理与输出 7. 内存管理和看门狗配置 需要确保代码结构清晰,关键部分有注释,并说明如何根据实际需求修改参数。同时,提醒用户注意模型兼容性、内存限制和硬件连接问题。</think>以下是使用CanMV IDE在K230芯片上部署KModel模型实现异常图片检测的完整代码框架及分步说明: --- ### **一、环境准备** 1. **硬件要求** - K230开发板 - OV2640摄像头模块 - 已训练好的KModel模型文件(如`anomaly_detect.kmodel`) 2. **软件配置** - CanMV IDE最新版本 - KModel工具链(模型转换工具) --- ### **二、完整代码示例** ```python # -*- coding: utf-8 -*- import sensor import image import lcd import KPU as kpu from machine import Timer, LED import gc # --------------------- 硬件初始化 --------------------- # 1. 摄像头初始化 def cam_init(): sensor.reset() # 复位摄像头 sensor.set_pixformat(sensor.RGB565) # 设置图像格式 sensor.set_framesize(sensor.QVGA) # 分辨率320x240 sensor.skip_frames(time=2000) # 跳过启动帧 # 2. 显示屏初始化 lcd.init(freq=15000000) # 3. LED指示灯初始化 led_r = LED(LED.RED) # 异常指示灯 # --------------------- 模型加载 --------------------- # 4. 加载KModel模型 try: # 模型路径需与实际文件一致 model = kpu.load("/sd/anomaly_detect.kmodel") anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025) # YOLO锚点 kpu.init_yolo2(model, 0.5, 0.3, 5, anchor) # 初始化YOLO参数 except Exception as e: print("模型加载失败:", e) led_r.on() # 亮红灯报错 # --------------------- 主推理循环 --------------------- def main(): cam_init() while True: try: # 5. 捕获图像 img = sensor.snapshot() # 6. 执行模型推理 code = kpu.run_yolo2(model, img) # 7. 异常检测逻辑 anomaly_detected = False if code: for obj in code: # 绘制检测框(置信度阈值>0.7) if obj.value() > 0.7: img.draw_rectangle(obj.rect(), color=(255,0,0)) anomaly_detected = True # 8. 异常处理 if anomaly_detected: led_r.on() print("[ALERT] 检测到异常目标!") # 可添加SD卡存储异常图片 # img.save("/sd/anomaly_%d.jpg" % Timer.TIMER_ID) else: led_r.off() # 9. 显示结果 lcd.display(img) # 10. 内存回收 gc.collect() # 防止内存泄漏 except Exception as e: print("运行时异常:", e) break # --------------------- 程序入口 --------------------- if __name__ == "__main__": main() ``` --- ### **三、关键代码解析** #### **1. 模型加载与初始化** ```python model = kpu.load("/sd/anomaly_detect.kmodel") ``` - **路径要求**:需将KModel文件存放在SD卡根目录 - **模型转换**:使用NNCase工具将TensorFlow/PyTorch模型转为`.kmodel`格式 #### **2. YOLO参数配置** $$ \text{置信度阈值}=0.5,\ \text{IoU阈值}=0.3 $$ ```python kpu.init_yolo2(model, 0.5, 0.3, 5, anchor) ``` #### **3. 异常判断逻辑** ```python if obj.value() > 0.7: # 阈值可根据实际调整 anomaly_detected = True ``` --- ### **四、部署与调试步骤** 1. **硬件连接** - 摄像头接入`DVP`接口 - SD卡插入卡槽并包含模型文件 2. **CanMV IDE操作** - 通过USB连接开发板 - 点击`烧录`按钮上传代码 - 打开串口监视器查看输出: ``` [ALERT] 检测到异常目标! ``` 3. **性能优化技巧** - 降低分辨率:`sensor.set_framesize(sensor.QQVGA)`(160x120) - 量化模型:使用8-bit量化减少模型体积 - 添加看门狗防卡死: ```python wdt = WDT(timeout=2000) wdt.feed() ``` --- ### **五、常见问题解决** | 错误类型 | 解决方案 | |--------------------------|---------------------------------| | `OSError: [Errno 2] ENOENT` | 检查SD卡是否挂载,确认模型路径正确 | | `MemoryError` | 减小模型尺寸或降低输入分辨率 | | `kpu: load error` | 验证KModel是否兼容K230芯片 | --- **扩展应用**:若需实现时序异常检测(如传感器数据),可结合以下公式计算动态阈值: $$ \text{动态阈值} = \mu \pm 3\sigma $$ 其中$\mu$为均值,$\sigma$为标准差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值