• OpenMV入门(下)


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

    接下来我们要进行的内容是目标跟随,但是目前得到的问题是我们不知道我们要跟随的物体是不是固定的,所以我们先用颜色识别来替代 (所要寻找的东西为橙色的物体,同时,我们要用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(",
    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...

  • 相关阅读:
    memcpy函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)
    大模型遇上数智化,腾讯云与行业专家共探行业AI发展之路
    满帮再现Non-GAAP盈利,恢复注册后预期增长更积极?
    消息中间件,RabbitMQ,kafka常见面试题
    【附源码】计算机毕业设计SSM蔬菜水果销售网站
    金仓数据库KingbaseES客户端编程接口指南-JDBC(4. JDBC 创建语句对象)
    【漏洞挖掘】Xray+rad自动化批量漏洞挖掘
    自己动手写编译器:词法解析的系统化研究
    【自用】C++ 知识点总结Ⅱ:异常、IO流、类型转化、C++11新特新、STL、设计模式...(待更新)
    最小编译器the-super-tiny-compiler
  • 原文地址:https://blog.csdn.net/ArtoriaLili/article/details/127566363