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…

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年8月8日
下一篇 2023年8月8日

相关推荐