Arduino 蓝牙摄像头 (ABC)
组件和用品
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
关于这个项目
今天,您几乎不会对拥有带摄像头、无线设备和其他技术进步的手机的任何人感到惊讶。得益于 Arduino 平台,数百万人发现了电子和编程的美妙世界。 100, 500 条指令是关于如何通过蓝牙在手机和 Arduino 之间交换数据的……我在说什么?是的。我想通过蓝牙在 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 位),
- 电阻式触摸屏(XPT2046 控制器),
- 5 个按钮,
- RTC IC DS1307 带 3V 锂电池 CR1220,
- 用于连接微型 SD 卡的插槽,
- 4 针(2.54 毫米)连接器,用于连接蓝牙模块 HC-05 (-06)、ESP8286 WiFi 模块。
- 用于相机 (OV7670) 的 20 针(2.54 毫米)连接器。
所需组件列表

硬件 :
- Arduino UNO;
- 独特的TFT屏蔽;
- AC-DC 电源适配器 6-12 伏,>600mA;
- 摄像机 OV7670;
- 蓝牙模块 HC-06 (HC-05);
- Android 手机。
注意:必须(!)使用 6-12 伏电源适配器来操作 TFT 屏蔽板,因为 USB 的最大 500 mA 电流不足以正常操作。
软件 :
- Arduino IDE;
- 独特的 TFT 屏蔽库;
- Android 手机的 APK 文件。
准备
软件
所有演示草图都是在Arduino IDE环境中编写的,因此一开始需要安装Arduino IDE - https://www.arduino.cc/en/main/software.然后需要安装一个用于TFT屏蔽的库- 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 草图:
/*********************************************** **************************** 软件和文档“按原样”提供,不提供*任何形式的明示或暗示保证,包括对适销性、所有权、非侵权和适用于 A* 特定目的的任何*保证,但不限于此。在任何情况下,作者或其许可人均不* 对合同、疏忽、严格责任、* 贡献、违反保证或其他法律公平理论承担* 责任或义务* 直接或间接损害*特殊的、间接的、惩罚性的或后果性的损害,* 利润损失或数据丢失,替代品的采购成本,* 技术、服务或第三方的任何索赔(包括但*不限于任何其他原因) .**************************************************** **********************/#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 240uint8_tmode8_t;uint8_tmode=last 0;uint8_t start_capt =0;uint16_t err;void setup(){ // 初始化串口Serial.begin(115200); // 初始化显示 tft.begin(); tft.SetColor(BRIGHTRED); tft.ClearDevice();}void loop(){ // 把你的主要代码放在这里,重复运行: if (Serial.available()) { uint8_t temp =Serial.read(); switch (temp) { case 0x10:// 发送单张照片模式 =1; start_capt =1; if (last_mode !=mode &&last_mode !=2) { tft.begin(); tft.SetRGB(); // 切换到RGB模式 cam.CamInit(&OV7670_QVGA[0][0]); cam.CamVideoPreview(0, 0, 1, true); codec.JPEGInit(); codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY);延迟(1000); } 休息; case 0x20:// 连续发送照片模式 =2; start_capt =2; if (last_mode !=mode &&last_mode !=1) { tft.begin(); tft.SetRGB(); // 切换到RGB模式 cam.CamInit(&OV7670_QVGA[0][0]); cam.CamVideoPreview(0, 0, 1, true); codec.JPEGInit(); codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY); } 休息; case 0x30:// 接收单张照片模式 =3; start_capt =3; if (last_mode !=mode &&last_mode !=4) { tft.begin(); tft.SetYUV(); // 切换到 YUV 模式 } break; case 0x40:// 连续接收照片模式 =4; start_capt =4; if (last_mode !=mode &&last_mode !=3) { tft.begin(); tft.SetYUV(); // 切换到 YUV 模式 } break;默认值:中断; } } if (mode ==1) // 发送单张照片 { if (start_capt ==1) { start_capt =0; last_mode =模式;模式 =0;摄像头(); } } else if (mode ==2) // 连续发送照片 { while (1) { uint8_t temp =Serial.read();如果(start_capt ==2){ start_capt =0; } if (temp ==0x21) // 停止? { start_capt =0; last_mode =模式;模式 =0;休息;如果(CamCapture())继续; } } else if (mode ==3) // 接收单张照片 { if (start_capt ==3) { //开始抓拍 start_capt =0; last_mode =模式;模式 =0; Serial.print("!"); srl.JPEGReadFromSerial(&jpeg_decode, // jpeg 解码结构 0, // x0 (左) 0, // y0 (上) GetMaxX()+1, // x1 (右) GetMaxY()+1, // y1 (下) ) 32000); // 最大图像尺寸 } } else if (mode ==4) // 连续接收照片 { uint8_t temp =Serial.read(); while (1) { if (start_capt ==4) { //开始捕获 start_capt =0; } if (temp ==0x41) // 停止 ? { start_capt =0; last_mode =模式;模式 =0;休息; Serial.print("!"); srl.JPEGReadFromSerial(&jpeg_decode, // jpeg 解码结构 0, // x0 (左) 0, // y0 (上) GetMaxX()+1, // x1 (右) GetMaxY()+1, // y1 (下) ) 32000); // 最大图像尺寸 } }}uint8_t CamCapture(void){ uint8_t temp =0xff, temp_last =0; bool is_header =false; uint32_t 长度 =0;长度 =codec.JPEGStart(); uint32_t en_jpeg_address =ifc.rdReg32(0x414)<<2;整数 k =0; if ((length>=0x5FFFF) | (length ==0)) { start_capt =2;返回 1; } temp =ifc.GetMem(en_jpeg_address+k); k++;长度 -;而(长度 - ){ 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) ) //如果找到结尾,break while,break; is_header =false;返回 0;}
OV7670_regs.h:
#ifndef OV7670_REGS_H#define OV7670_REGS_Hconst uint8_t OV7670_VGA[][2] PROGMEM ={ { 1, 0x42}, // 字节大小,地址(ID){ 640/16, //16}大小 X, 大小 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}, {0x10a, {0x71, , 0x18}, {0x7b, 0x02}, {0x7c, 0x07}, {0x7d, 0x1F}, {0x7e, 0x49}, {0x7f, 0x5A}, {0x80, 0x6A}, {0x81, {0x82} }, {0x83, 0x94}, {0x84, 0x9F}, {0x85, 0xAF}, {0x86, 0xBB}, {0x87, 0xCF}, {0x88, 0xEE}, {0x89, 0xEE}, {0x10}, 0xE {0x00, 0x00}, {0x10, 0x00}, {0x0d, 0x00}, {0x24, 0x98}, {0x25, 0x63}, {0x26, 0xD3}, {0x2a, 0x00}, {0x20b, {0x20b} , 0x00}, {0x13, 0xe5}, {0x13, 0xe7}, {0x1e, 0x30}, {0x74, 0x60}, {0x01, 0x80}, {0x02, 0x80}, {0x15, {0x10}, {0x10} }, {0x50, 0x34}, {0x51, 0x0C}, {0x52, 0x17}, {0x53, 0x29}, {0x54, 0x40}, {0x57, 0x80}, {0x58, 0x1e}, {0x10}{0x75, 0x60}, {0x76, 0x50}, {0x77, 0x48}, {0x3d, 0x92}, {0x3b, 0x00}, {0x04, 0x00}, {0xff, 0xff},}; const uint8_t OV7670_QVGA[][2] PROGMEM ={ { 1, 0x42}, // 字节大小,地址(ID){ 320/16, 240/16}, // 大小 X,大小 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}, {0x7b 0x7c, 0x07}, {0x7d, 0x1F}, {0x7e, 0x49}, {0x7f, 0x5A}, {0x80, 0x6A}, {0x81, 0x79}, {0x82, 0x87}, {0x84, {0x84}, 0x9F}, {0x85, 0xAF}, {0x86, 0xBB}, {0x87, 0xCF}, {0x88, 0xEE}, {0x89, 0xEE}, {0x13, 0xE0}, {0x00, 0x00}, {0x10} , {0x0d, 0x00}, {0x24, 0x98}, {0x25, 0x63}, {0x26, 0xD3}, {0x2a, 0x00}, {0x2b, 0x00}, {0x2d, 0x03}, {0xe5} 0x13, 0xe7}, {0x1e, 0x30}, {0x74, 0x60}, {0x01, 0x80}, {0x02, 0x80}, {0x15, 0x10}, {0x4f, 0x40}, {0x51, {0x51, 0x0C}, {0x52, 0x17}, {0x53, 0x29}, {0x54, 0x40}, {0x57, 0x80}, {0x58, 0x1e}, {0x41, 0x10}, {0x75, {0x50}, {0x70} , {0x77, 0x48}, {0x3d, 0x92 }, {0x3b, 0x00}, {0x04, 0x00}, {0xff, 0xff},}; #endif
安卓
在安卓手机上,你需要安装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 屏蔽层上的 20 针连接器(有时我使用间距为 2.54 毫米的有角度的 18-20 针连接器作为适配器);
- 将蓝牙模块 HC-06 (HC-05) 连接到 TFT 屏蔽板上带有“蓝牙”字样的 4 针连接器;
- 将 6-12V 电源适配器连接到 Arduino UNO 板上的电源输入。
打开电源后,TFT屏蔽的屏幕应该变成红色。这意味着愿意接收来自 Android 手机的命令。
演示






在Android手机上执行以下操作:
- 启动ArduinoTFT Android 手机上的应用程序;
- 将手机置于水平位置;
- 开启蓝牙连接,选择检测到的蓝牙模块(HC-06);
屏幕上应出现两个窗口和四个按钮:
- 右上角的窗口是手机的相机取景窗口;
- 左侧大窗口 - 接收或发送的图像。
按钮功能:
- 将单个图像从 Android 手机传输到 Arduino;
- 将图像从 Android 手机持续传输到 Arduino;
- 将单个图像从 Arduino 传输到 Android 手机;
- 将图像从 Arduino 持续传输到 Android 手机。
图像大小为 320x240 像素 (2-5 kB)。本章有演示视频。
如果您喜欢我的文章,我将不胜感激。也许这会给我写新文章的动力。 :-)
感谢收看!
以前的文章:
1) Arduino Uno 的独特 TFT 扩展板 - 开始,
2) 独特的Arduino TFT Shield - OV7670 Cam。
下一篇:
3) Arduino Nano 的 TFT 屏蔽 - 开始,
4) TFT SPI 显示器上的照片和 RGB 视频。
5) 智能手机四驱机器人车通过蓝牙控制。
2021 年 4 月 1 日更新:
再一次问好!有一系列屏幕的更新库,目前由两个屏蔽和两个分线板组成。根据所选版本(从 1 到 4)和微控制器类型(MegaAVR 或 ESP-32)编译草图。添加了照片,示例。更多信息可以在 https://github.com/Ekaburg/EkaTFT 中找到。
代码
TFT 屏蔽库
http://github.com/YATFT/YATFT定制零件和外壳
用OV7670和遥控电视做实验

制造工艺