“玩转创客小物件:Windows下机器视觉YOLOv5与Arduino单片机的完美结合”

目录

一、介绍

二、前期准备

1.机器视觉部分

2.串口通信部分

3.arduino部分

三、动手制作

1.代码的融合

2.接线

四、总结


一、介绍

        相信很多小伙伴都和我一样,是个外行人但又喜欢动手制作一些创客小物件的。但很多人或多或少会遇到和我之前一样的问题,要么只会玩单片机,要么只懂机器视觉或者某个算法,而从来没有真正的将人工智能和单片机结合起来制作出一个实实在在的智能化小物件。

本次我制作的物品可以实时地通过YOLOv5算法检测目标,当视频中检测到目标时,LED灯管打开,当视频中没有目标时,LED灯管关闭。工作原理也很简单:摄像头实时检测画面中的物体,当有目标出现时,python作为上位机利用串口通信发送指令给单片机(arduino),单片机接收到指令之后会控制继电器的通断,来实现LED灯管的亮灭。

        本次制作可能偏向于有一定机器视觉基础的小伙伴,最麻烦的地方也是视觉部分的调试,arduino部分和串口通信部分相对容易。

二、前期准备

主要有三个部分需要准备:机器视觉部分、串口通信部分、arduino部分

1.机器视觉部分

  1. YOLOv5所需环境和代码(代码本人可以提供,但是环境需要自己搭建,网上搜一下,有很多博主或者up主讲解的环境搭建的案例都很好),其实不一定非要是YOLOv5,任何算法或者是目标检测的算法可以,前提是要在python上实现的。(如果有需要,可以只需自己搭建个环境,我的视觉部分的代码可以提供给各位小伙伴。)
  2. 普通的USB连电脑的摄像头,或者笔记本自带的摄像头也可以

2.串口通信部分

主要就是串口通信部分的代码,这个代码是用在python上的。 使用这段代码之前需要在机器视觉的代码里安装一个包,且这个包必须要安装在自己的环境里面,如图1所示。(环境其实就是 图中所示的 (pytorch) E: )

 图1

没有这段代码,视觉部分就不能发送指令给单片机,具体这段代码怎么加,以及视觉部分的指令是什么,下面会详说。

# coding:utf-8

import serial.tools.list_ports
import time
plist = list(serial.tools.list_ports.comports())

if len(plist) <= 0:
        print("没有发现端口!")
else:
        plist_0 = list(plist[0])
        serialName = plist_0[0]
        serialFd = serial.Serial(serialName, 9600, timeout=60)
        print("可用端口名>>>", serialFd.name)

3.arduino部分

①代码:


const int pinNumber = 13; //因为电路连接中用的是11好管脚作为输出
#define jidianqi 2
void setup(){  //arduino程序必须有的函数,用作初始化,设置管脚,调用库等等
    Serial.begin(9600); //这里要和树莓派中串口波特率一致
    pinMode(pinNumber,OUTPUT); //将13号管脚状态设置为输出状态
    pinMode(jidianqi,OUTPUT);

}
void loop() {
   char val = Serial.read();
   if (val=='o')   //如果接收到的视觉的指令是字母 'o',则执行下面的指令
   {   
      digitalWrite(pinNumber,HIGH);//点亮单片机板载灯 
      digitalWrite(jidianqi,HIGH);//打开继电器,继电器在电路中其实就是个开关,控制灯管亮灭
      delay(50);
   }
   else
   {
      digitalWrite(pinNumber,LOW);//关闭小灯
      digitalWrite(jidianqi,LOW);//关闭继电器
      delay(30);
   }

}

②arduino单片机

③继电器、灯管以及灯管的电源(没有继电器和灯管也行,可以点亮单片机上自带的板载灯)


三、动手制作

如果上面的所有东西都准备好了,那么事情就简单了,实际上就是把代码融合以及接线的问题了。

1.代码的融合

①视觉部分的代码

如图2和图3所示,图2中在视觉的 detect.py文件中最上面的导包部分加入了串口通信部分的代码(代码在前期准备部分提供过)。图3在detect.py 文件中的plot_one_box下面加入了如红框内所示的一句代码。

图2

图3

 ②arduino中的代码

将这段代码烧录至arduino单片机中,注意这里面的if(val =='o')是和视觉部分图3 中的代码相对应的。


const int pinNumber = 13; //因为电路连接中用的是13号管脚作为输出
#define jidianqi 2
void setup(){  //arduino程序必须有的函数,用作初始化,设置管脚,调用库等等
    Serial.begin(9600); //这里要和树莓派中串口波特率一致
    pinMode(pinNumber,OUTPUT); //将13号管脚状态设置为输出状态
    pinMode(jidianqi,OUTPUT);

}
void loop() {
   char val = Serial.read();
   if (val=='o')
   {   
      digitalWrite(pinNumber,HIGH);//点亮小灯 
      digitalWrite(jidianqi,HIGH);//打开继电器
      delay(50);
   }
   else
   {
      digitalWrite(pinNumber,LOW);//关闭小灯
      digitalWrite(jidianqi,LOW);//关闭继电器
      delay(30);
   }

}

2.接线

初次接触单片机或者不会接线的小伙伴也不用担心,因为单片机里的程序是接收到了视觉的指令之后,单片机同时开起板载灯和继电器,也能实现相应的效果。我的上一篇文章也有详细介绍单片机和灯管接线的过程。

①单片机和继电器的接线

单片机 继电器
2号I/O  口 IN
V5 DC+
GND DC-

 图4

②继电器和灯管的接线

按照下面的接线顺序执行,接线图可以参照我上一篇博客:

  1. 电源的正极接继电器NO端
  2. 继电器的COM端接灯管的正极
  3. 灯管的负极接电源的负极

四、总结

这个东西的实现实际上可以做很多事情,比如施药机器人,快递分拣,巡检机器人,等等。下面举一些例子:

1.将灯管换成电磁阀,就可以控制一些气动元件,例如气缸和喷头(课题是施药机器人的可以参照一下)

2.视觉部分的代码可以换成任意的算法,比如手势识别的算法,那么小伙伴们可以做一些手势控制的灯,或者风扇。

3.即使不使用视觉的代码,只要是python中的程序想和单片机进行通信都可以在此基础上修改。

4.在单片机中加入Switch语句之后可以实现更多的功能。

5.有的小伙伴不是用的python,而是matlab或者c++,也可以找到相应的串口通信的代码,按照一定的逻辑发送控制指令到串口。且arduino中的代码类似,这样便可实现各种各样的上位机和下位机的通信。

最后,祝各位小伙伴顺利!

物联沃分享整理
物联沃-IOTWORD物联网 » “玩转创客小物件:Windows下机器视觉YOLOv5与Arduino单片机的完美结合”

发表评论