资料介绍
描述
今天,你几乎不会让任何人感到惊讶,因为你的手机配备了摄像头、无线小工具和其他威廉希尔官方网站 进步。多亏了 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) 连接器。
所需组件列表
硬件:
- 安卓手机。
注意:必须(!)使用 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(配有蓝牙模块)进行编程之前,必须断开蓝牙模块。编程后,将其重新设置(!)
集会
该设备的组装非常简单:
- 将 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本地视频及摄像头资料 34次下载
- V380摄像头客户端下载 0次下载
- 基于LABVIEW编程的USB摄像头拍照VI文件 56次下载
- 红外摄像头驱动工具ThermoX软件下载 65次下载
- CCD摄像头的电路原理图免费下载 148次下载
- 如何实现家庭安防系统中的多摄像头和视频采集与网络传送 21次下载
- stm32 摄像头 31次下载
- CCD摄像头 18次下载
- 摄像头入门 0次下载
- MINI摄像头接线图 35次下载
- 微视摄像头驱动下载
- 001摄像头万能驱动下载
- 中星微305摄像头驱动下载
- 用usb摄像头替换手机前置摄像头可以吗 1514次阅读
- AHD摄像头与CVBS的区别 1.1w次阅读
- 威廉希尔官方网站 前沿:摄像头模组 4431次阅读
- 摄像头应用领域及应用产品型号 1358次阅读
- 汽车摄像头链接威廉希尔官方网站 挑战和解决方案 950次阅读
- 如何正确的安装监控摄像头 1.2w次阅读
- fireflyAIO-3399J摄像头模组简介 1910次阅读
- fireflyAIO-3288C主板摄像头模组简介 2062次阅读
- 为什么智能摄像头这么受欢迎 4635次阅读
- FireflyRK3288的摄像头模组介绍 2256次阅读
- 关于Firefly摄像头模组的简介 3147次阅读
- 如何使用luvcview来实现UVC双摄像头拍摄 9745次阅读
- 双摄像头的手机有哪些?双摄像头的手机推荐 2.4w次阅读
- 摄像头芯片型号有哪些_摄像头芯片型号汇总 5.9w次阅读
- 双摄像头系列原理 6435次阅读
下载排行
本周
- 1使用单片机实现七人表决器的程序和仿真资料免费下载
- 2.96 MB | 44次下载 | 免费
- 2联想E46L DAOLL6笔记本电脑图纸
- 1.10 MB | 2次下载 | 5 积分
- 3MATLAB绘图合集
- 27.12 MB | 2次下载 | 5 积分
- 4PR735,使用UCC28060的600W交错式PFC转换器
- 540.03KB | 1次下载 | 免费
- 5UCC38C42 30W同步降压转换器参考设计
- 428.07KB | 1次下载 | 免费
- 6DV2004S1/ES1/HS1快速充电开发系统
- 2.08MB | 1次下载 | 免费
- 7模态分解合集matlab代码
- 3.03 MB | 1次下载 | 2 积分
- 8美的电磁炉维修手册大全
- 1.56 MB | 1次下载 | 5 积分
本月
- 1使用单片机实现七人表决器的程序和仿真资料免费下载
- 2.96 MB | 44次下载 | 免费
- 2UC3842/3/4/5电源管理芯片中文手册
- 1.75 MB | 15次下载 | 免费
- 3DMT0660数字万用表产品说明书
- 0.70 MB | 13次下载 | 免费
- 4TPS54202H降压转换器评估模块用户指南
- 1.02MB | 8次下载 | 免费
- 5STM32F101x8/STM32F101xB手册
- 1.69 MB | 8次下载 | 1 积分
- 6HY12P65/HY12P66数字万用表芯片规格书
- 0.69 MB | 6次下载 | 免费
- 7华瑞昇CR216芯片数字万用表规格书附原理图及校正流程方法
- 0.74 MB | 6次下载 | 3 积分
- 8华瑞昇CR215芯片数字万用表原理图
- 0.21 MB | 5次下载 | 3 积分
总榜
- 1matlab软件下载入口
- 未知 | 935119次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420061次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233084次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191367次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183335次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81581次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73807次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65987次下载 | 10 积分
评论
查看更多