自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(77)
  • 收藏
  • 关注

原创 c# OpenCv 2-使用haarcascade模型进行人脸识别

3. 使用cascade以及模型文件(本例使用的是人脸正面)对图片进行预测。1. 读取cascade模型文件。2. 对输入的图片进行灰度处理。步骤如Test,截取出人脸照片。

2024-04-09 09:20:42 390

原创 c# OpenCV -1 直接比对两张图片

输入两张图片,返回比对结果: DrawMatches.Test(arrICs[3], arrICs[1]);本例基于EmguCv...

2024-04-09 09:18:41 164

原创 在MicroPython中启用基于spiflash的LFS挂载文件系统

概述总体的思路是:自顶向下逐步启用mpy-cross编译,将Python程序集成到固件中自底向上逐步添加sfud组件并启用lfs合龙,创建mm32f3.flash模块,封装sfud,并由集成到固件中的Python程序调用mm32f3.flash模块。启用frozen_moduleMicroPython加载lfs使用了同之前加载fatfs不同的方式,通过向固件程序中集成Python语言编写的脚本来加载lfs文件系统。在C语言编写的MicroPython固件中加载Python语言程序的机制,就是所

2024-01-19 09:21:37 970

原创 在mm32f3270上为MicroPython启用Signal模块

原本以为放开在machine的类清单中对Signal类型的定义就能通,虽然能够通过编译,但在实测中并不能操作引脚。在代码仓库里搜索“mp_pin_p_t”,发现esp系的port中,machine_pin.c中有相关的引用。特别注意,machine_pin_type中的一个字段:“ .protocol = &pin_pin_p,”这里调用了mp_pin_p_t中的ioctl函数,它是在virpin.h中声明的,这是哪里定义的呢?但是在mm32的machine_pin_type的实现中就没有这个字段。

2024-01-18 11:31:22 350

原创 解决MicroPython执行SD卡中的main.py文件中的死循环出不来的问题

前文(尚未发布)提到,我目前已经启用Thonny对接KE18F/F3270上的MicroPython,但如果把main.py写成死循环(在实际开发时,必须写成死循环,否则程序执行完就不工作了),复位开发板后,由于MicroPython直接进入main.py中的死循环,调度器始终占用CPU,再没有机会进入REPL同Thonny对接了。解法只能是把SD卡取下来,改掉其中的main.py文件的死循环,再把SD卡装回去,重新启动开发板。我曾想试着利用CTRL+C打断调度器,但不起作用。

2024-01-18 10:43:07 358

原创 在mm32f3270上为micropython创建ADC模块(1)

额,算了,ADC可能不是一个单独的模块。当然,预先指定通道的事情,可以让ADC()实例化函数搞一下,当实例化一个ADC采样通道时,实际上后台已经开始转换了,并且周期地将最近一次转换结果保存到一个缓冲区中,这样当启动read_u16函数时,可以直接从缓冲区中读到最近的采样结果,这样做可以保证读数时直接拿到结果,不等待,但特别费电,ADC转换器在后台一直不停地工作。从面向对象的角度,用户看到的是引脚,才不关心内部是怎么分配的引脚号,实际转换的时候,用户也看不到分配的通道号,操作的是引脚对象而已。

2024-01-18 10:32:42 340

原创 micropython 自制数码相机

TPYBoard v102主控芯片采用STM32F405,M4的内核,168MHZ的最高运行速度,1024KB的Flash,192KB的。30 个通用GPIO 接口、 2个 SPI 接口、2个 CAN 接口、2个I2C 接口、 5个 USART 接口、 2个ADC接。其中对于串口控制拍照,读取静态图片的应用中,只需要用到 GND,RX,TX,VCC 这 4 个信号线。上电后,等待ToyBoard v102板载绿灯亮起,说明摄像头模块初始化完毕,按一下USR键,控制摄像头进行拍。

2024-01-18 10:06:25 823

转载 ESP32-CAM 使用 MicroPython 完成视频网络服务器 (Web Video Stream)

ESP32-CAM 是安信可发布小尺寸的摄像头模组。该模块可以作为最小系统独立工作,尺寸仅为2740.54.5mm。ESP32-CAM可广泛应用于各种物联网场合,适用于家庭智能设备、工业无线控制、无线监控、人脸识别以及其它物联网应用,是物联网应用的理想解决方案。ESP32-CAM采用DIP封装,直接插上底板即可使用,实现产品的快速生产,为客户提供高可靠性的连接方式,方便应用于各种物联网硬件终端场合。开发环境准备。

2024-01-18 10:01:43 264 3

原创 在mm32f3270为micropython创建Pin模块(2)

上文书说,已经搭建了一个基本的能够在REPL中引用到的Pin模块。为了规避Hardfault的问题,暂时屏蔽了history的功能。勉强已经可以用起来了。本文将要打通python对底层硬件的操作,进一步完成Pin模块。本文可能会涉及到引脚表的设计问题make_new()感觉在machine_pin_obj_make_new()里检查这个参数清单没啥功能性作用。如果参数无效,则直接报错?后来在试用程序的过程发现挺有用的,当用户输入参数不正确时,会提示错误类型。

2024-01-17 10:32:09 388

原创 在mm32f3270为micropython创建Pin模块(1)

考虑到history可能涉及到的地方比较多,我试着找了找能不能通过某个用户选项把history相关的功能都关掉,未果,只好人工mask掉这一句,并且祈祷尽量别碰到使用history的场景。在“ports/mm32”目录下创建“machine_pin.c”,此文件专用于存放pin类的实现,是“modmachine.c”总类的下属。一点长远的考虑,timer的类原本是在minimal中的,它对硬件的依赖并不复杂,短时间也考虑实现出来。在“machine_pin.c”文件中编写与底层无关的框架代码,见附件。

2024-01-17 10:23:02 366

原创 micropyton源码-添加C扩展类模块(2)

回到ports/mimxrt/machine_pin.c文件,同machine_pin_type并列定义的还有“machine_pin_af_type”,在“pin.h”和“ports/mimxrt/boards/mimxrt_prefix.c”文件中有所涉及,关于指定引脚功能复用的,似乎也作为一个实例对象定义的,但未被注册到任何模块中,暂且放过,待看完machine_pin_type后再回来看。关于“mp_obj_type_t”的定义,具体可参见“py/obj.h”文件,此处仅对必要的字段进行解释。

2024-01-17 10:15:31 868

原创 micropyton源码-添加C扩展类模块(1)

这个结构体中定义了mp_module_machine 对象内部的属性清单,并建立一个类似于python中map的表,这样在micropython内核中,就可以通过QSTR字符串“Pin”,找到指向machine_pin_type结构体实体的指针,我们或可认为通过python内部的某种机制就可以通过“.”这个字符,映射到其对应的内存块。在py/objmodule.c文件中,mp_builtin_module_map被函数mp_module_get()引用,在映射表中通过模块名字查询对应实体。

2024-01-17 10:05:06 437

原创 Micropyth关于_thread(多线程)开发的二次应用

介绍了_thread(多线程)的基础讲解,这次将结合UART(串口)开进行开发应用讲解。串口在日常的设计中是一个非常常见的东西,所以熟练掌握是基本知识。下面,就来介绍一下关于串口与_thread 结合的一个小程序。下面是所需要准备的东西。硬件设计:Rasspberry Pi Pico开发板(应用Micropython开发)USB转TTL开发板软连线上面显示了其连线示意图。

2024-01-17 09:58:49 442

原创 阅读micropython源码-内存管理组件GC

estack和_sstack就是系统栈,_gc_heap_start和_gc_heap_end代表了整个ocrm的空间。gc_collect()函数的实现依赖于具体的CPU架构,需要根据移植平台实现,中间涉及到获取系统栈中CPU寄存器值及监管范围的操作,不同的处理器有所区别,所以需要用户实现,但大部分通用操作已经由gc_collect_xxx()的其它函数实现了,所以用户在具体的移植中实现gc_collect()时,可调用其它gc_collect_xxx()函数完成大部分功能。

2024-01-10 11:38:44 932

原创 移植micropython最小工程(补充)-移除frozentest.mpy

从makefile文件中可以看到, "$(BUILD)/_frozen_mpy.c"文件是通过向mpy-tool.py工具传入frozentest.mpy, 在build过程中自动生成的. 删除相关的make环节之后, 在最小移植中不需要管mpy-tool.py中的"python3"问题, 同时 也可以在移植项目的根目录下删除frozentest.py和frozentest.mpy这两个不相干的文件了.在最小移植中移除对frozentest.mpy的依赖。

2024-01-10 11:28:46 361

原创 为micropython添加模块(2)-类模块

在pyb目录下创建pin.c/.h文件,包含Pin类定义的主体内容暂时不用管这里包含的头文件的含义,只要照抄就行。唯一有用的一句话是最后一句,定义了“pyb_pin_type”的一个类型实例,这个类型实例将在pyb.c文件中被整合到pyb模块下面。pin.c文件中实现mpy通过C语言操作硬件的功能函数。这个文件里可以直接包含C源代码的驱动程序文件,可以像平时写C语言的单片机程序一样自由发挥。例如:这些代码同用C语言操作底层寄存器的代码没有任何区别。

2024-01-10 11:04:53 837

原创 为micropython添加模块(1)-全局模块

根据官方描述步骤创建一个led模块为新模块创建一个源文件参考官方样例的命名规范, 这里在lpc5500移植项目的目录下创建mod_led.c。

2024-01-10 10:43:24 805

原创 Arduino运行FreeRTOS操作系统

我们从一开始接触Arduino编程就知道,Arduino程序结构由setup()和loop()两部分组成,我们需要反复执行的代码要放在loop()中,并且这些代码一般都是顺序执行的。随着我们需要实现的功能越来越复杂,这种顺序执行的方式很难达到实时性,这个时候就需要使用操作系统了,就类似于我们的PC机,可以同时运行多个软件,你可以一边聊QQ一边看电影,或者你用手机一边听歌一边看这篇文章。当然PC机和手机的处理器要强大的太多太多了,而我们的Arduino UNO开发板上使用的是一颗8位的AVR单片机。

2024-01-04 10:20:10 1250

原创 Arduino Nano 驱动OLED滚动显示

尽管Uno R3开发板是Arduino家族中入门级别的首选,但无奈它的体积实在有些大,我们实际中很多设计都需要考虑外形结构,小巧便捷而又功能齐全的Arduino Nano开发板就脱颖而出了。本篇我们使用Arduino Nano开发板来驱动0.91寸OLED滚动显示。1. Arduino Nano开发板Arduino Nano开发板是基于ATmega328的小巧且完整的Arduino系列开发板,兼容Arduino程序,你可以在官网找到它的详细资料。它的主要特点如下:微控制器:ATmega328。

2024-01-03 14:08:38 987

原创 Arduino提高篇(二十六)贪吃蛇游戏

之前文章Processing笔记05—贪吃蛇小游戏分享过如何使用Processing来实现贪吃蛇游戏,很多小伙伴问可不可以来个Arduino版本的,那么本篇就通过Arduino,配合摇杆按键和OLED显示屏来实现贪吃蛇游戏。1. 实验材料Uno R3开发板配套USB数据线面包板及配套连接线双轴按键摇杆模块OLED显示屏2. 实验步骤1. 根据原理图搭建电路图。OLED屏的VCC、GND分别连接开发板的3.3V、GND,OLED屏的SDA和SCL分别连接开发板的A4和A5。

2024-01-03 12:09:07 690 1

原创 Arduino提高篇(二十五)手势识别

随着科技的发展,人机交互也发生了翻天覆地的变化,从最开始的手动控制,到后来的遥控,再到语音识别以及图像识别。一切都是为了解放人类,毕竟能吵吵就不会动手对不对,现在都懒得吵吵了,图像识别分析就好。本篇我们来介绍高大尚的手势识别,用手比划就能进行控制了。1. APDS-9960模块介绍APDS-9960是一个体积非常小的传感器,它集成了非接触手势检测、接近检测、数字环境亮度测量和色彩检测等诸多功能。很多手机上也采用了该传感器,例如三星的Galaxy S5。

2024-01-03 11:54:21 359

原创 Arduino提高篇(二十四)摇杆调节时钟时间

对于电子时钟而言,虽然我们可以在程序中对RTC芯片写入初始时间数据,但按键调时功能也是必不可少的,它可以让我们更加灵活的进行时间调节校准。本篇我们使用摇杆按键来调节时间数据,采用多级菜单的思路进行设计,关于多级菜单的介绍可以参考之前的文章Arduino提高篇15—摇杆操作OLED多级菜单。1. 菜单显示结构本实验中显示菜单结构如下图所示:其中menu00是首页正常的时间日期显示界面,然后通过摇杆按键切换页面,进行日期调节和时间调节选择,然后对应跳转年月日和时分秒的调节页面。

2024-01-03 11:41:53 368

原创 Arduino提高篇(二十三)OLED电子时钟

在前篇文章中,我们通过库函数驱动DS1302获取到时间数据并且通过串口输出,而串口只是方便调试,要制作电子时钟,我们需要使用显示模块,本篇结合OLED对时间数据进行展示。1. 实验材料Uno R3开发板配套USB数据线公对母杜邦线面包板及配套连接线OLED显示屏DS1302模块2. 实验步骤1. 根据原理图搭建电路图。在前篇基础上添加了OLED模块连接。DS1302模块的VCC和GND连接Uno开发板的3.3V和GND。

2024-01-03 11:35:49 766

原创 Arduino提高篇(二十二)实时时钟DS1302

很多电子爱好者都热衷制作电子时钟来练手,这些时钟会使用数码管、点阵屏、LCD液晶屏、OLED屏、TFT屏等显示模块,所使用的RTC时钟芯片也各不相同,DS1302、DS3231、DS12C887等。通过单片机等MCU驱动RTC模块,读取时间数据并交给显示模块进行展示,还可以加入按键来调节时钟,可以说是一个非常全面的练手项目。本篇我们来学习DS1302的使用,通过库函数来驱动DS1302获取时间数据。1. DS1302介绍。

2024-01-03 11:28:15 923

原创 Arduino提高篇(二十一)RFID模块门禁设计

RFID可应用于门禁系统,我们可以把数据写入标签,然后将有权限的标签进行记录保存,当有用户标签被扫描时,进行身份信息读取比对,然后根据权限进行相应的操作。本篇配合OLED屏幕来模拟门禁系统,只对标签的UID进行简单对比判断,当然你也可以设置好自己的密钥,然后将数据写入到标签,进行更加严谨的身份识别。1. 实验材料Uno R3开发板配套USB数据线面包板及配套连接线OLED显示屏RFID-RC522模块及配套S50白卡和异形卡2. 实验步骤1. 根据原理图搭建电路图。

2024-01-03 11:20:22 783

原创 Arduino提高篇(二十)S50卡数据读写

RC522模块不但可以读取标签中的数据,还能将数据写入标签中,本篇介绍S50卡的写卡操作。1. S50卡介绍S50非接触式IC卡的容量为1K字节EEPROM,又称M1卡。内部EEPROM又分为16个扇区,每个扇区分4个块,以块为存取单位,每个块由16个字节组成。1. M1卡主要指标:每个扇区有独立的一组密码和访问控制。每张卡有唯一32位序列号。无电源,自带天线,内含加密控制逻辑和通讯逻辑电路。数据保存期为10年,可改写10万次,读无限次工作频率:13.56MHZ。

2024-01-03 11:14:25 548

原创 Arduino提高篇(十九)RFID模块的使用

射频识别「Radio Frequency IDentification,简称RFID」技术,又称为无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触,普遍应用于企业/校园一卡通、公交储值卡、高速公路收费、停车场、小区管理等。本篇介绍FRID-RC522模块的使用。1. RFID模块RFID 技术利用无线射频方式在阅读器和射频卡之间进行非接触双向数据传输,以达到目标识别和数据交换的目的。标签(Tag,即射频卡),耦合元件及芯片组成

2024-01-03 09:31:18 981

原创 使用VSCode开发Arduino

Arduino自家的IDE环境一直很简陋,没有语法高亮,没有代码补全,不能快速查找跳转函数及变量,在开发稍微复杂一点的项目时很是痛苦。有时候需要查看库文件代码,也只能在电脑中搜索文件名去打开。VSCode简介VSCode是当下比较流行的编辑器,有着轻量化、跨平台、大量插件支持等特点,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分等。VSCode上也有Arduino的插件,集成了Arduino上全部的功能,不管是编码烧录还是导入库之类的都可以在上面完成。搭建环境。

2024-01-02 15:52:49 661 1

原创 Arduino提高篇(十八)MPU6050数据3D展示

对MPU6050姿态解算得到欧拉角后,就可以应用于四轴等对姿态进行控制了。为了更直观的理解三个欧拉角,本篇我们使用Processing软件与Arduino进行交互,将MPU6050数据进行3D建模展示。1. Processing介绍Processing是一种文本编程语言,主要用于处理可视化数据,并可以将数据呈现为2D或3D模型。它以Java语言为基础,并且做了扩展和延伸,将计算机编程和艺术创作完美结合,将代码转换成千变万化的图像。

2024-01-02 15:46:20 917

原创 Arduino提高篇(十七)MPU6050姿态解算

对于大多数MPU6050的应用来说,获取到的原始数据并没有多大用处,我们需要对原始数据进行姿态融合解算,最终得到姿态数据,也就是三个欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。MPU6050内部自带数字运动处理器(DMP)硬件加速引擎,配合运动驱动库直接输出四元数,进而很方便的计算出欧拉角,大大降低了主控MCU的负担。本篇使用MPU6050的驱动库来获取姿态数据。1. MPU6050驱动库安装。

2024-01-02 15:37:58 1571

原创 Arduino提高篇(十六)六轴姿态MPU6050

惯性测量单元「Inertial measurement unit,简称 IMU」可以帮助我们在三维空间中获取物体当前三维位置的值,这些值可以用来帮助我们确定物体的精确位置,例如检测智能手机的水平或倾斜状态或是使用IMU传感器来追踪运动状态等。IMU传感器在汽车、自平衡机器人、四轴飞行器、惯性导航等设备上广泛应用。六轴姿态传感器MPU6050是IMU传感器系列的一种,本篇介绍如何驱动其获取原始数据。1. MPU6050传感器介绍。

2024-01-02 15:23:38 855

原创 Arduino提高篇(十五)摇杆操作OLED多级菜单

本实验中定义了9个界面,所以如上数组元素有9个,其中界面索引号从0到8,分别对应其界面函数指针。本实验中一级菜单有2个,二级菜单有3个,三级菜单有4个。3. 确定各按键按下需要跳转的界面索引。这一步骤确定了各界面之间的切换关系,非常重要。在此之前可以通过草图来整理菜单之间切换关系,如下所示为本实验9个界面之间的关联图。

2024-01-02 15:16:19 1657

原创 Arduino提高篇(十四)摇杆按键操作OLED

摇杆在很多应用场合被用来替代轻触按键,不但操作上方便,而且一个摇杆可替代多个按键,这使得电路设计得到简化。本篇演示如何将摇杆扭转的四个方向作为四个按键来操作OLED显示。1. 实验材料Uno R3开发板配套USB数据线面包板及配套连接线双轴按键摇杆模块OLED显示屏2. 实验步骤1. 根据原理图搭建电路图。OLED屏的VCC、GND分别连接开发板的3.3V、GND,OLED屏的SDA和SCL分别连接开发板的A4和A5。

2024-01-02 15:09:47 487

原创 Arduino提高篇(十三)摇杆控制OLED移动显示

很多经典的小游戏,例如贪吃蛇、俄罗斯方块等都是通过按键控制显示于屏幕,当摇杆遇上显示屏,我们可以尝试很多有意思的实验。本篇通过摇杆控制OLED上圆的移动。1. 实验材料Uno R3开发板配套USB数据线面包板及配套连接线双轴按键摇杆模块OLED显示屏2. 实验步骤1. 根据原理图搭建电路图。OLED屏的VCC、GND分别连接开发板的3.3V、GND,OLED屏的SDA和SCL分别连接开发板的A4和A5。

2024-01-02 14:35:33 463

原创 Arduino提高篇(十二)双轴按键摇杆

摇杆一般在航模、电玩、遥控车、云台等设备上应用广泛,很多带有屏幕的设备也经常使用摇杆作为菜单选择的输入控制。本篇介绍双轴按键摇杆的使用。1. 双轴按键摇杆介绍双轴按键摇杆主要由两个10K的电位器和一个按键开关组成,两个电位器随着摇杆扭转角度分别输出X、Y轴上对应的电压值,在Z轴方向上按下摇杆可触发轻触按键。在配套机械结构的作用下,无外力扭动的摇杆初始状态下,两个电位器都处在量程的中间位置。不同厂商生产的按键摇杆模块的引脚输出会有所不同,但都会有VCC、GND电源引脚和X、Y、Z输出引脚。

2024-01-02 14:29:54 762

原创 Arduino提高篇(十一)烟雾传感器MQ-2

MQ系列传感器是使用非常广泛的低成本传感器,广泛应用于家庭或工厂的气体泄漏监测装置。本篇介绍MQ家族中的MQ-2烟雾传感器的使用,其他MQ传感器使用都是相类似的。1. MQ系列传感器工作原理MQ系列传感器使用的敏感材料是活性很高的金属氧化物半导体,传感器加热后,在不同气体浓度中电导率不同。使用简单的电路就可以将电导率的变化转换成与该气体浓度相对应的信号输出了。

2024-01-02 14:24:09 1752

原创 Arduino提高篇(十)光强传感器控制OLED背光

像手机、平板之类的电子设备,屏幕亮度都能随环境光强度自动调节,其内部使用的是小体积的数字光照传感器。本篇我们使用GY-30光照传感器模块来控制OLED显示屏的背光亮度,使其随环境光自动调节。1. 实验材料Uno R3开发板配套USB数据线面包板及配套连接线OLED显示屏数字光强传感器GY-30模块2. 实验步骤1. 根据原理图搭建电路图。

2024-01-02 11:40:57 459

原创 Arduino提高篇(九)数字光强传感器

光敏电阻是常用的光感元件,但是其感应范围比较窄,响应速度慢,且受外界干扰较大。要接收强光时,需要更加精准的数字光照传感器。本篇介绍GY-30模块的使用,其板载BH1750数字光传感器专用IC。1. 光强传感器介绍GY-30模块基于BH1750FVI芯片,模块采用IIC通讯方式,内置16bit ADC转换器,可以直接数字输出,光照强度范围:0~65525 lx,勒克斯「lux,通常简写为lx」是照度的国际单位。主要特点内置16Bit ADC转换器。IIC通讯协议,直接输出数字量。

2024-01-02 11:36:08 504

原创 Arduino提高篇(八)OLED测距显示

1. 实验材料Uno R3开发板配套USB数据线面包板及配套连接线OLED显示屏HC-SR04超声波传感器模块2. 实验步骤1. 根据原理图搭建电路图。超声波传感器模块的VCC、GND分别连接到开发板的5V、GND。传感器的Trig引脚、Echo引脚分别连接到开发板的数字引脚2、3。OLED屏的VCC和GND分别连接开发板的3.3V和GND,OLED屏的SDA和SCL分别连接开发板A4和A5。

2024-01-02 11:22:20 437

原创 Arduino提高篇(七)超声波测距

超声波是振动频率高于20KHz的机械波,它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点,在工业、国防、生物医学等方面有广泛应用,本篇介绍利用超声波进行测距。1. 测距原理超声波传感器的发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。根据计时器记录的时间t,声波在空气中的传播速度为340m/s,就可以计算出发射点距障碍物的距离s,即:s=340m/s × t / 2。

2024-01-02 11:04:19 873

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除