这个是上一年的项目,之前弄得不怎么完整,只有一个openmv的,所以openmv自己去我主页找,这篇主要讲蓝牙
这个是我在使用openmv连接单片机1然后单片机1与单片机2通过蓝牙进行通信
最终实现的效果是:openmv识别到图形和数字然后远程传输到另外一个单片机·,另外一个单片机显示出来。
一定要注意HC05和HC06的区别
HC-06是一个四针无按键的模块,只能作为从机使用,上电后即可直接进入AT指令模式或连接模式,支持通过手机连接或串口通信,推荐设置波特率为9600。HC-05是一个六针带按键的模块,既可以作为主机也可以作为从机,通过长按按键上电可进入AT指令模式,直接上电则进入等待连接模式,其AT指令模式下的波特率为38400。两者在引脚数量、按键配置、功能模式以及默认波特率等方面存在明显差异,具体AT指令也有所不同。
对比表格
特性 | HC-06 | HC-05 |
---|---|---|
引脚数量 | 四针 | 六针 |
按键 | 无按键 | 带按键 |
功能模式 | 只能作为从机 | 主从一体(可作为主机或从机) |
上电模式 | 直接上电进入AT指令或连接模式 | 长按按键上电进入AT指令模式,直接上电为等待连接模式 |
默认波特率 | 9600 | 38400(AT指令模式) |
使用场景 | 适合简单的从机应用,如与手机连接或串口通信 | 适合需要主从切换的复杂应用,功能更灵活 |
一、项目背景与目标
OpenMV是一款开源的微型机器视觉模块,它能够方便地实现图像识别功能。而单片机则是嵌入式系统中常用的控制器。通过将OpenMV与单片机结合,并利用蓝牙模块实现通信,我们可以构建一个简单的图像识别与远程显示系统。这个项目不仅可以帮助我们更好地理解机器视觉和无线通信的基本原理,还可以应用于各种实际场景,例如远程监控、智能安防等。
二、硬件准备
-
OpenMV模块:用于图像识别。
-
单片机1:用于接收OpenMV的识别结果,并通过蓝牙发送数据。
-
单片机2:用于接收蓝牙传输的数据并显示。
-
HC-05蓝牙模块:用于单片机1与单片机2之间的通信。
-
USB转TTL串口模块:用于调试和配置蓝牙模块。
-
LCD显示屏(可选):用于在单片机2上显示识别结果。
-
连接线:用于连接各个模块。
三、硬件连接
3.1 OpenMV与单片机1的连接
OpenMV可以通过串口与单片机1通信。将OpenMV的串口引脚(如TXD和RXD)连接到单片机1的串口引脚上。具体连接方式如下表所示:
OpenMV | 单片机1 |
---|---|
TXD | RXD |
RXD | TXD |
GND | GND |
VCC | VCC |
3.2 单片机1与HC-05蓝牙模块的连接
将HC-05蓝牙模块与单片机1连接,用于数据传输。连接方式如下表所示:
单片机1 | HC-05 |
---|---|
TXD | RXD |
RXD | TXD |
GND | GND |
VCC | VCC |
3.3 单片机2与HC-05蓝牙模块的连接
同样,将另一个HC-05蓝牙模块与单片机2连接,用于接收数据。连接方式与单片机1类似:
单片机2 | HC-05 |
---|---|
TXD | RXD |
RXD | TXD |
GND | GND |
VCC | VCC |
如果使用LCD显示屏,还需要将LCD显示屏连接到单片机2的相应引脚上。
四、蓝牙模块配置
4.1 配置蓝牙模块为主机和从机
为了实现单片机1与单片机2之间的通信,需要将两个HC-05蓝牙模块分别配置为主机和从机。按照以下步骤进行配置:
-
进入AT指令模式:
-
按住HC-05的复位键(或将KEY引脚与高电平连接),然后将USB转TTL模块插入电脑。
-
观察HC-05的指示灯慢闪(1秒亮一次),表示已进入AT指令模式。
-
松开复位键(KEY引脚悬空),打开串口调试助手,选择端口,波特率设置为38400。
-
-
配置主机:
-
在串口调试助手中输入以下AT指令,将一个HC-05配置为主机:
AT+NAME=Master AT+ROLE=1 AT+PSWD=12345 AT+UART=9600,0,0
-
-
配置从机:
-
将另一个HC-05配置为从机:
AT+NAME=Slave AT+ROLE=0 AT+PSWD=12345 AT+UART=9600,0,0
-
4.2 配对蓝牙模块
按照以下步骤进行蓝牙模块的配对:
-
查询蓝牙地址:
-
在主机端输入
AT+ADDR?
,记录返回的地址。 -
在从机端输入
AT+ADDR?
,记录返回的地址。
-
-
绑定蓝牙模块:
-
在主机端输入
AT+BIND=从机地址
,例如AT+BIND=2020,09,274205
。 -
在从机端输入
AT+BIND=主机地址
,例如AT+BIND=2019,02,08346
。
-
-
查询绑定状态:
-
在主机和从机端分别输入
AT+BIND?
,如果返回的地址与绑定的地址一致,则表示绑定成功。
-
五、软件编程
5.1 OpenMV图像识别编程
在OpenMV IDE中编写程序,实现图形和数字的识别。以下是一个简单的示例代码:
Python复制
import sensor
import image
import time# 初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)# 加载训练好的模型
net = image.load_net("trained_model.net")while(True):img = sensor.snapshot()for obj in net.classify(img, min_confidence=0.8):img.draw_string(0, 0, "Recognized: %s" % obj.output(), color=(255, 0, 0), scale=2)print("Recognized:", obj.output())
将识别结果通过串口发送到单片机1:
Python复制
import pybuart = pyb.UART(3, 9600) # 初始化串口while(True):img = sensor.snapshot()for obj in net.classify(img, min_confidence=0.8):uart.write("Recognized: %s\n" % obj.output()) # 发送识别结果
5.2 单片机1与单片机2通信编程
在单片机1上编写程序,接收OpenMV的识别结果并通过蓝牙发送到单片机2。以下是一个示例代码(以51单片机为例):
c复制
#include <reg52.h>
#include <string.h>#define UART_BAUDRATE 9600void UART_Init() {TMOD |= 0x20; // 设置定时器1为模式2TH1 = 256 - (11059200 / 12 / 32) / UART_BAUDRATE; // 设置波特率TL1 = TH1;TR1 = 1; // 启动定时器1SM0 = 0; SM1 = 1; // 设置串口为模式1REN = 1; // 允许接收ES = 1; // 开启串口中断EA = 1; // 开启全局中断
}void UART_SendString(char *str) {while (*str) {SBUF = *str++;while (!TI); // 等待发送完成TI = 0; // 清除发送标志}
}void main() {UART_Init();while (1) {// 假设从OpenMV接收到的数据存储在buffer中char buffer[50];UART_SendString(buffer); // 发送数据到单片机2}
}
在单片机2上编写程序,接收蓝牙模块传输的数据并显示在LCD屏幕上:
c复制
#include <reg52.h>
#include <lcd.h> // 假设已经包含了LCD驱动库#define UART_BAUDRATE 9600void UART_Init() {TMOD |= 0x20; // 设置定时器1为模式2TH1 = 256 - (11059200 / 12 / 32) / UART_BAUDRATE; // 设置波特率TL1 = TH1;TR1 = 1; // 启动定时器1SM0 = 0; SM1 = 1; // 设置串口为模式1REN = 1; // 允许接收ES = 1; // 开启串口中断EA = 1; // 开启全局中断
}void UART_ReceiveString(char *str) {char ch;while ((ch = SBUF) != '\n') {*str++ = ch;}