赞
踩
目录
相信很多小伙伴都和我一样,是个外行人但又喜欢动手制作一些创客小物件的。但很多人或多或少会遇到和我之前一样的问题,要么只会玩单片机,要么只懂机器视觉或者某个算法,而从来没有真正的将人工智能和单片机结合起来制作出一个实实在在的智能化小物件。
本次我制作的物品可以实时地通过YOLOv5算法检测目标,当视频中检测到目标时,LED灯管打开,当视频中没有目标时,LED灯管关闭。工作原理也很简单:摄像头实时检测画面中的物体,当有目标出现时,python作为上位机利用串口通信发送指令给单片机(arduino),单片机接收到指令之后会控制继电器的通断,来实现LED灯管的亮灭。
本次制作可能偏向于有一定机器视觉基础的小伙伴,最麻烦的地方也是视觉部分的调试,arduino部分和串口通信部分相对容易。
主要有三个部分需要准备:机器视觉部分、串口通信部分、arduino部分
主要就是串口通信部分的代码,这个代码是用在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)
①代码:
-
- 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单片机
③继电器、灯管以及灯管的电源(没有继电器和灯管也行,可以点亮单片机上自带的板载灯)
如果上面的所有东西都准备好了,那么事情就简单了,实际上就是把代码融合以及接线的问题了。
①视觉部分的代码
如图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号I/O 口 | IN |
V5 | DC+ |
GND | DC- |
图4
②继电器和灯管的接线
按照下面的接线顺序执行,接线图可以参照我上一篇博客:
这个东西的实现实际上可以做很多事情,比如施药机器人,快递分拣,巡检机器人,等等。下面举一些例子:
1.将灯管换成电磁阀,就可以控制一些气动元件,例如气缸和喷头(课题是施药机器人的可以参照一下)
2.视觉部分的代码可以换成任意的算法,比如手势识别的算法,那么小伙伴们可以做一些手势控制的灯,或者风扇。
3.即使不使用视觉的代码,只要是python中的程序想和单片机进行通信都可以在此基础上修改。
4.在单片机中加入Switch语句之后可以实现更多的功能。
5.有的小伙伴不是用的python,而是matlab或者c++,也可以找到相应的串口通信的代码,按照一定的逻辑发送控制指令到串口。且arduino中的代码类似,这样便可实现各种各样的上位机和下位机的通信。
最后,祝各位小伙伴顺利!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。