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



    • 为什么控制的时候会无故抖动,有时改没有反应



    • 请贴出具体的代码和你的过程



    • //=======================================================
      // 智能小车超声波测距实验
      //===============================================================

      int Echo = A5; // Echo回声脚
      int Trig = A4;// Trig 触发脚()
      void Motor_Forward();
      void Motor_Back();
      void Motor_Stop();
      void Motor_Left();
      void klc(); //识别判断函数
      int PWM =5; //定义电机PWM引脚
      int DIR =4; //定义电机方向引脚
      int PWM1 =6;
      int DIR1 =7;
      int val = 150; //电机速度
      int Distance1 = 0;
      int Distance2 = 0;
      int Distance3 = 0;
      int Distance = 0;
      int a = 1;
      int flag = 0;
      int k = 100; //转弯速度
      int b = 0;
      int c = 2;
      int o = 0;

      void setup()
      {
      Serial.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(Serial.available()){ /判断串口有没有信息可以接受/
      o = 0;
      while(o == 0){
      klc(); /当小车接受到openmv发送来的信息时判断前方有没有障碍物/
      if(o == 0){
      Motor_Forward();
      delay(10);
      }
      }
      }
      klc(); /当小车没有接受到openmv发送来的信息时继续判断前方有没有障碍物/
      Motor_Left();
      delay(10); /如果arduino继续保持速度前进/
      }

      void Motor_Forward() /前进函数/
      {
      digitalWrite(DIR,HIGH);
      analogWrite(PWM, val);
      digitalWrite(DIR1,LOW);
      analogWrite(PWM1, val);
      }
      void Motor_Back() /后退函数/
      {
      digitalWrite(DIR,LOW);
      analogWrite(PWM, val);
      digitalWrite(DIR1,HIGH);
      analogWrite(PWM1, val);
      }
      void Motor_Stop() /停止函数/
      {
      digitalWrite(DIR,LOW);
      analogWrite(PWM, 0);
      digitalWrite(DIR1,LOW);
      analogWrite(PWM1, 0);
      }
      void Motor_Left() /左转函数/
      {
      digitalWrite(DIR,HIGH);
      analogWrite(PWM, k);
      digitalWrite(DIR1,LOW);
      analogWrite(PWM1, k);
      }
      void klc() /判断停止函数/
      {
      Distance_test();
      Distance_test();
      Distance_test(); /取3次距离平均值/
      if(Distance<29){ /如果前一个动作为前行,后退消除惯性/
      Serial.println(b); /发送数据是arduino停止对准光源/
      Motor_Stop(); /如果前一个动作为暂停,保持停止/
      delay(1500);
      Motor_Back();
      delay(1500);
      Serial.println(c); /发送数据让openmv继续旋转/
      o=1;
      }

      }
      想用openmv做一台追光小车这是arduino代码,
      import sensor, image, time
      from pyb import UART
      from pyb import Servo
      import json

      #设置阈值
      red_threshold_01 = ( 31, 54, 53, 78, 16, 64) #近阈值
      red_threshold_02 = ( 8, 57, 23, 78, 16, 64) #远阈值
      enable=0
      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(1500-step) #舵机旋转角度
      d=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_hmirror(True) #水平镜像,方便调试
      sensor.set_contrast(3) #设置对比度为3
      sensor.set_brightness(-3) #设置亮度最低
      sensor.set_auto_exposure(False)
      sensor.skip_frames(10)
      clock = time.clock()

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

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

      uart = UART(3, 9600)

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

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

      #色块在近处
      if blobs1:
      for b1 in blobs1:
      if b1[2]>1 and b1[3]>1:
      img.draw_rectangle(b1.rect(),color=(255,255,0)) #根据色块大小画黄色框
      img.draw_cross(b1.cx(), b1.cy(),color=(255,255,0)) #根据色块中心点画黄色十字架
      dj(b1.cx())
      print('jin')
      print('b1[5]=',b1[5])
      #色块不在近处但在远处
      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)) #根据色块中心点画白色十字架
      dj(b2[5])
      print('yuan')
      print('b2[5]=',b2[5])
      这是openmv的代码,连接完小车后小车舵机一直抖,不知道怎么回事,在并没有光源的情况下



      • 舵机是连接哪里的,arduino还是OpenMV

      • OpenMV 的阈值有没有问题

      • 控制需要PID



    • @kidswong999 舵机是连接openmv的,阈值没有问题,有没有PID教程的链接