赞
踩
之前的文章篇幅实在有点太大,找起东西来不太方便,我们接着新开的内容继续描述:
接下来我们要进行的内容是目标跟随,但是目前得到的问题是我们不知道我们要跟随的物体是不是固定的,所以我们先用颜色识别来替代 (所要寻找的东西为橙色的物体,同时,我们要用K210直接驱动我们的舵机,来让摄像头跟随着物体)
我们使用寻找最大色块的代码,来追踪我们的物体
-
- 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])
-
-
-
- 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...
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。