• 安装星瞳实验室APP,快速收到回复。扫描二维码或者点击 https://singtown.com/app/
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 一个提问,一个帖子,标题为问题的介绍
  • 请贴出具体的代码,与报错提示。
  • 代码一定要让别人可以运行的文本,不要贴图片
  • 关于openmv与arduino通信时出现的问题



    • import sensor, image, time
      from pyb import UART
      from pyb import Servo
      import json
      
      #设置阈值
      red_threshold_01 = ( 8, 57, 23, 78, 16, 64)   #阈值
      
      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(1550-step) #舵机旋转角度
          d=1550-step
          print('偏转量 :',step)
      
          #若偏离程度较小则小车加速
          if c < 1:
              if d == 1550:
                  uart.write('fast\r')
                  print('jia su')
                  
      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(1200) #舵机初始化到中间位置
      
      
      
      #设置感兴趣区域大小
      ROI=(0,0,160,120)
      
      uart = UART(3, 115200)
      
      while(True):
          img = sensor.snapshot()
          
      #通过读入ardiuo发送过来的信息来控制dj函数关闭与开启
          if(uart.any()):
             date=uart.read()
             
      #当读入信息为2时,表示后退已完成,开始新一轮转圈
          if date==2:
             s1.pulse_width(1200)
             date=1
             
      #当读入信息为0时,表示开始灭灯,此时不仅要关闭dj函数,还要让舵机中位(为后退做准备)
          if date==0:
             s1.pulse_width(1550)
             
          #设置感兴趣区域
          statistics=img.get_statistics(roi=ROI)
      
          #分阈值查找色块,并返回数组
          blobs1 = img.find_blobs([red_threshold_01],roi=ROI)
          
      #色块在近处
          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:
                     dj(b1.cx())
                     print('jin')
                     print('b1[5]=',b1[5])
      

      这个openmv代码的作用是识别光源并控制舵机,并接受arduino传过来的信号进行下一步运动,下面的是arduino的代码

      //=======================================================
      //  智能小车超声波测距实验
      //===============================================================
      #include <Servo.h>            //添加舵机库
      #include <SoftwareSerial.h>
      SoftwareSerial softSerial(10, 11);
      
      int Echo = A5;                 // Echo回声脚
      int Trig = A4;//  Trig 触发脚()
      void Motor_Forward();
      void Motor_Back();
      void Motor_Stop();
      void Motor_Left();
      int PWM =5;                   //定义电机PWM引脚
      int DIR =4;                   //定义电机方向引脚
      int val = 150;                 //电机速度
      int Distance1 = 0;
      int Distance2 = 0;
      int Distance3 = 0;
      int Distance = 0;
      int a = 1;
      int flag = 1;
      int zhuanwangsudu = 100;
      
      void setup()
      {
        softSerial.begin(9600);     // 初始化串口
        //初始化电机驱动IO为输出方式
        //初始化超声波引脚
        pinMode(Echo, INPUT);    // 定义超声波输入脚
        pinMode(Trig, OUTPUT);   // 定义超声波输出脚
        pinMode(PWM,OUTPUT);
        pinMode(DIR,OUTPUT);
        delay(1000); //开机延时
      
      }
      
      
      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()
      { 
        if(softSerial.available()){
           while(flag == 1){
                 Distance_test();
                 Distance_test();
                 Distance_test();                   /*取3次距离平均值*/
                 if(Distance<29){
                     if(flag=1){
                        Motor_Stop();
                        Motor_Back();
                        delay(10);                 /*如果前一个动作为前行,后退消除惯性*/
                        softSerial.println(flag);  /*发送数据是arduino停止对准光源*/
                        Motor_Stop();              /*如果前一个动作为暂停,保持停止*/
                        delay(1500);
                        Motor_Back();
                        delay(1500);
                        flag=0;
                        softSerial.println(flag);  /*发送数据让openmv继续旋转*/
                        flag=1;
                        
                  }
                 else {
                     Motor_Forward();
                     delay(10);
                  }
           }
        }
         while(!softSerial.available());{
              Motor_Left();
              flag=1;
              delay(10);
         }/*如果arduino继续保持速度前进*/
      
      }
      void Motor_Forward()
      {
        digitalWrite(DIR,LOW);
        analogWrite(PWM, val);
      }
      void Motor_Back()
      {
        digitalWrite(DIR,HIGH);
        analogWrite(PWM, val);
      }
      void Motor_Stop()
      {
        digitalWrite(DIR,LOW);
        analogWrite(PWM, 0);
      

      问题:openmv连接电脑执行时功能正常,arduino对于上面的代码未报错。但是进行实物组装后,功能却不能正常执行,出现舵机不断抖动,摄像头无法识别的情况。
      我们的想法是,通过arduino与openmv连接做一台自动追光小车,逻辑是这样的,开始openmv控制小车旋转,然后当识别到光源是小车开始对准光源 ,并在运行过程中不断调整角度,使光源在小车中央,当光源在摄像头中央时发送数据给小车,让小车加速,当小车运行到离灯一定距离时,通过小车停止旋转,arduino通过串口发送数据给openmv让他停止不断对准光源,然后小车延迟1秒多,后退1.5秒,然后arduino再发送信息给openmv,让openmv重新控制舵机向左转,重新开始新一轮的识别,



    • 希望有高手帮我看看,是不是arduino逻辑出现问题了



    • 求大神回复啊,真的急,谢谢了