当前位置:   article > 正文

OpenMV入门(下)_openmv输出pwm

openmv输出pwm

之前的文章篇幅实在有点太大,找起东西来不太方便,我们接着新开的内容继续描述:

接下来我们要进行的内容是目标跟随,但是目前得到的问题是我们不知道我们要跟随的物体是不是固定的,所以我们先用颜色识别来替代 (所要寻找的东西为橙色的物体,同时,我们要用K210直接驱动我们的舵机,来让摄像头跟随着物体)

1. 物体的颜色识别:

我们使用寻找最大色块的代码,来追踪我们的物体

  1. import sensor,lcd,time
  2. import gc,sys
  3. import ustruct
  4. from machine import UART,Timer
  5. from fpioa_manager import fm
  6. #映射串口引脚
  7. fm.register(6, fm.fpioa.UART1_RX, force=True)
  8. fm.register(7, fm.fpioa.UART1_TX, force=True)
  9. uart = UART(UART.UART1, 115200, read_buf_len=4096)
  10. #摄像头初始化
  11. sensor.reset()
  12. sensor.set_pixformat(sensor.RGB565)
  13. sensor.set_framesize(sensor.QVGA)
  14. sensor.set_vflip(1) #后置模式,所见即所得
  15. sensor.set_auto_whitebal(False)#白平衡关闭
  16. #lcd初始化
  17. lcd.init()
  18. # 颜色识别阈值 (L Min, L Max, A Min, A Max, B Min, B Max) LAB模型
  19. # 此处识别为橙色,调整出的阈值,全部为红色
  20. barries_red = (20, 100, -5, 106, 36, 123)
  21. clock=time.clock()
  22. #打包函数
  23. def send_data_wx(x,a):
  24. global uart;
  25. data = ustruct.pack("<bbhhhhb",
  26. 0x2c,
  27. 0x12,
  28. int(x),
  29. int(a),
  30. 0x5B)
  31. uart.write(data);
  32. #找到最大色块函数
  33. def find_max(blods):
  34. max_size=0
  35. for blob in blobs:
  36. if blob.pixels() > max_size:
  37. max_blob=blob
  38. max_size=blob.pixels()
  39. return max_blob
  40. while True:
  41. clock.tick()
  42. img=sensor.snapshot()
  43. #过滤
  44. blods = img.find_blobs([barries_red],x_strid=50)
  45. blods = img.find_blobs([barries_red],y_strid=50)
  46. blods = img.find_blobs([barries_red],pixels_threshold=100)
  47. blods = img.find_blobs([barries_red],area_threshold=60)
  48. blobs = img.find_blobs([barries_red]) #找到阈值色块
  49. cx=0;cy=0;
  50. if blobs:
  51. max_blob = find_max(blobs) #找到最大色块
  52. cx=max_blob[5]
  53. cy=max_blob[6]
  54. cw=max_blob[2]
  55. ch=max_blob[3]
  56. img.draw_rectangle(max_blob[0:4])
  57. img.draw_cross(max_blob[5],max_blob[6])
  58. lcd.display(img) #LCD显示图片
  59. print(max_blob[5],max_blob[6])
  60. send_data_wx(max_blob[5],max_blob[6])

2. 舵机的驱动代码:

  1. from machine import Timer,PWM
  2. import time
  3. #PWM 通过定时器配置,接到 IO17 引脚
  4. tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
  5. S1 = PWM(tim, freq=50, duty=0, pin=17)
  6. '''
  7. 说明:舵机控制函数
  8. 功能:180 度舵机:angle:-90 至 90 表示相应的角度
  9. 360 连续旋转度舵机:angle:-90 至 90 旋转方向和速度值。
  10. 【duty】占空比值:0-100
  11. '''
  12. def Servo(servo,angle):
  13. S1.duty((angle+90)/180*10+2.5)
  14. while True:
  15. #-45 度
  16. Servo(S1,-45)
  17. time.sleep(2)
  18. #0 度
  19. Servo(S1,0)
  20. time.sleep(2)
  21. #45 度
  22. Servo(S1,45)
  23. time.sleep(2)

我们通过文档来看一下,该如何使用180°舵机:

舵机驱动,需要3根线(GND VC++(5V) 信号(P17))

180°舵机的控制一般需要一个 20ms 左右的时基脉冲,该脉冲的高电平部分一般为 0.5ms-2.5ms 范围内的角度控制脉冲部分,总间隔为 2ms 。以 180 度角度伺服为例,在 MicroPython 编程对应的控制关系是从 -90 °至 90°.
  1. tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)#配置定时器
  2. S1 = PWM(tim, freq=50, duty=0, pin=17) #开启S1口的PWM控制

开启S1(Pin17的PWM,设置初始占空比为0)

PWM 对象在 machine 模块下。
【tim】K210 的 PWM 依赖于定时器来产生波形,在上方设置
【freq】PWM 频率
【duty】PWM 占空比
【pin】PWM 输出引脚


【enable】是否在构建对象后立即产生波形,默认 True。

在软件内,这些角度都是已经被封装好的,我们可以直接通过PWM来驱动舵机,流程图如下:

 其中:

  1. def Servo(servo,angle):
  2. S1.duty((angle+90)/180*10+2.5)

这个代码是我们来计算转的角度,调用他,我们就可以直接转到我们需要的角度,其中 0就是我们的居中位(servo是我们的位置,angle则是转的角度)

                                                                                                               =====>> to be continue...

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/825710
推荐阅读
相关标签
  

闽ICP备14008679号