.NET Gadgeteer – Fotografická past

Nedávno moje dcery řešily, co dělá naše kočka, když nejsme doma. Vymyslely, že chodí do kočičího světa. Já tvrdil, že chodí po zadních, kouká na televizi a pije moje pivo, které záhadně mizí z lednice. Manželka se diskuze neúčastnila a místo toho hledala telefon na nějakého doktora Chocholouška. Abychom zjistili, jak to doopravdy je, postavil jsem  fotografickou past.

Camera Module

Camera Module je jednoduchý barevný snímač s rozlišením až 320 x 240 bodů a manuálním ostřením. Zaostření je nejjednodušší nastavit na počítači, protože Camera Module se bude systému jevit jako obyčejná USB webová kamera. Camera Module se k počítači připojuje pomocí USB napájecího modulu.

Takto se hlásí Camera Module v systému

Připojení Camera Module jako webové kamery k počítači.

Připojení Camera Module jako webové kamery k počítači.

Tento modul vyžaduje připojení H (USB Host). Bohužel H modul nenajdete na levných deskách, jako je FEZ Hydra. Pro správnou funkci modulu musíte mít aktualizovaný firmware pro FEZ Spider alespoň z února 2012.

Camera Module, zdroj GHI Electronics

Camera Module, zdroj GHI Electronics

Pořizování snímků je asynchronní, musíte si tedy zaregistrovat událost PictureCaptured. Událost předá jako jeden z parametrů objekt typu Gadgeteer.Picture. Je to hotový obrázek ve formátu bmp, který můžete zobrazit na displeji nebo přímo uložit na SD kartu.

Pokud byste potřebovali kvalitnější obrázky, tak můžete připojit webovou kameru s větším rozlišením na USB Host Module nebo ovládat některé typy fotoaparátů pomocí simulace dálkového ovladače ať už IR nebo drátového.

Obrázek zachycený fotografickou pastí

Obrázek zachycený fotografickou pastí

Automatické vytvoření fotografie

Protože jsem neměl po ruce PIR senzor na zaznamenání pohybu, který se běžně používá v zabezpečovacích zařízeních, tak jsem použil infračervený dálkoměr. Dálkoměr jsem používal na starších projektech a má na sobě 3-pin konektor. Pro tyto konektory ze starších stavebnic od GHI Elektronics je pro .NET Gadgeteer dostupný speciální modul – eblock Expansion Module. Je to jen Extender Module s jinými konektory. Podle použitého dálkoměru musíte přepnout napájení s 3,3 V na 5 V.

Zapojení

Tlačítko slouží pro ruční použití fotografie a dálkoměr je připojen na EBlockExpansion. Protože budeme s infračerveného dálkoměru číst napětí (AnalogInput), tak je třeba použít pin 3 až 5. Ostatní piny nepodporují AnalogInput.

StepanB_FotografickaPast005

StepanB_FotografickaPast006

Zdrojový kód

using System;
using System.Collections;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;
using Microsoft.SPOT.Touch;

using Gadgeteer.Networking;
using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using Gadgeteer.Modules.GHIElectronics;
using System.IO;

namespace CameraTrap
{
    public partial class Program
    {
        private Bitmap _bmp = null;
        private int _counter = 0;
        private GT.Timer _trap = new GT.Timer(1000);
        private GT.Interfaces.AnalogInput _trapPin = null;

        void ProgramStarted()
        {
            // inicializace karty
            if (sdCard.IsCardInserted && !sdCard.IsCardMounted)
            {
                sdCard.MountSDCard();
            }

            button.ButtonPressed += new Button.ButtonEventHandler(button_ButtonPressed);
            camera.PictureCaptured += new Camera.PictureCapturedEventHandler(camera_PictureCaptured);

            _trapPin = eBlockExpansion.SetupAnalogInput(GT.Socket.Pin.Three);

            _trap.Tick += new GT.Timer.TickEventHandler(_trap_Tick);
            _trap.Start();

            Debug.Print("Program Started");
        }

        void _trap_Tick(GT.Timer timer)
        {
            //Debug.Print(_trapPin.ReadVoltage().ToString());

            if (camera.CameraReady && _trapPin.ReadVoltage() > 0.6)
            {
                camera.TakePicture();
                _trap.Stop();
            }
        }

        void camera_PictureCaptured(Camera sender, GT.Picture picture)
        {
            _bmp = picture.MakeBitmap();
            display.SimpleGraphics.DisplayImage(_bmp, 0, 0);

            if (!_trap.IsRunning)
            {
                _trap.Start();
            }

            if (!sdCard.IsCardMounted)
            {
                return;
            }

            using (FileStream s = new FileStream(@"\SD\picture" + _counter++ + ".bmp", FileMode.Create))
            {
                byte[] b = picture.PictureData;

                s.Write(b, 0, b.Length);
                s.Flush();
                s.Close();
            }
        }

        void button_ButtonPressed(Button sender, Button.ButtonState state)
        {
            if (!camera.CameraReady)
            {
                return;
            }

            camera.TakePicture();
        }
    }
}

Jednoduchou změnou kódu, nahrazení dálkoměru časovačem (Gadgeteer.Timer), můžete vytvořit časosběrnou kameru.