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.
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:
Raspberry Pi Zero W:
dodatkowo WiFi oraz Bluetooth
Będziemy potrzebować:
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
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!):
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:
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…
Osobiście tutaj tak na 75% 😉
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:
Kamera za pomocą przedłużacza wygląda tak:
Natomiast jej drugi koniec wraz z kamerą ustawiony jest nad licznikiem:
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 Raspberry Pi włączyć kamerę::
sudo raspi-config
Uruchamaiamy ponownie Raspberry i przechodzimy do instalacji oprogramowania:
sudo apt install tesseract-ocr imagemagick
Zróbmy zdjęcie:
/usr/bin/raspistill -o /home/pi/water-meter-raw.jpg
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…:
/usr/bin/convert /home/pi/water-meter-raw.jpg -crop 420x114+890+912 -threshold 54% /home/pi/maska-pic-cropped-bw.jpg -compose minus -composite /home/pi/water-meter-ocr.jpg
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:
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:
Wreszcie usuwamy co trzeba i finalizujemy nasze zdjęcie do rozpoznania:
/usr/bin/convert /home/pi/water-meter-raw.jpg -crop 420x114+890+912 -threshold 54% /home/pi/maska-pic-cropped-bw.jpg -compose minus -composite /home/pi/water-meter-ocr.jpg
Otrzymamy:
Pozostaje już tylko uruchomić Tesseract OCR:
/usr/bin/tesseract /home/pi/water-meter-ocr.jpg stdout -c tessedit_char_whitelist = 0123456789
Jako listę możliwych znaków podajemy wyłącznie: 0123456789, jeśli wszystko przebiegło poprawnie to powinniśmy otrzymać:
00522
To wszystko!