Introduction: WebCam Con Arduino YUN Y PIR MOTION

Aunque existen diversas formas de conectar una cámara al Arduino YUN y realizar un proyecto parecido, una forma sencilla de hacerlo es con un teléfono celular que ya no usemos, para utilizarlo como una WebCam.

Sin embargo la complejidad estaría en la parte del Android en la cual escribir todo el código requiere de su tiempo, pero existen muchos procesos realizados por otros programadores de los cuales hice uso de diferentes clases y las combine para elaborar este proyecto.

El concepto se basa en que se puede establecer una comunicación con la cámara del teléfono y estar monitoreando el estado del PIR o sensor de movimiento, que es leido por el Arduino Yun. Que a la vez utilizando el Bridge que viene incluido en la parte de LININO se puede leer también desde Android.

En el momento en que se detecte un movimiento, se dispara una alarma en el teléfono y se deja de transmitir el video, pero se dispara una actividad para dejar grabado un video en el télefono que puede ser revisados posteriormente.

Hay otras formas en que se puede llevar a cabo este proyecto como es el caso de utilizar Temboo con Dropbox como el ejemplo que se encuentra en Adafruit en el que se utiliza una WebCam convencional, o bien este otro ejemplo en el cual se realiza hasta una llamada para encender una luz el cual esta contenido en sitio de Temboo

O bien se puede utilizar protocolos como el caso de MQTT para crearlo, todo depende de la imaginación.

Step 1: Materiales

  • Arduino YUN
  • PIR Motion Sensor Module
  • 3 Breadboard Jumper machos
  • 3 Female Breadboard Jumper Wires
  • Teléfono celular Android con versión 4.3 o mayor.

Step 2: Software

  • Arduino IDE para el sketch.
  • Eclipse o Android Studio para la app.
  • Un navegador para configurar nuestro Yun.

Step 3: Conexión PIR Motion

La conexión de los cables en el sensor es sencilla ya que esta bien ilustrado en el módulo. Un cable a la alimentación de 5V (VCC), tierra (GND) y la salida (OUT), el cual se va a conectar al Pin 6 en mi caso del Arduino YUN.

Step 4: Sketch Arduino

En este caso se tomo el ejemplo del Bridge que viene incluido con el YUN, modificando solamente el pin en el que se conecta el sensor de movimiento.


/*
Arduino Yún Bridge example

This example for the Arduino Yún shows how to use the Bridge library to access the digital and analog pins on the board through REST calls. It demonstrates how you can create your own API when using REST style calls through the browser.

Possible commands created in this shetch:

"/arduino/digital/13" -> digitalRead(13) "/arduino/digital/13/1" -> digitalWrite(13, HIGH) "/arduino/analog/2/123" -> analogWrite(2, 123) "/arduino/analog/2" -> analogRead(2) "/arduino/mode/13/input" -> pinMode(13, INPUT) "/arduino/mode/13/output" -> pinMode(13, OUTPUT)

This example code is part of the public domain

http://www.arduino.cc/en/Tutorial/Bridge

*/

#include #include #include

// Listen to the default port 5555, the Yún webserver // will forward there all the HTTP requests you send BridgeServer server;

void setup() { // Bridge startup pinMode(6, INPUT); Bridge.begin();

// Listen for incoming connection only from localhost // (no one from the external network could connect) server.listenOnLocalhost(); server.begin(); }

void loop() { // Get clients coming from server BridgeClient client = server.accept();

// There is a new client? if (client) { // Process request process(client);

// Close connection and free resources. client.stop(); }

delay(50); // Poll every 50ms }

void process(BridgeClient client) { // read the command String command = client.readStringUntil('/');

// is "digital" command? if (command == "digital") { digitalCommand(client); }

// is "analog" command? if (command == "analog") { analogCommand(client); }

// is "mode" command? if (command == "mode") { modeCommand(client); } }

void digitalCommand(BridgeClient client) { int pin, value;

// Read pin number pin = client.parseInt();

// If the next character is a '/' it means we have an URL // with a value like: "/digital/13/1" if (client.read() == '/') { value = client.parseInt(); //digitalWrite(pin, value); } else { value = digitalRead(pin); }

// Send feedback to client client.print(F("Pin D")); client.print(pin); client.print(F(" set to ")); client.println(value);

// Update datastore key with the current pin value String key = "D"; key += pin; Bridge.put(key, String(value)); }

void analogCommand(BridgeClient client) { int pin, value;

// Read pin number pin = client.parseInt();

// If the next character is a '/' it means we have an URL // with a value like: "/analog/5/120" if (client.read() == '/') { // Read value and execute command value = client.parseInt(); analogWrite(pin, value);

// Send feedback to client client.print(F("Pin D")); client.print(pin); client.print(F(" set to analog ")); client.println(value);

// Update datastore key with the current pin value String key = "D"; key += pin; Bridge.put(key, String(value)); } else { // Read analog pin value = analogRead(pin);

// Send feedback to client client.print(F("Pin A")); client.print(pin); client.print(F(" reads analog ")); client.println(value);

// Update datastore key with the current pin value String key = "A"; key += pin; Bridge.put(key, String(value)); } }

void modeCommand(BridgeClient client) { int pin;

// Read pin number pin = client.parseInt();

// If the next character is not a '/' we have a malformed URL if (client.read() != '/') { client.println(F("error")); return; }

String mode = client.readStringUntil('\r');

if (mode == "input") { pinMode(pin, INPUT); // Send feedback to client client.print(F("Pin D")); client.print(pin); client.print(F(" configured as INPUT!")); return; }

if (mode == "output") { pinMode(pin, OUTPUT); // Send feedback to client client.print(F("Pin D")); client.print(pin); client.print(F(" configured as OUTPUT!")); return; }

client.print(F("error: invalid mode ")); client.print(mode); }

Step 5: Proyecto Android

Esta aplicación reúne una serie de ejemplos existentes en GitHub en los cuales se realizan procesos de conexión, transmisión de video por el puerto 8080 de la ip del celular, sonido y grabación.

Tomados gracias al aporte de:

https://github.com/xiongyihui/Webcam

https://github.com/JohnHBrock/soniferous

Además de algunas modificaciones propias.

Step 6: Proceso

  1. Configurar el YUN para que se conecte a nuestra WIFI https://www.arduino.cc/en/Guide/ArduinoYun#toc14
  2. Abrir el IDE de Arduino y cargar el archivo MOVSENSOR.INO
  3. Abrir Eclipse
  4. Cargar el proyecto HomeAlarm
  5. Modificar el MainActivity para cambiar la IP del YUN y el pin en el cual se conecto el sensor.
  6. Compilar la aplicación
  7. Instalar en el Celular la aplicación HOMEALARM.APK
  8. Una vez instalada la aplicación se ejecuta y este en forma automática va levantar el servicio para transmitir video por el puerto 8080 del celular. El cual se puede accesar desde cualquier browser con http://ipcelular:8080
  9. Cuando se activa el sensor va sonar una alarma y se detiene la transmision del video para iniciar la grabación, por el tiempo de un minuto. En caso de querer disminuir el tiempo de grabación se puede editar en la clase CaptureActivity en la sección onCreate variando la cantidad de milisegundos o bien aumentandolos.

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Log.v(TAG, "onCreate()");

setContentView(R.layout.capture);

captureActivityIsOpen=true;

mSurfaceView = (SurfaceView)findViewById(R.id.captureSurfaceView);

mHolder = mSurfaceView.getHolder();

mHolder.addCallback(this);

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

//finish is here

finish();

}

}, 60000);

}

Step 7: Demo