تایپ صوتی در نمایشگر 1602توسط رزبری پای و اپلیکیشن اندرویدی

الکترونیک و رباتیک -> ماژول ها و سنسور ها 751 4 کاربر آکادمی پارتینه

به احتمال زیاد با تایپ صوتی که به صورت گسترده در رایانه‌ها و تلفن‌های همراه استفاده می‌شود آشنا هستید. در این روش همانطور که از نام آن مشخص است با بیان هر کلمه، آن کلمه تایپ می‌شود. تایپ صوتی برای افراد معلول، نابینا و یا هر شخصی که می‌خواهد با سرعت تایپ کند بسیار مفید است. بنابراین در این پروژ به ایجاد یک سیستم تایپ صوتی توسط رزبری پای پرداخته می‌شود. در این پروژه از نمایشگر کاراکتری 16x2 برای نمایش متن استفاده شده است. اما این سیستم همراه با نمایشگرهای بزرگتر قابل استفاده در  فرودگاه‌ها ، مراکز تجاری ، دفاتر و ... خواهد بود. 

روش کار به این صورت است که صدای ورودی با استفاده از صفحه کلید گوگل ویس (Google Voice) ، از طریق یک اپلیکیشن اندروید به نام BlueTerm به عنوان ورودی توسط رزبری پای دریافت و پردازش شده و سپس بر روی نمایشگر نشان داده می‌شود. در آموزش‌های قبلی در رابطه با راه اندازی نمایشگر 1602 توسط رزبری پای و روش کار با بلوتوث آن مورد بررسی قرار گرفته است.

 

مرحله 1 : اتصال نمایشگر کاراکتری 1602 به رزبری پای

قبل از راه اندازی بلوتوث ، ابتدا باید نمایشگر 1602 توسط رزبری پای راه‌اندازی شود. در این پروژه از یک کتابخانه Adafruit خارجی، برای اتصال نمایشگر به رزبری پای ستفاده شده که توسط آن نیاز به نوشتن کد برای درایور نمایشگر بر طرف شده و با استفاده از یک دستور یک خطی به طور مستقیم متون بر روی  نمایشگر چاپ می‌شوند. 

برای استفاده از کتابخانه Adafruit ابتدا باید  آن را نصب کنیم. با اجرای دستور اول یک Repository برای نمایشگر توسط Adafruit بر روی رزبری پای ایجاد می‌شود. توسط دستور دوم در فهرست دانلود قرار گرفته و در آخر نیز اسکریپت setup.py که در مسیر Adafruit_Python_CharLCD ارائه شده است ، برای نصب کتابخانه اجرا می‌شود.

git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git

cd ./Adafruit_Python_CharLCD

sudo python setup.py install

اکنون کتابخانه نمایشگر بر روی سیتم نصب شده است و باید توسط دستور زیر این کتابخانه فراخوانی شود.

import Adafruit_CharLCD as LCD

چندین اسکریپت نمونه در داخل پوشه "examples" در پوشه کتابخانه (Adafruit_Python_CharLCD) موجود است. می‌توانید با اجرای اسکریپت  char_lcd.py در این قسمت نمایشگر را تست کنید. اما قبل از آن باید نمایشگر را به ترتیب زیر به رزبری پای متصل کنید.

# Raspberry Pi pin setup
lcd_rs = 18
lcd_en = 23
lcd_d4 = 24
lcd_d5 = 16
lcd_d6 = 20
lcd_d7 = 21
lcd_backlight = 2

اکنون توابع ارائه شده توسط کتابخانه Adafruit به طور مستقیم برای کنترل نمایشگر قابل استفاده هستند. توابع پر استفاده شامل موارد زیر هستند:

• برای چاپ متن بر روی نمایشگر   (lcd.message(message
• پاک کردن نمایشگر   ()lcd.clear
• منتقل شدن مکان نما به سطر و ستون مورد نظر   (lcd.set_cursor(col, row
• چشمک زدن مکان نما  (lcd.blink(True
• حرکت مکان نما به سمت چپ   ()lcd.move_left
• حرکت مکان نما به سمت راست   ()lcd.move_right

در ادامه نحوه‌ی اتصال رزبری پای به تلفن همراه آندرویدی با استفاده از بلوتوث بررسی می‌شود.

مرحله 2 : نصب پکیج های لازم برای ارتباط بلوتوث

در این پروژه از زبری پای 2 مدل B استفاده شده است که بلوتوث داخلی ندارد. بنابراین یک دانگل بلوتوث USB برای تنظیم ارتباط بلوتوث در رزبری پای در نظر گرفته شده است.

برای به روز رسانی سیستم عامل رزبین دو دستور زیر را اجرا می کنیم.

sudo apt-get update
sudo apt-get upgrade

حال لازم است که پکیج های لازم برای ارتباط بلوتوث نصب شوند:

sudo apt-get install bluetooth blueman bluez

بعد از نصب پکیج های لازم با استفاده از دستور زیر رزبری پای را ریبوت می کنیم.

sudo reboot

BlueZ یک پروژه اوپن سورس است که پشته (stack) رسمی پروتکل بلوتوث لینوکس است. این پروتکل از تمام پروتکل‌های اصلی بلوتوث پشتیبانی کرده و اکنون جزئی از هسته رسمی لینوکس محسوب می شود. Blueman رابط دسکتاپ را برای مدیریت و کنترل دستگاه های بلوتوث فراهم می کند.

در نهایت برای ارتباط بلوتوث به کتابخانه پایتون نیاز داریم تا بتوانیم داده‌ها را از طریق RFCOMM با استفاده از زبان پایتون ارسال و دریافت کنیم:

sudo apt-get install python-bluetooth

همچنین کتابخانه مربوط به GPIO را برای رزبری پای نصب می‌کنیم:

sudo apt-get install python-rpi.gpio

اکنون تمامی پیکج های مورد نیاز برای  ارتباط بلوتوث در رزبری پای نصب شدند.

مرحله 3 : اتصال تلفن همراه به رزبری پای توسط بلوتوث

اتصال دستگاه‌هایی با قابلیت ارتباط بلوتوث، مانند تلفن همراه به رزبری پای بسیار آسان است. در این پروژه تلفن هوشمند با سیستم عامل اندروید به رزبری پای متصل شده است.

BlueZ که یک ابزار خط فرمان به نام "bl Bluetoothctl" را برای مدیریت دستگاه‌های بلوتوثی ما فراهم می‌کند، قبلا دررزبری پای نصب شده است. در این مرحله دانگل بلوتوث USB را به رزبری پای متصل کرده و با استفاده از دستور زیر تلفن همراه را با رزبری پای Pair می‌کنیم.

lsusb

حال bluetoothctl را توسط  دستور زیر باز می کنیم:

sudo bluetoothctl  

                                                  
با تایپ کردن "help" تمام دستوراالعمل‌های bluetoothctl  قابل مشاهده‌اند.

[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on

بعد از آخرین دستور "scan on" ، بلوتوث (تلفن همراه) در این لیست قابل مشاهده خواهد بود. از روشن بودن و قابل مشاهده بودن بلوتوث تلفن همراه توسط دستگاههای مجاور اطمینان حاصل کنید. سپس MAC آدرس تلفن همراه را کپی کرده و با استفاده از دستور زیر به سیستم متصل شوید.

pair <address of your phone>


 

 

مرحله 4 : تایپ صوتی با استفاده از اپلیکیشن اندرویدی BlueTerm

بعد از دانلود و نصب اپلیکیشن BlueTerm ، کد پایتون زیر را اجرا کنید و با استفاده از BlueTerm رزبری پای را به تلفن همراه متصل کنید.بعد از اتصال موفقیت آمیز، در بالا و گوشه سمت راست برنامه عبارت connected:raspberrypi را مشاهده می‌کنید. اکنون صفحه کلید تایپ کردن Google Voice typing را انتخاب کرده و شروع به صحبت کنید تا بر روی نمایشگر نشان داده شود.

import bluetooth
import RPi.GPIO as GPIO   #calling for header file which helps in using GPIOs of PI
import Adafruit_CharLCD as LCD

# Raspberry Pi pin setup
lcd_rs = 18
lcd_en = 23
lcd_d4 = 24
lcd_d5 = 16
lcd_d6 = 20
lcd_d7 = 21
lcd_backlight = 2

# Define LCD column and row size for 16x2 LCD.
lcd_columns = 16
lcd_rows = 2

lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)
 
server_socket=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
 
port = 1
server_socket.bind(("",port))
server_socket.listen(1)
 
client_socket,address = server_socket.accept()
print "Accepted connection from ",address

while 1:
 
 data = client_socket.recv(1024)
 print "Received: %s" % data
 if (data != ""):
  lcd.clear()
  print (len(data))
  if (len(data) > 16):  #breaking long strings into 2 parts
   i = len(data)-16
   a,b = data[:16], data[16:]  #first string will be of 16 char
   lcd.message(a)
   lcd.message('\n')
   lcd.message(b)
   print i
   print a
   print b
  else:
   lcd.message(data)
  
 if (data == "clear"):
  lcd.clear()
  
 if (data == "q"):
  print ("Quit")
  break
 
client_socket.close()
server_socket.close()