Ciastka! Strona korzysta z plików cookies w celu realizacji usług i zgodnie z polityką plików cookies. [Zamknij]
Change language to: / Zmień język na: English

IDCT EYE (alpha)

Jakiś czas temu na łamach portalu wykop.pl opisałem projekt kamerki budowanej w opaciu o raspberry pi, który zacząłem robić w formie hobby. Pierwsze informacje możecie znaleźć pod adresem: https://www.wykop.pl/wpis/29558219/troche-jeszcze-musze-popracowac-nad-oprogramowanie/

Kamerka osiągnęła stan, w którym można już jej używać eksperymentalnie na co dzień, więc pomyślałem, że podzielę się informacjami na temat postępów.

Założenia

Elementy

Nie uwzględniając kosztu lutowania, kleju na ciepło oraz przewodów wychodzi mniej niż 200 zł.

Ja jeszcze statyw kupiłem:

Uwagi na tym etapie

Już na tym etapie można by zrobić kilka rzeczy potencjalnie lepiej: np. zamiast diod IR LED z zestawu od kamery zastosować własne. Można zastosować jeden przekaźnik lub jakiś w zestawie podwójnym. Innym rozwiązaniem jest też przełączanie oparte o tranzystor oraz odpowiednie rezystory przed samymi LEDami: powinno to dodatkowo ograniczyć wymiary całości oraz koszt.

Decydując się na własne LEDy, zasilane niezależnie od samej kamerki, można by organiczyć się do jednej przetwornicy step-up 5V.

Ładowanie oraz zasilanie można by zmienić na model 2S (dwie cele), dostępne są już tanie i gotowe ładowarki 2S 7,4V ze źródła 5V microUSB. Można wtedy łatwo zejść do 5V stabilizatorem/stabilizatorami. Można też się wtedy pokusić o model mieszany.

Wygląd

Kamera: front Kamera: tył

Oczywiście na tym etapie ktoś może się przyczepic co do jakości wykonania, ale tak jak mówiłem: to dla mnie hobby, więc nie przykładam do tego aż tak wielkiej roli. Nie miałem odpowiednich narzędzi do wycinania otworów, wycinałem je nożem. Dodatkowo, moje zdolności manualne są dość słabe.

Wymiary samego pudełka kamery są wymiarami pudełka Z4 (129x149x50mm). Z przodu odstaje około 0,5cm obiektywu kamerki, a z tyłu 1cm włącznika/wyłącznika.

W środku wygląda nieco gorzej (głównie ze względu na mój brak zdolności manualnych): Kamera w środku: front Kamera w środku: tył

Diagram połączeń

Diagram

Błędy połączeniowe

Oprogramowanie

Na tym polu kamerka głównie leży w tym momencie i wymaga dopracowania. Działa pod kontrolą systemu Raspbian. Interfejs kamery oraz podglądu zapewniają RaspiMJPEG oraz RPi Cam Web Interface (https://elinux.org/RPi-Cam-Web-Interface). Sam interfejs zapewnia większość potrzebnych rzeczy, ale jest brzydki oraz niewygodny.

Interfejs Lista nagrań

Docelowo chcę zrobić własny. Póki co, w wersji 0.2 planuję do tego istniejącego dodać przełączanie filtra IR oraz diod IR oraz włączanie streamowaia na youtube.

youtube

Tutaj porada! Streamowanie na youtube jest banalnie proste z RPi. Wystarczy wpisać:

raspivid -o - -t 0 -fps 25 -b 2000000 | ffmpeg -re -ar 22050 -ac 1 -acodec pcm_s16le -f s16le -ac 1 -i /dev/zero -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/[identyfikator]

Gdzie [identyfikator] pochodzi z panelu "na żywo" youtube. Bitrate oraz rozdzielczość możemy ustawiać w pierwszej częsci polecenia, w parametrach programu raspivid. Np:

raspivid -o -o -t 0 --fps 50 -b 1000000 -w 1280 -h 720

Pomimo, że dźwięku nie wysyłamy musimy załączyć jakiś strumień (u mnie z /dev/zero), aby youtube zaakceptował stream.

obsługa przycisków

Zastosowałem przyciski zewnętrzne. Póki co mają dwie funkcje:

Aby je obsługiwać korzystam z prostego programiku w PHP, działającego w pętli:

uwaga, program prowizoryczny

<?php
include "vendor/autoload.php";

$config = [
    'output' => [
            'ir' => 24,
            'ir2' => 23,
            'ircut' => 13,
            'red' => 5
    ],
    'input' => [
        'record' => 26,
        'setter' => 19
    ]
];

class Buttoner extends IDCT\Loopi
{
    protected $recording = false;
    protected $nightMode = false;

    protected $ledTime = 0;
    protected $ledState;

    protected function pipeWrite($msg)
    {
        $pipe = fopen("/var/www/cam2/FIFO", "w");
        fwrite($pipe, $msg . "\n");
        fclose($pipe);
    }
    protected function loop()
    {
        $state = file_get_contents("/var/www/cam2/status_mjpeg.txt");
        $this->recording = ($state == 'video');
        if ($this->switchedDown('record')) {
            if ($this->recording) {
                //stop
                $this->pipeWrite('ca 0');
            } else {
                //start
                $this->pipeWrite('ca 1');
            }
            $this->recording = !$this->recording;
        }

        if ($this->switchedDown('setter')) {
            $this->nightMode = !$this->nightMode;
            $this->setGpioValue('ir', $this->nightMode ? $this::GPIO_HIGH : $this::GPIO_LOW);
            $this->setGpioValue('ir2', $this->nightMode ? $this::GPIO_HIGH : $this::GPIO_LOW);
            $this->setGpioValue('ircut', $this->nightMode ? $this::GPIO_HIGH : $this::GPIO_LOW);
        }

        if ($this->recording) {
            $ledTime = time();
            if ($ledTime > $this->ledTime) {
                if ($this->ledState === $this::GPIO_HIGH) {
                    $this->setGpioValue('red', $this::GPIO_LOW);
                    $this->ledState = $this::GPIO_LOW;
                } else {
                    $this->setGpioValue('red', $this::GPIO_HIGH);
                    $this->ledState = $this::GPIO_HIGH;
                }
            }
            $this->ledTime = $ledTime;
        } else {
            $this->setGpioValue('red', $this::GPIO_LOW);
        }

        usleep(500000);
    }
}
$app = new Buttoner();
$app->run($config);

Korzysta on z mikroframeworka Loopi: https://github.com/ideaconnect/loopi

Funkcja pipeWrite pozwala na komunikację z RaspiMJPEG poprzez potok. ca 0 kończy nagrywanie, a ca 1 rozpoczyna. Programik odczytuje też obecny stan zapisany przez interfejs webowy (z pliku /var/www/cam2/status_mjpeg.txt). Oczywiście jest to prowizorka. Nawet ten etap prowizorki powinien zostać ulepszony zapisem tego pliku do pamięci, a nie na karcie SD.

Docelowo chcę dodać możliwość robienia zdjęć przyciskiem oraz różne zachownia w zależności od czasu trzymania przycisku.

W trakcie nagrywania mruga czerwona dioda.

Ograniczenia

W obecnym rozwiązaniu nie ma wskaźnika poziomu naładowania baterii. Czas nagrywania bez zapalonych diod IR LED to około 8 godzin, aczkolwiek rekord to 12 póki co. Z zapalonymi oczywiście ten czas ulega znacznemu skróceniu do 3 godzin (rekord 4). Zastosowanie, co prawda słabych, ale dwóch modułów ładowania zapewnia (przy zastosowaniu odpowiedniej ładowarki) dodatni bilans ładowania.

Sama kamera wykorzystuje sensor OV5647, który pozwala na nagrywanie w rozdzielczości 1920x1080 przy 30 klatkach / s oraz 1280x720 przy 60. Istotnym jest, że rozmiar sensora powoduje zmianę pola widzenia: przy Full HD jest ono ograniczone (mam wrażenie przybliżenia), gdyż nie jest wykorzystany cały sensor. Przy 720p wykorzystanie sensora jest lepsze, a jednocześnie jasność ulega poprawie. Dostępne są też: 1296x972 oraz 1640x1232.

Wbudowane diody zapewniają dobre oświetlenie tak do 3 metrów, czyli oświetlą mały pokój.

Po nagraniu uzyskujemy surowy strumień h264, który jest konwertowany do MP4, a to chwilę trwa. RPi Zero nie jest demonem prędkości. Dlaczego zastosowałem właśnie ten model? Z racji zużycia prądu! Jest on bardzo niski w porównaniu do wszystkich innych komputerów typu RPi czy Orange Pi.

Innym problemem jest też ostrość. Z racji zastosowanego obiektywu konieczna jest ręczna, fizyczna regulacja przed lub w trakcie nagrywania. Nie mamy możliwości regulacji z poziomu oprogramowania.

Co ciekawe obiektyw pozwala na całkiem niezłe makro.

Przykładowe zdjęcia nocne

Sample 1 Sample 2 Sample 3 Sample 4 Sample 5

Przykładowy film nocny

Z czasem postaram się nagrać lepszy! Sam dopiero poznaje efekty zmian parametrów nagrywania oraz nabieram doświadczenia w ustawianiu ostrości.

Przykładowe zdjęcia dzienne

Sample day 1 Sample day 2 Sample day 3 Sample day 4

Przykładowy film dzienny

Z czasem postaram się nagrać lepszy! Sam dopiero poznaje efekty zmian parametrów nagrywania oraz nabieram doświadczenia w ustawianiu ostrości.

Podsumowanie

Bardzo przepraszam za wszelkie błędy i literówki w tekście!

Tak jak mówiłem: to małe hobby, więc kamerka będzie ciągle ulepszana. Jeśli chcesz być na bieżąco to polecam śledzić mnie na portalu wykop: https://www.wykop.pl/ludzie/bartoszp/

bądź mój kanał na YouTube: https://www.youtube.com/user/codercom/videos

Newslettera nie udostępniam ze względu na RODO.

Jeśli macie jakieś pytania to zapraszam do komentarzy bądź kontaktu e-mailowego:

kontakt

Komentarze