Zacarías el Oso Espía

INTRODUCCIÓN

Somos el grupo 2 formado por Enrique Albaladejo Herrero, Daniel Borreguero Albitos y Jesús del Remedio García Fructuoso. Este proyecto originalmente fue concebido como “Almost spy glassesinator”, unas gafas espía que recogieran video y sonido, y lo almacenasen en una tarjeta SD, pero, debido a complicaciones, detalladas más abajo en el documento en la sección de “Problemas y Soluciones encontradas”, el proyecto fue reimaginado como “Zacarías el oso espía” un osito de peluche que en función de la luz ambiente recoja video a través de la cámara que tiene en el ojo y lo muestre por pantalla a través del serial.

Video del proyecto

FUNCIONAMIENTO

Cuando hay un nivel de luz superior a 10 empieza a mandar los fotogramas al serial, cuando la luz baja por debajo de 10 se detiene.

IMPLEMENTACIÓN HARDWARE

Conexiones OV7670 a Arduino Nano 33 BLE      – 3.3 conectado a 3.3
      – GND conectado a GND
      – SIOC conectado a A5
      – SIOD conectado a A4
      – VSYNC conectado a 8
      – HREF conectado a A1
      – XCLK conectado a 9
      – PCLK conectado a A0
      – D7 conectado a 4
      – D6 conectado a 6
      – D5 conectado a 5
      – D4 conectado a 3
      – D3 conectado a 2
      – D2 conectado a RX
      – D1 conectado a TX
      – D0 conectado a 10
Conexiones LDR –  Conectado al pin de 5v
–  Conectado a A7
Resistencia 100kΩ –  Conectado a GND
–  Conectado a A7

COSTE DE MATERIALES

COMPONENTEUNIDADESCOSTE/UNIDAD (€)
Cámara OV767017.01
Cables Arduino (M-H)1 Pack de 20 uds3
Arduino Nano 33 BLE124
Oso de peluche (Zacarías)19.60
TOTAL43.61

PROBLEMAS Y SOLUCIONES ENCONTRADOS

Problema 1. La cámara no era compatible con la placa Arduino UNO.

Decidimos comprar la placa Arduino Nano 33 BLE.

Problema 2. La cámara ocupaba muchos pines por lo que hubo que hacer un replanteamiento de la práctica.

Al final optamos por cambiar el proyecto de unas gafas espías a un oso espía.

Problema 3. El lector SD (DFPlayer) era únicamente de lectura y no de escritura.

Comprar el SPI Reader SD para poder escribir en una tarjeta SD.

Problema 4. Los sensores de sonido pensábamos que eran micrófonos, pero no lo eran y no podíamos grabar sonido claro con ellos. Solo producíamos ruido ligeramente parecido al sonido de entrada.

Decidimos descartar la idea de grabar el sonido.

Problema 5. No conseguimos guardar las imágenes en la SD a través del SPI Reader SD, no encontramos el motivo ya que ni siquiera creaba carpetas con los códigos de ejemplo de la librería, además fallaba con distintas tarjetas SD, por lo que, supusimos que el propio lector no funcionaba correctamente.

Para solventar esto, intentamos pasar las imágenes al pc a través del Bluetooth de la placa de arduino, ya que la Nano 33 BLE lo tiene incorporado.

Problema 6. No encontramos la forma de hacer el traspaso mediante Bluetooth, ya que todos los tutoriales que encontramos explicaban como hacer otras cosas, o usaban componentes externos de Bluetooth que utilizan librerías distintas. Al final decidimos pasar las imágenes al PC por cable.

CÓDIGO ARDUINO IDE

#include <Arduino_OV767X.h>

int luz = 7;
int bytesPerFrame;
byte data[320 * 240 * 2]; 

void setup() {
  Serial.begin(115200);
  while (!Serial);

  if (!Camera.begin(QVGA, RGB565, 5)) {
    Serial.println("Failed to initialize camera!");
    while (1);
  }

  bytesPerFrame = Camera.width() * Camera.height() * Camera.bytesPerPixel();

}

void loop() {
  Camera.readFrame(data);
  if (analogRead(luz)>10){
    Serial.write(data, bytesPerFrame);
  }
}

CÓDIGO EN PROCESSING

import processing.serial.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

Serial myPort;

final int cameraWidth = 320;
final int cameraHeight = 240;
final int cameraBytesPerPixel = 2;
final int bytesPerFrame = cameraWidth * cameraHeight * cameraBytesPerPixel;
PImage myImage;
byte[] frameBuffer = new byte[bytesPerFrame];

void setup(){
  size(320, 240);
  myPort = new Serial(this, "COM5", 9600);
  myPort.buffer(bytesPerFrame);  
  myImage = createImage(cameraWidth, cameraHeight, RGB);
}

void draw(){
  image(myImage, 0, 0);
}

void serialEvent(Serial myPort) {
  myPort.readBytes(frameBuffer);

  ByteBuffer bb = ByteBuffer.wrap(frameBuffer);
  bb.order(ByteOrder.BIG_ENDIAN);

  int i = 0;

  while (bb.hasRemaining()) {
    short p = bb.getShort();
 
    int r = ((p >> 11) & 0x1f) << 3;
    int g = ((p >> 5) & 0x3f) << 2;
    int b = ((p >> 0) & 0x1f) << 3;

    myImage .pixels[i++] = color(r, g, b);
  }
 myImage .updatePixels();

}

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *