?這個是上一年的項目,之前弄得不怎么完整,只有一個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;}