9—基于FPGA(ZYNQ-Z2)的多功能小车—拓展功能—OpenMV的色块识别

该文介绍了一种色块识别系统,通过OpenMV摄像头检测红绿蓝三种颜色,并利用串口通信将信息传递给Arduino。Arduino接收到信息后,根据颜色编码控制FPGA上的数码管显示。OpenMV代码中设置了颜色阈值来识别色块,而Arduino代码则解析接收到的数据并控制LED显示。Verilog代码用于在FPGA上进行解码和数码管驱动。
摘要由CSDN通过智能技术生成

目录

1. 色块识别设计思路

2. OpenMV代码

3. Arduino代码

4.Verilog代码


1. 色块识别设计思路

  对于色块识别功能,我想让OpenMV检测色块,在数码管上显示。OpenMV的通信也是串口通信,实现比较耗时。由于之前的红外遥控已经外接了Arduino,因此我依然借助Arduino对红绿蓝进行编码,使用两个IO实现信息传递,在FPGA上进行译码,最后根据对应的信息实现数码管显示。

 

流程如下:


2. OpenMV代码

import sensor, image, time
from pyb import UART

uart = UART(3, 115200)
red_threshold=(1, 21, 5, 50, -20, 36)   #red
green_threshold=(7, 22, -33, -14, 9, 27)#green
blue_threshold=(6, 42, -8, 16, -10, -79)#blue

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
clock = time.clock()

while True:
    clock.tick()
    img = sensor.snapshot()

    red_blobs = img.find_blobs([red_threshold], pixels_threshold=200, area_threshold=200, merge=True)
    green_blobs = img.find_blobs([green_threshold], pixels_threshold=200, area_threshold=200, merge=True)
    blue_blobs = img.find_blobs([blue_threshold], pixels_threshold=200, area_threshold=200, merge=True)

    if red_blobs and not green_blobs and not blue_blobs:
        uart.write("2")  # 发送给Arduino的红色标识
        print("红色")
    elif green_blobs and not red_blobs and not blue_blobs:
        uart.write("3")  # 发送给Arduino的绿色标识
        print("绿色")
    elif blue_blobs and not red_blobs and not green_blobs:
        uart.write("1")  # 发送给Arduino的蓝色标识
        print("蓝色")
    else:
        uart.write("0")  # 未识别到任何颜色的标识
        print("未识别到任何颜色")

    print(clock.fps())  # 打印帧率

3. Arduino代码

#include <SoftwareSerial.h>
int data;
SoftwareSerial BT(8, 11); // 引脚2是arduino的RX端
//无-48 蓝-49 红-50 绿-51


void setup() {
  BT.begin(115200);    //设置arduino的串口波特率与蓝牙模块的默认值相同为9600
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
}

void loop() {
  if (BT.available()>0) 
  {
    data=BT.read();  //读取串口字符串
    // 根据接收到的数据进行相应的处理
    //00-无 01-红 10-绿 11-蓝
    if (data == 49) {
      Serial.println("Blue");  // 打印蓝色
      digitalWrite(6, HIGH);
      digitalWrite(9, HIGH);
    } else if (data == 50) {
      Serial.println("Red");   // 打印红色
      digitalWrite(6,LOW);
      digitalWrite(9, HIGH);
    } else if (data == 51) {
      Serial.println("Green"); // 打印绿色
      digitalWrite(6,HIGH);
      digitalWrite(9, LOW);
    }
    else
    {
      digitalWrite(6,LOW);
      digitalWrite(9,LOW);
    }
  }
}

4.Verilog代码

 //遥控模式     
       else if(data==8'b11100000) begin
            case(openmv_in)
            2'b00: led1_reg<=SEG_NUM3;
            2'b01: led1_reg<=SEG_NUM1;//red
            2'b10: led1_reg<=SEG_NUM2;//green
            2'b11: led1_reg<=SEG_NUM0;//blue
            endcase
            ledout<=4'b0111;//亮三个LED
            mode<=0;//默认状态停止
            Mode_Control<=1;//遥控模式标志符置高
            end

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贡橙小白鼠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值