Kamera Bluetooth Arduino (ABC): Hubungkan Ponsel Anda melalui Bluetooth untuk Mengambil Gambar
Komponen dan Perlengkapan
Arduino UNO
×
1
Modul Bluetooth HC-05
×
1
Kamera OV7670
×
1
TFT shield Arduino
×
1
Tentang Proyek Ini
Kini sulit untuk mengejutkan siapa pun dengan ponsel dengan kamera, perangkat nirkabel, dan kemajuan teknis lainnya. Berkat platform Arduino, jutaan orang telah menemukan dunia elektronika dan pemrograman yang luar biasa. 100, 500 instruksi ditulis tentang cara bertukar data antara ponsel dan Arduino melalui bluetooth... Dari apa yang saya bicara? Ya. Saya ingin bertukar data antara ponsel Android dan Arduino UNO melalui bluetooth sebanyak 100, 501 kali. Tapi saya ingin mentransfer bukan sekadar sekumpulan karakter dan angka, tetapi gambar.
Seseorang akan mengatakan ini mustahil, Arduino terlalu lambat untuk memproses sejumlah besar data dengan kecepatan baik. Dan dia akan benar sekali. Dan bagaimana jika sedikit membantu Arduino - untuk mentransfer semua pekerjaan "berat" ke bahu perangkat lain? Dan ada perangkat seperti itu!
Ini adalah TFT shield unik untuk Arduino. Informasi tentang logo ini ada dalam artikel ini: artikel 1, artikel 2 Dalam tutorial ini, saya akan menunjukkan bagaimana Anda dapat terhubung melalui bluetooth antara Arduino dan ponsel Android, mendapatkan gambar dari kamera OV7670 pada Arduino UNO dan mentransfernya ke ponsel Android. Lalu, sebaliknya, mentransfer gambar (gambar dari kamera) dari ponsel Android ke Arduino UNO dan menampilkannya pada layar TFT shield unik ini.
Aplikasi khusus ditulis untuk ponsel Android.
Karakteristik singkat TFT shield:
Ukuran 3.5 inci diagonal,
Resolusi 320x240,
Jumlah warna 65536 (16-bit),
Layar sentuh resistif (kontroler XPT2046),
5 tombol,
IC RTC DS1307 dengan baterai litium 3V CR1220,
Slot untuk memasang kartu micro SD,
Konektor 4-pin (2.54 mm) untuk menghubungkan modul Bluetooth HC-05 (-06), modul WiFi ESP8286.
Konektor 20-pin (2.54 mm) untuk kamera (OV7670).
Daftar Komponen yang Diperlukan
Hardware:
Arduino UNO;
TFT shield unik;
Adapter daya AC-DC 6-12 volt, >600mA;
Kamera OV7670;
Modul Bluetooth HC-06 (HC-05);
Ponsel Android.
Perhatian: Diperlukan (!) adapter daya 6-12 volt untuk mengoperasikan TFT shield, karena arus maksimum 500 mA dari USB tidak cukup untuk operasi normal.
Perangkat lunak:
Arduino IDE;
Library untuk TFT shield;
File APK untuk ponsel Android.
Persiapan
Perangkat lunak
Semua sketsa demonstrasi ditulis di lingkungan Arduino IDE, jadi di awal diperlukan untuk menginstal Arduino IDE - https://www.arduino.cc/en/main/software. Lalu Anda perlu menginstal library untuk TFT shield - github.com/YATFT/YATFT (unduh library dan ekstrak ke dalam folder "libraries" di direktori Arduino IDE).
Setelah menginstal Arduino IDE, Anda harus memrogram papan Arduino UNO. Untuk kesederhanaan, saya merekomendasikan memflashnya secara terpisah, tanpa TFT shield. Untuk ini:
Hubungkan kabel USB ke papan Arduino UNO;
Jalankan Arduino IDE di komputer;
Pilih port yang sesuai tempat Arduino UNO terhubung;
Unduh sketsa demo ArduinoBluetoothCamera.ino (dan file ov7670_regs.h untuk inisialisasi kamera);
Klik tombol Upload.
Jika papan Arduino UNO berhasil diprogram, Anda dapat melanjutkan ke langkah berikutnya.
Sketsa 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 <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() { // 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; }
Pada ponsel Android, Anda perlu menginstal ArduinoTFT.apk. Izinkan aplikasi untuk menggunakan Bluetooth dan Kamera.
Update 05/26/2020!
Saya menambahkan sourcecode ArduinoTFT.apk. AS IS! Unduh ArduinoTFT.zip.h
, ganti nama menjadi ArduinoTFT.zip dan ekstrak. Nikmati!
Update 07/25/2020!
"Hi, i had the same problem with the Android App wich doesn't work. Solved after authorized the App to access at the smartphone camera. That's it. Bye" (c)
Modul Bluetooth
Diperlukan untuk menetapkan tingkat pertukaran dalam modul Bluetooth menjadi 115200 (perintah "AT+UART=115200, 0, 0"). Ini adalah kecepatan optimal di mana Arduino UNO berhasil menerima dan memproses data. (Secara teoritis, Anda dapat meningkatkan kecepatan, mengoptimalkan penerimaan dan pemrosesan data, tetapi ini memerlukan jumlah RAM yang lebih besar). Instruksi lebih rinci tentang cara menetapkan tingkat pertukaran dapat ditemukan di Internet, misalnya di sini: https://www.instructables.com/id/Communication-Bluetooth-Module-With-HC-05-HC-06/ .
(!) Harap dicatat bahwa modul Bluetooth terhubung ke port debug Arduino UNO. Jadi, saat bekerja dengan bluetooth, port debug tidak tersedia. Dan sebelum memrogram Arduino UNO (dengan modul Bluetooth), harus memutuskan koneksi modul Bluetooth. Dan setelah pemrograman, atur kembali (!)
Rangkaian
Rangkaian perangkat ini cukup sederhana:
Hubungkan bersama Arduino UNO dan TFT-shield;
Hubungkan kamera OV7670 ke konektor 20-pin pada TFT-shield dari shield (kadang saya menggunakan adaptor konektor miring 18-20 pin dengan jarak 2.54 mm);
Hubungkan modul Bluetooth HC-06 (HC-05) ke konektor 4-pin dengan kata "Bluetooth" pada TFT-shield;
Hubungkan adapter daya 6-12V ke input daya pada papan Arduino UNO.
Setelah menyala, layar TFT shield akan berwarna merah. Ini berarti siap menerima perintah dari ponsel Android.
Demonstrasi
Lakukan operasi berikut pada ponsel Android:
Jalankan aplikasi ArduinoTFT di ponsel Android;
Putar ponsel ke posisi horizontal;
Aktifkan koneksi Bluetooth, pilih modul Bluetooth yang terdeteksi (HC-06);
Dua jendela dan empat tombol akan muncul di layar:
Jendela kanan atas adalah jendela viewfinder kamera ponsel;
Jendela besar kiri - gambar yang diterima atau dikirim.
Fungsi tombol:
Transfer satu gambar dari ponsel Android ke Arduino;
Transfer berkelanjutan gambar dari ponsel Android ke Arduino;
Transfer satu gambar dari Arduino ke ponsel Android;
Transfer berkelanjutan gambar dari Arduino ke ponsel Android.
Ukuran gambar adalah 320x240 piksel (2-5 kB). Bab ini memiliki video demo.
Jika Anda menyukai artikel saya, saya akan mengapresiasi penilaian Anda. Mungkin ini akan memberi saya motivasi untuk artikel baru. :-)
Terima kasih sudah menonton!
Artikel sebelumnya:
1) TFT Shield Unik untuk Arduino Uno - Mulai,
2) TFT Shield Unik Arduino - OV7670 Cam.
Artikel selanjutnya:
3) TFT shield untuk Arduino Nano - Mulai,
4) Foto dan video RGB pada layar TFT SPI.
5) Kontrol Robot Car 4WD melalui Bluetooth dengan Smartphone.
Update 01.04.2021:
Halo lagi! Ada library yang diperbarui untuk serangkaian layar, yang saat ini terdiri dari dua shield dan dua papan breakout. Sketsa dikompilasi tergantung pada versi yang dipilih (dari 1 hingga 4) dan jenis mikrokontroler (MegaAVR atau ESP-32). Ditambahkan foto, contoh. Informasi lebih lanjut dapat ditemukan di https://github.com/Ekaburg/EkaTFT.
Kode
Library untuk TFT shield
https://github.com/YATFT/YATFT
Bagian dan Kotak Pelindung Khusus
Eksperimen dengan OV7670 dan pengendali TV jarak jauh
Eksperimen dengan kamera OV7670 dan pengendali TV jarak jauh