資料介紹
描述
今天,你幾乎不會讓任何人感到驚訝,因為你的手機配備了攝像頭、無線小工具和其他技術進步。多虧了 Arduino 平臺,數百萬人發現了電子和編程的美妙世界。關于如何通過藍牙在手機和 Arduino 之間交換數據的 100、500 條指令被寫...我在說什么?是的。我想通過藍牙在 Android 上的手機和 Arduino UNO 之間交換數據 100、501 次。但我想傳輸的不僅僅是一組字符和數字,而是圖片。
有人會說這是不可能的,Arduino 速度太慢,無法快速處理大量數據。他將是絕對正確的。如果對 Arduino 有一點幫助 - 將所有“艱苦”的工作轉移到其他設備的肩上呢?并且有這樣的設備!
這是 Arduino 獨特的 TFT 屏蔽。有關此徽標的信息在以下文章中:文章 1 ,文章 2在本教程中,我將演示如何通過藍牙連接 Arduino 和 Android 手機,從 Arduino UNO 上的 OV7670 攝像頭獲取照片并將其傳輸到 Android 手機。然后,相反,將圖片(來自相機的圖像)從 Android 手機傳輸到 Arduino UNO 并顯示在獨特的 TFT 屏蔽的屏幕上。
為 Android 手機編寫了一個特殊的應用程序。
TFT屏蔽的簡要特點:
- 尺寸 3.5 英寸對角線,
- 分辨率 320x240,
- 顏色數 65536(16 位),
- 5個按鈕,
- 用于連接 micro SD 卡的插槽,
- 4 針 (2.54 mm) 連接器,用于連接藍牙模塊 HC-05 (-06)、ESP8286 WiFi 模塊。
- 用于相機 (OV7670) 的 20 針 (2.54 mm) 連接器。
所需組件列表
![pYYBAGNOR8GAaVIyAADtezl-qxA968.jpg](https://file.elecfans.com/web2/M00/71/5C/pYYBAGNOR8GAaVIyAADtezl-qxA968.jpg)
硬件:
- 安卓手機。
注意:必須(!)使用 6-12 伏電源適配器來操作 TFT 屏蔽,因為 USB 的 500 mA 的最大電流不足以正常操作。
軟件:
準備中
軟件
所有演示草圖都是在 Arduino IDE 環境中編寫的,因此一開始需要安裝 Arduino IDE - https://www.arduino.cc/en/main/software。然后你需要為 TFT shield 安裝一個庫 - github.com/YATFT/YATFT (下載該庫并解壓到 Arduino IDE 目錄下的“libraries”文件夾中)。
安裝 Arduino IDE 后,您必須對 Arduino UNO 板進行編程。為簡單起見,我建議單獨刷機,不帶 TFT 屏蔽。為了這:
- 將 USB 線連接到 Arduino UNO 板;
- 在電腦上運行 Arduino IDE;
- 選擇Arduino UNO所連接的對應端口;
- 下載ArduinoBluetoothCamera.ino演示草圖(和文件ov7670_regs.h用于相機初始化);
- 單擊按鈕上傳。
如果 Arduino UNO 板編程成功,您可以繼續下一步。
ArduinoBluetoothCamera.ino草圖:
/**********************************************************************
* SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF
* ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY
* WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A
* PARTICULAR PURPOSE. IN NO EVENT SHALL AUTHOR OR ITS LICENSORS BE
* LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY,
* CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY
* DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO
* ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES,
* LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS,
* TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT
* NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
***********************************************************************/
#include
#include
#include
#include
#include "ov7670_regs.h"
JPEG_DECODE jpeg_decode;
YATFT tft(0);
INTRFC ifc;
CAM cam;
CODEC codec;
SRL srl;
#define IMG_SizeX 320
#define IMG_SizeY 240
uint8_t mode = 0;
uint8_t last_mode = 0;
uint8_t start_capt = 0;
uint16_t err;
void setup()
{
// initialize the serial port
Serial.begin(115200);
// initialize the display
tft.begin();
tft.SetColor(BRIGHTRED);
tft.ClearDevice();
}
void loop()
{
// put your main code here, to run repeatedly:
if (Serial.available())
{
uint8_t temp = Serial.read();
switch (temp)
{
case 0x10: // Send single Photo
mode = 1;
start_capt = 1;
if (last_mode != mode && last_mode != 2) {
tft.begin();
tft.SetRGB(); // Switch to RGB mode
cam.CamInit(&OV7670_QVGA[0][0]);
cam.CamVideoPreview(0, 0, 1, true);
codec.JPEGInit();
codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY);
delay(1000);
}
break;
case 0x20: // Continuous send Photo
mode = 2;
start_capt = 2;
if (last_mode != mode && last_mode != 1) {
tft.begin();
tft.SetRGB(); // Switch to RGB mode
cam.CamInit(&OV7670_QVGA[0][0]);
cam.CamVideoPreview(0, 0, 1, true);
codec.JPEGInit();
codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY);
}
break;
case 0x30: // Receive single Photo
mode = 3;
start_capt = 3;
if (last_mode != mode && last_mode != 4) {
tft.begin();
tft.SetYUV(); // Switch to YUV mode
}
break;
case 0x40: // Continuous receive Photo
mode = 4;
start_capt = 4;
if (last_mode != mode && last_mode != 3) {
tft.begin();
tft.SetYUV(); // Switch to YUV mode
}
break;
default:
break;
}
}
if (mode == 1) // Send single Photo
{
if (start_capt == 1)
{
start_capt = 0;
last_mode = mode;
mode = 0;
CamCapture();
}
}
else if (mode == 2) // Continuous send Photo
{
while (1)
{
uint8_t temp = Serial.read();
if (start_capt == 2)
{
start_capt = 0;
}
if (temp == 0x21) // Stop ?
{
start_capt = 0;
last_mode = mode;
mode = 0;
break;
}
if (CamCapture()) continue;
}
}
else if (mode == 3) // Receive single Photo
{
if (start_capt == 3)
{
//Start capture
start_capt = 0;
last_mode = mode;
mode = 0;
Serial.print("!");
srl.JPEGReadFromSerial(&jpeg_decode, // jpeg decode structure
0, // x0 (left)
0, // y0 (top)
GetMaxX()+1, // x1 (right)
GetMaxY()+1, // y1 (bottom)
32000); // max image size
}
}
else if (mode == 4) // Continuous receive Photo
{
uint8_t temp = Serial.read();
while (1)
{
if (start_capt == 4)
{
//Start capture
start_capt = 0;
}
if (temp == 0x41) // Stop ?
{
start_capt = 0;
last_mode = mode;
mode = 0;
break;
}
Serial.print("!");
srl.JPEGReadFromSerial(&jpeg_decode, // jpeg decode structure
0, // x0 (left)
0, // y0 (top)
GetMaxX()+1, // x1 (right)
GetMaxY()+1, // y1 (bottom)
32000); // max image size
}
}
}
uint8_t CamCapture(void)
{
uint8_t temp = 0xff, temp_last = 0;
bool is_header = false;
uint32_t length = 0;
length = codec.JPEGStart();
uint32_t en_jpeg_address = ifc.rdReg32(0x414)<<2;
int k = 0;
if ((length >= 0x5FFFF) | (length == 0))
{
start_capt = 2;
return 1;
}
temp = ifc.GetMem(en_jpeg_address+k);
k++;
length --;
while ( length-- )
{
temp_last = temp;
temp = ifc.GetMem(en_jpeg_address+k);
k++;
if (is_header == true)
{
Serial.write(temp);
}
else if ((temp == 0xD8) & (temp_last == 0xFF))
{
is_header = true;
Serial.write(temp_last);
Serial.write(temp);
}
if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
break;
}
is_header = false;
return 0;
}
OV7670_regs.h:
#ifndef OV7670_REGS_H
#define OV7670_REGS_H
const uint8_t OV7670_VGA[][2] PROGMEM =
{
{ 1, 0x42}, // Size of byte, Address (ID)
{ 640/16, 480/16}, // Size X, Size Y
{0b01000010, 0b00000100}, // Reset_Enable_N, 7|6|5|4|3|Vsync Invert|Hsync Invert|0
{0x3a, 0x0C}, {0x40, 0xC0}, {0x12, 0x00}, {0x0c, 0x00},
{0x3e, 0x00}, {0x70, 0x3A}, {0x71, 0x35}, {0x72, 0x11},
{0x73, 0xF0}, {0xa2, 0x02}, {0x11, 0x80}, {0x7a, 0x18},
{0x7b, 0x02}, {0x7c, 0x07}, {0x7d, 0x1F}, {0x7e, 0x49},
{0x7f, 0x5A}, {0x80, 0x6A}, {0x81, 0x79}, {0x82, 0x87},
{0x83, 0x94}, {0x84, 0x9F}, {0x85, 0xAF}, {0x86, 0xBB},
{0x87, 0xCF}, {0x88, 0xEE}, {0x89, 0xEE}, {0x13, 0xE0},
{0x00, 0x00}, {0x10, 0x00}, {0x0d, 0x00}, {0x24, 0x98},
{0x25, 0x63}, {0x26, 0xD3}, {0x2a, 0x00}, {0x2b, 0x00},
{0x2d, 0x00}, {0x13, 0xe5}, {0x13, 0xe7}, {0x1e, 0x30},
{0x74, 0x60}, {0x01, 0x80}, {0x02, 0x80}, {0x15, 0x10},
{0x4f, 0x40}, {0x50, 0x34}, {0x51, 0x0C}, {0x52, 0x17},
{0x53, 0x29}, {0x54, 0x40}, {0x57, 0x80}, {0x58, 0x1e},
{0x41, 0x10}, {0x75, 0x60}, {0x76, 0x50}, {0x77, 0x48},
{0x3d, 0x92}, {0x3b, 0x00}, {0x04, 0x00}, {0xff, 0xff},
};
const uint8_t OV7670_QVGA[][2] PROGMEM =
{
{ 1, 0x42}, // Size of byte, Address (ID)
{ 320/16, 240/16}, // Size X, Size Y
{0b01000010, 0b00000100}, // Reset_Enable_N, 7|6|5|4|3|Vsync Invert|Hsync Invert|0
{0x3a, 0x0C}, {0x40, 0xC0}, {0x12, 0x10}, {0x0c, 0x00},
{0x3e, 0x00}, {0x70, 0x3A}, {0x71, 0x35}, {0x72, 0x11},
{0x73, 0xF0}, {0xa2, 0x02}, {0x11, 0x80}, {0x7a, 0x18},
{0x7b, 0x02}, {0x7c, 0x07}, {0x7d, 0x1F}, {0x7e, 0x49},
{0x7f, 0x5A}, {0x80, 0x6A}, {0x81, 0x79}, {0x82, 0x87},
{0x83, 0x94}, {0x84, 0x9F}, {0x85, 0xAF}, {0x86, 0xBB},
{0x87, 0xCF}, {0x88, 0xEE}, {0x89, 0xEE}, {0x13, 0xE0},
{0x00, 0x00}, {0x10, 0x00}, {0x0d, 0x00}, {0x24, 0x98},
{0x25, 0x63}, {0x26, 0xD3}, {0x2a, 0x00}, {0x2b, 0x00},
{0x2d, 0x00}, {0x13, 0xe5}, {0x13, 0xe7}, {0x1e, 0x30},
{0x74, 0x60}, {0x01, 0x80}, {0x02, 0x80}, {0x15, 0x10},
{0x4f, 0x40}, {0x50, 0x34}, {0x51, 0x0C}, {0x52, 0x17},
{0x53, 0x29}, {0x54, 0x40}, {0x57, 0x80}, {0x58, 0x1e},
{0x41, 0x10}, {0x75, 0x60}, {0x76, 0x50}, {0x77, 0x48},
{0x3d, 0x92}, {0x3b, 0x00}, {0x04, 0x00}, {0xff, 0xff},
};
#endif
安卓
在 Android 手機上,您需要安裝ArduinoTFT.apk。允許應用使用藍牙和相機。
2020 年 5 月 26 日更新!
我添加了 ArduinoTFT.apk 的源代碼。原樣!下載ArduinoTFT.zip.h
,重命名為ArduinoTFT.zip 并解壓。享受!
2020 年 7 月 25 日更新!
“嗨,我遇到了同樣的問題,Android 應用程序無法正常工作。授權應用程序訪問智能手機相機后解決。就是這樣。再見”(c)
藍牙模塊
需要在藍牙模塊中設置匯率為115200(命令“AT+UART=115200, 0, 0”)。這是 Arduino UNO 管理接收和處理數據的最佳速度。(理論上可以提高速度,優化數據接收和處理,但這需要更大的RAM)。關于如何設置匯率的更詳細說明可以在網上找到,例如,這里:https:/ /www.instructables.com/id/Communication-Bluetooth-Module-With-HC-05-HC-06/ 。
(!)請注意藍牙模塊連接到 Arduino UNO 的調試端口。因此,在使用藍牙時,調試端口不可用。并且在對 Arduino UNO(配有藍牙模塊)進行編程之前,必須斷開藍牙模塊。編程后,將其重新設置(!)
集會
![poYBAGNOR8WAUbrBAAHcagtf9ow472.jpg](https://file.elecfans.com/web2/M00/70/C9/poYBAGNOR8WAUbrBAAHcagtf9ow472.jpg)
該設備的組裝非常簡單:
- 將 Arduino UNO 和 TFT-shield 連接在一起;
- 將 OV7670 相機連接到屏蔽層 TFT-shield 上的 20 針連接器(有時我使用 2.54 毫米間距的有角度的 18-20 針連接器作為適配器);
- 將藍牙模塊HC-06(HC-05)連接到TFT-shield上帶有“藍牙”字樣的4針連接器上;
- 將 6-12V 電源適配器連接到 Arduino UNO 板上的電源輸入。
打開電源后,TFT shield 的屏幕應變為紅色。這意味著愿意從 Android 手機接收命令。
在安卓手機上執行以下操作:
- 在 Android 手機上啟動ArduinoTFT應用程序;
- 將手機置于水平位置;
- 開啟藍牙連接,選擇檢測到的藍牙模塊(HC-06);
屏幕上應出現兩個窗口和四個按鈕:
- 右上角窗口是手機的相機取景窗口;
- 左側大窗口 - 接收或發送的圖像。
按鈕功能:
- 將單個圖像從 Android 手機傳輸到 Arduino;
- 將圖像從 Android 手機連續傳輸到 Arduino;
- 將單個圖像從 Arduino 傳輸到 Android 手機;
- 將圖像從 Arduino 連續傳輸到 Android 手機。
圖像大小為 320x240 像素 (2-5 kB)。本章有一個演示視頻。
再一次問好!有一個用于一系列屏幕的更新庫,目前由兩個屏蔽和兩個分線板組成。草圖的編譯取決于所選版本(從 1 到 4)和微控制器類型(MegaAVR 或 ESP-32)。添加了照片,示例。更多信息可以在https://github.com/Ekaburg/EkaTFT中找到。
?
- 帶有Android手機作為攝像頭的藍牙小車 0次下載
- 使用Arduino藍牙攝像頭的安全系統
- labview本地視頻及攝像頭資料 36次下載
- V380攝像頭客戶端下載 0次下載
- 基于LABVIEW編程的USB攝像頭拍照VI文件 56次下載
- 紅外攝像頭驅動工具ThermoX軟件下載 75次下載
- CCD攝像頭的電路原理圖免費下載 153次下載
- 如何實現家庭安防系統中的多攝像頭和視頻采集與網絡傳送 22次下載
- stm32 攝像頭 32次下載
- CCD攝像頭 18次下載
- 攝像頭入門 0次下載
- MINI攝像頭接線圖 35次下載
- 微視攝像頭驅動下載
- 001攝像頭萬能驅動下載
- 中星微305攝像頭驅動下載
- 用usb攝像頭替換手機前置攝像頭可以嗎 3061次閱讀
- AHD攝像頭與CVBS的區別 1.5w次閱讀
- 技術前沿:攝像頭模組 5445次閱讀
- 攝像頭應用領域及應用產品型號 1745次閱讀
- 汽車攝像頭鏈接技術挑戰和解決方案 1187次閱讀
- 如何正確的安裝監控攝像頭 1.3w次閱讀
- fireflyAIO-3399J攝像頭模組簡介 2040次閱讀
- fireflyAIO-3288C主板攝像頭模組簡介 2202次閱讀
- 為什么智能攝像頭這么受歡迎 4813次閱讀
- FireflyRK3288的攝像頭模組介紹 2432次閱讀
- 關于Firefly攝像頭模組的簡介 3347次閱讀
- 如何使用luvcview來實現UVC雙攝像頭拍攝 1w次閱讀
- 雙攝像頭的手機有哪些?雙攝像頭的手機推薦 2.5w次閱讀
- 攝像頭芯片型號有哪些_攝像頭芯片型號匯總 5.9w次閱讀
- 雙攝像頭系列原理 6736次閱讀
下載排行
本周
- 1A7159和A7139射頻芯片的資料免費下載
- 0.20 MB | 55次下載 | 5 積分
- 2PIC12F629/675 數據手冊免費下載
- 2.38 MB | 36次下載 | 5 積分
- 3PIC16F716 數據手冊免費下載
- 2.35 MB | 18次下載 | 5 積分
- 4dsPIC33EDV64MC205電機控制開發板用戶指南
- 5.78MB | 8次下載 | 免費
- 5STC15系列常用寄存器匯總免費下載
- 1.60 MB | 7次下載 | 5 積分
- 6模擬電路仿真實現
- 2.94MB | 4次下載 | 免費
- 7PCB圖繪制實例操作
- 2.92MB | 2次下載 | 免費
- 8零死角玩轉STM32F103—指南者
- 26.78 MB | 1次下載 | 1 積分
本月
- 1ADI高性能電源管理解決方案
- 2.43 MB | 452次下載 | 免費
- 2免費開源CC3D飛控資料(電路圖&PCB源文件、BOM、
- 5.67 MB | 141次下載 | 1 積分
- 3基于STM32單片機智能手環心率計步器體溫顯示設計
- 0.10 MB | 137次下載 | 免費
- 4A7159和A7139射頻芯片的資料免費下載
- 0.20 MB | 55次下載 | 5 積分
- 5PIC12F629/675 數據手冊免費下載
- 2.38 MB | 36次下載 | 5 積分
- 6如何正確測試電源的紋波
- 0.36 MB | 19次下載 | 免費
- 7PIC16F716 數據手冊免費下載
- 2.35 MB | 18次下載 | 5 積分
- 8Q/SQR E8-4-2024乘用車電子電器零部件及子系統EMC試驗方法及要求
- 1.97 MB | 8次下載 | 10 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935121次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233088次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73810次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論