精华内容
下载资源
问答
  • openMV摄像头循迹小车

    千次阅读 2021-10-26 08:32:59
    使用openMV线性回归,然后使用pid输出,使用串口发送到MSP430,在经过处理输出PWM到车轮,实现循迹 二、openMV代码 THRESHOLD = (0, 20, -128, 127, -128, 127) # Grayscale threshold for dark things... import...

    主控MSP430F5529,电机驱动模块L298N,openMV摄像头

    一、总体思路

    使用openMV线性回归,然后使用pid输出,使用串口发送到MSP430,在经过处理输出PWM到车轮,实现循迹

    二、openMV代码

    THRESHOLD = (0, 20, -128, 127, -128, 127) # Grayscale threshold for dark things...
    import sensor, image, time
    from pyb import UART,LED
    from pid import PID
    import ustruct
    rho_pid = PID(p=0.17, i=0 , d=0)#y=ax+b b截距
    theta_pid = PID(p=0.001, i=0, d=0)#a斜率
    
    
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QQQVGA) # 80x60 (4,800 pixels) - O(N^2) max = 2,3040,000.
    sensor.skip_frames(time = 2000)     # 跳过2s帧
    clock = time.clock()                # to process a frame sometimes.
    
    uart = UART(3,115200)   #定义串口3变量
    uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters
    def sending_data(xw):
        global uart;
        data = ustruct.pack("<bbib",      
                       0x2C,                      #帧头1
                       0x12,                      #帧头2
                       int(xw), # up sample by 4   #数据1
                       0x5B)
        uart.write(data);   #必须要传入一个字节数组
    
    
    while(True):
        clock.tick()
        img = sensor.snapshot().binary([THRESHOLD])#线设置为白色,其他为黑色
        line = img.get_regression([(100,100)], robust = True)#返回直线蓝色
        if (line):
            rho_err = abs(line.rho())-img.width()/2#直线偏移距离
            if line.theta()>90:#直线角度
                theta_err = line.theta()-180
            else:
                theta_err = line.theta()
            img.draw_line(line.line(), color = 127)#画出蓝色直线
            #print(rho_err,line.magnitude(),rho_err)
            if line.magnitude()>8:#线性回归效果,好进行下一步,否则不进行s
                #if -40<b_err<40 and -30<t_err<30:
                rho_output = rho_pid.get_pid(rho_err,1)
                theta_output = theta_pid.get_pid(theta_err,1)
                xw = rho_output+theta_output
            else:
                xw=0.0
        else:
            xw=-404.0
            pass
        FH = ustruct.pack("<bbib",      #格式为俩个字符俩个短整型(2字节)
                                   0x2C,                      #帧头1
                                   0x12,                      #帧头2
                                   int(xw*1000), # up sample by 4   #数据1
                                   0x5B)
        uart.write(FH)

    三、MSP430部分代码

    1、串口接收openMV发送过来的数据,一帧数据是7个字节,因为发送过程中可能会丢包,所以接收2帧数据做一次处理

    2、使用联合体获取数据处理

    typedef union{          //联合体,供数据处理,4个char合并为1个long或float
      long word32;
      float  byte32_arry;
      char data[4];
    }Openmv_word_bytes;
    
    static int num=0;
    Openmv_word_bytes x;//巡线联合体
    static char Float_databuf[15];//接收数组
    /********************接收中断*************************/
    __interrupt void openMV_UART_RX_IRQ_Handler()
    { 
      if(UART_GetITStatus(UART0,UART_RX_IRQn) == TRUE)   //清除串口某一个中断标志
      {
        if(num == 14){      //接收到14字节就不接收,等待数据处理完成
          UART_ClearITPendingBit(UART0,UART_RX_IRQn);
          return;
        }
        Float_databuf[num]=UART_GetChar(UART0);                 //读取一个字节1个字节
        num++;
        UART_ClearITPendingBit(UART0,UART_RX_IRQn);    //清除串口某一个中断标志
      
      }
    }
    
    /***************************初始化串口******************/
    void openMV_Init()
    {
      UART_Init(UART0,115200); //初始化UART0模块,波特率115200,TX_P33_RX_P34, openmv p5-R p4-T
      Set_Vector_Handler(VECTOR_UART0,openMV_UART_RX_IRQ_Handler);    //设置接收中断向量
      UART_ITConfig  (UART0,UART_RX_IRQn,TRUE);                //开串口接收中断
    }
    
    /*判断头帧位置*/
    int pd(int a){
      while(Float_databuf[a] != 0x2C){
        a++;
      }
      return a;
    }
    
    /************************巡线小车*********************/
    //返回浮点数
    void openMV_fdata()
    {
      int a;
      if(num == 14){
        a = pd(0);
        x.data[0] = Float_databuf[a+2];
        x.data[1] = Float_databuf[a+3];
        x.data[2] = Float_databuf[a+4];
        x.data[3] = Float_databuf[a+5];
        
        x.byte32_arry = (float)(x.word32/1000.0);
        //OLED_DispFolatAt(FONT_ASCII_6X8,2,0,x.byte32_arry,3);  //在指定位置显示一个浮点数数字
    
        num = 0;
        memset(Float_databuf,'\0',15);    
      } 
    }
    

    openMV循迹小车

    展开全文
  • openmv巡线小车优化程序进行优化,通过计算线性回归方程的theta和rho来循迹
  • openmv寻线,把摄像头当成8路光电数字灰度进行寻线,同时可识别十字路线,已配置uart3输出需要的数据
  • 单线或多线循迹.py

    2019-08-01 22:46:09
    openmv巡线,9区域划分,通过串口发送数字与单片机通讯,便于过滤周围其他线条的影响
  • 简介:循迹小车由三轮或四轮小车和摄像头两大部分组成,通过镜头识别路径,将其得到的图像做处 理并发送给小车,小车对应做出动作。 寻迹小车核心组成:openMV和STM3F1。 涉及主要知识:STM32相关知识(学习视频 ...

    此篇文章是自己在学习制作寻迹小车中遇到的问题以及解决方法,写出来供同样的人参考参考…
    -------------->直接开始------------>
    STM32各类小车工作原理及学习
    http://www.yahboom.com/study/bc-32

    简介:循迹小车由三轮或四轮小车和摄像头两大部分组成,通过镜头识别路径,将其得到的图像做处
    理并发送给小车,小车对应做出动作。
    寻迹小车核心组成:openMV和STM3F1。
    涉及主要知识:STM32相关知识(学习视频 https://ke.qq.com/course/279403);
    openMV相关知识(学习网站 http://book.myopenmv.com/quick-start/ide-tutorial.html);
    USART通信(运用在摄像头与小车之间通信);
    SPI通信(用在OLED显示);
    直流电机有关资料;
    直流电机驱动TB6612FNG(http://tech.hqew.com/circuit_1476430);
    等等。

    掌握具体知识后便可搭建循迹小车了。
    然而并不是一帆风顺,肯定会漏洞百出…所以在搭建时候就细心耐心,一点一点解决问题。搭建时候的注意事项:
    1、在用杜邦线连接小车各部分模块时候,首先确保杜邦线没有坏;
    2、杜邦线也不能有松动或者没有插紧的情况,不然很容易造成接触不良,在调试陈旭时候也会被误认为程序问题而浪费时间;
    3、接的电压要按照各器件额定值接入。

    到现在小车基本上是搭建好了(除了摄像头部分),先启动小车,让它能够跑起来,还要能够跑直线,特别直!
    同时还要时不时地检查一下接线是否有松动的情况!!
    一切都OK了,那就装上openMV进行数据对接。

    有几点软件部分需要注意的事项:
    1、注意使用USART通信要明确自己所用的协议,否则会出现不是自己预想的数据;
    2、在我使用openMV时候,左右的偏移量为0到45 和 -45到0,但是将该数据传输回STM32时候负数段数据不正常。解决方法为将左右偏移量的数据范围加上相应的数字,使其左右偏移量范围里没有负数数据。

    搞好以后迫不及待的要跑一下了,但是刚按下开关,小车按照轨迹过弯道过到一半时候乱跑了,然后又是瞎跑。。。。做到这一步又有几点需要注意,可耐心读完:
    1、 注意,这几点很重要!!!
    2、小车能够简单寻迹,但又不能完全寻迹时候,可以把摄像头从小车上拿下来,固定在一个摄像头倾斜角和高度相同的简易支架上,连接到电脑上观看小车视野,,在OPENMV IDE里面查看画面,是否在过弯到一半时候找不到视野。若是这个问题则根据自己的需求配合程序进行相应的调整;
    3、 小车向左转很顺利,向右转会“出轨”,或是左转到一半会瞎跑。首先要确保摄像头摆放位置是正的,接线是否有松动而影响数据传输,然后确保硬件没问题时候检查偏移量的数据。通过查看偏移时候openMV处理出来的数据,发现左边过弯很顺利是其偏移量正常,而右边偏移量不足,导致其过弯一半“出轨”。适当增加右转偏移量即可解决。
    4、 有时会出现数据传输错乱,但是硬件又没有问题,这时候应该把数据传输有关的模块单独接电源或是原理接线群,其他的线路可能会有些许的影响(没有固然最好,但是值得一试)。
    5、 测试时候-务-必-一-定-必-须-要在光线好的地方测试,很重要!!!!因为光线弱会影响到识别路径,从而导致乱跑、跑到旁边的路径上,此时又会误以为是程序出了问题,又去调试程序浪费时间。程序调试N多次,不如灯光照一次!!

    好了,到这里你的小车应该会跑的很顺利了
    最后附上openMV的Python程序

    # Black Grayscale Line Following Example
    #
    # Making a line following robot requires a lot of effort. This example script
    # shows how to do the machine vision part of the line following robot. You
    # can use the output from this script to drive a differential drive robot to
    # follow a line. This script just generates a single turn value that tells
    # your robot to go left or right.
    #
    # For this script to work properly you should point the camera at a line at a
    # 45 or so degree angle. Please make sure that only the line is within the
    # camera's field of view.
    
    import sensor, image, time, math#调用声明
    from pyb import UART
    
    # Tracks a black line. Use [(128, 255)] for a tracking a white line.
    GRAYSCALE_THRESHOLD = [(0, 64)]
    #设置阈值,如果是黑线,GRAYSCALE_THRESHOLD = [(0, 64)];
    #如果是白线,GRAYSCALE_THRESHOLD = [(128,255)]
    
    
    # Each roi is (x, y, w, h). The line detection algorithm will try to find the
    # centroid of the largest blob in each roi. The x position of the centroids
    # will then be averaged with different weights where the most weight is assigned
    # to the roi near the bottom of the image and less to the next roi and so on.
    ROIS = [ # [ROI, weight]
            (0, 100, 160, 20, 0.7), # You'll need to tweak the weights for you app
            (0, 050, 160, 20, 0.3), # depending on how your robot is setup.
            (0, 000, 160, 20, 0.1)
           ]
    #roi代表三个取样区域,(x,y,w,h,weight),代表左上顶点(x,y)宽高分别为w和h的矩形,
    #weight为当前矩形的权值。注意本例程采用的QQVGA图像大小为160x120,roi即把图像横分成三个矩形。
    #三个矩形的阈值要根据实际情况进行调整,离机器人视野最近的矩形权值要最大,
    #如上图的最下方的矩形,即(0, 100, 160, 20, 0.7)
    
    # Compute the weight divisor (we're computing this so you don't have to make weights add to 1).
    weight_sum = 0 #权值和初始化
    for r in ROIS: weight_sum += r[4] # r[4] is the roi weight.
    #计算权值和。遍历上面的三个矩形,r[4]即每个矩形的权值。
    
    # Camera setup...
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.GRAYSCALE) # use grayscale.
    sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
    sensor.skip_frames(30) # Let new settings take affect.
    sensor.set_auto_gain(False) # must be turned off for color tracking
    sensor.set_auto_whitebal(False) # must be turned off for color tracking
    #关闭白平衡
    clock = time.clock() # Tracks FPS.
    
    while(True):
        clock.tick() # Track elapsed milliseconds between snapshots().
        img = sensor.snapshot() # Take a picture and return the image.
        uart = UART(3,19200)
        uart.init(19200,bits=8,parity=None,stop=1)#init with given parameters
    
        centroid_sum = 0
        #利用颜色识别分别寻找三个矩形区域内的线段
        for r in ROIS:
            blobs = img.find_blobs(GRAYSCALE_THRESHOLD, roi=r[0:4], merge=True)
            # r[0:4] is roi tuple.
            #找到视野中的线,merge=true,将找到的图像区域合并成一个
    
            #目标区域找到直线
            if blobs:
                # Find the index of the blob with the most pixels.
                most_pixels = 0
                largest_blob = 0
                for i in range(len(blobs)):
                #目标区域找到的颜色块(线段块)可能不止一个,找到最大的一个,作为本区域内的目标直线
                    if blobs[i].pixels() > most_pixels:
                        most_pixels = blobs[i].pixels()
                        #merged_blobs[i][4]是这个颜色块的像素总数,如果此颜色块像素总数大于                     #most_pixels,则把本区域作为像素总数最大的颜色块。更新most_pixels和largest_blob
                        largest_blob = i
    
                # Draw a rect around the blob.
                img.draw_rectangle(blobs[largest_blob].rect())
                img.draw_rectangle((0,0,30, 30))
                #将此区域的像素数最大的颜色块画矩形和十字形标记出来
                img.draw_cross(blobs[largest_blob].cx(),
                               blobs[largest_blob].cy())
    
                centroid_sum += blobs[largest_blob].cx() * r[4] # r[4] is the roi weight.
                #计算centroid_sum,centroid_sum等于每个区域的最大颜色块的中心点的x坐标值乘本区域的权值
    
        center_pos = (centroid_sum / weight_sum) # Determine center of line.
        #中间公式
    
        # Convert the center_pos to a deflection angle. We're using a non-linear
        # operation so that the response gets stronger the farther off the line we
        # are. Non-linear operations are good to use on the output of algorithms
        # like this to cause a response "trigger".
        deflection_angle = 0
        #机器人应该转的角度
    
        # The 80 is from half the X res, the 60 is from half the Y res. The
        # equation below is just computing the angle of a triangle where the
        # opposite side of the triangle is the deviation of the center position
        # from the center and the adjacent side is half the Y res. This limits
        # the angle output to around -45 to 45. (It's not quite -45 and 45).
        deflection_angle = -math.atan((center_pos-80)/60)
        #角度计算.80 60 分别为图像宽和高的一半,图像大小为QQVGA 160x120.
        #注意计算得到的是弧度值
    
        # Convert angle in radians to degrees.
        deflection_angle = math.degrees(deflection_angle)
        #将计算结果的弧度值转化为角度值
        A=deflection_angle
        print("Turn Angle: %d" % int (A))#输出时强制转换类型为int
        #print("Turn Angle: %d" % char (A))
        # Now you have an angle telling you how much to turn the robot by which
        # incorporates the part of the line nearest to the robot and parts of
        # the line farther away from the robot for a better prediction.
        print("Turn Angle: %f" % deflection_angle)
        #将结果打印在terminal中
        uart_buf = bytearray([int (A)])
        #uart_buf = bytearray([char (A)])
        #uart.write(uart_buf)#区别于uart.writechar是输出字符型,这个函数可以输出int型
        uart.write(uart_buf)
        uart.writechar(0x41)#通信协议帧尾
        uart.writechar(0x42)
    
        time.sleep(10)#延时
        print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
        # connected to your computer. The FPS should increase once disconnected.
    
    
    展开全文
  • OpenMV嵌入式图像处理 笔记

    千次阅读 多人点赞 2017-08-17 14:58:44
    OpenMV简介以及基本中文教程请参见目前官网给出OpenMV中国的三家代理商,英文教程请参见官网以及官方论坛。此笔记是由于中文代理商不够全面的基础上,整合官网教程,自己可以最大程度的了解这个小巧易用的摄像头模块...

    OpenMV简介以及基本中文教程请参见目前官网给出OpenMV中国的三家代理商英文教程请参见官网以及官方论坛。此笔记是由于中文代理商不够全面的基础上,整合官网教程,自己可以最大程度的了解这个小巧易用的摄像头模块,也方便大家参考,*不保证正确,您所使用的代码,对您的openmv造成任何损害,我概不负责,慎用!*


    >0x01<—>MicroPython库<


    以下标准Python库内置于MicroPython中。对于其他库,请从micropython-lib存储库下载。Python标准库和微型库,以下标准Python库已经被“微观化”以适应MicroPython的理念。它们提供该模块的核心功能,旨在成为标准Python库的替代品。这些模块可以通过他们的 u-name引用,也可以通过它们的 non-u-name来获得。 non-u-name该名称的文件应在你的package路径中。例如,import json 将首先搜索 json.py 文件或 json 目录,如果找到它就可加载该包。如果没有找到任何内容,它将回退加载内置ujson模块。
    官网给出的几个模块,引用方法同Python的基本语法一样,先 import,再 name.function()

    • gc - 控制垃圾收集器
    • math - 数学函数库
    • select - 等待一组流上的事件
    • sys - 系统特定功能
    • ubinascii - 二进制/ ASCII转换
    • uhashlib - 哈希算法
    • uio - 输入/输出流
    • ujson - JSON编码和解码
    • uos - 基本的“操作系统”服务
    • ure - 正则表达式
    • usocket - 提供对BSD的访问。
    • ustruct - 打包和解包原始数据类型
    • utime - 时间相关功能
    • uzlib - zlib解压缩

    举个栗子

    import  math
    
    def degrees(radians):   #弧度制和角度制的转换计算
        return (180 * radians) / math.pi
    

    对于OpenMV,开发者,封装了专门的库,用于使用者调用,简单方便。

    pyb     # 与电路板相关的功能(板级功能)
            #时间相关功能 (部分可以与time类替换)
            #复位相关功能
            #中断相关功能
            #电源相关功能
            #其他功能
            #类(class)
    ########其他类#########
    ADC     #- 模数转换
            #构造函数(Constructors)
            #方法(Methods)
    
    DAC     #- 数模转换
            #构造函数
            #方法
    
    CAN     #总线控制器局域网通信总线
            #构造函数
            #类方法(Class Methods)
            #方法
            #常量(Constants)
    
    ExtInt  #- 配置I / O引脚以在外部事件中中断
            #构造函数
            #类方法
            #方法
            #常量
    
    I2C     # - 一个双线串行协议
            #构造函数
            #方法
            #常量
    
    LED     #LED,板子上已经内置了几个led
            #构造函数
            #方法
    
    I / O   #引脚
            #构造函数
            #类方法
            #方法
            #常量
    
    servo   #- 3线伺服驱动器
            构造函数
            方法
    
    SPI类    #- 主驱动串行协议
            #构造函数
            #方法
            #常量
    
    Timer  #- 控制内部定时器
            #构造函数
            #方法
    
    TimerChannel    #- 为定时器设置通道
                    #方法
    
    UART    #- 双工串行通信总线
            #构造函数
            #方法
            #常量
            #流量控制
    
    USB_VCP #- USB虚拟通信端口
            #构造函数
            #方法
    
    time    #- 追踪经过时间
            #功能
            #构造函数
            #方法
    
    sensor  #- 摄像头传感器
            #功能
            #常量
    
    image   #- 机器视觉
            #功能
    
    HaarCascade     #- 特征描述符
                    #构造函数
    
    Histogram       #- 直方图对象
                    #方法
    
    Percentile      #百分位数对象
    方法
    
    Statistics      #- 统计对象
                    #方法
    
    Blob            #- Blob对象
                    #方法
    
    Line            #- Line对象
    
    Circle          #- Circle对象
                    #方法
    
    Rect            #- Rectangle Object
                    #方法
    
    QRCode          #- QRCode对象,扫码
                    #方法
    
    AprilTag        #- AprilTag对象,3D识别***标签***
                    #方法
    
    DataMatrix      #- DataMatrix对象
                    #方法
    
    BarCode         #- BarCode对象
                    #方法
    
    kptmatch        #- 关键点对象
                    #方法
    
    ImageWriter     #- ImageWriter对象
                    #构造函数
                    #方法
    
    ImageReader     # - ImageReader对象
                    #构造函数
                    #方法
    Image           #- 图像对象
                    #构造函数
                    #方法
                    #常量
    
    gif             #- gif录音
    
    Gif             #Gif录音机
                    #构造函数
                    #方法
    
    mjpeg           #- mjpeg录音
    
    Mjpeg           #- Mjpeg录音机
                    #构造函数
                    #方法
    
    lcd             #- lcd屏蔽驱动程序,配套官方屏幕
                    #功能
    
    fir             #- 热电屏蔽驱动器(fir ==远红外线)
                    #功能
    
    cpufreq         #- 简单的cpu频率控制
                    #功能
                    #常量
    
    machine         #- 与电路板相关的功能
                    #复位相关功能
                    #中断相关功能
                    #电源相关功能
                    #杂项功能
                    #类
    
    I2C             #- 一个双线串行协议
                    构造函数
                    一般方法
                    原始I2C操作
                    标准 bus 操作
                    内存操作

    代码实例

    import sensor, image, time,pyb
    from pyb import UART
    from pyb import Pin
    
    green_threshold=(45,75,-40,-10,4,30)
    blue_threshold   = ( 30 ,45,0,30,-62,-39)
    
    ROI=(77,8,221,216)#设置检测区域(兴趣范围)
    
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.RGB565) # use RGB565.
    sensor.set_framesize(sensor.QVGA) # use QQVGA for speed.
    sensor.set_brightness(-1)#亮度
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.set_auto_gain(False) # must be turned off for color tracking
    sensor.set_auto_whitebal(False) # must be turned off for color tracking
    #关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡。
    clock = time.clock() # Tracks FPS.
    
    
    single_out =  Pin('P0', Pin.OUT_PP)#IO操作,注意对应OpenMV引脚
    single_out.low()
    
    # P4->TX ,P5->RX
    uart = UART(3, 115200)#先实例化一个19200波特率的串口3,
    pyb.delay(1000)#板级毫秒延时,也可以time.ticks()替换,
    
    send_data_2=[0xf1,0,0,0,0,0,0,0,0,0xf2]
    while(True):
        clock.tick() # Track elapsed milliseconds between snapshots().
        send_data=[]
        send_data.append(0xf0)
        img = sensor.snapshot() # Take a picture and return the image.
        green_blobs = img.find_blobs([green_threshold],roi=ROI)
    
        sum_bai=len(green_blobs)
        #print("bai%d:"%sum_bai)#调试用
        if sum_bai>=1:
        #如果找到了目标颜色
            for b in green_blobs[0:1]:#只取一个
            #迭代找到的目标颜色区域
                # Draw a rect around the blob.
                img.draw_rectangle(b[0:4],color=(255,255,255)) # rect
                #用白色矩形标记出目标颜色区域
                img.draw_cross(b[5], b[6]) # cx, cy
                #发打送包(8bit/位),精度保留
                send_data.append(b[5]//256)
                send_data.append(b[5]%256)
                send_data.append(b[6]//256)
                send_data.append(b[6]%256)
                #在目标颜色区域的中心画十字形标记
        if sum_bai==0:#保证数据包一样长
            send_data.append(send_data_2[1])
            send_data.append(send_data_2[2])
            send_data.append(send_data_2[3])
            send_data.append(send_data_2[4])
        #蓝色识别追踪
        blue_blobs = img.find_blobs([blue_threshold],roi=ROI)
        sum_blue=len(blue_blobs)
        if blue_blobs:
            #如果找到了目标颜色
            for b in blue_blobs:
                #迭代找到的目标颜色区域
                    # Draw a rect around the blob.
                    img.draw_rectangle(b[0:4],color=(0,0,0)) # rect
                    #用白色矩形标记出目标颜色区域
                    img.draw_cross(b[5], b[6]) # cx, cy
                    #在目标颜色区域的中心画十字形标记
                    send_data.append(b[5]//256)
                    send_data.append(b[5]%256)
                    send_data.append(b[6]//256)
                    send_data.append(b[6]%256)
                    break
                    #在目标颜色区域的中心画十字形标记
        if sum_blue==0:
                send_data.append(send_data_2[5])
                send_data.append(send_data_2[6])
                send_data.append(send_data_2[7])
                send_data.append(send_data_2[8])
    
        img.draw_rectangle(ROI)
        print(clock.fps()) # 帧率值,Note: Your OpenMV Cam runs about half as fast while
        # connected to your computer. The FPS should increase once disconnected.
        print("white: %d blue: %d"%(sum_bai,sum_blue))
        send_data.append(0xf1)#帧尾
        #自定义数据帧完毕,拉高P0为高电平,出发单片机外部IO中断接收数据包
        single_out.high()
        pyb.delay(5)
        for i in send_data:
            uart.writechar(i)
        print(send_data)#调试用
        send_data_2=send_data#更新包,目标出现短暂检测不出使用上一个位置的值
        pyb.delay(1)#延迟再拉低P0,发送完毕,在示波器下可看出P0为高电平时,有UART3的发送引脚有电平变化即数据发送
        single_out.low()
    展开全文

空空如也

空空如也

1
收藏数 6
精华内容 2
关键字:

openmv双线循迹

友情链接: facedetectpcaVC6.rar