- bazuje na komputerku Raspberry Pi Zero W,
- posiada komponenty niezbędne do monitorowania otoczenia i realizacji interfejsu użytkownika,
- umożliwia łączność poprzez Wi-Fi,
- programowany przy pomocy języka Python.
Urządzenie przypomina nietypową płytkę ewaluacyjną. Oferuje zasoby sprzętowe ukierunkowane na realizację interfejsu użytkownika i monitorowanie otoczenia, oraz program inicjujący te zasoby i pokazujący, jak z nich korzystać we własnych programach. Natomiast docelowa funkcja urządzenia zależy od kreatywności konstruktora/programisty. Najważniejsze funkcje i możliwości Asystenta cyfrowego to:
- odtwarzanie komunikatów głosowych,
- sygnalizacja dźwiękowa przy pomocy buzera,
- wyświetlanie krótkich treści na wyświetlaczu LCD 2×16,
- oświetlanie otoczenia przy pomocy diod LED,
- pomiar temperatury otoczenia,
- odczytywanie stanu 3 przycisków,
- wykrywanie ruchu przy pomocy czujnika PIR,
- możliwość połączenia z siecią Wi-Fi,
- pozwala obserwować otoczenie przy pomocy kamery.
Budowa urządzenia
Budowę Asystenta cyfrowego ZW-1 można podzielić na dwie części. Pierwsza część to komputer Raspberry Pi Zero W oraz komponenty niezbędne do jego działania i rozszerzające jego funkcje multimedialne:
- Kamera dla Raspberry Pi 8 Mpx + taśma połączeniowa do kamery o długości 150 mm,
- Karta dźwiękowa USB + przewód OTG microUSB – USB o długości 120 mm,
- Karta pamięci mikroSD o pojemności 16 GB,
- Zasilacz mikroUSB 5 V o wydajności prądowej 2 A.
Połączone komponenty pierwszej części urządzenia pokazuje fotografia 1.
Druga część to płytka drukowana, na której znajdują się elementy elektroniczne, dzięki którym Asystent cyfrowy ZW-1 komunikuje się z użytkownikiem oraz pobiera dane z otoczenia. Schemat ideowy części elektronicznej został pokazany na rysunku 1.
Złącze J1 służy do podłączenia komputera Raspberry Pi Zero W. Układ scalony oznaczony U1 oraz współpracujące z nim elementy dyskretne C1, C2, C3 oraz R1 ma za zadanie wzmacniać sygnał audio pochodzący z karty dźwiękowej. Wzmocniony sygnał trafia na złącze J2 i jest następnie odtwarzany w głośniku G1. Za pomocą potencjometru montażowego P1 jest ustawiany kontrast wyświetlacza LCD1, a elementy elektroniczne T1, R2 oraz R3 są odpowiedzialne za sterowanie jego podświetlaniem. Przyciski S1, S2 oraz S3 są dołączone do wyprowadzeń GPIO komputerka, ich funkcję można dowolnie zaprogramować. Czujnik U2 typu DS18B20 umożliwia pomiar temperatury otoczenia. Rezystor R4 dołaczony do wyjścia czujnika, magistrali 1Wire, realizuje podciąganie do potencjału dodatniego. Złacze oznaczone MOD2 służy dołączeniu gotowego modułu czujnika ruchu. Moduł ten posiada dwa potencjometry, dzięki którym można ustawić czas trwania stanu wysokiego na jego wyjściu po wykryciu ruchu, oraz zasięg jego działania. Elementy R7 i T2 sterują diodami LED1 i LED2. Prąd płynący przez diody ograniczają rezystory R5 i R6. Element BUZ1 to sygnalizator dźwiękowy z generatorem, sterowany jest bezpośrednio z wyprowadzenia GPIO21 komputerka.
Montaż i uruchomienie
Na rysunku 2 został pokazany schemat płytki drukowanej wraz z rozmieszczeniem elementów.
Zmontowana płytka wraz z wyprowadzonymi przewodami do podłączenia komputerka Raspberry Pi Zero W oraz karty dźwiękowej została pokazana na fotografii 2.
Konstrukcja mechaniczna asystenta cyfrowego ZW-1 jest wykonana z czarnego szkła akrylowego oraz niewielkiej ilości elementów montażowych. Do tylnej ścianki obudowy przymocowano komputerek Raspberry Pi Zero W za pomocą tulei dystansowych M3×6 mm o gwincie obustronnie wewnętrznym. Do zewnętrznych otworów przykręcono dłuższe tuleje dystansowe M3×30 mm o gwincie obustronnie wewnętrznym, będą one potrzebne do montażu płytki drukowanej. Kartę dźwiękową przyklejono z wykorzystaniem rzepa samoprzylepnego o wymiarach ok. 25×25 mm (fotografia 3).
Za pomocą tulei dystansowych M3×15 mm o gwincie obustronnie wewnętrznym połączono wyświetlacz LCD z płytką, a następnie płytkę przykręcono za pomocą tulei dystansowych M3×20 mm o gwincie wewnętrznym oraz zewnętrznym do przygotowanej wcześniej ścianki tylnej obudowy. Do górnej części obudowy przykręcono czujnik ruchu i kamerę za pomocą śrub oraz nakrętek M2 (fotografia 4).
Na zakończenie montażu konstrukcji mechanicznej Asystenta cyfrowego ZW-1, uchwytami LED RTC51 stabilnie przymocowano diody LED oraz przykręcono górną część obudowy.
Oprogramowanie
Przed rozpoczęciem programowania Asystenta cyfrowego ZW-1, konieczne jest zainstalowanie bibliotek języka Python do obsługi wyświetlacza LCD, czujnika temperatury oraz syntezatora mowy. W tym celu łączymy się z komputerkiem np. za pomocą PuTTY i wpisujemy następujące polecenia:
pi@raspberrypi:~ $ git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git
pi@raspberrypi:~ $ cd Adafruit_Python_CharLCD
pi@raspberrypi:~ / Adafruit_Python_CharLCD $ sudo python3 setup.py install
pi@raspberrypi:~ $ pip3 install w1thermsensor
pi@raspberrypi:~ $ sudo apt-get install espeak
Aby syntezator mowy prawidłowo wymawiał polskie litery, należy otworzyć plik, w którym zapisane są odpowiednie ustawienia, poleceniem
pi@raspberrypi:~ $ sudo nano /ust/lib/arm-linux-gnueabihf/espeak-data/voices/default
a następnie zmodyfikować treść otwartego pliku:
name default
language pl
gender male
intonation 2
Teraz można uruchomić program prezentujący umiejętności urządzenia, którego kod został pokazany na listingu 1.
import os
from time import sleep
import Adafruit_CharLCD as LCD
import w1thermsensor
from picamera import PiCamera
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(3, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(21, GPIO.OUT)
GPIO.setup(12, GPIO.IN)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)
lcd = LCD.Adafruit_CharLCD(9, 11, 8, 7, 5, 6, 16, 2)
lcd.create_char(1,[7, 5, 7, 32, 32, 32, 32, 32])
lcd.clear()
def Komunikat_głosowy(tekst):
os.system( ‘espeak "’+tekst+’" --stdout -a 200 -s 180 -p 40 | aplay 2>/dev/null’ )
Zmienna_pomocnicza1 = True
Zmienna_pomocnicza2 = True
Komunikat_głosowy("Witaj, Nazywam się ZW-1,
jestem asystentem cyfrowym,
stworzył mnie Zygmunt Wypich.
Posiadam wiele umiejętności.")
sleep(2)
Komunikat_głosowy("Informuję o zdarzeniach za pomocą buzzera.")
sleep(2)
GPIO.output(21, GPIO.HIGH)
sleep(2)
GPIO.output(21, GPIO.LOW)
sleep(2)
Komunikat_głosowy("Wyświetlam dane na wyświetlaczu LCD.")
sleep(2)
GPIO.output(13, GPIO.HIGH)
lcd.message(‘Witaj!’)
sleep(7)
lcd.clear()
GPIO.output(13, GPIO.LOW)
sleep(2)
Komunikat_głosowy("Oświetlam otoczenie za pomocą diod LED.")
sleep(2)
GPIO.output(3, GPIO.HIGH)
sleep(7)
GPIO.output(3, GPIO.LOW)
sleep(2)
Komunikat_głosowy("Mierzę aktualną temperaturę otoczenia.")
sleep(2)
GPIO.output(13, GPIO.HIGH)
lcd.clear()
sensor = w1thermsensor.W1ThermSensor()
temp = sensor.get_temperature()
temp = round(temp, 1)
temperatura = str(temp)
lcd.message(‘Temperatura:’)
lcd.set_cursor(0,1)
lcd.message(temperatura + ‘\x01’ + ‘C’)
sleep(7)
lcd.clear()
GPIO.output(13, GPIO.LOW)
sleep(2)
Komunikat_głosowy("Odczytuję stan trzech przycisków ogólnego przeznaczenia.")
sleep(1)
while (Zmienna_pomocnicza1 == True):
if GPIO.input(19) == False and Zmienna_pomocnicza2 == True:
sleep(0.2)
Komunikat_głosowy("Został naciśnięty górny przycisk.")
Zmienna_pomocnicza1 = False
Zmienna_pomocnicza2 = GPIO.input(19)
sleep(1)
Zmienna_pomocnicza1 = True
Zmienna_pomocnicza2 = True
while (Zmienna_pomocnicza1 ==True):
if GPIO.input(16) == False and Zmienna_pomocnicza2 == True:
sleep(0.2)
Komunikat_głosowy("Został naciśnięty środkowy przycisk.")
Zmienna_pomocnicza1 = False
Zmienna_pomocnicza2 = GPIO.input(16)
sleep(1)
Zmienna_pomocnicza1 = True
Zmienna_pomocnicza2 = True
while (Zmienna_pomocnicza1 ==True):
if GPIO.input(26) == False and Zmienna_pomocnicza2 == True:
sleep(0.2)
Komunikat_głosowy("Został naciśnięty dolny przycisk.")
Zmienna_pomocnicza1 = False
Zmienna_pomocnicza2 = GPIO.input(26)
sleep(2)
Zmienna_pomocnicza1 = True
Komunikat_głosowy("Wykrywam ruch w swoim otoczeniu.")
sleep(2)
Komunikat_głosowy("Proszę opuść pomieszczenie na dziesięć sekund, a następnie ponownie się w nim pojaw. Kiedy wykryję twój ruch, poinformuję cię o tym.")
sleep(10)
while (Zmienna_pomocnicza1 == True):
if GPIO.input(12) == True:
Komunikat_głosowy("Twój ruch został wykryty.")
Zmienna_pomocnicza1 = False
sleep(2)
Komunikat_głosowy("Obserwuję otoczenie za pomocą kamery.")
sleep(2)
Komunikat_głosowy("Za pięć sekund zaświecę diody LED, a następnie zrobię zdjęcie, które zapiszę na pulpicie.")
sleep(5)
GPIO.output(3, GPIO.HIGH)
Kamera = PiCamera()
Kamera.start_preview()
Kamera.capture(‘/home/pi/Desktop/Zdjęcie.jpg’)
Kamera.stop_preview()
sleep(5)
GPIO.output(3, GPIO.LOW)
sleep(2)
Komunikat_głosowy("Dziękuję za uwagę.")
Więcej informacji na temat asystenta cyfrowego ZW-1 oraz film prezentujący jego umiejętności znajduje się na stronie internetowej www.zw-robotics.pl.
Zygmunt Wypich
zygmunt.wypich@zw-robotics.pl
- R1: 10 Ω
- R2: 33 Ω
- R3, R4, R7: 4,7 kΩ
- R5, R6: 220 Ω
- P1: potencjometr montażowy 10 kΩ
- C1: 10 μF/25 V
- C2: 220 μF/25 V
- C3: 47 nF ceramiczny
- LED1, LED2: dioda LED 5 mm biała
- T1, T2: BC337
- U1: LM386L DIP8
- U2: DS18B20
- S1…S3: przycisk 6×6 mm i długości 22,5 mm
- G1: głośnik 8 Ω, 0,5 W, średnicy 30 mm
- BUZ1: buzzer z generatorem 3 V
- J1: gniazdo IDC 40 pin + wtyk IDC kątowy 40 pin + przewód taśmowy o długości 140 mm
- LCD1: wyświetlacz LCD 2×16 HD44780
- MOD2: czujnik ruchu PIR HC-SR501
- wtyk jack 3,5 z przewodem o długości 240 mm
- Raspberry Pi Zero W + osprzęt (wykaz w tekście)
- elementy mocujące – tuleje, śruby, nakrętki, itd.