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

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

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.
P1052494-scaled

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
    P1052489-scaled

Raspberry Pi Zero W:

  • dodatkowo WiFi oraz Bluetooth

    Przygotowanie

    Będziemy potrzebować:

    Hardware:

  • 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

    Software:

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!):
P1052496-scaled
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_close_tv
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…
rpi0_front-scaled
Osobiście tutaj tak na 75% 😉
pi0_solder-scaled
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:
full_pizero_garaz-scaled
Kamera za pomocą przedłużacza wygląda tak:
hdmi_camera
Natomiast jej drugi koniec wraz z kamerą ustawiony jest nad licznikiem:
full_hdmi_camera

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 Raspberry Pi włączyć kamerę::

sudo raspi-config

raspi-config
raspi-config-camera
raspi-config-camera-on

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:

pic-scaled

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:
pic-cropped
pic-cropped-bw
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:
maska-pic-cropped-bw
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:
result
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!

Previous Post Next Post