• 免费好用的星瞳AI云服务上线!简单标注,云端训练,支持OpenMV H7和OpenMV H7 Plus。可以替代edge impulse。 https://forum.singtown.com/topic/9519
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • openmv串口通信 出现busy



    • 0_1530371902681_4a1fd949-b110-438e-bc59-8b290bf5bc13-image.png
      openmv串口接收数据,为什么接收一定数量数据后,就会卡顿,而且画面不动
      0_1530371938957_e1c49a01-903b-48d3-9ab8-770641c9d607-image.png
      然后就出现这种提示



    • 请提供能重复出现问题的代码。



    • @kidswong999 import sensor, image, time
      from pyb import UART
      from pyb import Servo
      import json

      #设置阈值
      red_threshold_01 = ( 7, 58, 10, 81, 21, 74) #近阈值
      red_threshold_02 = ( 9, 68, 8, 71, 6, 70) #远阈值
      enable=0

      uart = UART(3, 115200)

      def dj(b):
      step=0
      x = b #将b[5]赋值给x
      c=abs(80-b) #把cx与中心x值的差赋值给c
      #下面为简单的识别舵机运动算法,具体根据实际调试修改参数,可以自行优化
      if x > 81:
      step=step-int(x-80)
      if -800 > step:
      step=step+int(x-80)
      if x < 79:
      step=step+int(80-x)
      if step > 900:
      step=step-int(80-x)
      s1.pulse_width(1400-4*step) #舵机旋转角度
      d=step
      #print('偏转量 :',step)

      def dj1(b):
      step=0
      x = b #将b[5]赋值给x
      c=abs(80-b) #把cx与中心x值的差赋值给c
      #下面为简单的识别舵机运动算法,具体根据实际调试修改参数,可以自行优化
      if x > 81:
      step=step-int(x-80)
      if -800 > step:
      step=step+int(x-80)
      if x < 79:
      step=step+int(80-x)
      if step > 900:
      step=step-int(80-x)
      s1.pulse_width(1400-5*step) #舵机旋转角度
      d=step
      #print('偏转量 :',step)

      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QQVGA)
      sensor.set_auto_whitebal(False)
      sensor.set_auto_gain(False) #关闭自动亮度增益,太暗了可以自行打开
      sensor.set_contrast(3) #设置对比度为3
      sensor.set_brightness(-3) #设置亮度最低
      sensor.set_auto_exposure(False)
      sensor.skip_frames(10)
      clock = time.clock()

      #用于灭灯时关闭图像识别(dj函数),1为开启,0为关闭
      date=1 #默认为开启

      s1 = Servo(1) #P7 舵机
      s1.pulse_width(750) #舵机初始化到中间位置

      #设置感兴趣区域大小
      ROI=(0,0,160,120)

      dates=0

      while(True):
      img = sensor.snapshot()

      #通过读入ardiuo发送过来的信息来控制dj函数关闭与开启
      if(uart.any()):
      dates=uart.readchar()
      print(dates)
      #type(dates)
      #date=2
      #print('date= ',date)

      #当date为2时,表示开始灭灯,此时不仅要关闭dj函数,还要让舵机中位(为后退做准备)
      if dates==2:
      print('字符dates= ',dates)
      #s1.pulse_width(1400)
      #time.sleep(6000)
      #date=3

      #当date为3时,表示后退已完成,开始新一轮转圈
      if dates==3:
      print('数字dates= ',dates)
      #time.sleep(4000)
      #s1.pulse_width(750)
      #date=1

      #设置感兴趣区域
      statistics=img.get_statistics(roi=ROI)
      
      #分阈值查找色块,并返回数组
      blobs1 = img.find_blobs([red_threshold_01])
      blobs2 = img.find_blobs([red_threshold_02])
      

      #色块在近处
      if blobs1:
      for b1 in blobs1:
      img.draw_rectangle(b1.rect(),color=(255,255,0)) #根据色块大小画黄色框
      img.draw_cross(b1.cx(), b1.cy(),color=(255,255,0)) #根据色块中心点画黄色十字架
      if date==1:
      if b1[3]>=15:
      dj1(b1[5])
      #print('b1[5]= ',b1[5])
      #print('jin')
      else:
      if b1[3]<15:
      dj(b1[5])
      #print('jin')

      #色块不在近处但在远处
      else:
      if blobs2:
      for b2 in blobs2:
      if b2[2]>1 and b2[3]>1:
      img.draw_rectangle(b2.rect(),color=(255,255,255)) #根据色块大小画白色框
      img.draw_cross(b2.cx(), b2.cy(),color=(255,255,255)) #根据色块中心点画白色十字架
      if date==1:
      if b2[3]>=15:
      dj1(b2[5])
      #print('yuan')
      #print('b2[5]= ',b2[5])
      else:
      if b2[3]<15:
      dj(b2[5])
      #print('b2[5]= ',b2[5])
      #print('yuan')
      你好小助手这是openmv代码

      int Echo = A5; // Echo回声脚
      int Trig = A4;// Trig 触发脚()
      int Distance1 = 0;
      int Distance2 = 0;
      int Distance3 = 0;
      int Distance = 0;
      int a = 1;
      unsigned char val = 2;
      unsigned char bal = 3;
      unsigned char kal = 4;

      void setup()
      {
      Serial.begin(115200);
      //初始化电机驱动IO为输出方式
      //初始化超声波引脚
      pinMode(Echo, INPUT);
      // 定义超声波输入脚
      pinMode(Trig, OUTPUT); // 定义超声波输出脚
      delay(100); //开机延时

      }

      void Distance_test() // 量出前方距离
      {
      digitalWrite(Trig, LOW); // 给触发脚低电平2μs
      delayMicroseconds(2);
      digitalWrite(Trig, HIGH); // 给触发脚高电平10μs,这里至少是10μs
      delayMicroseconds(10);//10us
      digitalWrite(Trig, LOW); // 持续给触发脚低电
      float Fdistance = pulseIn(Echo, HIGH); // 读取高电平时间(单位:微秒)
      Fdistance= Fdistance/58; //为什么除以58等于厘米, Y米=(X秒344)/2
      // X秒=( 2
      Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
      switch (a){
      case 1:Distance1 = Fdistance;
      case 2:Distance1 = Fdistance;
      case 3:Distance1 = Fdistance;
      }
      if(a==3){a=0;}
      else a++;
      Distance=Distance1+Distance2+Distance3;
      }

      void loop()
      {
      Distance_test();
      Distance_test();
      Distance_test(); /取3次距离平均值/
      if(Distance<30){ /如果前一个动作为前行,后退消除惯性/
      Serial.write(val); /发送数据是arduino停止对准光源/
      Serial.write(bal);
      Serial.write(kal);
      }
      }
      这是测试用的arduino代码,if(any)那里接受数据的地方,把数据打印到电脑串口调试器里,每次发送一定量数据之后就会出现busy的情况,然后摄像头卡顿,这是为什么



    • 求大佬解释一下,突然出现的问题



    • 我不知道你怎么跟你解释,因为我没法复现这个问题。

      而且你贴了好几百行的代码,真的没法看。



    • 你需要精简代码,只剩出bug的代码。



    • @kidswong999 import sensor, image, time
      from pyb import UART
      from pyb import Servo
      import json

      #设置阈值
      red_threshold_01 = ( 7, 58, 10, 81, 21, 74) #近阈值
      enable=0

      uart = UART(3, 115200)

      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QQVGA)
      sensor.set_auto_whitebal(False)
      sensor.set_auto_gain(False) #关闭自动亮度增益,太暗了可以自行打开
      sensor.set_contrast(3) #设置对比度为3
      sensor.set_brightness(-3) #设置亮度最低
      sensor.set_auto_exposure(False)
      sensor.skip_frames(10)
      clock = time.clock()

      #设置感兴趣区域大小
      ROI=(0,0,160,120)

      dates=0

      while(True):
      img = sensor.snapshot()

      #以下为串口通信测试代码
      if(uart.any()):
      dates=uart.readchar()
      print(dates)

      if dates==2:
         print('字符dates= ',dates)       
        
         
      if dates==3:
         print('数字dates= ',dates)       
      

      #测试代码到此结束

      #设置感兴趣区域
      statistics=img.get_statistics(roi=ROI)
      
      #分阈值查找色块,并返回数组
      blobs1 = img.find_blobs([red_threshold_01])
      

      #色块在近处
      if blobs1:
      for b1 in blobs1:
      img.draw_rectangle(b1.rect(),color=(255,255,0)) #根据色块大小画黄色框
      img.draw_cross(b1.cx(), b1.cy(),color=(255,255,0)) #根据色块中心点画黄色十字架
      小助手这是精简后的代码,和arduino通信的,求告知问题所在



    • 求助啊,真的不知道是什么问题



    • @kidswong999 求助啊,串口通信只要是太快了一直发,就会出现这种情况
      0_1530451868337_32594a54-6138-497a-a348-a70b8ea1120d-image.png
      然后接着电脑就显示这种信息了



    • @kidswong999 换了三个摄像头都是这种情况



    • 是不是寄存器空间太小了,有没有清空数据累的操作