در این پروژه ، می خواهیم برنامه ای طراحی کنیم که با استفاده از رسپبری پای پلاک خودرو ها را تشخیص داده و گیت را برای خودرو های مجاز باز کرده و تصویر خودرو ها را از طریق ربات تلگرام برای شما ارسال کند!
فرایند به این صورت انجام می شود :
- ماشین به سمت گیت ورودی حرکت می کند.
- دوربین شماره پلاک خودرو را می خواند.
- شماره خوانده شده را با پایگاه داده مطابقت داده می شود، اگر شماره ی خودرو از قبل ثبت شده بود گیت را باز می کند و اجازه می دهد ماشین عبور کند.
- از هر خودرو در مقابل گیت عکس گرفته شده ، سپس عکسی با شماره پلاک خودرو و وضعیت آن به اپلیکیشن تلگرام ارسال می شود.
- ربات تلگرام توانایی باز و بسته کردن گیت ها، گرفتن عکس و افزودن اتومبیل جدید به پایگاه داده را دارد.
- این کار با پایتون ، پوسته Bash و ربات تلگرام انجام می شود
همچنین بر روی یک رابط وب کار می کنیم که قابلیت های زیر را داشته باشند:
- گیت های ورودی را باز کند / مکث کند و ببندد
- اضافه کردن / حذف / ویرایش / مسدود کردن خودرو ها
- اضافه کردن / حذف / ویرایش / مسدود کردن آی پی های دوربین ها
- تنظیم پین های GPIO را برای قطع و وصل رله ها
- تنظیم بزرگنمایی دوربین IP
- باز کردن خودکار گیت ها را فعال یا غیرفعال کند
- افزودن / حذف / ویرایش / مسدود کردن کاربران، تنظیم وضعیت و اختیارات مختلف برای کاربران
- گزارشات سیستم پلاک خوان که بتواند خودرو ها را بر اساس تاریخ و شماره پلاک جستجو کرد و بتوان از گزارشات با فرمت Excel خروجی گرفت.
آماده سازی
برای این منظور شما به رسپبری پای ۳ یا ۴ با نصب Ubuntu Mate نیاز دارید که می توانید آن را از اینجا دریافت کنید.
نصب کتابخانه پلاک خوان
کتابخانه را از طریق کد زیر نصب کنید
sudo apt-get update && sudo apt-get install -y openalpr openalpr-daemon openalpr-utils libopenalpr-dev
ImageMagick را نصب کنید
sudo apt-get install imagemagick
نصب ملزومات ربات تلگرام
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev make apt-get update apt-get -y install python-pip pip install pytelegrambotapi pip install json
نصب Telegram-cli
برای نصب و پیکربندی telegram-cli در ubuntu این لینک را دنبال کنید.
اتصال رله ها
رله ها را به رسپبری پای وصل کنید.
ما در این پروژه از پین GPIO23 برای رله اول و GPIO26 برای رله دوم استفاده می کنیم.
می توانید رله را با اسکریپت shell آزمایش کنید ، فقط یک اسکریپت ساده sh ایجاد کرده و آن را اجرا کنید:
nano open.sh chmod +x open.sh sh open.sh
کد زیر را جایگذاری کنید و آن را اجرا کنید.
کد اسکریپت برای رله اول :
#!/bin/bash echo 23 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio23/direction echo 0 > /sys/class/gpio/gpio23/value ping -c 2 localhost echo 23 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio23/direction echo 1 > /sys/class/gpio/gpio23/value
کد اسکریپت برای بازپخش دوم :
#!/bin/bash echo 26 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio26/direction echo 0 > /sys/class/gpio/gpio26/value ping -c 2 localhost echo 26 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio26/direction echo 1 > /sys/class/gpio/gpio26/value
رله ها را به گیت متصل کنید
اسکریپت ارسال پیام در تلگرام
اسکریپت .sh را با کد زیر ایجاد کنید:
#!/bin/bash to=$1 msg=$2 tgpath=/home/user/tg cd ${tgpath} (sleep 1; echo "dialog_list";sleep 1; echo "msg $to $msg";) | ${tgpath}/bin/telegram-cli -k -W tg-server.pub
اسکریپت ارسال عکس در تلگرام
اسکریپت .sh را با کد زیر ایجاد کنید:
#!/bin/bash to=$1 msg=$2 tgpath=/home/user/tg cd ${tgpath} (sleep 1; echo "dialog_list";sleep 1; echo "send_photo $to $msg";) | ${tgpath}/bin/telegram-cli -k -W tg-server.pub
۲ فایل برای اسکریپت شناسایی اصلی ایجاد کنید :
touch log.txt touch numbers.txt
در number.txt تمام شماره های شناخته شده پلاک خودرو را اضافه کنید.
ترتیب numbers.txt باید به صورت زیر باشد:
YZO169
RFS961
RFS123
ILAI123
اسکریپت تشخیص پلاک ماشین
اول سیستم پلاک خوان به دوربین IP پلاک خوان متصل می شود و یک عکس را دریافت می کند.
سپس پسوند فایل snapshot.cgi را به .jpg تغییر می دهد.
مرحله بعدی تبدیل (بزرگنمایی) تصویر است.
این مرحله را باید خودتان پیکربندی کنید.
در این مورد از “برش ۴۵٪” استفاده شده زیرا دوربین به کار گرفته شده بالای گیت ورودی قرار دارد بنابراین لازم بود عکس بزرگنمایی شود تا اسکریپت بتواند پلاک ماشین را تشخیص دهد.
#! /bin/bash wget -q http://login:password@ipadress/cgi-bin/snapshot.cgi -O /home/user/Downloads/autocheck/snapshot.cgi mv /home/user/Downloads/autocheck/snapshot.cgi /home/user/Downloads/autocheck/snapshot.jpg convert /home/user/Downloads/autocheck/snapshot.jpg -gravity Center -crop 45%\! /home/user/Downloads/autocheck/output.jpg FILENAME=$(alpr -c eu -d -n 1 /home/user/Downloads/autocheck/output.jpg |awk '{print $2}' | awk 'FNR>=2 && FNR<=4') if grep -Fxq "$FILENAME" /home/user/Downloads/autocheck/numbers.txt then echo CAR FOUND!, opening the gates! | while IFS= read -r line; do echo "$FILENAME, $(date) $line"; done >>/home/user/Downloads/autocheck/log.txt sh /home/user/Downloads/autocheck/relay-control/open.sh 2> /dev/null sh /home/user/Downloads/autocheck/tg.sh xGates "Car Found! Welcome" > log.out 2> /dev/null sh /home/user/Downloads/autocheck/tg.sh xGates $FILENAME > log.out 2> /dev/null sh /home/user/Downloads/autocheck/tgphoto.sh xGates /home/user/Downloads/autocheck/output.jpg > log.out 2> /dev/null sleep 20 sh /home/user/Downloads/autocheck/relay-control/open.sh 2> /dev/null elif [ -n "$FILENAME" ]; #if not empty then echo Unregistered car is at the gates! | while IFS= read -r line; do echo "$FILENAME, $(date) $line"; done >>/home/user/Downloads/autocheck/log.txt sh /home/user/Downloads/autocheck/relay-control/open.sh 2> /dev/null sh /home/user/Downloads/autocheck/tg.sh xGates "Unregistered car is at the gates!" > log.out 2> /dev/null sh /home/user/Downloads/autocheck/tg.sh xGates $FILENAME > log.out 2> /dev/null sh /home/user/Downloads/autocheck/tgphoto.sh xGates /home/user/Downloads/autocheck/output.jpg > log.out 2> /dev/null sleep 20 sh /home/user/Downloads/autocheck/relay-control/open.sh 2> /dev/null else ۲> /dev/null fi sleep 1 exec bash "$0"
ربات تلگرام و اسکریپت آن
تلگرام را باز کنید و @BotFathe را جستجو کنید. چت را شروع کرده و دستور /newbot را ارسال کنید و بقیه مراحل ساخت آن را پیش بروید. پس از انجام مراحل اولیه ساخت ربات، شما یک توکن دریافت می کنید.
یک اسکریپت پایتون ایجاد کرده و آن را با نام bot.py ذخیره کنید.
# -*- coding: utf-8 -*- import config import telebot import os import time import requests import subprocess import simplejson import sys from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telebot import types bot = telebot.TeleBot(config.token) @bot.message_handler(content_types=["text"]) def any_msg(message): keyboard = types.InlineKeyboardMarkup() callback_button1 = types.InlineKeyboardButton(text="Gate-1", callback_data="open") callback_button2 = types.InlineKeyboardButton(text="Gate-2", callback_data="open2") callback_button3 = types.InlineKeyboardButton(text="Photo", callback_data="photo") # callback_button3 = types.InlineKeyboardButton(text="Add car", callback_data="add") keyboard.add(callback_button1,callback_button2,callback_button3) bot.send_message(message.chat.id, "Welcome to the xGates", reply_markup=keyboard) @bot.callback_query_handler(func=lambda call: True) def callback_inline(call): if call.message: if call.data == "open": os.system("cat </dev/null |sh /home/user/Downloads/autocheck/relay-control/open.sh 2>/dev/null") if call.message: if call.data == "open2": os.system("cat </dev/null |sh /home/user/Downloads/autocheck/relay-control/open2.sh 2>/dev/null") if call.message: if call.data == "photo": os.system("sh /home/user/Downloads/autocheck/tgphoto.sh xGates /home/user/Downloads/autocheck/output.jpg > log.out 2> /dev/null") if call.message: if call.data == "close": os.system("cat </dev/null |sh /home/user/Downloads/autocheck/relay-control/close.sh 2>/dev/null") if call.message: if call.data == "add": os.system("cat </dev/null |sh /home/user/Downloads/autocheck/relay-control/add.sh 2>/dev/null") def run(self): while True: self.updates() time.sleep(1) if __name__ == '__main__': bot.polling(none_stop=True)
در همان آدرس یک فایل دیگر به نام config.py ایجاد کرده و توکنی که از @bofather دریافت می کنند را در آن پیست کنید.
# -*- coding: utf-8 -*- token = 'TOKEN'
کد را اجرا کنید
تمام آدرس های داخل اسکریپت را بررسی کرده و کد را اجرا کنید.
sh check.sh python bot.py
اگر تمام مراحل را به صورت گفته شده پیش رفته باشید باید بتوانید در نهایت پروژه پلاک خوان خود را اجرا کرده و به راحتی از آن استفاده کنید. لطفا نظر خود را در مورد این پروژه به ما اعلام کنید.
نتیجه
نتیجه کد برای پنل وب به صورت زیر است.
و نتیجه ای که توسط ربات در تلگرام برای ما ارسال می شود به صورت زیر است.
دمای کار برد رسپبری پای در هنگام پلاک خوانی به صورت زیر است.
دمای برد رسپبری پای : ۶۸٫۲C
میزان بار پردازشی CPU در هنگام پلاک خوانی : ۴۰%
در پایین نیز اطلاعات کامل برد رسپبری پای نشان داده شده است.
تشخیص پلاک های ایرانی
روش گفته شده در بالا تنها برای پلاک های خارجی کاربرد دارد و لیست پلاک ها باید به صورت دستی وارد نرم افزار شود. اما برای پلاک های ایرانی و به عنوان یک پروژه با درصد اطمینان بالا، شرکت دانش بنیان شهاب محصول پلاک خوان خود را برای اجرا روی برد های رسپبری پای و جتسون نانو عرضه کرده است.
نرم افزار پلاک خوان آی پلاک لینوکس به عنوان یک محصول در رده تجاری برای پیاده سازی روی سیستم های لینوکس محور عرضه شده که به طور ویژه برای برد های مینی کامپیوتر لینوکسی مانند رسپبری پای و جتسون نانو توسعه یافته است. این نرم افزار با نصب بر روی برد های پردازنده، تصویر دوربین های مداربسته را دریافت کرده و به صورت Real-Time پلاک خوانی را انجام می دهد. در نهایت نتیجه ی پلاک خوانی به همراه ساعت دقیق تشخیص تردد گزارش می شود.
شما می توانید از طریق این نرم افزار، شماره پلاک خودرو های ایرانی را تشخیص داده و از گزارش خروجی آن در پروژه های خود استفاده کنید.
سلام خسته نباشید فقط کاش یک کلیپ هم آماده کنید که نحوه نصب رله ها رو آموزش میدادین خیلی ممنون
سلام
شماتیک نحوه اتصالش نشون داده شده. به همین صورت و با استفاده از کد هایی که گذاشتیم اگه اتصال بدید جواب میده.