Elektroda.pl
Elektroda.pl
X
Montersi
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

10 projektów na nudne lato: Monitoring z PiCam (2)

ghost666 07 Lip 2016 12:53 9534 10
  • 10 projektów na nudne lato: Monitoring z PiCam (2)
    Nadal jest lato, każdy ma trochę więcej wolnego czasu niż zazwyczaj. Czas ten spożytkować można na wiele sposobów - granie w gry komputerowe, oglądanie filmów na youtubie czy uprawianie sportów to tylko niektóre z możliwości. Ale oczywiście elektronicy i programiści - hobbyści i zawodowcy - mają teraz więcej czasu niż zazwyczaj na zrealizowanie jakiegoś pobocznego projektu, zanim nadejdzie jesień i wszelkie terminy powrócą ze swoją nieubłaganością.

    W poprzednim artykule przedstawialiśmy HoloCam, który wykorzystuje aż 24 Raspberry Pi z dedykowanymi kamerami, do rekonstrukcji obrazów 3D i dodawania efektów udających hologramy. W tym artykule zaprezentujemy sprytny system monitoringu, wykorzystujący te same dedykowane dla 'Maliny' kamery co HoloCam. Do realizacji opisywanego projektu wystarczą dwa moduły Raspberry Pi - jeden do monitorowania otoczenia i przekazywania strumienia wideo, a drugi do prezentacji zbieranych przez moduł monitorujący danych.

    Wprowadzenie

    Korzystając z adafrut.io możliwe jest zapisywanie i odczytywanie obrazów. Oznacza to, że mając moduł Raspberry Pi z kamerą można korzystając z tej usługi zapisywać obrazy wraz z innymi danymi np. z sensorów, a następnie odczytywać z wykorzystaniem drugiego modułu RPi podpiętego do sieci i adafrut.io gdziekolwiek na świecie.



    Opisywany poniżej projekt wykorzystuje dwa moduły Raspberry Pi - nadajnik i odbiornik; nadajnik wyposażony jest w kamerę i termometr MCP9808. Odbiornik wyposażono w ekran PiTFT, który pozwala na wyświetlanie obrazów (odświeżanych co 5 minut), aktualnej temperatury i jej historii z ostatnich 24h.

    Odbiornik wykorzystuje metodę io-client-python do odbioru danych i matplotliba, aby utworzyć wykres z danymi z ostatnich 24h.

    Do skonstruowania układu potrzebować będziemy:





    2 x Raspberry Pi - wykorzystać można dowolną wersję, ale wersje 2 lub 3 sprawdzają się najlepiej.
    1 x PiTFT 2.8", 3.2" lub moduł HAT - zależnie jaki pasuje do naszej 'Maliny'.
    1 x termometr z układem MCP9808.
    1 x Kamera PiCam.
    2 x Karta WiFi na USB lub kabel ethernet - zależnie jak podłączamy komputer do sieci.
    4 x Zworki do podłączenia płytki z termometrem do modułu.
    Plastikowy pojemnik na nadajnik, jeśli chcemy zabezpieczyć go przed wpływami środowiska.
    Taśma klejąca.

    Nadajnik

    10 projektów na nudne lato: Monitoring z PiCam (2) 10 projektów na nudne lato: Monitoring z PiCam (2)


    Do izolacji nadajnika od otoczenia wykorzystano plastikowy pojemnik spożywczy z wyciętymi otworami na kamerę i okablowanie. Jako, że nadajnik działać ma na zewnątrz domu, to liczba otworów, jakie w nim robimy, powinna być minimalna. Poza obudową umieścić musimy termometr, aby mierzył on temperaturę powietrza, a nie wnętrza obudowy, gdzie RPi produkować będzie pewną ilość ciepła.

    Moduł RPi, kamerę i okablowanie przymocowano w obudowie taśmą klejącą. Termometr MCP9808 na osobnym PCB podłączony jest do RPi z pomocą czterech przewodów. Opis podłączania tego modułu do 'Maliny' znaleźć można m.in. tutaj.

    Aby móc wysyłać i odbierać obrazy musimy w pierwszej kolejności założyć konto na stronie adafruit.io. Następnie skorzystać należy z tego poradnika, ale bez wprowadzania zmian do pliku motion.conf. W tym projekcie wprowadzić musimy odrobinę inne zmiany, co zostanie opisane szczegółowo poniżej. Aby Motion uruchamiał się zaraz po zabootowaniu systemu musimy postępować zgodnie z tym fragmentem poradnika. Następnie instalujemy kod uploadera do tego projektu, rozpoczynamy od zainstalowania wymaganych pakietów:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Dalej musimy skopiować kod programu. Znaleźć możemy go w projekcie adaiot, więc musimy sklonować repo z Githuba:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Na tym etapie powinniśmy uzyskać nasz sekretny klucz AIO i nazwę użytkownika Adafruit.io - dane te wprowadzamy w skrypcue adaiot-uploader, gdzie słowo SECRET, zastepujemy naszym sekretnym kluczem AIO:

    Kod: python
    Zaloguj się, aby zobaczyć kod


    Skrypt jest relatywnie nieskomplikowany. Loguje się on poprzez RESTowego klienta do usług adafruit.io. Nie potrzebujemy tutaj MQTT, ponieważ po prostu wysyłamy wartość do feeda. Następnie szukamy pliku lastsnap.jpg i wykorzystując bibliotekę PIL tworzymi miniaturkę lastsmall.jpg. Miniaturka tworzona jest ponieważ ekran, na którym wyświetlany jest finalnie obraz ma 320x240 px. Po konwersji obraz jest zapisywany, konwertowany do base64 i wysyłany poprzez adafruit.io.

    Teraz skonfigurować musimy Motion, aby obraz taki wysyłany był co 5 minut. Zedytujmy zatem plik konfiguracyjny /etc/motion/motion.conf:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    I wpiszmy tam:

    Code:
    width 1024
    
    height 768
    output_pictures off
    snapshot_interval 300
    snapshot_filename lastsnap
    on_picture_save /home/pi/adaiot/adaiot-uploader.py


    Po wprowadzeniu zmian w pliku konfiguracyjnym zresetujmy usługę Motion:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Następnie tworzymi tzw. "dashboard" na adafruit, logując się do systemu, klikając na "Your Dashboards" i następnie na "Create Dashboard". Musimy teraz nadać dashboardowi nazwę, utworzyć go i naciskając znak plusa dodać blok do niego - obraz z feedu "pic".

    10 projektów na nudne lato: Monitoring z PiCam (2)


    Na tym etapie w dashboardzie powinniśmi widzieś obraz, aktualizowany co około 5 minut. Podczas odświeżania obrazu system może chwilowo pokazywać wszystkie obrazy, jakie odebrane zostały przez adafruit.io w danej sesji nasze przeglądarki - nie ma co być zaalarmowany tą kwestią. Teraz, do systemu dodać można, oprócz obrazu, odczyt temperatury.

    W tym poradniku, opisana jest biblioteka służąca do obsługi sensora MCP9808, aby ją zainstalować musimy po kolei:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Następnie edytować musimy plik ~/adaiot/adaiot-temp.py i wpisać weń nasz sekretny klucz AIO zamiast hasła SECRET.

    Plik ten wygląda następująco:

    Kod: python
    Zaloguj się, aby zobaczyć kod


    Skrypt ten ponownie wykorzystuje RESTowego klienta adafrut.io. W nieskończonej pętli program odczytuje temperaturę poprzez MCP9808, formatuję ją do 3 miejsc po przecinku i wysyła do feedu. Można w skrypcie zmienić nazwę,pod jaką jest wysyłana temperatura. Następnie dodać możemy ją do dashboarda.

    Aby skrypt ten uruchamiał się automatycznie po reboocie RPi musimy przeedytować plik /etc/rc.local:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    W pliku powinniśmy wpisać:

    Code:
    #!/bin/sh -e
    
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
     
    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
      printf "My IP address is %s\n" "$_IP"
    fi
     
    python /home/pi/adaiot/adaiot-temp.py &
     
    exit 0


    W dashboardzie dodajemy odpowiednią kontrolkę, która wyświetli nam aktualną temperaturę. Zakres temperatur dobrać musimy do zakresu w jakich ma ona być mierzona:

    10 projektów na nudne lato: Monitoring z PiCam (2)


    Po naciśnięciu "Create" powinno dać się zobaczyć kontrolkę pokazującą temperaturę obok naszego obrazu:

    10 projektów na nudne lato: Monitoring z PiCam (2)


    Odbiornik

    10 projektów na nudne lato: Monitoring z PiCam (2)


    Odbiornik prezentować będzie obrazy z kamery i odczyt temperatury na ekranie PiTFT. Cały system oparty jest na Pygame, jak je skonfigurować i uruchomić przeczytać możemy tutaj. Doinstalować musimy tylko kilka dodatkowych bibliotek oraz pobrać kod programu:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Kod odbiornika nie jest taki prosty, jak nadajnika, więc przyjrzyjmy mu się dokładniej. W skrypcie możemy chcieć zmienić wartość kilku zmiennych:

    ADAFRUIT_IO_KEY oraz ADAFRUIT_IO_USERNAME, to zmienne które pozwalają na zalogowanie się do adafruit.io.
    PIC_FEED i TEMP_FEED to zmienne z nazwami feedów z obrazami i temperaturą.
    LCD_WIDTH i LCD_HEIGHT konfigurują wielkość ekranu LCD, na jakim wyświetlamy aplikację.
    LUM_SAMPLE_POS to piksel, jaki jest próbkowany, aby określić luminancje - wyjaśnione dokładniej jest to później.

    Kod: python
    Zaloguj się, aby zobaczyć kod


    W dalszej kolejności musimy skonfigurować obsługę wydarzeń dla sesji MQTT. Podczas tej sesji szereg funkcji wywoływanych jest w różnych momentach:

    connected jest wywoływane, gdy podłączmy się do serwera Adafruit. W tej funkcji łączymy się do dwóch feedów, a serwer Adafruit odpowiada nam wysyłając ostatnie wpisy z feedu, a następnie każde nowododane, wraz z odświeżaniem feedu przez nadajnik.

    disconnected jest wywoływane gdy utracimy lub zakończymy połączenie. Biblioteka MQTT próbować będzie ponownie się połączyć, więc w naszym programie w takiej sytuacji drukujemy jedynie komunikat na standadowe wyjście.

    message jest wywoływane za każdym razem, gdy w feedzie pojawi się nowy wpis.

    Po odebraniu nowego obrazu jest on dekodowany z base64 do pliku jpeg i wysyłany do pygame. Następnie na podstawie koloru piksela (określonego w skrypcie) determinujemy jaki kolor ma mieć tekst naniesiony na obraz, tak aby był czytelny - jasny na ciemnym tle lub ciemny na jasnym tle. W ten sposób wyświetlana jest aktualna temperatura odczytana z termometru.

    Kod: python
    Zaloguj się, aby zobaczyć kod



    Funkcja show_dash jest główną funkcją realizującą wyświetlanie danych na LCD. Jeśi jesteśmy na stronie 0 to wyświetlane jest to co zapisano w image_surface, jeśli takowe skonfigurowaliśmy. Następnie w dolnej, lewej części pozycjonowna jest zawartość text_surface. Na stronie 1 wyświetlany jest wykres z temperaturami - o nim więcej poniżej.

    W dalszej części zobaczymy jak wykorzystano ekran dotykowy do przełączania pomiędzy stronami, funkcja switch_page służy do przełączania pomiędzy stroną 0 i 1:

    Kod: python
    Zaloguj się, aby zobaczyć kod


    W ostatniej sekcji kodu zająć musimy się połączeniem z adafruit.op poprzez MQTT oraz zarządzaniem wątkami w programie, tak aby po jego wyłączeniu nie zostawić po sobie bałaganu.

    W głównej pętli programu czekamy na wydarzenie MOUSEBUTTONUP, które wywołuje switch_page w momencie dotknięcia ekranu Następnie wykorzystując licznik sterujemy drugim wątkiem, aby uruchomić jego działanie co około 5 minut. Zadaniem tego wątku jest tworzenie wykresu z temperaturami, jak opisano dalej w tekście.

    Kod: python
    Zaloguj się, aby zobaczyć kod



    Skrypt feed.py definiuje osobny wątek, który jest okresowo uruchamiany. Jego zadaniem jest tworzenie wykresu z historią temperatur. Dzięki wykorzystaniu osobnego wątku nie ma problemu z regularnym odczytem danych z ekrany dotykowego. Jak łatwo zobaczyć na poniższych skryptach zbieranie danych o temperaturze i generowanie wykresu nie jest takim łatwym zadaniem jak może się wydawać.

    Korzystając z RESTowego klienta do Adafruit odbierane są historyczne dane dotyczące temperatury. W tym celu wykorzystano Data Retrieval API, aby odczytać nie tylko najnowszą, ale wszyetkie temperatury z ostatnich 24 godzin. Ka,żdy obiekt, pobierany przez API ma swój format, wyglądający w następujący sposób:

    Code:
    Data(created_epoch=1459912484.47247, created_at=u'2016-04-06T03:14:44.472Z', updated_at=u'2016-04-06T03:14:44.472Z', value=u'-0.875', completed_at=None, feed_id=514989, expiration=None, position=None, id=348921349)


    Korzystając z created_epoch jesteśmy w stanie ocenić czy wartość została zebrana w okresie ostatnicj 24h i precyzyjnie umieścić ją na osi czasu. Dane zebrane w postaci dwóch list - jednej z czasami, a drugiej z wartościami temperatury - przekazywane są do matplotliba. Biblioteka ta odpowiedzialna jest za wygenerowanie wykresu i zapisanie go w pliku.

    Kod: python
    Zaloguj się, aby zobaczyć kod


    10 projektów na nudne lato: Monitoring z PiCam (2)


    I gotowe. Pamiętajmy, aby program do wyświetlania dashboarda uruchamiać z uprawnieniami roota:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Źródła:
    http://www.eetimes.com/document.asp?doc_id=1329968&page_number=2
    https://learn.adafruit.com/monitor-picam-and-temperature-on-a-pitft-via-adafruit-dot-io?view=all
    Kod: actionscript
    Zaloguj się, aby zobaczyć kod


    Fajne!
  • Montersi
  • #2 07 Lip 2016 20:37
    Karol966
    Poziom 30  

    ghost666 napisał:

    Nadal jest lato
    ... a na jednym ze zdjęć temperatura:

    10 projektów na nudne lato: Monitoring z PiCam (2)
    Przyznam, że czasami w letnie gorące wieczory wolałbym tą ze zdjęcia niż 26 na plusie o drugiej nad ranem :D

  • #3 07 Lip 2016 22:41
    Jatsekku2
    Poziom 12  

    Cała seria przewidziana jest tylko z wykorzystaniem Malinki? Może jakiś równie ciekawy wpis na coś mniejszego ;)

  • #4 07 Lip 2016 23:26
    ghost666
    Tłumacz Redaktor

    Jatsekku2 napisał:
    Cała seria przewidziana jest tylko z wykorzystaniem Malinki? Może jakiś równie ciekawy wpis na coś mniejszego ;)


    Obawiam się, że jedyną nie Malinką jest bodajże UDOO - podobny minikomputer, więc obawiam się, że w tej serii na np. Arduino nic nie ma. Ale jeśli znasz jakieś ciekawe projekty, podeślij mi je na PW, ok? :)

  • Montersi
  • #5 07 Lip 2016 23:52
    Jatsekku2
    Poziom 12  

    Szczerze powiedziawszy nic ciekawego nie mam, dlatego liczyłem na jakąś inspirację :P
    Jak coś znajdę dam znać ;)

  • #6 09 Lip 2016 07:48
    OldSkull
    Poziom 27  

    ghost666 napisał:
    Odbiornik wyposażono w ekran PiTFT, który pozwala na wyświetlanie obrazów (odświeżanych co 5 minut)

    Że co ile? Mamy całe 0.003(3) Hz?

  • #7 09 Lip 2016 08:58
    ghost666
    Tłumacz Redaktor

    OldSkull napisał:
    ghost666 napisał:
    Odbiornik wyposażono w ekran PiTFT, który pozwala na wyświetlanie obrazów (odświeżanych co 5 minut)

    Że co ile? Mamy całe 0.003(3) Hz?


    Co minut PiCam robi nowe zdjęcie, ładuje je na adafuit.io, skąd moduł odbiornika je pobiera.

  • #8 09 Lip 2016 15:08
    OldSkull
    Poziom 27  

    Ale co to ma wspólnego z monitoringiem? Rozumiem ograniczenia sprzętowe samej maliny, ale łącząc się po VNC uzyskamy częstsze odświeżanie.
    Do tego wycięty wizjer dla kamery - dlaczego nie użyto obudowy z pokrywą przezroczystą?
    Moim zdaniem projekt nieużyteczny i zrobiony chyba tylko po to aby pokazać się.

  • #9 09 Lip 2016 18:42
    ghost666
    Tłumacz Redaktor

    OldSkull napisał:
    Ale co to ma wspólnego z monitoringiem? Rozumiem ograniczenia sprzętowe samej maliny, ale łącząc się po VNC uzyskamy częstsze odświeżanie.
    Do tego wycięty wizjer dla kamery - dlaczego nie użyto obudowy z pokrywą przezroczystą?
    Moim zdaniem projekt nieużyteczny i zrobiony chyba tylko po to aby pokazać się.


    A co stoi na przeszkodzie, aby wpisać częstsze odświeżanie?

  • #11 25 Lip 2016 08:20
    OldSkull
    Poziom 27  

    ghost666 napisał:
    co stoi na przeszkodzie, aby wpisać częstsze odświeżanie?

    Nie wiem, co stało autorowi na przeszkodzie? Nawet jak zmienimy czas z 5 minut na 1 minutę albo i 30 sekund (o ile serwer zewnętrzny to zaakceptuje) to i tak będzie lipa. Można przecież udostępniać po sieci obraz z RPi, nie potrzeba zewnętrznego serwera.