亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino 蓝牙摄像头 (ABC)

组件和用品

Arduino UNO
× 1
HC-05 蓝牙模块
× 1
相机 OV7670
× 1
Arduino TFT 屏蔽
× 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和遥控电视做实验 相机OV7670和电视遥控器的实验

制造工艺

  1. 相机
  2. 相机镜头
  3. BrickPi Bookreader
  4. 通过蓝牙控制的树莓派机器人
  5. Arduino 蓝牙控制电动相机滑块
  6. Arduino 带蓝牙控制 LED!
  7. 带有 OK Google 的蓝牙语音控制设备
  8. 移动远程监控摄像头
  9. 基于 Arduino、Windows 和 Azure 的跌倒检测系统
  10. Arduino Uno + 电子设备(灯泡)+ Android 手机
  11. 使用智能手机控制您的灯光系统
  12. 使用 Arduino Uno 和蓝牙进行汽车控制