基于open mv 搭配stm32循迹

基于open mv 搭配stm32循迹

一.代码

THRESHOLD = (0, 43, 20, -8, -37, 14) # Grayscale threshold for dark things...
import sensor, image, time
from pyb import LED
import car
from pid import PID
from pyb import UART
from pyb import Pin
rho_pid = PID(p=0.4, i=0)
theta_pid = PID(p=0.001, i=0)

sensor.reset()
sensor.set_vflip(True)
sensor.set_hmirror(True)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQQVGA) # 80x60 (4,800 pixels) - O(N^2) max = 2,3040,000.
#sensor.set_windowing([0,20,80,40])
sensor.skip_frames(time = 2000)     # WARNING: If you use QQVGA it may take seconds
clock = time.clock()                # to process a frame sometimes.
uart = UART(3, 115200)

while(True):

    clock.tick()
    img = sensor.snapshot().binary([THRESHOLD])
    line = img.get_regression([(100,100)], robust = True)#二值化
    if (line):
        rho_err = abs(line.rho())-img.width()/2
        if line.theta()>90:
            theta_err = line.theta()-180
        else:
            theta_err = line.theta()
        img.draw_line(line.line(), color = 127)
        #print(rho_err,line.magnitude(),rho_err)
        if line.magnitude()>8:   #值越大线性回归效果越好
            #if -40<b_err<40 and -30<t_err<30:
            rho_output = rho_pid.get_pid(rho_err,1)
            theta_output = theta_pid.get_pid(theta_err,1)
            output = rho_output+theta_output
            if rho_err > -3 and rho_err < 3:
                uart.write("1")
                p_out = Pin('P0', Pin.OUT_PP)
                p_out.high()
                p_out = Pin('P1', Pin.OUT_PP)
                p_out.low()#设置p_out引脚为低
                p_out = Pin('P2', Pin.OUT_PP)
                p_out.low()#设置p_out引脚为低
                print('0')
            elif rho_err <= -3:
                p_out = Pin('P1', Pin.OUT_PP)#设置p_out为输出引脚
                p_out.high()#设置p_out引脚为高
                p_out = Pin('P0', Pin.OUT_PP)
                p_out.low()#设置p_out引脚为低
                p_out = Pin('P2', Pin.OUT_PP)
                p_out.low()#设置p_out引脚为低
                uart.write("2")
                print('1')
            elif rho_err >= 3:
                uart.write("3")
                p_out = Pin('P2', Pin.OUT_PP)#设置p_out为输出引脚
                p_out.high()#设置p_out引脚为高
                p_out = Pin('P1', Pin.OUT_PP)
                p_out.low()#设置p_out引脚为低
                p_out = Pin('P0', Pin.OUT_PP)
                p_out.low()#设置p_out引脚为低
                print('2')

    #print(clock.fps())

这里使用星瞳的例程,加入自己的思想,由于时刚学OPEN MV所以使用这种简单的思想。这里OPEN MV相当于循迹模块。

二.思想
这里我是主要使用rho_err这个函数,在星瞳例程中会在所循迹物体中间画出一条线,而rho_err便是那个线对于所循的误差,偏左了小于0,偏大了大于0,rho_err >= 某个数,某个数就是偏移量,可以对某个数进行调整使路线更加精准。然后对IO口设置高低电平。32读取io电平对路线进行调整。

如果还有问题可以在下方留言。

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的示例程序,演示了如何在 STM32F103 小车上使用 OpenMV 进行寻迹功能。这里假设你已经连接好了 OpenMVSTM32F103,并且通过串口进行通信。 首先是 OpenMV 端的代码: ```python import sensor import image import time from pyb import UART # 初始化串口 uart = UART(3, 115200) # 使用 UART3,波特率为 115200 # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.GRAYSCALE) sensor.set_framesize(sensor.QQVGA) sensor.skip_frames(time=2000) while True: img = sensor.snapshot() # 捕获图像 # 在这里添加你的图像处理代码,实现循迹黑线功能 # 将处理结果发送给 STM32 uart.write("Hello from OpenMV!\n") # 发送字符串到串口 time.sleep(100) # 延时一段时间,确保 STM32 接收完数据 ``` 接下来是 STM32F103 端的代码,使用 HAL 库进行编写: ```c #include "stm32f1xx_hal.h" #include <string.h> UART_HandleTypeDef huart3; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART3_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART3_UART_Init(); while (1) { char buffer[20]; if (HAL_UART_Receive(&huart3, (uint8_t*)buffer, 20, 100) == HAL_OK) { if (strcmp(buffer, "Hello from OpenMV!\n") == 0) { // 在这里添加你的控制代码,例如驱动电机进行运动 } } } } ``` 这只是一个简单的示例,实际的循迹和控制代码会根据你的具体需求而有所不同。你需要在 STM32F103 上添加适当的引脚配置、电机驱动和控制逻辑。 另外,请确保在 STM32F103 的 CubeMX 或者 HAL 库中正确配置和初始化 UART3,以便与 OpenMV 进行串口通信。 请根据你的具体硬件和需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值