• 星瞳AI VISION软件内测!可以离线标注,训练,并生成OpenMV的模型。可以替代edge impulse https://forum.singtown.com/topic/8206
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 运行追小球的小车代码没有反应



    • 线接好了,运行追小球的小车代码 openmv会报警!发出类似蜂鸣器的声音(不知道是不是Openmv发出的,大概率是),求解求解!!!
      0_1656126552366_a322df40-eb15-4544-adff-5e73306f0566-801160657e3cb57d3315b77fbed1649.jpg

      0_1656126559471_06ebc0c7-455b-42b6-aac2-c1f90fcd4e97-a0fcfa1011284f3b074b5ff5e5a5c87.jpg

      0_1656126575616_fad0392e-f8f6-4882-b59a-a2e2f73a950e-da44660eed43cd4f0edb8e8022b8fcc.jpg
      main.py

      # Blob Detection Example
      #
      # This example shows off how to use the find_blobs function to find color
      # blobs in the image. This example in particular looks for dark green objects.
      
      import sensor, image, time
      import car  #引入控制电机运动的代码
      from pid import PID     #从pid模块中导入pid类
      
      # You may need to tweak the above settings for tracking green things...
      # Select an area in the Framebuffer to copy the color settings.
      
      sensor.reset() # 重置感光原件
      sensor.set_pixformat(sensor.RGB565) # 设置为彩图
      sensor.set_framesize(sensor.QQVGA) # 设置分辨率 
      sensor.skip_frames(10) # 跳过几帧使图像生效 
      sensor.set_auto_whitebal(False) # 关闭白平衡
      clock = time.clock() # 设置时钟 
      
      # For color tracking to work really well you should ideally be in a very, very,
      # very, controlled enviroment where the lighting is constant...
      green_threshold   = (76, 96, -110, -30, 8, 66)      #设置颜色阈值,不同颜色要修改!!!
      size_threshold = 2000       #如果摄像头检测到像素块的面积大于2000,就说明我们的小车离小球非常近,那么需要后退一段距离
      
      x_pid = PID(p=0.5, i=1, imax=100)       #x_pid是方向pid:控制小车电机的方向(如果在小车拐弯时发现小车拐的角度非常大,可以把x_pid的参数调得小一点)
      h_pid = PID(p=0.05, i=0.1, imax=50)     #h_pid是距离pid:用于控制小车的速度(如果速度偏快,可以把h_pid的p参数调得再小一点)
      
      #定义一个函数去找到视野中最大的块:视野中肯定不止一个小球,我们让小车去追踪最近(最近的在摄像头里就最大)的一个小球
      def find_max(blobs):
          max_size=0
          for blob in blobs:
              if blob[2]*blob[3] > max_size:
                  max_blob=blob
                  max_size = blob[2]*blob[3]
          return max_blob
      
      
      while(True):
          clock.tick() # Track elapsed milliseconds between snapshots().
          img = sensor.snapshot() # 从sensor中截取一段图像
      
          blobs = img.find_blobs([green_threshold])       #调用颜色识别的函数
          if blobs:#如果小球找到色块
              max_blob = find_max(blobs)      #调用find_max()函数找到视野中最大的色块去追踪
              #pid的差值,后面用于计算pid的参数
              x_error = max_blob[5]-img.width()/2
              h_error = max_blob[2]*max_blob[3]-size_threshold
              print("x error: ", x_error)
              '''
              for b in blobs:
                  # Draw a rect around the blob.
                  img.draw_rectangle(b[0:4]) # rect
                  img.draw_cross(b[5], b[6]) # cx, cy
              '''
              
              
              img.draw_rectangle(max_blob[0:4]) # 在找到的色块上画一个矩形
              img.draw_cross(max_blob[5], max_blob[6]) # 在色块的中心cx,cy画一个十字
              
              #调用了pid.py中的函数,用于得到最终的结果,控制小车的运动
              x_output=x_pid.get_pid(x_error,1)
              h_output=h_pid.get_pid(h_error,1)
              print("h_output",h_output)
              car.run(-h_output-x_output,-h_output+x_output)      #两个轮胎的h_pid应该是一样的(距离),x_pid应该是相反的
         
          else:#没有找到色块
              car.run(18,-18) #左右电机向相反的方向慢速运动,让小车在原地以非常慢的速度旋转,可以让小车在原地搜寻小球
      
      
      

      car.py

      from pyb import Pin, Timer      #导入引脚和定时器
      
      import pyb
      #如果两个轮子的电机正负接反了,那么就设置为True,在32行可以改
      inverse_left=False  #change it to True to inverse left wheel
      inverse_right=False #change it to True to inverse right wheel
      
      #新建四个引脚,分别控制左右两个电机的方向
      ain1 = pyb.Pin('P0', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)   #Pin.OUT_PP:设置上拉电阻
      ain2 = pyb.Pin('P1', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      bin1 = pyb.Pin('P2', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      bin2 = pyb.Pin('P3', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      ain1.low()
      ain2.low()          #引脚初始化:低电平
      bin1.low()
      bin2.low()
      
      #定义P7、P8为PWM
      pwma = Pin('P7')
      pwmb = Pin('P8')
      tim = Timer(4, freq=1000)   #设置定时器4,频率为1000HZ
      
      #新建两个通道     通过官网的中文文档:Timer4(定时器4)用到的通道是channel 1、2、3(通道1、2、3分别对于引脚P7、P8、P9)
      ch1 = tim.channel(1, Timer.PWM, pin=pwma)
      ch2 = tim.channel(2, Timer.PWM, pin=pwmb)
      ch1.pulse_width_percent(0)      
      ch2.pulse_width_percent(0)          #初始化:设置通道的占空比为0
      
      #定义run函数:用于控制小车电机左右运动
      def run(left_speed, right_speed):#参数为左右电机的速度
          
          #设置电机正反转(安装的时候直接接上去了,因此正负两条线可能接反,两个电机不一定都是正方向转动,在这里可以调)
          if inverse_left==True:
              left_speed=(-left_speed)
          if inverse_right==True:
              right_speed=(-right_speed)
      
          if left_speed < 0:
              ain1.low()
              ain2.high()
          else:
              ain1.high()
              ain2.low()
          ch1.pulse_width_percent(int(abs(left_speed)))   #abs(x)是一个函数,取x的绝对值,进而控制占空比,来控制小车速度
                                                          #x越大,即占空比越大,小车就越快
          if right_speed < 0:
              bin1.low()
              bin2.high()
          else:
              bin1.high()
              bin2.low()
          ch2.pulse_width_percent(int(abs(right_speed)))
      
      


    • 是电机模块的蜂鸣器报警 求解!



    • 单独运行电机驱动的代码没有报错 轮子可以转动

      # 电机驱动板输出PWM例程
      #
      # A为左轮 B为右轮
      #
      # 此示例显示如何控制OpenMV Cam上的电机扩展板。 
      # 通过使用PYB模块控制电机扩展板,可以通过PWM控制速度并设置数字I/O引脚状态。 
      # 电机扩展板需要6个I/O引脚用于两个电机。
      
      import pyb  # 导入pyb模块(pyb 模块包含与插件相关的特定函数)
      
      # 初始化4个引脚
          # 这些引脚控制我们的方向,而下面的其他PWN引脚控制速度。 
          # 每个电机的方向由H桥设置,其中A0/1是一个H桥驱动器的两侧。 B0/1是另一个H桥。
      pinADir0 = pyb.Pin('P3', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      pinADir1 = pyb.Pin('P2', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
                                                                 # 每两个引脚控制其中一个电机的方向(是由电机驱动板的芯片决定的)
      pinBDir0 = pyb.Pin('P1', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      pinBDir1 = pyb.Pin('P0', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      
      # 控制电机的方向
          # 对于向前或向后操作:Dir0/1必须彼此不相等。如果它们相等则那就是刹车操作。 
          # 如果它们不相等,则电机将以另一个方式旋转,这取决于它的连接和dir 0的值。
      pinADir0.value(0)   # 把P3引脚设置为低电平
      pinADir1.value(1)   # 把P2引脚设置为高电平       控制其中一个轮子正转(如果是1 0 就是轮子反转;如果是0 0 就是停止不动)
      
          # 对于向前或向后操作,Dir0/1必须彼此不相等。如果它们相等则那就是刹车操作。 
          # 如果它们不相等,则电机将以另一个方式旋转,这取决于它的连接和dir 0的值。
      pinBDir0.value(0)
      pinBDir1.value(1)                   # 控制两个电机的另一个正转
      
      # 设置一个定时器
          # 创建一个以1KHz运行的定时器对象,它将为我们的OpenMV Cam上的PWM输出供电。 
          # 只需要创建一次。
      tim = pyb.Timer(4, freq=1000)
      
      # 通过定时器来控制PWM信号
          # 使用timer对象在OpenMV Cam上创建两个PWM输出。这些定时器控制电机的速度。 
          # 您将在循环中重复设置这些定时器的PWM百分比。
          
          
      # chA为左轮    chB为右轮
      chA = tim.channel(1, pyb.Timer.PWM, pin=pyb.Pin("P7"))
      chB = tim.channel(2, pyb.Timer.PWM, pin=pyb.Pin("P8"))      # 通过定时器来控制两个PWM信号,来控制电机速度
      
      while (True):
      
          for i in range(100):# i从0-99增加
              pyb.delay(100)
              chA.pulse_width_percent(i)      # 第一个电机的占空比从0-99 ——> 速度越来越快
              chB.pulse_width_percent(99-i)   # 第二个电机的占空比从99-0 ——> 速度越来越慢
      
          for i in range(100):# 这是相反的
              pyb.delay(100)
              chA.pulse_width_percent(99-i)   # 第一个电机的占空比从99-0 ——> 速度越来越慢
              chB.pulse_width_percent(i)      # 第二个电机的占空比从0-99 ——> 速度越来越快
      
      
      
      # 如果只控制单个电机
      #while (True):
      #    chA.pulse_width_percent(20) # 左轮
      #    #chB.pulse_width_percent(20) # 右轮
      
      


    • 因为小车不是配套的小车,引脚定义不太一样。

      ain1 = pyb.Pin('P0', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)   #Pin.OUT_PP:设置上拉电阻
      ain2 = pyb.Pin('P1', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      bin1 = pyb.Pin('P2', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      bin2 = pyb.Pin('P3', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      

      改为

      ain1 = pyb.Pin('P3', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)   #Pin.OUT_PP:设置上拉电阻
      ain2 = pyb.Pin('P2', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      bin1 = pyb.Pin('P1', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      bin2 = pyb.Pin('P0', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
      


    • @kidswong999 不行啊还是报警



    • @kidswong999 电机驱动模块的蜂鸣器还是会报警 所以蜂鸣器报警是因为什么原因啊???



    • @16yd 电机扩展板上没有蜂鸣器。



    • @kidswong999 那我报警是为什么啊 我拆下了拓展板就不会报警了 很奇怪



    • @kidswong999 大大求解!



    • @16yd 我没法解决啊,我没有你的硬件,也不知道哪里出错了.

      那你就在单机驱动的代码和car.py检查一下.