.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 Choholouška. Abychom zjistili, jak to je, tak jsem se rozhodl postavit 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.

clip_image002

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

clip_image004

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.

clip_image006

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.

clip_image007

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í vytvoření 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.

clip_image009

clip_image011

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.

Pohyb Měsíce (uprostřed), Jupiteru (vlevo nahoře) a Venuše (vpravo dole). Zrychleno cca 100x.

Štěpán

Comments (0)

Skip to main content