Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen

Onderdelen en benodigdheden

Onderdeel Aantal
Arduino UNO 1
HC-05 Bluetooth Module 1
Camera OV7670 1
Arduino TFT Shield 1

Over dit project

Vandaag de dag kun je bijna niemand meer verrassen met een mobiele telefoon met camera, draadloze gadgets en andere technische vooruitgang. Dankzij het Arduino-platform hebben miljoenen mensen de prachtige wereld van elektronica en programmeren ontdekt. 100, 500 instructies zijn geschreven over hoe je data kunt uitwisselen tussen een mobiele telefoon en Arduino via bluetooth... Waar praat ik over? Ja. Ik wil data uitwisselen tussen een Android-telefoon en Arduino UNO via bluetooth voor de 100, 501e keer. Maar ik wil geen karakters en getallen doorsturen, maar afbeeldingen.

Iemand zal zeggen dat dit onmogelijk is, Arduino is te traag om grote hoeveelheden data met goede snelheid te verwerken. En hij heeft helemaal gelijk. En wat als we Arduino een beetje helpen - om al het "zware" werk op de schouders van een ander apparaat te leggen? En zo'n apparaat bestaat!

Dit is een unieke TFT shield voor Arduino. Informatie over dit logo vind je in deze artikelen: artikel 1, artikel 2. In deze tutorial zal ik demonstreren hoe je via bluetooth kunt verbinden tussen Arduino en Android-telefoon, een afbeelding van de OV7670 camera op Arduino UNO krijgt en deze naar de Android-telefoon overbrengt. Daarna, omgekeerd, de afbeelding (beeld van de camera) van de Android-telefoon naar Arduino UNO overbrengen en weergeven op het scherm van een unieke TFT shield.

Er is een speciale applicatie geschreven voor de Android-telefoon.

Korte Kenmerken van TFT Shield:

  • Formaat 3,5" diagonaal
  • Resolutie 320x240
  • Aantal kleuren 65536 (16-bit)
  • Weerstands touchscreen (XPT2046 controller)
  • 5 knoppen
  • RTC IC DS1307 met 3V lithium batterij CR1220
  • Slot voor micro SD kaart
  • 4-pin (2,54mm) connector voor Bluetooth module HC-05 (-06), ESP8286 WiFi module
  • 20-pin (2,54mm) connector voor camera (OV7670)

Lijst van Benodigde Componenten

Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen

Hardware:

  • Arduino UNO
  • Unieke TFT shield
  • AC-DC voeding 6-12 volt, >600mA
  • Camera OV7670
  • Bluetooth module HC-06 (HC-05)
  • Android telefoon

Let op: Het is noodzakelijk (!) om een 6-12 volt voeding te gebruiken voor de TFT shield, want de maximale stroom van 500mA van USB is niet genoeg voor normale werking.

Software:

  • Arduino IDE
  • Library voor Unieke TFT shield
  • APK bestand voor Android telefoon

Voorbereiding

Software

Alle demonstratiesketches zijn geschreven in de Arduino IDE omgeving, dus eerst moet je de Arduino IDE installeren - https://www.arduino.cc/en/main/software. Daarna moet je een library voor TFT shield installeren - github.com/YATFT/YATFT (download de library en pak het uit in de "libraries" map in de Arduino IDE directory).

Na het installeren van de Arduino IDE, moet je het Arduino UNO bord programmeren. Voor de eenvoud, raad ik aan om het apart te flashen, zonder TFT shield. Hiervoor:

  • Sluit de USB-kabel aan op het Arduino UNO bord
  • Start de Arduino IDE op de computer
  • Selecteer de bijbehorende poort waaraan de Arduino UNO is aangesloten
  • Download de ArduinoBluetoothCamera.ino demo sketch (en bestand ov7670_regs.h voor camera init)
  • Klik op de knop Upload

Als het Arduino UNO bord met succes is geprogrammeerd, kun je doorgaan naar de volgende stap.

ArduinoBluetoothCamera.ino Sketch:

/********************************************************************** 
 * SOFTWARE EN DOCUMENTATIE WORDEN "ZOALS ZIJN" GELEVERD ZONDER GARANTIE VAN 
 * ENIGE SOORT, ZOALS UITDRUKKELIJK OF IMPLICEIT, INCLUDING ZONDER BEPERKING, ENIGE 
 * GARANTIE VAN VERKOOPBAARHEID, TITEL, NIET-INBREUK EN GESCHIKTHEID VOOR EEN 
 * BIJZONDER DOEL. IN GEEN GEVAL ZIJN AUTEUR OF ZIJN LICENTIEGEVERS 
 * AANSPREEKBAAR OF VERPLICHT ONDER CONTRACT, NALATIGHEID, STRICTE AANSPRAKELIJKHEID, 
 * BIJDRAGE, SCHENDING VAN GARANTIE, OF ANDERE WETTELIJKE BILLijKE THEORIE ENIGE 
 * RECHTSTREEKE OF ONRECHTSTREEKE SCHADE OF KOSTEN INCLUDING MAAR NIET BEPERKT TOT 
 * ENIGE INCIDENTELE, BIJZONDERE, INDIRECTE, STRAFBARE OF GEVOLGSCHADE, 
 * VERLOREN WINST OF VERLOREN DATA, KOSTEN VAN VERVANGENDE GOEDEREN, 
 * TECHNOLOGIE, DIENSTEN, OF ENIGE CLAIMS DERDEN (INCLUDING MAAR NIET BEPERKT TOT 
 * ENIGE VERDEDIGING DAARVAN), OF ANDERE VERGELIJKBARE KOSTEN. 
 ***********************************************************************/
#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: // Enkel foto sturen
        mode = 1;
        start_capt = 1;
        if (last_mode != mode && last_mode != 2) {
          tft.begin();
          tft.SetRGB(); // Schakel naar RGB modus
          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: // Continu foto's sturen
        mode = 2;
        start_capt = 2;
        if (last_mode != mode && last_mode != 1) {
          tft.begin();
          tft.SetRGB();
          cam.CamInit(&OV7670_QVGA[0][0]);
          cam.CamVideoPreview(0, 0, 1, true);
          codec.JPEGInit();
          codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY);
        }
        break;
      case 0x30: // Enkel foto ontvangen
        mode = 3;
        start_capt = 3;
        if (last_mode != mode && last_mode != 4) {
          tft.begin();
          tft.SetYUV(); // Schakel naar YUV modus
        }
        break;
      case 0x40: // Continu foto's ontvangen
        mode = 4;
        start_capt = 4;
        if (last_mode != mode && last_mode != 3) {
          tft.begin();
          tft.SetYUV();
        }
        break;
      default:
        break;
    }
  }
  
  if (mode == 1) { // Enkel foto sturen
    if (start_capt == 1) {
      start_capt = 0;
      last_mode = mode;
      mode = 0;
      CamCapture();
    }
  } else if (mode == 2) { // Continu foto's sturen
    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) { // Enkel foto ontvangen
    if (start_capt == 3) {
      start_capt = 0;
      last_mode = mode;
      mode = 0;
      Serial.print("!");
      srl.JPEGReadFromSerial(&jpeg_decode, 0, 0, GetMaxX()+1, GetMaxY()+1, 32000);
    }
  } else if (mode == 4) { // Continu foto's ontvangen
    uint8_t temp = Serial.read();
    while (1) {
      if (start_capt == 4) { start_capt = 0; }
      if (temp == 0x41) { // Stop?
        start_capt = 0;
        last_mode = mode;
        mode = 0;
        break;
      }
      Serial.print("!");
      srl.JPEGReadFromSerial(&jpeg_decode, 0, 0, GetMaxX()+1, GetMaxY()+1, 32000);
    }
  }
}

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)) break;
  }
  is_header = false;
  return 0;
}

OV7670_regs.h:

#ifndef OV7670_REGS_H
#define OV7670_REGS_H
const uint8_t OV7670_VGA[][2] PROGMEM = {
  {1, 0x42}, // Grootte van byte, Adres (ID)
  {640/16, 480/16}, // Grootte X, Grootte 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},
  {0x11, 0x80}, {0x7a, 0x18}, {0x7b, 0x02}, {0x7c, 0x07}, {0x7d, 0x1F},
  {0x7e, 0x49}, {0x7f, 0x5A}, {0x80, 0x6A}, {0x81, 0x79}, {0x82, 0x87},
  {0x83, 0x94}, {0x84, 0x9F}, {0x85, 0xAF}, {0x86, 0xBB}, {0x87, 0xCF},
  {0x88, 0xEE}, {0x89, 0xEE}, {0x13, 0xE0}, {0x00, 0x00}, {0x10, 0x00},
  {0x0d, 0x00}, {0x24, 0x98}, {0x25, 0x63}, {0x26, 0xD3}, {0x2a, 0x00},
  {0x2b, 0x00}, {0x2d, 0x00}, {0x13, 0xe5}, {0x13, 0xe7}, {0x1e, 0x30},
  {0x74, 0x60}, {0x01, 0x80}, {0x02, 0x80}, {0x15, 0x10}, {0x4f, 0x40},
  {0x50, 0x34}, {0x51, 0x0C}, {0x52, 0x17}, {0x53, 0x29}, {0x54, 0x40},
  {0x57, 0x80}, {0x58, 0x1e}, {0x41, 0x10}, {0x75, 0x60}, {0x76, 0x50},
  {0x77, 0x48}, {0x3d, 0x92}, {0x3b, 0x00}, {0x04, 0x00}, {0xff, 0xff},
};

const uint8_t OV7670_QVGA[][2] PROGMEM = {
  {1, 0x42}, {320/16, 240/16}, {0b01000010, 0b00000100},
  {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, 0x02}, {0x7c, 0x07}, {0x7d, 0x1F},
  {0x7e, 0x49}, {0x7f, 0x5A}, {0x80, 0x6A}, {0x81, 0x79}, {0x82, 0x87},
  {0x83, 0x94}, {0x84, 0x9F}, {0x85, 0xAF}, {0x86, 0xBB}, {0x87, 0xCF},
  {0x88, 0xEE}, {0x89, 0xEE}, {0x13, 0xE0}, {0x00, 0x00}, {0x10, 0x00},
  {0x0d, 0x00}, {0x24, 0x98}, {0x25, 0x63}, {0x26, 0xD3}, {0x2a, 0x00},
  {0x2b, 0x00}, {0x2d, 0x00}, {0x13, 0xe5}, {0x13, 0xe7}, {0x1e, 0x30},
  {0x74, 0x60}, {0x01, 0x80}, {0x02, 0x80}, {0x15, 0x10}, {0x4f, 0x40},
  {0x50, 0x34}, {0x51, 0x0C}, {0x52, 0x17}, {0x53, 0x29}, {0x54, 0x40},
  {0x57, 0x80}, {0x58, 0x1e}, {0x41, 0x10}, {0x75, 0x60}, {0x76, 0x50},
  {0x77, 0x48}, {0x3d, 0x92}, {0x3b, 0x00}, {0x04, 0x00}, {0xff, 0xff},
};
#endif

Android

Op de Android-telefoon moet je de ArduinoTFT.apk installeren. Sta de app toe om Bluetooth en Camera te gebruiken.

Update 05/26/2020! Ik heb de broncode van ArduinoTFT.apk toegevoegd. AS IS! Download ArduinoTFT.zip.h, hernoem naar ArduinoTFT.zip en pak uit. Veel plezier!

Update 07/25/2020! "Hi, ik had hetzelfde probleem met de Android App die niet werkte. Opgelost na toestemming gegeven aan de App om toegang te krijgen tot de smartphone camera. Dat is het. Groetjes" (c)

Bluetooth Module

Het is noodzakelijk om de baudrate in de Bluetooth-module in te stellen op 115200 (commando "AT+UART=115200, 0, 0"). Dit is de optimale snelheid waarop Arduino UNO de data kan ontvangen en verwerken. (Theoretisch kun je de snelheid verhogen, dataontvangst en -verwerking optimaliseren, maar dit vereist meer RAM). Gedetailleerde instructies over het instellen van de baudrate vind je op internet, bijv. hier: https://www.instructables.com/id/Communication-Bluetooth-Module-With-HC-05-HC-06/.

(!) Let op dat de Bluetooth-module verbindt met de debug-poort van Arduino UNO. Dus bij werken met bluetooth is de debug-poort niet beschikbaar. En voordat je de Arduino UNO programmeert (met de Bluetooth-module) moet je de Bluetooth-module loskoppelen. En na programmeren, weer terugzetten (!)

Montage

Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen

Montage van het apparaat is redelijk simpel:

  • Verbind Arduino UNO en TFT-shield
  • Sluit de OV7670 camera aan op de 20-pin connector op de TFT-shield (soms gebruik ik een angewinkelde 18-20 pin connector met 2,54mm pitch als adapter)
  • Sluit de Bluetooth module HC-06 (HC-05) aan op de 4-pin connector met de tekst "Bluetooth" op de TFT-shield
  • Sluit de 6-12V voeding aan op de voedingingang op het Arduino UNO bord

Na aanzetten van de voeding, zou het scherm van de TFT shield rood moeten worden. Dit betekent gereedheid om commando's van de Android-telefoon te ontvangen.

Demonstratie

Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen
Arduino Bluetooth Camera (ABC): Verbind je Telefoon via Bluetooth om Afbeeldingen vast te Leggen

Voer de volgende handelingen uit op de Android-telefoon:

  • Start de ArduinoTFT applicatie op de Android-telefoon
  • Draai de telefoon in horizontale positie
  • Schakel Bluetooth in, selecteer de gedetecteerde Bluetooth-module (HC-06)

Er moeten twee vensters en vier knoppen op het scherm verschijnen:

  • Het rechterbovenste venster is het viewfinder-venster van de telefooncamera
  • Groot linkervenster - ontvangen of verzonden afbeeldingen

Knopfuncties:

  • Enkelvoudige afbeelding van Android-telefoon naar Arduino overbrengen
  • Continue overdracht van afbeeldingen van Android-telefoon naar Arduino
  • Enkelvoudige afbeelding van Arduino naar Android-telefoon overbrengen
  • Continue overdracht van afbeeldingen van Arduino naar Android-telefoon

De afbeeldingsgrootte is 320x240 pixels (2-5 kB). Dit hoofdstuk heeft een demovideo.

Als je mijn artikel leuk vindt, waardeer ik een beoordeling. Misschien geeft dit me motivatie voor nieuwe artikelen. :-)

Dank je voor het kijken!

Vorige artikelen:

  1. Unieke TFT Shield voor Arduino Uno - Start
  2. Unieke Arduino TFT Shield - OV7670 Cam

Volgende artikelen:

  1. TFT shield voor Arduino Nano - Start
  2. Foto's en RGB video op TFT SPI display
  3. Besturing door Smartphone 4WD Robot Auto via Bluetooth

Update 01.04.2021:

Hallo weer! Er is een geüpdatete library voor een reeks schermen, die momenteel uit twee shields en twee breakout boards bestaat. De sketch wordt gecompileerd afhankelijk van de geselecteerde versie (1 tot 4) en het type microcontroller (MegaAVR of ESP-32). Foto's, voorbeelden toegevoegd. Meer informatie vind je in https://github.com/Ekaburg/EkaTFT.

Code

Library voor TFT shield

https://github.com/YATFT/YATFT

Aangepaste onderdelen en behuizingen

  • Experiment met OV7670 en TV afstandsbediening
  • Experiment met camera OV7670 en TV afstandsbediening

Productieproces

  1. De Evolutie en Ontwerp van Moderne Camera's
  2. Cameraobjectieven Begrijpen: Ontwerp, Geschiedenis en Toekomstige Innovaties
  3. BrickPi Bookreader: Kindle Lezen Automatiseren met Raspberry Pi en LEGO Mindstorms
  4. Bouw een Bluetooth-gecontroleerde Raspberry Pi Robot met Audio Feedback
  5. Bluetooth-gestuurde Arduino gemotoriseerde camerashuif voor soepel filmische opnames
  6. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  7. Spraakgestuurde huishoudapparaten: Bluetooth-besturing met Google Assistant
  8. Draagbare Remote Surveillance Camera Robot
  9. Geavanceerd Valdetectiesysteem met Arduino, Windows IoT en Azure Cloud
  10. Afstandsbediening van een Lamp met Arduino Uno, Relais en Android App
  11. Naadloze Smartphone-besturing van Huisverlichting met 1Sheeld