Arduino Bluetooth Camera (ABC): スマホとBluetooth接続で画像撮影・転送
コンポーネントと用品
| Arduino UNO | × | 1 |
| HC-05 Bluetoothモジュール | × | 1 |
| カメラ OV7670 | × | 1 |
| Arduino TFTシールド (独自仕様) | × | 1 |
このプロジェクトについて
今日では、カメラ付きスマートフォンやワイヤレスガジェットは珍しくありません。Arduinoプラットフォームのおかげで、何百万人もの人々が電子工作とプログラミングの素晴らしい世界を発見しました。スマホとArduino間でBluetooth通信する方法については、すでに100、500もの解説記事が書かれています... 私が挑戦するのは100、501回目です。しかし、単なる文字や数値のやり取りではなく、「画像」を転送したいのです。
「Arduinoは大量データの高速処理には遅すぎて不可能」と言う人もいるでしょう。その通りです。でも、Arduinoの「重い」処理を別のデバイスに肩代わりさせたらどうでしょう? そんなデバイスがあります!
それが、Arduino用のユニークなTFTシールドです。このシールドについては「記事1」「記事2」で詳しく解説しています。このチュートリアルでは、ArduinoとAndroidスマホをBluetooth接続し、Arduino UNOのOV7670カメラで撮影した画像をスマホに転送。逆に、スマホからArduino UNOへ画像を送り、TFTシールドの画面に表示する方法を実演します。
Androidスマホ用の専用アプリも作成しました。
TFTシールドの主な仕様
- 3.5インチ対角サイズ
- 解像度 320×240
- 65,536色 (16-bit)
- 抵抗膜式タッチスクリーン (XPT2046コントローラー)
- 5つのボタン
- RTC IC DS1307 + CR1220リチウム電池
- microSDカードスロット
- 4ピン(2.54mm)コネクター: Bluetooth HC-05/06、ESP8266 WiFiモジュール接続用
- 20ピン(2.54mm)コネクター: OV7670カメラ接続用
必要なコンポーネント
ハードウェア:
- Arduino UNO
- ユニークTFTシールド
- AC-DCアダプター 6-12V, 600mA以上 (重要!)
- カメラ OV7670
- Bluetoothモジュール HC-06 (または HC-05)
- Androidスマホ
注意: TFTシールドの動作には6-12VのACアダプターが必須です。USBの500mAでは電力不足で正常動作しません。
ソフトウェア:
- Arduino IDE
- ユニークTFTシールド用ライブラリ
- Android用APKファイル
準備
ソフトウェア
すべてのデモスケッチはArduino IDEで書かれています。まず Arduino IDEをインストール してください。次に、TFTシールド用ライブラリを GitHubからダウンロード し、Arduino IDEの「libraries」フォルダに解凍してください。
Arduino IDEインストール後、Arduino UNOボードにプログラムを書き込みます。簡単のため、TFTシールドを外した状態で書き込むことを推奨します:
- USBケーブルでArduino UNOをPCに接続
- Arduino IDEを起動
- 接続ポートを選択
- デモスケッチ
ArduinoBluetoothCamera.inoとカメラ初期化用ov7670_regs.hをダウンロード - [書き込み] ボタンをクリック
書き込み成功後、次のステップへ進みます。
ArduinoBluetoothCamera.ino スケッチ (抜粋)
#include <YATFT.h>
#include <util/yacam.h>
#include <util/yacodec.h>
#include <util/yasrl.h>
#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() {
Serial.begin(115200);
tft.begin();
tft.SetColor(BRIGHTRED);
tft.ClearDevice();
}
void loop() {
if (Serial.available()) {
uint8_t temp = Serial.read();
switch (temp) {
case 0x10: // 単発撮影送信モード
mode = 1; start_capt = 1;
if (last_mode != mode && last_mode != 2) { initCamera(); }
break;
case 0x20: // 連続撮影送信モード
mode = 2; start_capt = 2;
if (last_mode != mode && last_mode != 1) { initCamera(); }
break;
case 0x30: // 単発受信表示モード
mode = 3; start_capt = 3;
if (last_mode != mode && last_mode != 4) { tft.begin(); tft.SetYUV(); }
break;
case 0x40: // 連続受信表示モード
mode = 4; start_capt = 4;
if (last_mode != mode && last_mode != 3) { tft.begin(); tft.SetYUV(); }
break;
}
}
// 各モードの処理 (省略: 完全版は添付コード参照)
// mode 1: 単発撮影 -> JPEGエンコード -> シリアル送信
// mode 2: 連続撮影送信 (0x21受信で停止)
// mode 3: 単発受信 -> JPEGデコード -> TFT表示
// mode 4: 連続受信表示 (0x41受信で停止)
}
uint8_t CamCapture(void) {
// JPEGデータを読み出し、シリアル送信
// ヘッダー(0xFF 0xD8)からフッター(0xFF 0xD9)までを抽出
}
OV7670_regs.h (カメラレジスタ設定)
VGA(640×480)とQVGA(320×240)のレジスタ設定テーブルが定義されています。このプロジェクトではQVGAを使用します。
Android側
Androidスマホに ArduinoTFT.apk をインストールしてください。Bluetoothとカメラへのアクセス許可を与えてください。
更新 2020/05/26: ArduinoTFT.apkのソースコードを追加しました。ArduinoTFT.zip.h をダウンロードし、ArduinoTFT.zip にリネームして解凍してください。
更新 2020/07/25: 「Androidアプリが動かない」という報告がありましたが、スマホのカメラアクセス権限をアプリに許可することで解決しました。
Bluetoothモジュール設定
Bluetoothモジュールの通信速度を 115200 bps に設定する必要があります (コマンド: AT+UART=115200,0,0)。これがArduino UNOでデータを受信・処理できる最適な速度です。設定方法の詳細は こちら などを参照してください。
重要: BluetoothモジュールはArduino UNOのデバッグポート(シリアル)に接続されます。したがって、Bluetooth使用中はデバッグポートが使用できません。Bluetoothモジュールを接続したままArduino UNOに書き込みをすることはできません。書き込み前には必ずBluetoothモジュールを外し、書き込み後に再接続してください。
組み立て
- Arduino UNOとTFTシールドを接続
- OV7670カメラをTFTシールドの20ピンコネクターに接続 (変換アダプター使用の場合あり)
- Bluetoothモジュール HC-05/06 をTFTシールドの「Bluetooth」と記載された4ピンコネクターに接続
- 6-12V ACアダプターをArduino UNOの電源ジャックに接続
電源投入後、TFTシールドの画面が赤くなれば、Androidスマホからのコマンド待機状態です。
デモンストレーション
Androidスマホで以下の操作を行います:
ArduinoTFTアプリを起動- スマホを横向きにする
- Bluetoothを有効化し、検出されたモジュール(HC-06)を選択
画面に2つのウィンドウと4つのボタンが表示されます:
- 右上の小窓: スマホのカメラプレビュー
- 左の大きなウィンドウ: 送受信された画像
ボタンの機能:
- スマホからArduinoへ単発画像転送
- スマホからArduinoへ連続画像転送
- Arduinoからスマホへ単発画像転送
- Arduinoからスマホへ連続画像転送
画像サイズは 320×240ピクセル (2-5 KB)。デモ動画も用意しています。
記事が気に入ったら評価をお願いします。新しい記事を書くモチベーションになります!
過去の関連記事:
- Unique TFT Shield for Arduino Uno - Start
- Unique Arduino TFT Shield - OV7670 Cam
次の記事予定:
- TFT shield for Arduino Nano - Start
- Photos and RGB video on TFT SPI display
- Control by Smartphone 4WD Robot Car over Bluetooth
更新 2021/01/04: スクリーンシリーズ用の更新ライブラリを公開しました。現在は2つのシールドと2つのブレークアウトボードで構成されています。スケッチは選択バージョン(1-4)とマイコンタイプ(MegaAVR or ESP-32)に応じてコンパイルされます。詳細は GitHubリポジトリ をご覧ください。
コード
TFTシールド用ライブラリ
https://github.com/YATFT/YATFT
カスタムパーツとエンクロージャ
OV7670とTVリモコンでの実験画像など
製造プロセス
- 現代カメラの進化と設計:フィルムからデジタルへ
- カメラレンズの理解:設計、歴史、未来の革新
- BrickPi Bookreader:Raspberry Pi と LEGO Mindstorms で Kindle 読書を自動化
- Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
- Bluetooth対応 Arduino制御 モータライズド カメラ スライダー 〜滑らかなシネマティック撮影を実現〜
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- 音声で家電を操作:GoogleアシスタントとBluetoothでArduino家電制御
- 携帯型リモート監視カメラロボット - Raspberry PiとArduinoで構築
- Arduino + Windows IoT + Azure クラウドによる高度な転倒検知システム
- Arduino Uno、リレー、Androidアプリで電球をリモート制御
- スマホで家庭照明をシームレス制御 - 1Sheeld活用