Raspberry Pi Zero W with camera

Raspberry Pi Zero – aktualizujemy otwieranie bramy o nowy sprzęt oraz rozponawanie wskazań licznika (OCR)

Wstęp

Po kilku latach pracy Raspberry Pi w garażu – postanowiłem wymienić starzejący się model z 2014 roku, czyli Raspberry Pi 1B+ z 512MB RAM na nowsze rozwiązanie. Przez chwilę zastanawiałem się czy trzymać się zasady Keep it Small and Simple – a więc użyć ESP Easy na ESP8266 (sterowanie przekaźnikiem i czytanie kontaktronu to aż nadto na ową platformę, nawet dodając czujniki środowiskowe), jednak po namyśle – wygrała opcja pozostawienia platformy Raspberry Pi ze względu na jeden dodatkowy element, który chciałem obsłużyć – licznik wody. Tak, taki stary analogowy licznik wody.

Raspberry Pi Zero Front
Raspberry Pi Zero Front

Raspberry Pi Zero

Od 2014 ilość wersji Raspberry Pi urosła dość znacznie – które zatem wybrać? Zdecydowałem się na niedoceniane Raspberry Pi Zero, chociaż pozostała jeszcze kwestia wyboru pomiędzy wersją Zero a Zero W:

Raspberry Pi Zero:

  • CPU: Broadcom BCM2835, identyczny jak w Raspberry Pi B+
  • Zegar: 1GHz, poprzednio 700MHz
  • Pamięć RAM: 512MB
  • Pamięc masowa: microSD, poprzednio SD
  • USB: 1 port microUSB, poprzednio 4 porty USB-A
  • HDMI: port miniHDMI (specjalny kabel albo przejściówka może być wymagana)
  • Złącze dla kamery, pomniejszone, wymagany jest inny typ kabla niż poprzednio.
  • GPIO – standardowo piny nie są przylutowane do płytki
Raspberru Pi Zero W with camera
Raspberry Pi Zero W with camera

Raspberry Pi Zero W:

  • dodatkowo WiFi oraz Bluetooth

it will be launched also an

Przygotowanie

Będziemy potrzebować:

Sprzęt:

  • Rasbpberry Pi Zero (lub inna wersja Raspberry Pi)
  • Kamera dla Raspberry Pi wraz z odpowiednim kablem
  • OPCJA: przedłużacz HDMI dla kamery Raspberry Pi – jeśli nie możemy umieścić Raspberry nad licznikiem

Oprogramowanie:

  • ImageMagick – program służący do manipulowania plikami graficznymi i obrazem, który pozwoli nam na manipulację zarejestrowanego zdjęcia licznka przez kamerę tak, aby rozpoznanie było łatwiejsze i pewniejsze
  • Tesseract OCR – program do rozpoznawania tekstu: https://github.com/tesseract-ocr/tesseract

Raspberry Pi Zero oraz wersja WiFi – współpracują z aktualną wersją Raspbiana – Stretch dziś (początek 2020) Buster. Tak jak w poprzednich wpisach instalujemy system operacyjny, używając karty SD. Od niedawna trzeba pamiętać, że po zainstalowaniu należy stworzyć pusty plik o nazwie „ssh” (bez rozszerzenia, tylko słowo ssh) w katalogu głównym pierwszej partycji na świezo zainstalowanej karcie (partycja nazywa się boot), aby po uruchomieniu Raspberry Pi Zero – uruchomiony został równiż daemon SSH (sshd) pozwalający na zdalny dostęp. Jest to zabezpieczenie przed uruchamianiem Raspberry Pi z domyślnym hasłem „rasbperry”, a więc pierwszą rzeczą po uruchomieniu powinna być zmiana hasła oraz włączenie sshd na stałe!

Osobiście używam Raspberry Pi Zero (oczywiscie można także W, jeśli nie mamy dostepu do kabla ethernet w garażu), więc w przypadku wersji Zero – dodatkowo stosuję hub USB z Ethernet (oraz gustowny miedziany radiator!):

Raspberruy Pi Zero with Hub/Ethernet
Raspberry Pi Zero with Hub/Ethernet

Jeżeli nie mamy przejściówki lub kabla to możemy przylutować piny do wyjścia CVSB (AV na telewizorze), sygnał gorący jest zaznaczony strzałką, po lewej:

RPi Zero - adding AV/CVSB output
RPi Zero – adding AV/CVSB output

Kolejną kwestią jest przylutowanie pinów dla GPIO – łączymy nasze RPi Zero z czujnikami i kontaktronami – musi więc posiadać „header„. Lutowanie to rzecz, która wymaga dość dużej wprawy – co jakiś czas warto trenować i sprawdzić z ilu pinów jesteśmy zadowoleni…

Raspberruy Pi Zero Header
Raspberry Pi Zero Header

Osobiście tutaj z 75% 😉

Raspberruy Pi Zero Solder Side
Raspberry Pi Zero Solder Side

OK, pozostaje teraz przenieść wszystko z poprzedniego wpisu o otwieraniu garażu, oraz dodać nowy element – kamerę Raspberry Pi – dla Raspberry Pi Zero, oraz podłączyć zasilanie (tak jak poprzdnio – zasilam przez piny GPIO)

W moim przypadku – nie mogąc przenieść Raspberry Pi Zero – doadtkowo zastosowałem przedłużacz kabla kamery – za pomocą rozwiązania z użyciem kabla HDMI. Zobaczmy więc jak wygląda montaż, tym razem zmieniłem radiator na wersję aluminiową. Podobnie jak poprzedno mamy przekaźnik do otwierania bramy, czujnik zamknięcia (kontaktron) oraz dodatkowo – światło na LED 12V które załącza drugi z przekaźników. Jedyna zmiana od poprzedniego wpisu to zamiana na Raspberry Pi Zero z starszej wersji:

New Raspberry Pi Zero in Garadge
New Raspberry Pi Zero in Garadge

Kamera za pomocą przedłużacza wygląda tak:

Begining of HDMI RPi camera extension
Begining of HDMI RPi camera extension

Natomiast jej drugi koniec wraz z kamerą ustawiony jest nad licznikiem:

End of HDMI RPi camera extension
End of HDMI RPi camera extension

Rozpoznawanie wskazań licznika

Aby rozpoznać ile zużyliśmy wody należy zrobić zdjęcie i rozpoznać cyfry – zamienić je na formę, której możemy użyć w programach – Domoticz, Home Assistant etc.
Po pierwsze – należy włączyć kamerę:

Selecting camera in raspi-config
Selecting camera in raspi-config

Turning on camera in raspi-config
Turning on camera in raspi-config
Turning on camera in raspi-config
Turning on camera in raspi-config

Uruchamaiamy ponownie Raspberry i przechodzimy do instalacji oprogramowania:

Zróbmy zdjęcie:

Otrzymamy coś podobnego do:

Teraz należy obciąć a następnie dokonać konwersji obrazka na czarno biały (monochromatyczny) to zapewni lepsze rozpoznanie. Używamy do tego Image Magick’a, ale nie wykonujmy jeszcz całej komendy…:

Kroki wyglądają następująco na zdjęciach, -crop to obszar gdzie jest licznik a parametr 54% należy dobrać tak aby cyfry były wyraźne jak na poniższym zdjęciu:

Raw meter picture, cropped
Raw meter picture, cropped (water-meter-raw.jpg)
Black and white picture for recogntion, not mask yet
Black and white picture for recogntion, not mask yet (intermediate picture)

Możemy teraz dokładnie określić gdzie wystepują cyfry i wykonać tzw. maskę którą odejmując od obrazu – usuniemy artefakty. Jak to wykonać? Po prostu – wymazujemy cyfry – pozostawiając same nieporządane artefakty na kolejnym obrazie:

Mask for the meter
Mask for the meter (created maska-pic-cropped-bw.jpg)

Wreszcie usuwamy co trzeba i finalizujemy nasze zdjęcie do rozpoznania:

Otrzymamy:

Water meter after mask and inversion
Water meter after mask and inversion

Pozostaje już tylko uruchomić Tesseract OCR:

Jako listę możliwych znaków podajemy wyłącznie: 0123456789, jeśli wszystko przebiegło poprawnie to powinniśmy otrzymać:

00522

To wszystko!