Omawiany projekt został wykonany przez Davida Hunta z Irlandii. Bazą wykonanego telefonu jest komputer jednopłytkowy Raspberry Pi Model B, choć inne modele też mogą zostać użyte. Model A pozwoli np. na obniżenie poboru energii.
Interfejs użytkownika zrealizowano na wyświetlaczu ciekłokrystalicznym TFT o rozdzielczości 320×240 pikseli, dostępnym w postaci modułu dla Raspberry PI. Wyświetlacz ma ekran dotykowy, przy czym nie ma większego znaczenia, czy zastosuje się model z interfejsem rezystancyjnym, czy dotykowym.
Ten drugi będzie droższy, ale pozwoli łatwiej zrealizować zaawansowane interakcję z użytkownikiem, gdyby zaszła taka potrzeba. Idealny rozmiar wyświetlacza, pasującego do omawianej konstrukcji to 2,8". Autor wybrał model PiTFT firmy Adafruit.
Do komunikacji z siecią komórkową użyto modułu GSM/GPRS. W pierwotnej wersji projektu autor skorzystał z modelu SIM900 firmy ElecFreaks, w której znajdował się układ SimCom SIM900. W nowszej rewizji projektu użyto zminiaturyzowanego modułu Adafruit FONA, w którym zainstalowany był modem SimCom SIM800L. W tym drugim przypadku konieczne jest jeszcze dokupienie anteny.
Potrzebne komponenty:
|
Aby zapewnić przenośność telefonu, konieczne było użycie akumulatora. Wybór padł na model litowo-polimerowy o pojemności 2500 mAh. W wersji usprawnionej, aby zmniejszyć całkowite wymiary sprzętu i zapewnić lepszą wentylację użyto mniejszego akumulatora litowo-polimerowego o pojemności 1200 mAh.
Ponieważ Raspberry Pi wymaga zasilania napięciem 5 V, a akumulator dostarcza 3,7 V, potrzebna była przetwornica podwyższająca napięcie. I znowu - pierwotnym wyborem był chiński podzespół, ale docelowo użyto przetwornicy Adafruit PowerBoost 500 z układem Texas Instruments TPS61090.
Oczywiście potrzebna była jeszcze karta SD o pojemności przynajmniej 4 GB, z systemem operacyjnym oraz elementy montażowe. Warto też zwrócić uwagę na fakt, że Raspberry Pi nie ma wbudowanego głośnika i dlatego jest konieczne zastosowanie np. zestawu słuchawkowego.
Montaż podzespołów
Trzon konstrukcji to Raspberry Pi oraz płytka wyświetlacza ciekłokrystalicznego. Autor umieścił je - jedną na drugiej, a w przestrzeń pomiędzy złączami RPi wstawił wspomniany akumulator. Komponenty są zamocowane za pomocą golpinów, do których jest dołączony moduł wyświetlacza.
Odwzorowując samodzielnie tę konstrukcję warto zwrócić uwagę na przewiew powietrza pomiędzy płytkami. Nieco nagrzewają się one w trakcie pracy, co podwyższa temperaturę akumulatora, prawdopodobnie nie wpływając korzystnie na jego trwałość. Zamontowanie dodatkowego wentylatora może poprawić niezawodność urządzenia.
Moduł z modemem został umieszczony od spodu Raspberry Pi. Aby odizolować go od PCB komputera, autor odseparował go grubą, twardą gąbką. Komponenty trzymają się siebie dzięki plastikowym taśmom zaciskowym, co nie jest rozwiązaniem eleganckim, ale w prototypie jest dopuszczalne. Obok modemu doczepiono przetwornicę, a całość połączono przewodami, zgodnie z rysunkami 1 i 2. Raspberry Pi jest dołączony do wyświetlacza, a wiec także i do zasilacza oraz modemu, poprzez goldpiny.
Oprogramowanie
W pierwszej kolejności należy zainstalować Raspbiana, a następnie skonfigurować obsługę wyświetlacza z ekranem dotykowym, zgodnie z instrukcją do wybranego modelu. Czasem dostawcy wyświetlaczy do Raspberry Pi dostarczają własne, już skonfigurowane wersje Raspbiana w postaci obrazów. Warto poszukać ich na stronie producenta.
Podczas pierwszego uruchomienia systemu, warto podłączyć monitor, klawiaturę i myszkę do przejścia przez procedurę konfiguracyjną. Ponieważ urządzenie będzie pracować z akumulatorem, lepiej zrezygnować z opcji przetaktowania komputera, by nie czerpał on zbyt wiele energii.
Ponieważ domyślnie wyświetlacz telefonu ma pracować w orientacji portretowej, należy przygotować go do tego trybu. W przypadku wyświetlacza w postaci modułu PiTFT polega to na edytowaniu pliku /etc/modprobe.d/adafruit.conf i przypisaniu do znajdującego się wewnątrz parametru rotate wartości 0.
O ile dodatkowe przyciski, znajdujące się na PCB modułu PiTFT nie są w niniejszym projekcie potrzebne, należy za to przeprowadzić kalibrację ekranu dotykowego.
W ramach konfiguracji trzeba też sprawić, by port szeregowy komputera komunikował się z modułem GSM. W tym celu w pliku /etc/inittab należy wykomentować linijkę:
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Właściwy program
Kod programu PiPhone został napisany w Pythonie i nie jest skomplikowany. Dzięki wykorzystaniu wielu bibliotek, całość sprowadza się do około 300 linijek, po usunięciu komentarzy.
Na początek kodu importowane są biblioteki (listing 1). Najbardziej pomocna jest biblioteka pygame, która pozwała w łatwy sposób obsłużyć wyświetlacz oraz wyjścia i wejście audio. Definiowana jest klasa Icon (listing 2), która pozwala ładować pliki PNG jako obrazy z katalogu z ikonami.
Autor zdecydował, że lista nie jest definiowana globalnie, tylko ładowana dynamicznie. Drugą z definiowanych klas jest Button, która określa region ekranu oraz opcjonalnie jego kolor tła, wyświetlaną w jego obszarze ikonę, funkcję wywoływaną po przytrzymaniu lub naciśnięciu danego regionu, a także parametr przekazywany tej funkcji.
Dzięki temu wszystkie przyciski korzystają z tej samej funkcji, a jedynie parametr określa, który przycisk został naciśnięty. Warto zwrócić uwagę, że jeśli przyciski będą na siebie nachodzić, istotna jest ich kolejność wpływająca na to, który z przycisków został naciśnięty.
Na listingu 3. Przedstawiono treść funkcji reagującej na naciśnięcie przycisku. Po pierwsze sprawdza ona, czy przycisk jest cyfrą, a po drugie, czy aktualnie trwa rozmowa. Naciśnięcie klawisza numerycznego wydłuża ciąg cyfr wybieranego numeru telefonu.
Przycisk cofania skraca ciąg. Przycisk słuchawki służy do nawiązywania lub rozłączania połączenia. Polecenie wybrania numeru lub rozłączenia wysyłane jest poprzez port szeregowy za pomocą komend AT. Przykładowo, do nawiązania połączenia służy linijka
serialport.write("ATD " + numberstring + ‘;r’)
Autor przygotował zestaw zmiennych globalnych (listing 4), do których odnoszą się poszczególne funkcje. Zmienne te przechowują m.in. informacje o tym, czy prowadzona jest aktualnie rozmowa, który katalog zawiera ikony przycisków oraz który przycisk został ostatni naciśnięty. Jako zmienne globalne zadeklarowano także tablicę ikon i przycisków (listing 5), tworzoną w oparciu o podane wcześniej klasy. Na listingu 6 można zobaczyć funkcje służące do zapamiętywania i odczytywania ustawień.
W ramach inicjalizacji programu (listing 7) skrypt konfiguruje zmienne środowiskowe dla ekranu dotykowego, a następnie uruchamia bibliotekę pygame. W następnej części ładuje ikony przycisków, wypełniając zadeklarowaną wcześniej globalną tablicę. Ładuje też dodatkowe ustawienia i tło wyświetlacza, a następnie inicjalizuje modem GSM. W tym celu również korzysta z poleceń AT przesyłanych przez port szeregowy.
Główna pętla programu (listing 8) nie jest długa. Przegląda ona stale listę zdarzeń zarejestrowanych za pomocą biblioteki pygame i jeśli znajdzie na niej zdarzenie typu MOUSEBUTTONDOWN, sprawdza dla każdego przycisku, czy obszar zdarzenia (pozycja kursora) nie leży czasem w zasięgu danego przycisku.
Jeśli tak jest, program przechodzi do odtworzenia poprawnego wyglądu ekranu - ponownego wyświetlenia tapety, wypisania wybieranego numeru lub np. narysowania na nowo przycisków. Sama obsługa przycisków jest bowiem realizowana za pomocą zdarzeń wywoływanych niezależnie.
Gotowy program w języku Python należy dopisać do skryptu inicjacji komputera, edytując plik /etc/rc.local i dodając treść:
cd/home/pi/PiPhone-master
python piphone.py
przed linijką exit 0.
Podsumowanie
Omawiany projekt jest bardzo dobrym przykładem tego, jak łatwe jest zrobienie bardzo zaawansowanego urządzenia, jeśli korzysta się z gotowych modułów i bibliotek. Kto by pomyślał, że telefon komórkowy z interfejsem dotykowym wymaga jedynie 300 linijek kodu i połączenia ze sobą maksymalnie kilkunastu punktów lutowniczych. A ponadto, znacząca część napisanego kodu służy przede wszystkim wyświetlaniu przycisków i informacji na ekranie.
Aby telefon faktycznie był użyteczny, należałoby jeszcze poprawić jego konstrukcje mechaniczną, by się nie rozpadał i zabezpieczyć go przed warunkami środowiskowymi. Najlepiej poprzez zaprojektowanie dla niego obudowy z tworzywa i wydrukowanie jej na drukarce 3D.
Można też wbudować mikrofon i miniaturowy głośnik, korzystając choćby z dodatkowych interfejsów modułu FONA, użytego w zmodernizowanej wersji projektu. Niestety, samodzielna budowa telefonu nie jest sposobem na zaoszczędzenie - łączny koszt użytych komponentów to około 150 dolarów + podatki.
Kompletny gotowy program można pobrać z adresu https://goo.gl/buWC7D, a opis zmodernizowanego projektu znajduje się tu https://goo.gl/3lFHZ1. Dla ułatwienia komplet skryptów można pobrać bezpośrednio do Raspberry Pi za pomocą komend:
wget https://github.com/climberhunt/Piphone/archive/master.zip
unzip master.zip
Spowodują one pobranie i rozpakowanie pliku z zasobami projektu, przy czym tamtejszy kod zawiera dodatkowe komentarze i linijki z starszych projektów autora, które nie są potrzebne do działania PiPhone i dla skrócenia listingów zostały w niniejszym artykule z nich usunięte.
Marcin Karbowniczek, EP