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
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:
- 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

- 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!):

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 z 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:

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ę:
1 |
sudo raspi-config |


Uruchamaiamy ponownie Raspberry i przechodzimy do instalacji oprogramowania:
1 |
sudo apt install tesseract-ocr imagemagick |
Zróbmy zdjęcie:
1 |
/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…:
1 |
/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:
1 |
/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:
1 |
/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!