資料介紹
描述
今天,你幾乎不會(huì)讓任何人感到驚訝,因?yàn)槟愕?a target='_blank' class='arckwlink_none'>手機(jī)配備了攝像頭、無線小工具和其他技術(shù)進(jìn)步。多虧了 Arduino 平臺,數(shù)百萬人發(fā)現(xiàn)了電子和編程的美妙世界。關(guān)于如何通過藍(lán)牙在手機(jī)和 Arduino 之間交換數(shù)據(jù)的 100、500 條指令被寫...我在說什么?是的。我想通過藍(lán)牙在 Android 上的手機(jī)和 Arduino UNO 之間交換數(shù)據(jù) 100、501 次。但我想傳輸?shù)牟粌H僅是一組字符和數(shù)字,而是圖片。
有人會(huì)說這是不可能的,Arduino 速度太慢,無法快速處理大量數(shù)據(jù)。他將是絕對正確的。如果對 Arduino 有一點(diǎn)幫助 - 將所有“艱苦”的工作轉(zhuǎn)移到其他設(shè)備的肩上呢?并且有這樣的設(shè)備!
這是 Arduino 獨(dú)特的 TFT 屏蔽。有關(guān)此徽標(biāo)的信息在以下文章中:文章 1 ,文章 2在本教程中,我將演示如何通過藍(lán)牙連接 Arduino 和 Android 手機(jī),從 Arduino UNO 上的 OV7670 攝像頭獲取照片并將其傳輸?shù)?Android 手機(jī)。然后,相反,將圖片(來自相機(jī)的圖像)從 Android 手機(jī)傳輸?shù)?Arduino UNO 并顯示在獨(dú)特的 TFT 屏蔽的屏幕上。
為 Android 手機(jī)編寫了一個(gè)特殊的應(yīng)用程序。
TFT屏蔽的簡要特點(diǎn):
- 尺寸 3.5 英寸對角線,
- 分辨率 320x240,
- 顏色數(shù) 65536(16 位),
- 5個(gè)按鈕,
- 用于連接 micro SD 卡的插槽,
- 4 針 (2.54 mm) 連接器,用于連接藍(lán)牙模塊 HC-05 (-06)、ESP8286 WiFi 模塊。
- 用于相機(jī) (OV7670) 的 20 針 (2.54 mm) 連接器。
所需組件列表
硬件:
注意:必須(!)使用 6-12 伏電源適配器來操作 TFT 屏蔽,因?yàn)?USB 的 500 mA 的最大電流不足以正常操作。
軟件:
準(zhǔn)備中
軟件
所有演示草圖都是在 Arduino IDE 環(huán)境中編寫的,因此一開始需要安裝 Arduino IDE - https://www.arduino.cc/en/main/software。然后你需要為 TFT shield 安裝一個(gè)庫 - github.com/YATFT/YATFT (下載該庫并解壓到 Arduino IDE 目錄下的“l(fā)ibraries”文件夾中)。
安裝 Arduino IDE 后,您必須對 Arduino UNO 板進(jìn)行編程。為簡單起見,我建議單獨(dú)刷機(jī),不帶 TFT 屏蔽。為了這:
- 將 USB 線連接到 Arduino UNO 板;
- 在電腦上運(yùn)行 Arduino IDE;
- 選擇Arduino UNO所連接的對應(yīng)端口;
- 下載ArduinoBluetoothCamera.ino演示草圖(和文件ov7670_regs.h用于相機(jī)初始化);
- 單擊按鈕上傳。
如果 Arduino UNO 板編程成功,您可以繼續(xù)下一步。
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 手機(jī)上,您需要安裝ArduinoTFT.apk。允許應(yīng)用使用藍(lán)牙和相機(jī)。
2020 年 5 月 26 日更新!
我添加了 ArduinoTFT.apk 的源代碼。原樣!下載ArduinoTFT.zip.h
,重命名為ArduinoTFT.zip 并解壓。享受!
2020 年 7 月 25 日更新!
“嗨,我遇到了同樣的問題,Android 應(yīng)用程序無法正常工作。授權(quán)應(yīng)用程序訪問智能手機(jī)相機(jī)后解決。就是這樣。再見”(c)
藍(lán)牙模塊
需要在藍(lán)牙模塊中設(shè)置匯率為115200(命令“AT+UART=115200, 0, 0”)。這是 Arduino UNO 管理接收和處理數(shù)據(jù)的最佳速度。(理論上可以提高速度,優(yōu)化數(shù)據(jù)接收和處理,但這需要更大的RAM)。關(guān)于如何設(shè)置匯率的更詳細(xì)說明可以在網(wǎng)上找到,例如,這里:https:/ /www.instructables.com/id/Communication-Bluetooth-Module-With-HC-05-HC-06/ 。
(!)請注意藍(lán)牙模塊連接到 Arduino UNO 的調(diào)試端口。因此,在使用藍(lán)牙時(shí),調(diào)試端口不可用。并且在對 Arduino UNO(配有藍(lán)牙模塊)進(jìn)行編程之前,必須斷開藍(lán)牙模塊。編程后,將其重新設(shè)置(?。?/font>
集會(huì)
該設(shè)備的組裝非常簡單:
- 將 Arduino UNO 和 TFT-shield 連接在一起;
- 將 OV7670 相機(jī)連接到屏蔽層 TFT-shield 上的 20 針連接器(有時(shí)我使用 2.54 毫米間距的有角度的 18-20 針連接器作為適配器);
- 將藍(lán)牙模塊HC-06(HC-05)連接到TFT-shield上帶有“藍(lán)牙”字樣的4針連接器上;
- 將 6-12V 電源適配器連接到 Arduino UNO 板上的電源輸入。
打開電源后,TFT shield 的屏幕應(yīng)變?yōu)榧t色。這意味著愿意從 Android 手機(jī)接收命令。
在安卓手機(jī)上執(zhí)行以下操作:
- 在 Android 手機(jī)上啟動(dòng)ArduinoTFT應(yīng)用程序;
- 將手機(jī)置于水平位置;
- 開啟藍(lán)牙連接,選擇檢測到的藍(lán)牙模塊(HC-06);
屏幕上應(yīng)出現(xiàn)兩個(gè)窗口和四個(gè)按鈕:
- 右上角窗口是手機(jī)的相機(jī)取景窗口;
- 左側(cè)大窗口 - 接收或發(fā)送的圖像。
按鈕功能:
- 將單個(gè)圖像從 Android 手機(jī)傳輸?shù)?Arduino;
- 將圖像從 Android 手機(jī)連續(xù)傳輸?shù)?Arduino;
- 將單個(gè)圖像從 Arduino 傳輸?shù)?Android 手機(jī);
- 將圖像從 Arduino 連續(xù)傳輸?shù)?Android 手機(jī)。
圖像大小為 320x240 像素 (2-5 kB)。本章有一個(gè)演示視頻。
再一次問好!有一個(gè)用于一系列屏幕的更新庫,目前由兩個(gè)屏蔽和兩個(gè)分線板組成。草圖的編譯取決于所選版本(從 1 到 4)和微控制器類型(MegaAVR 或 ESP-32)。添加了照片,示例。更多信息可以在https://github.com/Ekaburg/EkaTFT中找到。
?
- 帶有Android手機(jī)作為攝像頭的藍(lán)牙小車 0次下載
- 使用Arduino藍(lán)牙攝像頭的安全系統(tǒng)
- labview本地視頻及攝像頭資料 34次下載
- V380攝像頭客戶端下載 0次下載
- 基于LABVIEW編程的USB攝像頭拍照VI文件 56次下載
- 紅外攝像頭驅(qū)動(dòng)工具ThermoX軟件下載 65次下載
- CCD攝像頭的電路原理圖免費(fèi)下載 148次下載
- 如何實(shí)現(xiàn)家庭安防系統(tǒng)中的多攝像頭和視頻采集與網(wǎng)絡(luò)傳送 21次下載
- stm32 攝像頭 31次下載
- CCD攝像頭 18次下載
- 攝像頭入門 0次下載
- MINI攝像頭接線圖 35次下載
- 微視攝像頭驅(qū)動(dòng)下載
- 001攝像頭萬能驅(qū)動(dòng)下載
- 中星微305攝像頭驅(qū)動(dòng)下載
- 用usb攝像頭替換手機(jī)前置攝像頭可以嗎 1514次閱讀
- AHD攝像頭與CVBS的區(qū)別 1.1w次閱讀
- 技術(shù)前沿:攝像頭模組 4431次閱讀
- 攝像頭應(yīng)用領(lǐng)域及應(yīng)用產(chǎn)品型號 1358次閱讀
- 汽車攝像頭鏈接技術(shù)挑戰(zhàn)和解決方案 950次閱讀
- 如何正確的安裝監(jiān)控攝像頭 1.2w次閱讀
- fireflyAIO-3399J攝像頭模組簡介 1910次閱讀
- fireflyAIO-3288C主板攝像頭模組簡介 2062次閱讀
- 為什么智能攝像頭這么受歡迎 4635次閱讀
- FireflyRK3288的攝像頭模組介紹 2256次閱讀
- 關(guān)于Firefly攝像頭模組的簡介 3147次閱讀
- 如何使用luvcview來實(shí)現(xiàn)UVC雙攝像頭拍攝 9745次閱讀
- 雙攝像頭的手機(jī)有哪些?雙攝像頭的手機(jī)推薦 2.4w次閱讀
- 攝像頭芯片型號有哪些_攝像頭芯片型號匯總 5.9w次閱讀
- 雙攝像頭系列原理 6435次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多