找回密码
 立即注册
楼主: 神***

2023年电赛申领奖金,奖金已发放; 2025年,最高奖100万@STC32

[复制链接]
  • TA的每日心情
    开心
    2024-4-9 10:41
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    7

    主题

    103

    回帖

    858

    积分

    超级版主

    积分
    858
    发表于 2023-10-13 10:25:47 | 显示全部楼层
    本帖最后由 岁月如歌 于 2023-12-13 10:05 编辑

    硬件方案设计3.1舵机云台选择
    由于该题目对舵机精度要求较高,普通的SG90舵机不能满足要求,而高精度的磁编码舵机价格过高且比赛时间紧迫,同样不符合要求。因此,可以选择一些精度较高的舵机,如谐波减速器,但由于价格和交货期等原因,可能会影响比赛。可以考虑使用数字信号舵机控制系统来提高舵机的精度。
    我们使用了实验室里舵机机械臂上拆下来的DS3218数字舵机DS3218舵机适用于对精度、反馈和稳定性都有较高要求的机械臂应用,其具有精度高、反馈快、稳定性好等优点。

    遇到的问题:
    1.舵机精度不够。步进移动时往往需要移动很多下才能前进一步。我们的解决办法是尽量把云台的螺丝拧紧,采用DDA算法对前进的路径进行处理,使每一步都尽量落在黑线上

    2.绿光太亮。掩盖了红色激光使摄像头无法识别到红色激光,进而使闭环运动失效,舵机无法前进。我们的解决方案是直接掩盖绿色激光,将激光头掩盖一半使摄像头无法识别。但是人眼能看到绿色激光的跟踪。然后对红色激光功率加大,使红光在黑线上时同样能识别。

    3.系统工作受环境光亮影响很大。我们的解决办法是使用多阈值判断,把不同环境光亮下的阈值写在程序中,分别运行,当程序检测到红色激光点的面积符合要求时,便使用当前阈值进行处理。

    4.铅笔线很难识别。我们的解决方案是手动调节铅笔线的范围,使用主板上的按键进行调整,然后程序直接根据手动调整结果进行运行。

    5.openmv识别矩形方框时有误差。我们的解决方案是进行手动误差补偿,在比赛前调试系统时,对识别到的矩形角度和边缘等进行手动补偿,这样会使正式比赛的误差减小到可以接受的范围







    BP5994YAL%$HT8F_A4)`PFT.png 5~CG}U1@RC1[`P%Y8LQ7VQN.png YQ75ZNU1]YK2TU~P4ER{}BJ.png

    3.2主板硬件方案
    主板为比赛前为电赛定制的主板,包含屏幕接口,按键模块,编码器接口,核心板接口,舵机接口,电机接口等等,在题目出来后部分模块未使用,但基本满足题目的使用要求。
    2JP4X%FNA`K{{H}XD7QIL.png 5]3E}%RBLBV{S}45DEDBJ.png

    diansai.zip

    1.41 MB, 下载次数: 19

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 77 天

    [LV.6]常住居民II

    9

    主题

    170

    回帖

    1677

    积分

    版主

    积分
    1677
    发表于 2023-10-13 10:37:27 | 显示全部楼层
    本帖最后由 一轮明月 于 2024-1-13 11:44 编辑

    鲁东大学航空队===获得2023年全国大学生电子设计竞赛,本科组二等奖
    E题:运动目标控制与自动追踪系统STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币伍仟元@STC32G12K128
    ===2023/12/13审核通过,已上传获奖证书和补拍视频


    截图202312131346411428.jpg
    为确保奖金发放评审的公平公正,经广大老师推荐,委托第三方资深团队组织评审,点评如下
    这个作品使用了两个K210实现激光位置识别,并且通过查阅其开源的STC32G控制代码发现坐标接收部分以及PID函数中的坐标误差计算部分,
    初步判定由K210发送激光位置信息到STC32G,再由STC32G完成后续整个计算以及云台控制,并且两个平台都仅使用了STC32G作为主控芯片。
    结论:建议颁发二等奖全额奖金,人民币伍千元,以资鼓励!

    ================================以下是获奖团队文件描述和相关资料================================
    获奖证书:
    截图202312140922479106.jpg
    补拍视频:


    参赛作品使用了两个二维云台分别作为运动目标控制系统和自动追踪系统,分别由两个DS3115舵机和两个SD7舵机搭建而成。两个云台均使用STC32G12K128作为主控芯片,使用K210来辅助获取图像,识别轨迹和激光笔的运动目标。云台搭建的过程中,我们固定了视觉模块,让固定量激光笔的舵机云台与其分离,保证图像识别的稳定性,视觉模块与控制系统独立,以应对不同情况。基础题部分,前三问了解题目要求后,加上我们的激光笔又固定在云台上,直接选择了开环的方法去做,稳定完成任务。第四问使用K210识别矩形框和运动目标,提取矩形框四顶点坐标和运动目标坐标,通过串口发送给单片机,根据坐标点实现PID闭环控制,完成第四问,由于舵机精度问题在第四问浪费了好长时间。在第四问闭环实现后第三问也写了闭环,但是最终比赛用开环的方式去做的。附加题增加了自动追踪系统,由于要实现同时识别到两个运动目标,加上光斑之间存在相互影响,进而对两个系统系统的图像进行了特殊处理,使之在能稳定识别边框的条件下同时能够识别两个光点坐标,追踪目标系统使用PID闭环实现任务,但是最终比赛时还是受到了光斑的影响,好在前几问还比较稳定。
      两个云台系统均采用STC32G12K128芯片作为主控:
       鲁东大学STC证明.png

    控制系统云台

    控制系统云台

          

    PCB成品图-1

    PCB成品图-1

    PCB成品图-2

    PCB成品图-2



    国二,2023年电赛中使用STC32完成E题; 有学校证明,无需社团证明 - 2025全国大学生电子设计竞赛技术支持版块,最高奖100万,一等奖2万,选型 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)




















    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 77 天

    [LV.6]常住居民II

    9

    主题

    170

    回帖

    1677

    积分

    版主

    积分
    1677
    发表于 2023-10-13 10:37:39 | 显示全部楼层
    本帖最后由 一轮明月 于 2023-12-14 09:08 编辑

    鲁东大学硬件部分:
    硬件方面在准备智能车的同为电赛做了考虑,提前留了足够的模块接口,电赛时直接拿来用了(以为会有小车题)。同时准备了独立的稳压电路板以应对不确定的题目的复杂性,很好地实现了电源分配。

            

            

    电赛.pdf

    637.4 KB, 下载次数: 7

    硬件图

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 77 天

    [LV.6]常住居民II

    9

    主题

    170

    回帖

    1677

    积分

    版主

    积分
    1677
    发表于 2023-10-13 10:38:10 | 显示全部楼层
    本帖最后由 一轮明月 于 2023-11-18 09:42 编辑

    鲁东大学软件部分:
    在电赛与智能车使用STC单片机的过程中感受很多。STC单片机具有较低的价格,且完全满足比赛要求,同时还具有较高的稳定性和可靠性具有丰富的外设,包括通用输入/输出引脚(GPIO)、串口通信(UART)、定时器/计数器、比较器、PWM输出、ADC/DAC等,且有很多开源,可以满足多种应用需求,很是方便。


    控制思路流程:
    整体的控制思路上通过K210识别外边框提取顶点坐标点及红绿光点坐标,通过串口发送到STC32G12K128单片机进行误差计算,通过PID计算后PWM控制舵机打脚。使用按键实现人机交互控制题目选择,控制云台完成任务。STC32G12K128单片机做主控,K210视觉模块辅助完成视觉任务,PID算法为控制核心搭建运动目标控制系统和自动追踪系统。




    本系统有很好的稳定性,符合题目的各种要求。
    云台一:CPU MODE:     251 SOURCE MODE
    INTR FRAME:   2 BYTES SAVED ON INTERRUPT
    MEMORY MODEL: XSMALL WITH FLOATING POINT ARITHMETIC


    INPUT MODULES INCLUDED:
      .\Out_File\board.obj (board)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\common.obj (common)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_adc.obj (zf_adc)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_delay.obj (zf_delay)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_eeprom.obj (zf_eeprom)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_exti.obj (zf_exti)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_gpio.obj (zf_gpio)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_nvic.obj (zf_nvic)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_pwm.obj (zf_pwm)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_spi.obj (zf_spi)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_tim.obj (zf_tim)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_uart.obj (zf_uart)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_fifo.obj (zf_fifo)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_18TFT.obj (SEEKFREE_18TFT)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_BLUETOOTH_CH9141.obj (SEEKFREE_BLUETOOTH_CH9141)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_DL1A.obj (SEEKFREE_DL1A)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_DL1B.obj (SEEKFREE_DL1B)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_FONT.obj (SEEKFREE_FONT)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_ICM20602.obj (SEEKFREE_ICM20602)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_IMU660RA.obj (SEEKFREE_IMU660RA)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_IMU963RA.obj (SEEKFREE_IMU963RA)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_IPS114_SPI.obj (SEEKFREE_IPS114_SPI)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_MPU6050.obj (SEEKFREE_MPU6050)
             COMMENT TYPE 0: C251 V5.60.0
    L251 LINKER/LOCATER V4.66.93.0                                                        10/13/2023  18:10:35  PAGE 2


      .\Out_File\SEEKFREE_OLED.obj (SEEKFREE_OLED)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_PRINTF.obj (SEEKFREE_PRINTF)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_VIRSCO.obj (SEEKFREE_VIRSCO)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_WIRELESS.obj (SEEKFREE_WIRELESS)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_WIRELESS_CH573.obj (SEEKFREE_WIRELESS_CH573)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\isr.obj (isr)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\main.obj (main)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\control.obj (control)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\uart..obj (uart)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\all_int.obj (all_int)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\yuntai.obj (yuntai)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\anjian.obj (anjian)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\show.obj (show)
             COMMENT TYPE 0: C251 V5.60.0
      ..\..\Libraries\seekfree_peripheral\SEEKFREE_CONFIG.LIB (SEEKFREE_CONFIG)
             COMMENT TYPE 0: C251 V5.60.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPADD)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPMUL)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPDIV)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPCMP)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPNEG)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FCAST)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?CASTF)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (PRINTF)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPGETOPN)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?PRNFMT)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPCONVERT)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FTNPWR)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C_START)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?INITEDATA)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?SIDIV)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?LMUL)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?LIMUL)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?ULDIV)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?SLDIV)
    L251 LINKER/LOCATER V4.66.93.0                                                        10/13/2023  18:10:35  PAGE 3


             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (memcpy)
             COMMENT TYPE 0: C251 V5.58.7
      D:\KEIL5\C251\LIB\C2SXS.LIB (memset)
             COMMENT TYPE 0: C251 V5.58.7
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?INITEDATA_END)
             COMMENT TYPE 0: A251 V4.69.6.0


    ACTIVE MEMORY CLASSES OF MODULE:  .\Out_File\SEEKFREE (board)

    云台二:
    CPU MODE:     251 SOURCE MODE
    INTR FRAME:   2 BYTES SAVED ON INTERRUPT
    MEMORY MODEL: XSMALL WITH FLOATING POINT ARITHMETIC


    INPUT MODULES INCLUDED:
      .\Out_File\board.obj (board)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\common.obj (common)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_adc.obj (zf_adc)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_delay.obj (zf_delay)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_eeprom.obj (zf_eeprom)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_exti.obj (zf_exti)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_gpio.obj (zf_gpio)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_nvic.obj (zf_nvic)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_pwm.obj (zf_pwm)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_spi.obj (zf_spi)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_tim.obj (zf_tim)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_uart.obj (zf_uart)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\zf_fifo.obj (zf_fifo)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_18TFT.obj (SEEKFREE_18TFT)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_BLUETOOTH_CH9141.obj (SEEKFREE_BLUETOOTH_CH9141)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_DL1A.obj (SEEKFREE_DL1A)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_DL1B.obj (SEEKFREE_DL1B)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_FONT.obj (SEEKFREE_FONT)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_ICM20602.obj (SEEKFREE_ICM20602)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_IMU660RA.obj (SEEKFREE_IMU660RA)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_IMU963RA.obj (SEEKFREE_IMU963RA)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_IPS114_SPI.obj (SEEKFREE_IPS114_SPI)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_MPU6050.obj (SEEKFREE_MPU6050)
             COMMENT TYPE 0: C251 V5.60.0
    L251 LINKER/LOCATER V4.66.93.0                                                        10/13/2023  18:11:45  PAGE 2


      .\Out_File\SEEKFREE_OLED.obj (SEEKFREE_OLED)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_PRINTF.obj (SEEKFREE_PRINTF)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_VIRSCO.obj (SEEKFREE_VIRSCO)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_WIRELESS.obj (SEEKFREE_WIRELESS)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\SEEKFREE_WIRELESS_CH573.obj (SEEKFREE_WIRELESS_CH573)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\isr.obj (isr)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\main.obj (main)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\control.obj (control)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\uart..obj (uart)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\all_int.obj (all_int)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\yuntai.obj (yuntai)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\anjian.obj (anjian)
             COMMENT TYPE 0: C251 V5.60.0
      .\Out_File\show.obj (show)
             COMMENT TYPE 0: C251 V5.60.0
      ..\..\Libraries\seekfree_peripheral\SEEKFREE_CONFIG.LIB (SEEKFREE_CONFIG)
             COMMENT TYPE 0: C251 V5.60.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPADD)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPMUL)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPDIV)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPCMP)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FCAST)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?CASTF)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (PRINTF)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPGETOPN)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?PRNFMT)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FPCONVERT)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SFPXS.LIB (?C?FTNPWR)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C_START)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?INITEDATA)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?SIDIV)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?LMUL)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?LIMUL)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?ULDIV)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?SLDIV)
             COMMENT TYPE 0: A251 V4.69.6.0
      D:\KEIL5\C251\LIB\C2SXS.LIB (ABS)
    L251 LINKER/LOCATER V4.66.93.0                                                        10/13/2023  18:11:45  PAGE 3


             COMMENT TYPE 0: C251 V5.58.7
      D:\KEIL5\C251\LIB\C2SXS.LIB (memcpy)
             COMMENT TYPE 0: C251 V5.58.7
      D:\KEIL5\C251\LIB\C2SXS.LIB (memset)
             COMMENT TYPE 0: C251 V5.58.7
      D:\KEIL5\C251\LIB\C2SXS.LIB (?C?INITEDATA_END)
             COMMENT TYPE 0: A251 V4.69.6.0


    ACTIVE MEMORY CLASSES OF MODULE:  .\Out_File\SEEKFREE (board)



    yuntai.zip

    2.56 MB, 下载次数: 14

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-1 10:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    121

    回帖

    1018

    积分

    版主

    积分
    1018
    发表于 2023-10-13 10:41:12 | 显示全部楼层
    本帖最后由 STC芯势力 于 2023-12-23 11:59 编辑

    河南科技大学快来队===获得全国大学生电子设计竞赛2023年,本科组二等奖
    G题空地协同智能消防系统STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币伍仟元@STC32G12K128
    ===2023/12/13审核中,已上传获奖证书和相关视频。
    河南科技大学快来队参加2023年全国大学生电子设计竞赛
    本科G题:空地协同智能消防系统
    截图202312131454577967.jpg
    为确保奖金发放评审的公平公正,经广大老师推荐,委托第三方资深团队组织评审点评如下
    该作品中使用到了K210视觉模块、匿名飞控、STC32G主控板。其中无人机部分由STC32G主控板连接匿名飞控以及K210视觉模块,STC32G主要为转发K210的串口信息,程序中也并未看到其他算法控制部分,消防车由STC32G作为主要控制芯片,控制小车移动、云台、激光打靶等行为。
    后续学生已补充其他算法部分,
    无人机部分由STC32G主控,消防车由STC32G作为主控,详情见附件
    结论:建议颁发二等奖全额奖金人民币伍千元,以资鼓励
    ============以下是获奖团队文件描述和相关资料==============
    截图202312131459312421.jpg
    河南科技大学2023年电赛G题二等奖获奖视频如下:


    简介:
    小车上和无人机都使用STC32G12K128,其中四轴使用STC32做信息采集和下位机控制板,小车采用STC32G12K128作为主控,最终获得国二
    所有硬件信息大概会开源到嘉立创上(本人考研党,也可能在考完研后整理)。
    ---河南科技大学
    先讲故事:
    大学很精彩,大一上来到实验室,跟着学长们学习51单片机,大一下32单片机,然后是21年电赛,老师把无人机交到了我们手中,我们满怀热情的扑街了(省三),但是我们不甘心啊,于是开始沉淀。大二下的17界智能车竞赛中,每天高强度备赛,但是由于已经险些无法参赛,最终在一处山村里和河南另一所学校组成赛点(我们那届特殊,疫情原因)勉强完成比赛冲进国赛,但是在外租房成本真的太高了,我们也没有得到任何学校的支持,于是无奈告别线下决赛,遗憾国二。
    正巧的是当时STC赞助的比赛,所以我们使用的芯片是STC16,从此和STC32结下不解之缘~
    在完成智能车竞赛后,我们得到一段难得的清闲时光,在这段事件里,我开发了一个小游戏机(也用的是STC32,有机会也会开源,图片在最后),并准备22年河南赛的电赛,虽然我们在小车题中获得过国奖,但是我们组毅然选择飞控题,不为别的,主打一个弥补遗憾!
    但是事与愿违,疫情又来了。河南省电赛本来说是延迟到3月份过完年返校后举办,然后我们就把飞机留到学校回家了,突然赛委会通知要在一周内完成所有评比工作(这都没东西咋比啊),遗憾止步省二(还是凭借ppt获得的)。
    真的太难受了,当时这个飞控的板子就画出来了,不过族中还是在23年电赛用上了。
    然后就是最后一次比赛--23年电赛,我们这时候其实已经没有大一大二那么多经历放在电赛上了,因为都要考研。但是飞控题真的给我留下太多遗憾了,所以我们还是打算搏一把,我几乎整个暑假每天都用半天时间在弄飞机(太痛了),这对考研党来说有点致命,但是没办法,真的很想拿国一。
    唉,最后我们奋战4天3夜,但是由于测试的时候没识别到火源,可能摄像头算法的问题也可能是K210没读到SD卡,总之发挥不是很理想,回来的时候我们几个心情都非常沉重,国一肯定没戏了,有点遗憾。
    结果出来还是国二。
    没办法,竞赛总是伴随遗憾,这大概率是我大学生涯最后一个比赛了,虽然没能达到巅峰,但总归要记录一下,一路来也踩过不少坑,写下此篇,方便大家学习入门。
    有些细节方面可能会在有时间以后详细展开,现在先大致介绍一下,也算给初学者点思路。

                                 
    先上图吧
    其中小车因为我们参加过17界智能车(也是国二),所以直接用了以前的车模。但是因为我们的车车都传给学弟了,所以搭车的时候也是慌手慌脚,最终没能达到很好的效果。主板方面是抄的逐飞的板子,就不再过多展示,下面着重说明飞机STC32G12K128主控的设计和使用。 飞控_外设及通信控制.zip (24.7 KB, 下载次数: 8) https://www.stcaimcu.com/forum.p ... 4014&extra=page%3D2




    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-1 10:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    121

    回帖

    1018

    积分

    版主

    积分
    1018
    发表于 2023-10-13 10:41:22 | 显示全部楼层
    本帖最后由 STC芯势力 于 2023-10-13 14:22 编辑

    硬件环节
    主板设计



    主板原理图并不是非常复杂,只是提供了很多接口方便连接传感器和数据采集,毕竟主要工作是做下位机嘛,所以画的并不是很复杂。


    该主控板采用STC宏晶官方最新推出单片机STC32G12K128作为主控芯片,上有两个K210深度学习摄像头嵌槽,用于固定k210以及进行数据通讯,并且外引4GPIO3AD、两路串口、两个可控LED灯、三个可编程按键以及一个IIC接口方便后续扩展模块等资源。其中IIC扩展部分可以直接排线相连接16PWM舵机控制模块,对于有些需要依靠舵机转向或者抓取的任务也可以快速扩展。右侧K210直插的中间有四个孔位,可以与我们后续介绍的12v5v稳压降压模块依靠铜柱直接相连接。
    主板资源概述(来自于报告图片):






    上面有两个K210的卡槽,可以插K210模块,因为近些年的无人机题都有识别任务,并且可能牵扯到前方和下方两个方向,所以设计两个卡槽来进行通讯。




    电源设计:


    与上述主控搭配使用,可对3C锂电池进行降压稳压处理,输出5V稳定电源,并且连接方式采用铜柱代替导线,无线化设计减少飞行扰动。



    使用螺丝代替导线进行连接,这样可能会有一些问题(大佬轻喷),但是我们目前用了这么久是没遇到问题的,而且非常方便更换。

    飞控方面
    采用匿名飞控,懂得都懂,非常好用,方便二次开发,与飞控采用串口连接通讯,在本次设计中,重物的抛洒工作(舵机完成)、摄像头的信息反馈与控制、蜂鸣器的控制、LED的控制信号等都由飞控下达指令,然后由STC32进行传感器的控制,为了保持通讯的实时性,使用921600的波特率(之前都一直用的115200,没想到升高后数据依然稳定)。


    还有就是为了方便图像的调试,自制了上位机方便观察图像,配合K210上面镶嵌的ESP32实现组网通讯(K210处理完图像直接通过ESP32发送至电脑)

    通过图中信息可看的,灯点被识别后被涂满,在识别区密度满足要求后,返回数传信息给上位机,飞机通过调试信息完成对点位的矫正工作。
    假设目标值为 Setpoint,当前系统输出值为 ProcessVariable,定义以下变量:
    偏差: Error = Setpoint – ProcessVariable
    积分误差: Integral = Integral + Error * Δt,其中 Δt 为采样时间间隔
    导数: Derivative = (Error - PreviousError) / Δt
    通过公式
    ControlOutput = Kp * Error + Ki * Integral + Kd * Derivative     (1)
    计算位置式PID偏差,对位置环进行校准。

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-1 10:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    121

    回帖

    1018

    积分

    版主

    积分
    1018
    发表于 2023-10-13 10:42:14 | 显示全部楼层
    本帖最后由 STC芯势力 于 2023-10-13 14:56 编辑

    软件环节:
    “消防车”路径规划
    在系统中设计每个街区每个边都一一对应一条路径,首先无人机向小车发送火情位置,小车在接受到信息后计算火情所在街区,由于小车无法驶入街区,小车会将火情坐标位置转化成离街区“火情”最近的位置、需要到达“火情”街区的边。
    每个路径数据包括包括数个转向操作其中包括方向dir,进行拐弯位置的四元列表[x,y,w,h],其中x、y表示需要转向的区域矩形的左下角坐标,w、h表示需要转向的区域矩形的宽和高。这样利用车载“UWB”就可以实现小车在指定位置转向。

    “消防车”对无人机轨迹刻画与里程计算
    本系统中使用UWB进行室内定位,无人机将UWB信息每秒通过蓝牙发送给“消防车”,“消防车”在接受到数据后将实际坐标转化为屏幕中的像素坐标,之后计算本次接收到的坐标值与上次接收到的坐标值之间的距离,累加进总里程中并显示。

    我们的定位采用的是UWB的方案,UWB建系PID校准,然后状态机逐点搜索,大概就是这么个流程。

    以下是STC32中关键代码的局部展示(4天3夜写的有点乱~)
    • /**********************************
    • **函数名:Isr_timerInit
    • **作用 :定时器ISR总初始化
    • ************************************/
    • void Isr_timerInit()
    • {
    • //        //最多定时20ms左右,多了会炸!!!!!
    • //        pit_timer_ms(TIM_0, 5);                                                                                                                                        //使用TIMER作为系统时钟,时间5ms一次,最高优先级
    • //        PT0 = 1;    //定时器0优先级中断低位
    • //        PT0H =1;        //定时器0优先级中断高位
    • //
    • //        pit_timer_ms(TIM_1, 20);                                                                                                                                //使用TIMER作为系统时钟,时间20ms一次,次高优先级
    • //        PT1 = 0;    //定时器1优先级中断低位
    • //        PT1H =1;        //定时器1优先级中断高位
    • //
    •         pit_timer_ms(TIM_4, 1);                                                                                                                //使用TIMER作为系统时钟,时间1ms一次
    • }
    • /*1ms线程*/
    • void task_1ms()
    • {
    • }
    • /*5ms线程*/
    • void task_5ms()
    • {
    •         LED_control();
    • }
    • /*20ms线程*/
    • void task_20ms()
    • {
    •         Servo_actuator_control();
    •         Uart1_Sendbuff();        //向两个K210传输数据
    •         Uart4_Sendbuff(); //转发k210数据
    •         //
    • //                        uart_putbuff(UART_1,"561",3);
    • //                        set_pwm(0,15);
    • //                        set_pwm(0,10);
    • //                   delay_ms(1000);
    • }
    • /*31ms线程*/
    • void task_31ms()
    • {
    •                 Uart3_Sendbuff();        //转发k210数据
    • }
    • /*32ms线程*/
    • void task_32ms()
    • {
    •                 Uart2_Sendbuff();        //转发k210数据
    • }
    • /*100ms线程*/
    • void task_100ms()
    • {
    • //        UWB_Receive();//uwb接收函数
    • //        UWB_X =UWB_Y =51231;
    • //        UWB_NewDate =1;
    • //        UWB_Send();
    • }
    • /*300ms线程*/
    • void task_300ms()
    • {
    •         KeyAndLedRecall();
    • //        BEEP==0?BEEP =1:BEEP=0;
    • }
    • /*****************任务管理**************************/
    • /*****************用户屏蔽**************************/
    • //创建任务配置
    • static schedule_task_t schedule_task[] =
    • {
    • //task_2ms(函数名) 2 (执行周期)2(初始化计时器) 0(任务执行标志)
    •         {task_1ms, 1, 1, 0}        ,
    •         {task_5ms, 5, 5, 0},
    •         {task_20ms, 20,  20, 0},
    •         {task_31ms,31 ,31 ,0},
    •         {task_32ms,32,32,0},
    •         {task_100ms, 100,  100, 0},
    •         {task_300ms, 300, 300, 0},
    • };
    • //根据数组长度,判断任务数量
    • #define TASK_NUM (sizeof(schedule_task)/sizeof(schedule_task_t))//记得改定时器值
    • void task_interrupt(void)
    • {
    •         uint8 index = 0;
    •         // 循环判断
    •         for (index = 0; index < TASK_NUM; index++)
    •         {
    •                 // 判断计时器是否到时间
    •                 if (schedule_task[index].run_timer)    //不为0
    •                 {
    •                         // 计时器减1
    •                         schedule_task[index].run_timer--;
    •                         //判断计时器是否到时间
    •                         if (0 == schedule_task[index].run_timer)
    •                         {
    •                                 // 恢复倒计时器的时间
    •                                 schedule_task[index].run_timer = schedule_task[index].interval_time;
    •                                 // 任务标志置1
    •                                 schedule_task[index].run_sign = 1;
    •                         }
    •                 }
    •         }
    • }
    • void task_process(void)
    • {
    •         uint8 index = 0;
    •         // 循环判断任务
    •         for (index = 0; index < TASK_NUM; index++)
    •         {
    •                 if (schedule_task[index].run_sign)
    •                 {
    •                         // 清除任务标志
    •                         schedule_task[index].run_sign = 0;
    •                         // 使用函数指针,执行任务,
    •                         schedule_task[index].task_func();
    •                 }
    •         }
    • }

    复制代码
    stc32游戏机:



    程序及硬件.zip

    10.11 MB, 下载次数: 11

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 34 天

    [LV.5]常住居民I

    12

    主题

    185

    回帖

    1117

    积分

    版主

    STC

    积分
    1117
    发表于 2023-10-13 11:26:50 | 显示全部楼层
    本帖最后由 大刀阔斧 于 2024-1-15 09:14 编辑

    西安建筑科技大学(队伍编号1811E)--获得2023年全国大学生电子设计竞赛,本科组二等奖
    【E】题: 运动目标控制与自动追踪系统STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币伍仟元@STC32G12K128
    ===2023/12/13审核通过!
    截图202312131716096920.jpg
    为确保奖金发放评审的公平公正,经广大老师推荐,委托第三方资深团队组织评审,点评如下:
    程序逻辑框图比较混乱并且开源程序仅主函数代码,所以无法确认其作品中的单片机具体工作内容如何,请补充详细程序后才能颁奖,按照其描述可知整个控制系统中由STC32G12K128实现坐标闭环解算以及激光云台控制,但无具体的完整源程序,所以,无法判定。
    结论:请立即补充详细源程序,待再次评审!

    后续:学生已补充完整源程序,详见软件开源
    整个控制系统中由STC32G12K128实现坐标闭环解算以及激光云台控制STC32G12K128作为唯一主控MCU实现
    ===2023/12/13再次审核
    结论: 建议颁发二等奖全额奖金,人民币5000元,以资鼓励!


    ================================以下是获奖团队文件描述和相关资料================================
    获奖证书: 获奖证书-队伍编号1811E.jpg
    视频内容:


    2023年全国大学生电子设计竞赛使用STC32G12K128为主控芯片-本科组

    本作品为两架二维电动云台,完成运动目标控制和自动追踪系统的实现。云台通过 K210 图像处理模块识别运动轨迹和捕捉目标,通过步进电机控制云台运动进行控制目标的 沿轨迹运动及目标追踪。 控制系统使用 STC32G12K128 为主控制器,K210 图像处理模块作为轨迹识别和目标检测 的视觉模块,A4988 模块作为步进电机驱动模块。轨迹识别算法使用 K210 和中位极值滤波 进行目标检测,脉冲控制算法进行云台运动控制。机械结构采用双轴步进电机云台结构,两 个步进电机形成双轴联动控制,辅以三脚架式结构作为装置支撑。测试表明,在题目所给环 境中,二维电动云台可以控制目标按题目要求移动,并在规定时间内完成目标追踪,且用时 较短,运动精确,符合题目要求。

    机械结构设计与搭建
    对于机械结构的设计,采取了三脚架式支撑结构,三脚架式支撑结构具有较高稳定性,在云 台运动时不易发生位移或颤动,可以提高控制的准确率。两台驱动电机通过同步带间接控制云台 转动,具有更高的精确度。整体结构设计有效可靠,符合本次任务需要。 运动控制云台将 K210 图像识别模块架于激光发射器后方,使摄像头能覆盖整块屏幕的同时, 也与激光的射线具有相似的轨道,更加便于激光光斑的控制。 运动控制云台的总体机械结构模型如图 2 所示。

    目标追踪云台将 K210 图像识别模块架于激光发射器上方,并与激光发射器共同运动,使得该 云台的激光光斑能够一直处于 K210 图像的中间位置,有利于云台进行目标追踪。 目标追踪云台的总体机械结构模型如图 3 所示。

    图像识别模块
    本次设计要求云台控制激光光斑沿着任意位置的 A4 靶纸进行移动,并使绿色激光光斑追踪红 色激光光斑,因此需要用到图像处理模块。在本次设计中,选择了 K210 视觉模块作为图像处理的 平台,通过 K210 视觉模块的摄像头捕捉屏幕画面,并对画面进行矩形和光斑的搜索,将搜索到的 结果以坐标形式输送给主控制器,以此完成 A4 靶纸和激光光斑的识别功能,如图 4 所示。

    运动目标控制原理
    控制激光在屏幕上移动,需要将移动的信息换算成控制电机旋转的脉冲和方向信号。将屏幕 位置以二维坐标系表示,并以屏幕的中心为原点,向上为 Y 轴正方向,向右为 X 轴正方向,则激 光在屏幕上的任意一个位置都可以以一个数对(x,y)表示,如图 5 所示。

    通过公式 1 将位置数对转换为脉冲数对。
    𝐴𝑁𝐺𝑥 = atan ( 𝑥 1000) ∗ 1528 (1)
    其中𝑥为位置参数,𝐴𝑁𝐺𝑥为转换后的脉冲参数。对得到的脉冲参数进行进一步处理,通过公 式 2 与公式 3 分别计算出 X 轴电机与 Y 轴电机的脉冲比例。
    𝑆𝐹𝑥 = { 1, |𝐴𝑁𝐺𝑥 − 𝑂𝐴𝑁𝐺𝑥 | ≥ |𝐴𝑁𝐺𝑦 − 𝑂𝐴𝑁𝐺𝑦| |𝐴𝑁𝐺𝑥−𝑂𝐴𝑁𝐺𝑥| |𝐴𝑁𝐺𝑦−𝑂𝐴𝑁𝐺𝑦| , |𝐴𝑁𝐺𝑥 − 𝑂𝐴𝑁𝐺𝑥 | < |𝐴𝑁𝐺𝑦 − 𝑂𝐴𝑁𝐺𝑦| (2)
    𝑆𝐹𝑦 = { |𝐴𝑁𝐺𝑦−𝑂𝐴𝑁𝐺𝑦| |𝐴𝑁𝐺𝑥−𝑂𝐴𝑁𝐺𝑥| , |𝐴𝑁𝐺𝑥 − 𝑂𝐴𝑁𝐺𝑥 | ≥ |𝐴𝑁𝐺𝑦 − 𝑂𝐴𝑁𝐺𝑦| 1, |𝐴𝑁𝐺𝑥 − 𝑂𝐴𝑁𝐺𝑥 | < |𝐴𝑁𝐺𝑦 − 𝑂𝐴𝑁𝐺𝑦| (3)
    其中𝑆𝐹𝑛为 n 轴电机的脉冲比例,𝐴𝑁𝐺𝑛为根据目标坐标转换的脉冲参数,𝑂𝐴𝑁𝐺𝑛激光当前坐 标的脉冲参数(𝑛取𝑥, 𝑦)。将转换后的脉冲数对与当前位置的脉冲数对进行比较,确定旋转量较 大的轴为主旋转轴,并将其对应的电机脉冲比例设置为 1,而对于旋转量较小的电机,根据脉冲 数对计算出相应的脉冲比例。
    追踪性能分析
    对于 A4 靶纸的黑色矩形轨道的追踪,由 K210 矩形识别和中位数极值滤波法共同完成。先通 过 K210 矩形识别函数识别出 A4 靶纸的黑色矩形轨道,并将矩形四个角的坐标传回主控制器。由 于矩形识别存在不稳定性,因此需要多次测量数据,并通过极值滤波去除极端值,也就是识别失 败数据带来的影响。中位数不受极值影响,具有良好的稳定性,具有一组相似数据的代表性,且 计算方便,因此采用中位数极值滤波法处理数据。 使 K210 传回十组数据,每组数据由四个二元数对,即四个角的坐标值组成,每组共八个数据, 对十组数据的八类数据分别进行排序,并求出每类数据的中位数,得到一组中位数数据,如公式 4 所示。
    𝑃𝐶[𝑚][𝑛] = 𝑃𝐷[ 𝑘 2 ][𝑚][𝑛]+𝑃𝐷[ 𝑘 2 +1][𝑚][𝑛] 2 (4)
    其中𝑃𝐶为处理后的中位数数据,𝑚为四个角下标(取值为 0—3),𝑛为 X,Y 轴,𝑘为数据数量, 此处为 10,PD 为测量数据。经过处理后的数据,可以有效排除由识别错误带来的误差,使之成为 稳定且可靠的矩形数据。 经过中位数极值滤波的数据,通过公式 5 进行 K210 与屏幕的坐标换算,以方便后续电机进行 控制。
    𝑛 = (𝑃𝐶 − 𝑙 2 ) ∗ ℎ𝑛 + 𝑓𝑛 (5)
    其中𝑛为取值 X,Y 的坐标值,PC 为经过极值滤波处理的中位数数据,𝑙为 K210 相应轴的长度, ℎ𝑛为对应坐标轴的放大系数,𝑓𝑛为对应坐标轴的偏差值。
    电路设计
    本次设计采用的主控芯片为 STC32G12K128,具有 32 个可用 I/O 口。步进电机驱动模块采用 具有过温,过压保护功能的 A4988 步进电机驱动器,其输出电流可通过可变电阻调节。电源采用 12V 航模电池供电,使用 TPS5450 为核心的稳压模块,降压为 5V,为单片机及其他模块供电。 OLED 模块,蜂鸣器模块,旋转编码器模块共同组成人机交互部分,以便于进行程序的调试和现象 第 5 页 的展示。由于单片机 I/O 口驱动能力有限,因此设计三极管开关电路驱动激光笔。K210 通过串口 与主控芯片相连,将识别到的目标坐标返回给主控芯片,总体电路图见图 6。
    运动目标控制原理
    控制激光在屏幕上移动,需要将移动的信息换算成控制电机旋转的脉冲和方向信号。将屏幕 位置以二维坐标系表示,并以屏幕的中心为原点,向上为 Y 轴正方向,向右为 X 轴正方向,则激 光在屏幕上的任意一个位置都可以以一个数对(x,y)表示,如图 5 所示。

    通过公式 1 将位置数对转换为脉冲数对。
    𝐴𝑁𝐺𝑥 = atan ( 𝑥 1000) ∗ 1528 (1)
    其中𝑥为位置参数,𝐴𝑁𝐺𝑥为转换后的脉冲参数。对得到的脉冲参数进行进一步处理,通过公 式 2 与公式 3 分别计算出 X 轴电机与 Y 轴电机的脉冲比例。
    𝑆𝐹𝑥 = { 1, |𝐴𝑁𝐺𝑥 − 𝑂𝐴𝑁𝐺𝑥 | ≥ |𝐴𝑁𝐺𝑦 − 𝑂𝐴𝑁𝐺𝑦| |𝐴𝑁𝐺𝑥−𝑂𝐴𝑁𝐺𝑥| |𝐴𝑁𝐺𝑦−𝑂𝐴𝑁𝐺𝑦| , |𝐴𝑁𝐺𝑥 − 𝑂𝐴𝑁𝐺𝑥 | < |𝐴𝑁𝐺𝑦 − 𝑂𝐴𝑁𝐺𝑦| (2)
    𝑆𝐹𝑦 = { |𝐴𝑁𝐺𝑦−𝑂𝐴𝑁𝐺𝑦| |𝐴𝑁𝐺𝑥−𝑂𝐴𝑁𝐺𝑥| , |𝐴𝑁𝐺𝑥 − 𝑂𝐴𝑁𝐺𝑥 | ≥ |𝐴𝑁𝐺𝑦 − 𝑂𝐴𝑁𝐺𝑦| 1, |𝐴𝑁𝐺𝑥 − 𝑂𝐴𝑁𝐺𝑥 | < |𝐴𝑁𝐺𝑦 − 𝑂𝐴𝑁𝐺𝑦| (3)
    其中𝑆𝐹𝑛为 n 轴电机的脉冲比例,𝐴𝑁𝐺𝑛为根据目标坐标转换的脉冲参数,𝑂𝐴𝑁𝐺𝑛激光当前坐 标的脉冲参数(𝑛取𝑥, 𝑦)。将转换后的脉冲数对与当前位置的脉冲数对进行比较,确定旋转量较 大的轴为主旋转轴,并将其对应的电机脉冲比例设置为 1,而对于旋转量较小的电机,根据脉冲 数对计算出相应的脉冲比例。
    追踪性能分析
    对于 A4 靶纸的黑色矩形轨道的追踪,由 K210 矩形识别和中位数极值滤波法共同完成。先通 过 K210 矩形识别函数识别出 A4 靶纸的黑色矩形轨道,并将矩形四个角的坐标传回主控制器。由 于矩形识别存在不稳定性,因此需要多次测量数据,并通过极值滤波去除极端值,也就是识别失 败数据带来的影响。中位数不受极值影响,具有良好的稳定性,具有一组相似数据的代表性,且 计算方便,因此采用中位数极值滤波法处理数据。 使 K210 传回十组数据,每组数据由四个二元数对,即四个角的坐标值组成,每组共八个数据, 对十组数据的八类数据分别进行排序,并求出每类数据的中位数,得到一组中位数数据,如公式 4 所示。
    𝑃𝐶[𝑚][𝑛] = 𝑃𝐷[ 𝑘 2 ][𝑚][𝑛]+𝑃𝐷[ 𝑘 2 +1][𝑚][𝑛] 2 (4)
    其中𝑃𝐶为处理后的中位数数据,𝑚为四个角下标(取值为 0—3),𝑛为 X,Y 轴,𝑘为数据数量, 此处为 10,PD 为测量数据。经过处理后的数据,可以有效排除由识别错误带来的误差,使之成为 稳定且可靠的矩形数据。 经过中位数极值滤波的数据,通过公式 5 进行 K210 与屏幕的坐标换算,以方便后续电机进行 控制。
    𝑛 = (𝑃𝐶 − 𝑙 2 ) ∗ ℎ𝑛 + 𝑓𝑛 (5)
    其中𝑛为取值 X,Y 的坐标值,PC 为经过极值滤波处理的中位数数据,𝑙为 K210 相应轴的长度, ℎ𝑛为对应坐标轴的放大系数,𝑓𝑛为对应坐标轴的偏差值。
    电路设计
    本次设计采用的主控芯片为 STC32G12K128,具有 32 个可用 I/O 口。步进电机驱动模块采用 具有过温,过压保护功能的 A4988 步进电机驱动器,其输出电流可通过可变电阻调节。电源采用 12V 航模电池供电,使用 TPS5450 为核心的稳压模块,降压为 5V,为单片机及其他模块供电。 OLED 模块,蜂鸣器模块,旋转编码器模块共同组成人机交互部分,以便于进行程序的调试和现象 第 5 页 的展示。由于单片机 I/O 口驱动能力有限,因此设计三极管开关电路驱动激光笔。K210 通过串口 与主控芯片相连,将识别到的目标坐标返回给主控芯片,总体电路图见图 6。

    程序设计
    本次系统软件设计采取了顺序控制的设计方法,根据每个任务的需要完成的步骤,按步设计 相应函数,完成控制任务。首先对各个外设进行初始化,保证其能够完成相应任务,之后图像处 理模块采集和处理,运动控制云台根据任务的不同执行不同的运动指令,完成控制任务,程序流 程图如图 7 所示





    https://www.stcaimcu.com/forum.p ... 4571&extra=page%3D1











    电话:0513-55012982、18106296593 (微信同)
    QQ : 1347154513
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 34 天

    [LV.5]常住居民I

    12

    主题

    185

    回帖

    1117

    积分

    版主

    STC

    积分
    1117
    发表于 2023-10-13 11:30:27 | 显示全部楼层
    本帖最后由 大刀阔斧 于 2023-12-13 17:19 编辑

    西安建筑科技大学 -2023电赛【E】题--运动目标控制和自动追踪系统(队伍编号1811E)国二,软件开源

    本次设计采用的主控芯片为 STC32G12K128,具有 32 个可用 I/O 口。步进电机驱动模块采用 具有过温,过压保护功能的 A4988 步进电机驱动器,其输出电流可通过可变电阻调节。电源采用 12V 航模电池供电,使用 TPS5450 为核心的稳压模块,降压为 5V,为单片机及其他模块供电。 OLED 模块,蜂鸣器模块,旋转编码器模块共同组成人机交互部分,以便于进行程序的调试和现象 5 的展示。由于单片机 I/O 口驱动能力有限,因此设计三极管开关电路驱动激光笔。K210 通过串口 与主控芯片相连,将识别到的目标坐标返回给主控芯片,总体电路图见图 6

    程序设计
    本次系统软件设计采取了顺序控制的设计方法,根据每个任务的需要完成的步骤,按步设计 相应函数,完成控制任务。首先对各个外设进行初始化,保证其能够完成相应任务,之后图像处 理模块采集和处理,运动控制云台根据任务的不同执行不同的运动指令,完成控制任务,程序流 程图如图 7 所示



    void main(void)
    {
            System_init();  //系统初始化        
            PIT_init_ms(0,1);                //用户任务定时器1ms
              PIT_init_us(1,400);                //步进电机脉冲专用定时器

            OLED_Init();

            Motors_Init();  //电机使能

            GPIO_init_pin(13,1);
            LASER=0;

            EA = 1;  //允许所有中断
            ET0=0;
            Delay_X_mS(200);
    //        Motors_Home(Y_axis,0,100);        //电机复位
    //        Motors_Home(X_axis,0,100);
    //        motor_go(2230,-102,40);  //从复位位置返回到设定X,Y中点
    //        while(motor_busy);
    //        Delay_X_mS(10);
            Set_motor_origin(X_axis);
            Set_motor_origin(Y_axis);


            LASER=1;
            OLED_ShowChar(0,6,'a',16);
            while(P32);

    //        Motors_Stop(X_axis);
    //        Motors_Stop(Y_axis);
            ET0=1;
            while(1)
            {
                            LED=!LED;


                            Laser_go(0,-250,5);                        //位置调试
                            while(motor_busy);
                            Delay_X_mS(100);
                            Laser_go(-250,-250,5);
                            while(motor_busy);
                            Delay_X_mS(100);
                            Laser_go(-250,250,5);
                            while(motor_busy);
                            Delay_X_mS(100);
                            Laser_go(250,250,5);
                            while(motor_busy);
                            Laser_go(250,-250,5);
                            while(motor_busy);
                            Delay_X_mS(100);


    //                        Laser_go(40,55,5);
    //                        while(motor_busy);
    //                        Delay_X_mS(100);
    //                        Laser_go(-240,55,5);
    //                        while(motor_busy);
    //                        Delay_X_mS(100);
    //                        Laser_go(-240,250,5);
    //                        while(motor_busy);
    //                        Delay_X_mS(100);
    //                        Laser_go(40,250,5);
    //                        while(motor_busy);
    //                        Delay_X_mS(100);


            }
    }

    void Task1(void) //任务1,电机失能,回原点
    {
            Motors_Stop(X_axis);
            Motors_Stop(Y_axis);
            LASER=1;
    }

    void Task2(void) //任务2,走500mm方框
    {
            LASER=0;
            Task_flag=1;


                    Laser_go(-250,-250,10);
                    while(motor_busy && Task_flag);
                    LASER=1;
                    Delay_X_mS(50);
                    Laser_go(-250,250,10);
                    while(motor_busy && Task_flag);
                    Delay_X_mS(50);
                    Laser_go(250,250,10);
                    while(motor_busy && Task_flag);
                    Delay_X_mS(50);
                    Laser_go(250,-250,10);
                    while(motor_busy && Task_flag);
                    Delay_X_mS(50);
                    Laser_go(-250,-250,10);
                    while(motor_busy && Task_flag);


            Task_flag=0;
    }

    void Task3(void) //任务3,走A4纸边框
    {
            LASER=0;
            Task_flag=1;

            Laser_go(39,47,10);
            while(motor_busy && Task_flag);
            LASER=1;
            Delay_X_mS(50);
            Laser_go(-245,47,10);
            while(motor_busy && Task_flag);
            Delay_X_mS(50);
            Laser_go(-242,242,10);
            while(motor_busy && Task_flag);
            Delay_X_mS(50);
            Laser_go(39,245,10);
            while(motor_busy && Task_flag);
            Delay_X_mS(50);
            Laser_go(39,47,10);
            while(motor_busy && Task_flag);

            Task_flag=0;
    }



    void Set_motor_origin(unsigned char Chs)        //电机位置初始化函数
    {
            switch(Chs)
            {
                    case X_axis:
                    {
                            Motors_Current[X_axis] = 0;
                            Motors_target[X_axis] = 0;
                            Motors_target_old[X_axis]=0;
                            X_MOTOR_OFFSET = Get_magnetic_pos(X_axis);  //记录当前磁编码器值
                    }break;
                    case Y_axis:
                    {
                            Motors_Current[Y_axis] = 0;
                            Motors_target[Y_axis] = 0;
                            Motors_target_old[Y_axis]=0;
                            Y_MOTOR_OFFSET = Get_magnetic_pos(Y_axis);   //记录当前磁编码器值
                    }break;
            }
    }


    void Motors_Init(void)        //步进电机电机初始化函数
    {
            GPIO_init_8pin(2,1);

            P23=1;  //步进电机细分设置
            P27=1;

            Motors_Current[X_axis] = 0;  //每轴绝对位置清0
            Motors_Current[Y_axis] = 0;


            X_Current =0.0;    //每轴实际位置清0
            Y_Current =0.0;


            Motors_Start(X_axis);  //电机使能
            Motors_Start(Y_axis);
    }


    代码链接 代码.rar


    源程序.zip

    1.2 MB, 下载次数: 9

    电话:0513-55012982、18106296593 (微信同)
    QQ : 1347154513
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 34 天

    [LV.5]常住居民I

    12

    主题

    185

    回帖

    1117

    积分

    版主

    STC

    积分
    1117
    发表于 2023-10-13 11:33:21 | 显示全部楼层
    本帖最后由 大刀阔斧 于 2023-10-13 13:23 编辑

    西安建筑科技大学 -2023电赛【E】题--运动目标控制和自动追踪系统(队伍编号1811E)国二,硬件开源
    滚轴控制任务要求分析
    任务及要求
    设计一滚轴控制系统,由轨道和滚轴组成,轨道长度30-100cm,轨道上标识20个刻度,一端从0开始至另一端为20,轨道能使得滚轴在轨道上自由滚动,设计相关机构使得轨道倾斜角度可调,通过检测滚轴位置实现对滚轴的控制,完以下任务。
    基本要求:
    1.        系统能通过屏幕显示轨道上是否存在滚轴并显示滚轴当前处于轨道的相对位置0-20(显示字体高度大于8mm)。
    2.        初始将轨道水平,滚轴放于轨道中间位置10,要求滚轴放置后不发生自主滚动,并至少维持5秒。
    3.        初始将轨道水平,滚轴位于轨道位置0,一键启动系统,控制系统可使滚轴滚动至轨道另一端20位置并停止,滚轴不能脱离轨道。
    4.        初始将轨道水平,滚轴初始放于轨道位置0,一键启动系统,滚轴控制系统可在30秒内控制滚轴位置处于轨道中点位置10处并保持至少10秒,位置误差小于3刻度。
    发挥部分:
    1.        初始将轨道水平,滚轴放于轨道中间位置10,一键启动系统,滚轴控制系统可在20秒内控制滚轴处于轨道位置15处并保持至少10秒,位置误差小于1刻度。
    2.        初始将轨道水平,滚轴初始放于轨道中间位置10,一键启动系统,滚轴系统可使滚轴往返于轨道1/4处和3/4处,两端位置误差3刻度,要求100秒内完成3次往返,最后回到中间位置10。
    3.        初始将轨道水平,滚轴初始放于轨道中间,一键启动系统,滚轴系统可使滚轴先前往轨道1/4处直到静止,位置误差小于1刻度,随后开始前往轨道3/4处,从开始滚动计时,直道第一次经过3/4处停止计时,要求时长10s±1s。
    主控系统方案
    在本设计中,采取STC32系列单片机STC32G12K128-Beta(如图1—1)为主控控制器,STC32G 系列单片机是不需要外部晶振和外部复位的单片机,是以超强抗干扰/超低价/高速/低功耗为特点的 32 位 8051 单片机,在相同的工作频率下,STC32G 系列单片机比传统的 8051 约快 70 倍。


    STC32G 系列单片机是 STC 生产的单时钟(1T)的单片机,是宽电压/高速/高可靠/低功耗抗静电较强抗干扰的新一代32 位 8051 单片机,超级加密。有 268 条强大的指令,包含 32 位加减法指令和 16 位乘除法指令。硬件扩充了32 位硬件乘除单元 MDU32,对比传统51单片机,STC32G 系列单片机技术成熟,硬件齐全,故选用STC32G12K128-Beta作为主控控制器。

    测距模块
    方案一:超声波测距
    超声波是一种频率高于20000Hz的声波。具有频率高、波长短、绕射现象小,特别是方向性好、能够成为射线而定向传播等特点。超声波测距类似于回声定位。


                     图1—2超声波测距模块
    在超声波测距模块(如图1—2)的应用中,单片机控制超声波测距模块的超声波探头发送超声波,同时利用单片机开始计数,超声波在空气中传播遇到障碍物时便会反射回来,当超声波接收探头接收到此信号时,就立即停止计数。单片机把计得的时间差进行运算,以此来计算车与障碍物的距离。
    1.2.2方案二:激光测距
    相位式激光测距仪(如图1—3与图1—4)是用无线电波段的频率,对激光束进行幅度调制并测定调制光往返测线一次所产生的相位延识,再根据调制光的波长,换算此相位延迟所代表的距离。即用间接方法测定出光经往返测线所需的时间。相位式激光测距仪一般应用在精密测距中。
    图1—3激光测距模块

    图1—4激光测距模块参数表



    激光测距相比超声波测距,具有更加高的精度,且受环境影响较小,因此在设计中选择了激光测距作为测距手段。



    轨道设计
    在轨道设计上,选取两根半径4mm玻璃纤维管作为轨道主体,使用3D打印件作为轨道两端支撑(如图1—6与图1—7)。其中左端支撑连接舵机,舵机转轴连接一支撑杆,通过舵机转动带动支撑杆上下运动以控制架设其上的轨道的角度调整。右端架设激光测距模块,使得激光测距始终与轨道平行。

    滚轴设计
    在设计过程中经过多次试验,最终采取了柱锥体滚轴(如图1—8)设计。
                            图1—8 柱锥体滚轴

    柱锥体滚轴没有了两侧的限位槽设计,增大了滚轴与轨道接触面的角度使其可以在轨道上顺滑的滚动而不发生旋转,卡死等现象,并且减少了滚轴内部填充的密度,减轻了滚轴的质量使其更加容易控制。


    显示模块设计
    常用的显示屏幕模块大体分为两类LCD屏幕和OLED屏幕,LCD的有LCD1602,LCD12864等OLDE屏幕有0.96寸OLED,1.54寸OLED等,本次设计选取了0.96寸OLED屏幕(如图1—9),既能满足题目显示要求字体大于8mm的要求,又节省空间,并且价格较低性价比高。
    图1—9 0.96寸OLED

    旋转编码器开关模块设计
    旋转编码开关(如图1—10)又称小型旋转编码器,是指具有一组有规律且严格时序脉冲的开关电子元器件,通过与IC的配合,起到递增、递减、翻页等功能,例:鼠标的翻页,菜单的选择,音响的声音与调节,频率的调节,温度的调节,医用器械的频率调节等。
    按结构可将其分为机械式旋转编码开关和光电式旋转编码开关。所谓机械式旋转编码开关,是指通过信号配合零件的规律转动(或移动)形成触点接触而产生规律脉冲的编码产品,其寿命具有较大的局限性;光电式旋转编码开关,是指通过光源耦合,形成的无接触点接触而产生规律脉冲的编码产品,其寿命极长。

    本次设计中采用了机械式旋转编码开关,以此完成一键启动的需求同时又能实现多个任务之间的切换



    测距原理及方法
    相位式激光测距通常适应于中短距离的测量,测量精度可达毫米、微米级,也是目前测距精度最高的一种方式;大部分短程测距仪都采用这种工作方式。相位式测距则是将一调制信号对发射光波的光强进行调制,通过测量相位差来间接测量时间,较直接测量往返时间的处理难度降低了许多。测量距离如公式1-1所示。
    2L=∅*C*T/2Π                (1-1)
        式中L为测量距离,C为光在空气中传播的速度,T为调制信号的周期时间,∅为发射与接收波形的相位差。

    图2—1 相位式激光测距原理示意图
    PID控制方法
    在PID控制算法是工业控制领域的一个最为实用和经典的算法,原理简单,易于实现,适用面广。本次设计中对于舵机角度以及速度中运用了PID控制。PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。是结合比例、积分和微分三种环节于一体的控制算法,它是连续系统中技术最为成熟、应用最为广泛的一种控制算法。
    在舵机调整中,采用分段PID应对转轴远离与转轴靠近设定位置,以使舵机控制更加丝滑。在设计时亦尝试过使用增量式PID,但由于滚轴在低速下控制并不需要过于对舵机速度PID控制,而且增量式PID需要考虑速度及速度积分等更加复杂的实际情况,但实际调试的结果并没有太大差异,因此一般的位置式已经足够使用,舵机精度符合需求。
    PID算法是一种闭环控制算法。其满足闭环控制规律,框图如下:


    图2—2 闭环控制框图

    当以微控制器为大脑,激光测距作为信息传输通道,可以实现系统的控制。控制框图如下。这里使用STC的微控制器STC32G128k。
                               

    图2—3 PID计算原理框图
    激光测距模块
    本次设计中采用的激光测距是通过对激光相位差的检测,感知目标物距离,可以达到毫米级的分辨率;温度适应能力强,漂移量较小;
    高信噪比使得目标物的颜色、表面粗糙度和材质等对检测结果影响很小;小体积,更方便使用;
    在使用时需要先使用TTL转USB接口,将激光测距模块与PC相连接,使用串口助手设置测量方式为上电即测,连续测量,设置波特率为115200。然后需将设置好的激光测距模块与主控系统相连,采用串口通信的方式接线如图3—1。

    图3—1 激光测距模块连线示意图


                 各引脚功能如表3—1。

                   表3—1 激光测距模块引脚表

                      5V        电源正极(3.3-5V)

    GND        电源地

    RX        接串口TX

    TX        接串口RX


    电源及稳压模块
    在本次设计中采用了12V航模电池(如图3—2)为主控系统与舵机进行供电,航模电池具有放电能力强,储能效果好等优点,将其与主控模块的供电模块相连接。

    图3—2 12V航模电池

    经过稳压模块降压为5V后给主控系统的各个模块进行供电。稳压模块主要采用TPS5450芯片,设计相应稳压电路如图3—3。

    图3—3 稳压模块原理图

    电路中设计为6V,5V,3.3V三种常用电压,根据主控芯片为STC32G28k(如图3—4)选择调节为5V稳压。STC32G28k各引脚功能如表3—2所示。

    图3—4 稳压模块

    表3—2    STC32G28k引脚功能表

                         IN        接电源供电电源12V
      
    GND        接地

              OUT        稳压输出5V


    OLED显示模块
    本设计中采用四针脚的0.96寸OLED屏幕引脚功能如表3—3所示。
          表3—3 OLED引脚功能表

    GND        电源地

               VVC        正极(供电3.3-5V)

    SCL        IIC时钟线

    SDA        IIC数据线

    将其接入主控系统中OLED预留模块,OLED模块电路如图3—5所示。

    图3—5 OLED引脚图

               硬件总设计图如图3—6所示。








    图3—6 硬件总设计图
    2023电赛备赛送药小车训练第一篇

    以STC32G128K单片机为核心、结合视觉识别技术,通过速度闭环、位置闭环和方向闭环来控制智能送药小车,并实现双车在预定轨道上送药,取药。
    基本模块主要包括主控、摄像头、灰度传感器、直流减速电机、驱动模块,稳压模块,mpu6050,蓝牙模块,本设计主控选择STC32G128K。
    摄像头采用K210,用于识别数字和寻找对应数字并通过串口向主控发送识别信息,从而进入对应的病房。灰度传感器用来寻迹,防止小车偏离预定轨道;
    小车1,2通过蓝牙模块来完成双车通信,实现双车协同运送的效果;通过电机编码器反馈的信息设计小车的速度闭环控制系统,实现运输距离的精准控制。
    经过检测发现,本设计具有识别速度快,识别精准度高,运输稳定且效率高等优点。
    控制方案设计
    根据题目要求,将小车系统分为4个基本模块,包括主控模块、电机驱动模块、视觉检测和识别模块,无线通讯模块,主控选择STC32G128K,通过速度闭环来实现电机驱动的精准控制。
    机械结构方案
    由于题目要求小车的长宽高不能超过25cm*20cm*25cm,再加上赛道的宽度只有30cm,为了保证转向的时候能够避免碰到黑实线,我们采用双驱动置于车身中间,车身前后分别装置牛眼轮便于转向。


    根据设计要求和实际情况,摄像头安装于车头前端,以便于识别和检测。
    由于识别数字时数字宽度较大,K210无法全部识别到数字,所以识别时,实时控制两个驱动轮的位置来达到扩大视野范围的目的。


    送药小车数字识别方法和自动循迹方法。
    数字识别方法
    首先将1-8字模原比例打印出来,然后用K210进行模型训练,模型训练了几千张模型,生成训练样本矩阵,一般样本是以二维矩阵的方式存在文件当中,现在要将它们读出来,进行适当的预处理,然后生成OpenCV能理解的数据结构。
    其中包含了分别从不同的视角对图像进行采集入库,在通过NCC模板匹配训练产生数字分类器,训练样本中的数字位置形态各异,因此读入时需要进行规整化。
    主要方法是先找到数字的边界框,然后以宽和高中大的一边为基准进行缩放和拉伸,从而使得其可以占满整个表示单个样本的矩阵。
    再将其图像二值化,进行腐蚀分割,前面通过学习产生了分类器,但我们输入图像中的数字并不能直接作为测试输入。图像中的数字笔画有时并不规整,还可能相互重叠。
    接下来,就可以对图像进行分割了。由于我们的分类器只能对数字一个一个地识别,所以首先要把每个数字分割出来。分割完后就可以应用我们前面训练好的分类器对分割结果进行识别。
    自动寻径方法
    首先对灰度传感器传回的数据进行相关预处理,采集和传输过程中可能产生噪点,通过滤波减小干扰。
    已知:每一个灰度值i出现的概率为p=n/ N;






    紧接着,运用线性回归(Linear Classification)算法进行寻线。
    最后向STC32提供反馈信息,控制电机进行自动寻径。
    小车电机运动闭环控制算法
    依靠编码器反馈数值,通过速度闭环解决对小车行驶距离的把控,本小车所采用的PID算法是闭环控制系统中常用的控制算法之一,其全称为比例积分微分控制。
    其传递函数如下:



    再配合灰度传感器二值化处理寻线辅助和K210数字识别并将相关数据通过串口反馈给主控板最终实现小车的精准控制。
    通过配置串口的波特率便可以控制串口通讯的速率。
    为保证数据接收正常,本设计通过对控制系统中的STC32G128K单片机进行编写通信协议程序,以防止无线接收模块在受到干扰的情况下收到错误指令而使小车失控的情况发生。
    小车1的程序设计思路
    在识别目标病房号后,判断是否为近端,如果为近端则直接第一个十字路口转对应方向,否则直行至第二路口,判断是否为目标数字。
    如果是,则转对应方向,否则直行至T型路口左转,判断判断是否为目标数字,如果否,则转至T型路口对面,识别目标数字方位并转弯。
    识别虚线点后停车,发送位置信号给小车2,同时检测小车2回馈信号和药品是否卸载,在卸载药品完成条件下,如果检测到回馈信号则为双车模式,等待小车2,发送到达指定位置信号,则开始启动返回,否则为单车模式,直接按记忆路线返回。

    小车2的程序设计思路
    发送反馈信号给小车1,开始识别目标病房号,检测是否装药,如未装药且接收到小车1位置指令,则取药模式,运行到T型路口处小车1对面支路并识别是否为目标数字,如果否,则转至T型路口对面,识别目标数字方位并转弯,识别虚线点后停车。
    如装药且接收到小车1位置指令,则送药模式,小车2运行到指定位置停车且发送反馈信号,当接收到小车1继续运行指令则倒车回十字路口识别目标数字方位并转弯,识别虚线点后停车。



    电话:0513-55012982、18106296593 (微信同)
    QQ : 1347154513
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-28 18:28 , Processed in 0.087198 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表