资料下载:待更新
1、实现功能
系统采用STM32F103单片机作为控制器,通过摄像头和K210模块实现图像数据的采集,并以此实现金属键的识别,当识别后通过SG960舵机对金属键进行分类,并通过液晶进行显示,同时加入了串口通信模块,将分拣后的结果输出到PC电脑,方便用户进行管控。
可增加的功能:
主要元器件:
STM32F103C8T6最小系统板、
2、硬件
硬件框图
系统架构图
- STM32F103单片机:STM32F103单片机是本系统的核心控制单元,采用ARM Cortex-M3内核,具有高性能和低功耗的特点。它的主频可达到72MHz,拥有较大的内存和丰富的外设接口,适合用于嵌入式系统中的实时控制。在本系统中,STM32F103负责协调各个模块的工作,包括控制图像采集、舵机动作以及蓝牙通信。通过其GPIO接口与其他外部设备进行通信,STM32F103作为系统的大脑,有效保证了系统的实时性和稳定性。
- 摄像头:摄像头在本系统中用于图像数据的采集,通过高分辨率的图像传感器捕捉金属键的外观信息。摄像头传输的图像信号被STM32F103传输至K210模块进行处理和识别。其优越的成像质量和响应速度使得系统能够准确捕捉到金属键的形态特征,并为后续的分类处理提供清晰的数据输入。摄像头在实现物体检测和识别过程中起到了至关重要的作用。
- K210模块:K210模块是一个AI处理单元,专为图像处理和机器学习任务设计,基于RISC-V架构,具备强大的图像识别能力。在本系统中,K210用于对摄像头采集到的图像进行实时处理和分析。通过内置的深度学习算法,K210能够准确地识别金属键的形态,并生成分类结果。K210的高效处理能力显著提升了系统的识别速度和精度,为金属键分类提供了有力支持。
- SG960舵机:SG960舵机用于执行金属键的分类操作。它具有较高的精度和稳定性,能够在接收到控制信号后精准地调整其角度。在本系统中,当K210模块完成对金属键的识别后,STM32F103控制SG960舵机进行相应的分类动作。舵机的高扭矩和响应速度确保了金属键在分类过程中能够迅速、准确地定位到指定位置,从而完成分拣工作。
- 液晶显示屏:液晶显示屏(OLED12864)用于实时显示系统的工作状态和金属键的分类结果。该显示器具有清晰的显示效果和较低的功耗,在提供实时反馈的同时不会对系统的整体能耗产生过大影响。在系统运行过程中,LCD能够向操作员展示摄像头捕获的图像和K210识别的分类结果,让用户直观地了解系统当前的操作状态和结果。
6.串口通信模块:采用CH340串口通信模块用于将分拣结果与电脑进行无线通信。通过与STM32F103的串口连接,CH340串口通信模实现了数据的TTL转USB传输,减少了开发人员的工作量。
实物
3、代码
STM32代码采用C语言,标准库编写,软件是keil5,关键代码有中文注释,看不懂可以VX问我
以下为Maixpy IDE软件 Python语言编写的K210图像处理模块自学习处理代码:
import gc
import lcd
import sensor
import time
from maix import GPIO
from maix import KPU
from board import board_info
from fpioa_manager import fm
from image import Image
from machine import UART
fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(10, fm.fpioa.UART1_RX, force=True)
uart = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=64)
####################################################################################################################
class STATE(object):
IDLE = 0
INIT = 1
TRAIN_CLASS_1 = 2
TRAIN_CLASS_2 = 3
TRAIN_CLASS_3 = 4
CLASSIFY = 5
STATE_MAX = 6
class EVENT(object):
POWER_ON = 0 # virtual event, 用于上电初始化
BOOT_KEY = 1 # boot键按下
BOOT_KEY_LONG_PRESS = 2 # boot键长按约3秒
EVENT_NEXT_MODE = 3 # virtual event, 用于切换到下一个模式
EVENT_MAX = 4
class StateMachine(object):
def __init__(self, state_handlers, event_handlers, transitions):
self.previous_state = STATE.IDLE
self.current_state = STATE.IDLE
self.state_handlers = state_handlers
self.event_handlers = event_handlers
self.transitions = transitions
def reset(self):
'''
重置状态机
:return:
'''
self.previous_state = STATE.IDLE
self.current_state = STATE.IDLE
def get_next_state(self, cur_state, cur_event):
'''
根据当着状态和event, 从transitions表里查找出下一个状态
:param cur_state:
:param cur_event:
:return:
next_state: 下一状态
None: 找不到对应状态
'''
for cur, next, event in self.transitions:
if cur == cur_state and event == cur_event:
return next
return None
# execute action before enter current state
def enter_state_action(self, state, event):
'''
执行当前状态对应的进入action
:param state: 当前状态
:param event: 当前event
:return:
'''
try:
if self.state_handlers[state][0]:
self.state_handlers[state][0](self, state, event)
except Exception as e:
print(e)
# execute action of current state
def execute_state_action(self, state, event):
'''
执行当前状态action函数
:param state: 当前状态
:param event: 当前event
:return:
'''
try:
if self.state_handlers[state][1]:
self.state_handlers[state][1](self, state, event)
except Exception as e:
print(e)
# execute action when exit state
def exit_state_action(self, state, event):
'''
执行当前状态的退出action
:param state: 当前状态
:param event: 当前event
:return:
'''
try:
if self.state_handlers[state][2]:
self.state_handlers[state][2](self, state, event)
except Exception as e:
print(e)
def emit_event(self, event):
'''
发送event。根据当前状态和event,查找下一个状态,然后执行对应的action。
:param event: 要发送的event
:return:
'''
next_state = self.get_next_state(self.current_state, event)
# execute enter function and exit function when state changed
if next_state != None and next_state != self.current_state:
self.exit_state_action(self.previous_state, event)
self.previous_state = self.current_state
self.current_