OpenMV入门(下)

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

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

1. 物体的颜色识别:

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


import sensor,lcd,time
import gc,sys
import ustruct

from machine import UART,Timer
from fpioa_manager import fm

#映射串口引脚
fm.register(6, fm.fpioa.UART1_RX, force=True)
fm.register(7, fm.fpioa.UART1_TX, force=True)
uart = UART(UART.UART1, 115200, read_buf_len=4096)


#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1) #后置模式,所见即所得
sensor.set_auto_whitebal(False)#白平衡关闭


#lcd初始化
lcd.init()
# 颜色识别阈值 (L Min, L Max, A Min, A Max, B Min, B Max) LAB模型
# 此处识别为橙色,调整出的阈值,全部为红色
barries_red = (20, 100, -5, 106, 36, 123)

clock=time.clock()


#打包函数
def send_data_wx(x,a):
    global uart;
    data = ustruct.pack("<bbhhhhb",
                  0x2c,
                  0x12,
                  int(x),
                  int(a),
                  0x5B)
    uart.write(data);

#找到最大色块函数
def find_max(blods):
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:
            max_blob=blob
            max_size=blob.pixels()
    return max_blob


while True:
    clock.tick()
    img=sensor.snapshot()
    #过滤
    blods = img.find_blobs([barries_red],x_strid=50)
    blods = img.find_blobs([barries_red],y_strid=50)
    blods = img.find_blobs([barries_red],pixels_threshold=100)
    blods = img.find_blobs([barries_red],area_threshold=60)
    blobs = img.find_blobs([barries_red])  #找到阈值色块
    cx=0;cy=0;
    if blobs:
       max_blob = find_max(blobs) #找到最大色块
       cx=max_blob[5]
       cy=max_blob[6]
       cw=max_blob[2]
       ch=max_blob[3]
       img.draw_rectangle(max_blob[0:4])
       img.draw_cross(max_blob[5],max_blob[6])



    lcd.display(img)     #LCD显示图片
    print(max_blob[5],max_blob[6])
    send_data_wx(max_blob[5],max_blob[6])



2. 舵机的驱动代码:

from machine import Timer,PWM
import time
#PWM 通过定时器配置,接到 IO17 引脚

tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
S1 = PWM(tim, freq=50, duty=0, pin=17)
'''
说明:舵机控制函数
功能:180 度舵机:angle:-90 至 90 表示相应的角度
 360 连续旋转度舵机:angle:-90 至 90 旋转方向和速度值。
 【duty】占空比值:0-100
'''

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

while True:

 #-45 度
      Servo(S1,-45)
      time.sleep(2)
 #0 度
      Servo(S1,0)
      time.sleep(2)
 #45 度
      Servo(S1,45)
      time.sleep(2)
 

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

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

180°舵机的控制一般需要一个 20ms 左右的时基脉冲,该脉冲的高电平部分一般为 0.5ms-2.5ms 范围内的角度控制脉冲部分,总间隔为 2ms 。以 180 度角度伺服为例,在 MicroPython 编程对应的控制关系是从 -90 °至 90°.
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)#配置定时器
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来驱动舵机,流程图如下:

 其中:

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

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

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

  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WanGxxxx.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值