Arduino 蓝牙相机 (ABC):手机通过蓝牙远程拍摄与图像传输
项目背景
作者利用一款集成了 3.5" TFT 屏 (320×240, 65K 色)、电阻触摸 (XPT2046)、RTC (DS1307)、microSD 卡槽、OV7670 摄像头 20P 接口、HC-05/06 蓝牙 4P 接口的**独特 TFT 扩展板**,在 Arduino UNO 上实现了双向图像传输:
- **UNO → 手机**:OV7670 拍摄 JPEG (320×240, 2~5 KB) 经蓝牙发送至 Android App 显示。
- **手机 → UNO**:手机拍照或相册选图,经蓝牙发送至 UNO,TFT 屏解码 JPEG 显示。
由于 Arduino UNO 仅 2 KB SRAM,无法缓存完整帧,作者将 JPEG 编解码、摄像头驱动、SD 卡、触摸、蓝牙收发全部下沉到 TFT 扩展板上的**专用协处理器 (YATFT 库内部 MCU)**,UNO 仅负责高层指令调度,实现了"小马拉大车"。
硬件清单
- Arduino UNO R3 ×1
- 独特 TFT 扩展板 (YATFT 兼容) ×1
- OV7670 摄像头模块 (带 FIFO) ×1
- HC-05/06 蓝牙模块 (已配置 115200 波特率) ×1
- 6-12V / ≥600mA 直流电源适配器 ×1 (USB 500mA 不足以驱动 TFT+摄像头)
- Android 手机 (安装
ArduinoTFT.apk) ×1
关键配置步骤
- 蓝牙波特率:AT 指令
AT+UART=115200,0,0设置为 115200/N/8/1,匹配 UNO 硬件串口最大可靠速率。 - 烧录顺序:拔掉蓝牙模块 → UNO 单独烧录
ArduinoBluetoothCamera.ino→ 插回蓝牙模块 → 上电。 - 库安装:GitHub
YATFT/YATFT整库放入libraries目录。 - Android 权限:安装 APK 后授予蓝牙、相机、存储权限 (Android 10+ 需额外授予"所有文件访问")。
核心固件逻辑 (节选)
// 四种工作模式,通过串口单字节切换
// 0x10: 单帧发送 (UNO→手机)
// 0x20: 连续发送 (UNO→手机)
// 0x30: 单帧接收 (手机→UNO)
// 0x40: 连续接收 (手机→UNO)
void loop() {
if (Serial.available()) {
uint8_t cmd = Serial.read();
switch(cmd) {
case 0x10: mode=1; start_capt=1; initCamJPEG(); break;
case 0x20: mode=2; start_capt=2; initCamJPEG(); break;
case 0x30: mode=3; start_capt=3; tft.SetYUV(); break;
case 0x40: mode=4; start_capt=4; tft.SetYUV(); break;
}
}
if (mode==1 && start_capt==1) { start_capt=0; mode=0; CamCapture(); }
else if (mode==2) { while(1) { if(Serial.read()==0x21) break; CamCapture(); } }
else if (mode==3 && start_capt==3) { start_capt=0; mode=0; srl.JPEGReadFromSerial(...); }
else if (mode==4) { while(1) { if(Serial.read()==0x41) break; srl.JPEGReadFromSerial(...); } }
}
// 读取摄像头 JPEG 并发送
uint8_t CamCapture() {
uint32_t len = codec.JPEGStart(); // 触发拍摄+编码
if (len >= 0x5FFFF || len==0) return 1;
uint32_t addr = ifc.rdReg32(0x414)<<2;
uint8_t temp=0xFF, last=0; bool header=false;
for (uint32_t k=0; k
Android App 界面与操作
横屏 UI 分两区:右上角手机摄像头预览,左侧大区域显示接收/发送的图像。四个按钮对应四种模式:
- 手机→UNO 单张
- 手机→UNO 连续 (视频流)
- UNO→手机 单张
- UNO→手机 连续
图像分辨率 320×240,JPEG 质量可在 App 设置调节 (默认 Q=50),单帧 2~5 KB,蓝牙 115200 理论吞吐 ~10 KB/s,连续模式约 2~3 fps。
性能与局限
- 优势:零 WiFi 依赖、低成本、硬件极简、适合教学演示"嵌入式图像传输"全链路。
- 瓶颈:蓝牙带限制帧率与分辨率;OV7670 无自动曝光/白平衡,画质一般;UNO 仅作指令分发,扩展性受限。
- 进阶替代:ESP32-CAM (自带 WiFi/BT、PSRAM、JPEG 硬编) 可实现 10+ fps 720p 传输,成本相当。
资源链接
- YATFT 库:github.com/YATFT/YATFT
- ArduinoTFT.apk 及源码 (ArduinoTFT.zip):项目附件区下载。
- 后续系列教程:TFT Shield 入门、OV7670 驱动详解、SPI 屏显示照片/视频、蓝牙遥控 4WD 小车。
制造工艺
- 现代相机的演变与设计
- 深度解析相机镜头:设计原理、发展历史与未来创新
- BrickPi Bookreader:树莓派+乐高Mindstorms自动翻页朗读Kindle
- 蓝牙控制树莓派机器人:语音反馈功能构建指南
- 蓝牙控制 Arduino 电动相机滑轨:打造丝滑电影级运镜
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- 语音控制家电:Google Assistant + 蓝牙 + Arduino UNO
- 便携式远程监控摄像头机器人系统
- 基于Arduino、Windows IoT与Azure云的高级跌倒检测系统
- Arduino + 继电器 + 安卓 App 远程控制灯泡
- 1Sheeld + Arduino 手机无线控制家庭灯光系统
- 使用 Arduino Uno 和蓝牙实现遥控小车:分步指南