Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00252 007667 10469242 na godz. na dobę w sumie
Projekty elektroniczne na iPhone i iPad. Niekonwencjonalne gadżety z technologią Arduino i techBASIC - książka
Projekty elektroniczne na iPhone i iPad. Niekonwencjonalne gadżety z technologią Arduino i techBASIC - książka
Autor: Liczba stron: 304
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-8890-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie mobilne >> iphone
Porównaj ceny (książka, ebook, audiobook).

Podstawowe funkcje telefonu, czyli dzwonienie i wysyłanie SMS-ów, nikomu już dziś nie wystarczają. Współczesne smartfony wykorzystywane są na mnóstwo innych sposobów. Gry, przeglądanie ulubionych stron w Internecie, aktywny udział w życiu portali społecznościowych — to tylko niektóre z nich.

Przy odrobinie umiejętności możesz użyć Twojego telefonu także do niekonwencjonalnych działań: na przykład jako wykrywacza metali, barometru lub żyroskopu. To urządzenia, które możesz zbudować na podstawie Twojego iPada lub iPhone’a oraz kilku niedrogich urządzeń dodatkowych. Dzięki tej książce jest to naprawdę proste! W trakcie lektury poznasz język techBasic, który pomoże Ci zbudować działający higrometr oraz przyśpieszeniomierz. Ponadto zdobędziesz wiedzę na temat technologii Bluetooth Low Energy oraz nauczysz się sterować zdalnie samochodem za pomocą urządzenia typu BLE i platformy Arduino. Książka ta jest doskonałą lekturą dla wszystkich pasjonatów elektroniki, którzy chcieliby maksymalnie wykorzystać potencjał swoich smartfonów i tabletów. Zaskocz swoich znajomych niesamowitym zastosowaniem telefonu!

Dzięki tej książce:

Odkryj nowe zastosowania dla Twoich urządzeń iPhone i iPad!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Building iPhone and iPad Electronic Projects Tłumaczenie: Robert Górczyński ISBN: 978-83-246-8890-6 © 2014 Helion S.A. Authorized Polish translation of the English edition of Building iPhone and iPad Electronic Projects, ISBN 9781449363505 © 2013 James M. Westerfield. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/prelip Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:316)ci Wprowadzenie ..............................................................................................................7 W(cid:228)asny tricorder Krótkie wprowadzenie do techBASIC 1. Wprowadzenie do techBASIC i czujników wbudowanych w urz(cid:233)dzenia iOS .......... 13 13 14 15 15 17 20 Aplikacja techBASIC Sampler Uruchomienie pierwszego programu Tworzenie programu Przy(cid:264)pieszeniomierz (cid:275)yroskop Radiany czy stopnie? 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników ..........................................33 34 40 41 47 51 52 53 Magnetometr Uzyskanie szybszej odpowiedzi z czujnika Wyznaczanie kursu Po(cid:228)o(cid:276)enie Twój w(cid:228)asny tricorder Magnetometr w urz(cid:241)dzeniach iPhone i iPad Ziemskie pole magnetyczne U(cid:276)ycie iPhone’a lub iPada jako wykrywacza metalu 3. Budujemy wykrywacz metalu .....................................................................................55 55 56 58 60 61 63 Konwersja aplikacji Magnetometer na wykrywacz metalu U(cid:276)ywanie wykrywacza metalu Co dalej? 4. HiJack ...........................................................................................................................65 65 67 71 Co to jest HiJack? Budowa czujnika Zasilanie zewn(cid:246)trzne dla urz(cid:241)dzenia HiJack 3 Kup książkęPoleć książkę Program Hello HiJack Kiedy sprawy id(cid:241) (cid:274)le Lepsza wersja programu HiJack Co dalej? 73 75 75 80 Dodanie wilgotno(cid:264)ciomierza do tricordera Budowa wilgotno(cid:264)ciomierza Kalibracja 5. Budujemy wilgotno(cid:316)ciomierz za pomoc(cid:233) urz(cid:233)dzenia HiJack .................................... 81 81 82 83 83 85 86 89 96 Zebranie danych do kalibracji Przenoszenie plików danych do oraz z techBASIC U(cid:276)ycie danych kalibracji Pe(cid:228)ny kod (cid:274)ród(cid:228)owy programu Moisture Meter Lepsza wersja oprogramowania Czym jest technologia Bluetooth Low Energy? Urz(cid:241)dzenie SensorTag firmy Texas Instruments Tworzenie programów obs(cid:228)uguj(cid:241)cych urz(cid:241)dzenia typu BLE Przy(cid:264)pieszeniomierz Barometr (cid:275)yroskop Uzyskanie dost(cid:246)pu do barometru Kod (cid:274)ród(cid:228)owy programu odczytuj(cid:241)cego warto(cid:264)ci z barometru Co to jest przy(cid:264)pieszeniomierz? Uzyskanie dost(cid:246)pu do przy(cid:264)pieszeniomierza U(cid:276)ycie przy(cid:264)pieszeniomierza Kod (cid:274)ród(cid:228)owy programu odczytuj(cid:241)cego warto(cid:264)ci z przy(cid:264)pieszeniomierza 6. Technologia Bluetooth Low Energy ............................................................................99 99 101 103 115 115 116 118 120 123 124 128 132 132 134 135 138 139 141 141 144 145 147 150 150 152 153 156 Uzyskanie dost(cid:246)pu do magnetometru U(cid:276)ycie magnetometru Kod (cid:274)ród(cid:228)owy programu odczytuj(cid:241)cego warto(cid:264)ci z magnetometru Uzyskanie dost(cid:246)pu do termometru U(cid:276)ycie termometru Kod (cid:274)ród(cid:228)owy programu odczytuj(cid:241)cego warto(cid:264)ci z termometru Uzyskanie dost(cid:246)pu do (cid:276)yroskopu U(cid:276)ycie (cid:276)yroskopu Kod (cid:274)ród(cid:228)owy programu odczytuj(cid:241)cego warto(cid:264)ci z (cid:276)yroskopu Uzyskanie dost(cid:246)pu do wilgotno(cid:264)ciomierza Kod (cid:274)ród(cid:228)owy programu odczytuj(cid:241)cego warto(cid:264)ci z wilgotno(cid:264)ciomierza Wilgotno(cid:264)ciomierz Magnetometr Termometr Co dalej? 4 (cid:95) Spis tre(cid:316)ci Kup książkęPoleć książkę Dlaczego u(cid:276)ywamy SensorTag? Konstrukcja Odrobina informacji na temat budowy rakiet Listy niezb(cid:246)dnych elementów Model rakiety ST-2 przenosz(cid:241)cej iPhone i SensorTag Model rakiety ST-1 przenosz(cid:241)cej tylko SensorTag ST-1 ST-2 Inne elementy potrzebne dla obu budowanych rakiet Program odpowiedzialny za zbieranie danych Oprogramowanie SensorTag dzia(cid:228)aj(cid:241)ce w zakresie ±8G Wskazówki dotycz(cid:241)ce lotów 7. Model rakiety jako sterowane iPhone’em urz(cid:233)dzenie typu BLE ..............................157 158 159 159 160 161 161 162 163 168 169 180 182 182 182 182 183 183 183 185 186 189 189 189 191 Analiza danych Analiza danych za pomoc(cid:241) programu Rocket Flight Analysis Pr(cid:246)dko(cid:264)(cid:232) i wysoko(cid:264)(cid:232) Obrót i ci(cid:264)nienie Silniki Spadochrony Pogoda podczas lotów Start rakiety Czego si(cid:246) dowiedzieli(cid:264)my? Wyniki dla rakiety ST-1 Wyniki dla rakiety ST-2 Dane 8. Zdalne sterowanie samochodem Demonta(cid:276) samochodu Modyfikacja samochodu Mostek H Uk(cid:228)ad scalony Texas Instruments SN754410 Monta(cid:276) ca(cid:228)ego uk(cid:228)adu elektronicznego za pomoc(cid:233) urz(cid:233)dzenia typu BLE i mikrokontrolera Arduino ................................... 193 194 Sterowanie samochodem za pomoc(cid:241) urz(cid:241)dzenia typu BLE 196 Wybór zdalnie sterowanego samochodu 196 200 201 202 204 211 211 213 216 216 218 228 Instalacja oprogramowania Arduino Pobranie oprogramowania Firmata Modulacja szeroko(cid:264)ci impulsów Wracamy do oprogramowania Sterowanie mikrokontrolerem Arduino Uno Oprogramowanie Uruchom silniki! Spis tre(cid:316)ci (cid:95) 5 Kup książkęPoleć książkę Tryb podleg(cid:228)y w BLE Program BLE Chat 9. Po(cid:293)(cid:233)czenie BLE mi(cid:253)dzy urz(cid:233)dzeniami iOS ................................................................ 231 231 232 232 234 Konfiguracja urz(cid:241)dze(cid:254) U(cid:276)ycie us(cid:228)ug 10. Paddles, czyli ho(cid:293)d z(cid:293)o(cid:348)ony grze Pong ......................................................................245 245 246 247 251 Klasyczna gra Pong Gra Paddles Program obs(cid:228)uguj(cid:241)cy paletk(cid:246) Program obs(cid:228)uguj(cid:241)cy konsol(cid:246) gry Paddles Komunikacja ze (cid:264)wiatem WiFly Protoko(cid:228)y HTTP, FTP i TCP/IP 11. Wi-Fi ...........................................................................................................................263 263 264 265 266 267 268 269 271 271 273 274 Wczytanie oprogramowania do mikrokontrolera Arduino Uk(cid:228)ad elektroniczny Komunikacja za pomoc(cid:241) programu terminala Uk(cid:228)ad elektroniczny Nawi(cid:241)zanie po(cid:228)(cid:241)czenia sieciowego Komunikacja z TCP/IP Prosty program terminala Wi-Fi i Arduino Ogólne informacje o serwomechanizmach Kontroler Pololu Serial Servo Controller Uk(cid:228)ad elektroniczny 12. Serwomechanizmy Wi-Fi ..........................................................................................275 275 276 279 281 281 285 285 288 Maski na Halloween Oprogramowanie Wypróbuj zbudowane urz(cid:241)dzenie Serwomechanizmy wykonuj(cid:241)ce ruch do przodu i do ty(cid:228)u Zako(cid:254)czenie Skorowidz ..................................................................................................................289 6 (cid:95) Spis tre(cid:316)ci Kup książkęPoleć książkę ROZDZIA(cid:292) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników W tym rozdziale Przygotowania Programy przedstawione w tym rozdziale s(cid:241) zmodyfikowanymi wersjami programu omó- wionego w rozdziale 1. Je(cid:276)eli natkniesz si(cid:246) na jakiekolwiek niejasno(cid:264)ci, wtedy zapoznaj si(cid:246) z rozdzia(cid:228)em 1. Wyposa(cid:276)enie Wymagane jest urz(cid:241)dzenie iPhone, iPod touch b(cid:241)d(cid:274) iPad dzia(cid:228)aj(cid:241)ce pod kontrol(cid:241) systemu iOS 5 lub nowszego. Oprogramowanie Wymagana jest kopia aplikacji techBASIC lub techBASIC Sampler. Czego si(cid:246) nauczysz? Z tego rozdzia(cid:228)u dowiesz si(cid:246), jak uzyska(cid:232) dost(cid:246)p do magnetometru i (cid:276)yroskopu, które s(cid:241) wbudowane w wi(cid:246)kszo(cid:264)ci urz(cid:241)dze(cid:254) iOS. Wymienione czujniki mo(cid:276)na wykorzysta(cid:232) w prak- tycznie dowolnym celu, pocz(cid:241)wszy od wyznaczania kursu, a(cid:276) po rzeczywisto(cid:264)(cid:232) rozsze- rzon(cid:241) (ang. Augmented Reality). Zanim zako(cid:254)czysz lektur(cid:246) rozdzia(cid:228)u, dowiesz si(cid:246) nieco wi(cid:246)cej na temat techBASIC. Mi(cid:246)dzy innymi poznasz inny sposób uzyskania dost(cid:246)pu do czujników w znacznie krótszym czasie. Ponadto przekonasz si(cid:246), (cid:276)e mo(cid:276)na u(cid:276)ywa(cid:232) systemu pomocy w aplikacji techBASIC do wy- szukiwania informacji na temat samego j(cid:246)zyka i oferowanych przez niego polece(cid:254). Na ko(cid:254)cu rozdzia(cid:228)u pokrótce zapoznasz si(cid:246) z dwoma innymi us(cid:228)ugami. Wprawdzie to nie s(cid:241) typowe czujniki, ale dost(cid:246)p do nich odbywa si(cid:246) w taki sam sposób jak do czujników. Pierw- sza ze wspomnianych us(cid:228)ug to GPS, natomiast druga to wyznaczanie kursu (ang. heading), które wykorzystuje magnetometr i kompas w celu znalezienia odpowiedniego kursu. Utworzenie naszego pierwszego programu opartego na graficznym interfejsie u(cid:276)ytkownika i przeznaczonego do wy(cid:264)wietlania danych czujnika wbudowanego w urz(cid:241)dzenia iPhone i iPad wymaga(cid:228)o nieco pracy. Nic dziwnego, poznajemy nowe (cid:264)rodowisko programistyczne, a tak(cid:276)e 33 Kup książkęPoleć książkę czujniki oferowane przez urz(cid:241)dzenia iOS. Maj(cid:241)c ju(cid:276) podstawow(cid:241) wiedz(cid:246), warto j(cid:241) rozszerzy(cid:232) i wykorzysta(cid:232) nowe mo(cid:276)liwo(cid:264)ci. Dzi(cid:246)ki temu b(cid:246)dziemy mogli uko(cid:254)czy(cid:232) prace nad naszym tricorderem. (cid:347)yroskop Pocz(cid:241)wszy od modelu iPhone 4, wszystkie smartfony iPhone s(cid:241) wyposa(cid:276)one w (cid:276)yroskop trójosiowy. By(cid:232) mo(cid:276)e s(cid:241)dzisz, (cid:276)e (cid:276)yroskop jest niepotrzebny, poniewa(cid:276) przy(cid:264)pieszeniomierz mo(cid:276)e dostarczy(cid:232) wszelkich informacji o po(cid:228)o(cid:276)eniu urz(cid:241)dzenia (patrz rysunek 2.1), (cid:264)ledzi(cid:232) po(cid:228)o(cid:276)enie i informowa(cid:232) o wszelkich zmianach orientacji. Okazuje si(cid:246) jednak, (cid:276)e przy(cid:264)piesze- niomierz nie sprawdza si(cid:246) jako zamiennik (cid:276)yroskopu. Jednym z powodów s(cid:241) prawa fizyki. Grawitacja Ziemi to nie jedyne przy(cid:264)pieszenie wychwytywane przez przy(cid:264)pieszeniomierz, sam ruch tak(cid:276)e wi(cid:241)(cid:276)e si(cid:246) z pewnym przy(cid:264)pieszeniem. Inny powód jest czysto praktyczny. Przy(cid:264)pieszeniomierz nie mo(cid:276)e wykrywa(cid:232) gwa(cid:228)townych zmian w orientacji tak dobrze jak (cid:276)y- roskop, który zosta(cid:228) opracowany w(cid:228)a(cid:264)nie do tego celu. Rysunek 2.1. Orientacja osi jest taka sama w przy(cid:264)pieszeniomierzu, (cid:276)yroskopie i magnetometrze Interfejs u(cid:276)ytkownika aplikacji (cid:276)yroskopu, któr(cid:241) utworzymy w tym rozdziale (patrz rysunek 2.2), jest bardzo podobny do aplikacji przy(cid:264)pieszeniomierza omówionej w poprzednim rozdziale. Kod (cid:274)ród(cid:228)owy aplikacji równie(cid:276) jest bardzo podobny do aplikacji omówionej w poprzednim rozdziale. Oczywi(cid:264)cie mi(cid:246)dzy wspomnianymi aplikacjami wyst(cid:246)puj(cid:241) pewne ró(cid:276)nice, ale two- rzonego tutaj programu nie b(cid:246)dziemy omawia(cid:232) wiersz po wierszu. Zamiast tego przyjrzymy si(cid:246) dziel(cid:241)cym je ró(cid:276)nicom. Pierwsza i najbardziej oczywista zmiana dotyczy czujnika, z którego b(cid:246)d(cid:241) pobierane warto- (cid:264)ci. W programie nie pobieramy warto(cid:264)ci z czujnika przy(cid:264)pieszeniomierza: PRINT Sensors.accel 34 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę Rysunek 2.2. Uruchomiona aplikacja Gyroscope ale z czujnika (cid:276)yroskopu, korzystaj(cid:241)c z bardzo podobnego polecenia: PRINT Sensors.gyro W programie s(cid:241) jeszcze inne subtelne zmiany. Czy wiesz, (cid:276)e (cid:276)yroskop jest dost(cid:246)pny tylko w niektórych modelach smartfona iPhone? Oznacza to, (cid:276)e bardzo wa(cid:276)ne jest sprawdzenie dost(cid:246)pno(cid:264)ci czujnika, zanim b(cid:246)dzie mo(cid:276)na przyst(cid:241)pi(cid:232) do odczytywania jego danych. Z tego po- wodu w dwóch miejscach programu wprowadzono odpowiednie zmiany. Pierwsza zmiana znajduje si(cid:246) ju(cid:276) na pocz(cid:241)tku programu, w kodzie konfiguracyjnym odpowiedzialnym za pobra- nie warto(cid:264)ci pocz(cid:241)tkowej czasu: ! Pobranie i ustawienie warto(cid:286)ci pocz(cid:261)tkowej czasu dla (cid:298)yroskopu. DIM t0 AS DOUBLE IF Sensors.gyroAvailable THEN WHILE t0 = 0 r = Sensors.gyro t0 = r(4) WEND END IF Polecenie IF sprawdza dost(cid:246)pno(cid:264)(cid:232) (cid:276)yroskopu, zanim program spróbuje odczyta(cid:232) z niego dane. Kod zawiera tak(cid:276)e p(cid:246)tl(cid:246) WHILE, aby zagwarantowa(cid:232) pobranie niezerowej warto(cid:264)ci czasu. Powód jest prosty: zanim nie osi(cid:241)gnie pe(cid:228)nej gotowo(cid:264)ci do pracy, (cid:276)yroskop mo(cid:276)e zwróci(cid:232) warto(cid:264)(cid:232) zero. Druga zmiana zosta(cid:228)a wprowadzona na ko(cid:254)cu podprocedury setUpGUI: ! Upewnienie si(cid:266) o dost(cid:266)pno(cid:286)ci (cid:298)yroskopu. Je(cid:298)eli czujnik jest niedost(cid:266)pny, ! nale(cid:298)y wy(cid:286)wietli(cid:252) odpowiedni komunikat i zako(cid:276)czy(cid:252) dzia(cid:225)anie programu. IF NOT Sensors.gyroAvailable THEN msg$ = This device does not have a gyroscope. msg$ = msg$ The program will exit. button = Graphics.showAlert( No Gyro , msg$) STOP END IF (cid:347)yroskop (cid:95) 35 Kup książkęPoleć książkę Powy(cid:276)szy fragment kodu sprawdza, czy urz(cid:241)dzenie jest wyposa(cid:276)one w (cid:276)yroskop. W przy- padku jego braku nast(cid:246)puje wy(cid:264)wietlenie odpowiedniego komunikatu i zako(cid:254)czenie dzia(cid:228)a- nia programu. Inna drobna zmiana zosta(cid:228)a wprowadzona na pocz(cid:241)tku podprocedury setUpGUI. Polecenie ustawiaj(cid:241)ce cz(cid:246)stotliwo(cid:264)(cid:232) pobierania danych z czujnika musi by(cid:232) zmodyfikowane, aby zdefi- niowa(cid:232) cz(cid:246)stotliwo(cid:264)(cid:232) dla (cid:276)yroskopu, a nie przy(cid:264)pieszeniomierza. Poni(cid:276)ej przedstawiono no- wy fragment kodu: SUB setUpGUI ! Pobieranie warto(cid:286)ci z (cid:298)yroskopu co 0,05 sekundy. Sensors.setGyroRate(0.05) Po uruchomieniu programu mo(cid:276)esz zauwa(cid:276)y(cid:232), (cid:276)e wykres jest obs(cid:228)ugiwany w nieco odmien- ny sposób. W aplikacji odczytuj(cid:241)cej dane przy(cid:264)pieszeniomierza po narysowaniu wykresu do ko(cid:254)ca jego rysowanie ponownie zaczyna si(cid:246) od pocz(cid:241)tku. Z kolei aplikacja (cid:276)yroskopu nie- ustannie uaktualnia wykres, przesuwaj(cid:241)c istniej(cid:241)ce punkty w lew(cid:241) stron(cid:241) i umieszczaj(cid:241)c no- we po prawej stronie. Takie rozwi(cid:241)zanie wymaga wprowadzenia dwóch zmian w programie. Pierwsza to usuni(cid:246)cie zmiennej index, poniewa(cid:276) nie jest d(cid:228)u(cid:276)ej potrzebna. Druga zmiana do- tyczy podprocedury nullEvent, w której kod nale(cid:276)y zmieni(cid:232) z: ax(index, 2) = a(1) ay(index, 2) = a(2) az(index, 2) = a(3) index = index + 1 IF index 100 THEN index = 1 na nast(cid:246)puj(cid:241)cy: FOR i = 1 TO 99 rx(i, 2) = rx(i + 1, 2) ry(i, 2) = ry(i + 1, 2) rz(i, 2) = rz(i + 1, 2) NEXT rx(100, 2) = r(1) ry(100, 2) = r(2) rz(100, 2) = r(3) Mo(cid:276)esz zadawa(cid:232) sobie pytanie, czy skopiowanie 297 warto(cid:264)ci z jednego miejsca w tablicy do innego nie zabiera wi(cid:246)kszej ilo(cid:264)ci czasu ni(cid:276) po prostu uaktualnienie jednej warto(cid:264)ci i przej- (cid:264)cie dalej. Masz racj(cid:246), to wymaga wi(cid:246)cej czasu, ale dla nowoczesnego procesora tego rodzaju zmiana naprawd(cid:246) nie powoduje widocznego pogorszenia wydajno(cid:264)ci dzia(cid:228)ania programu. Operacja kopiowania warto(cid:264)ci tablicy jest przeprowadzana bardzo szybko. Najwi(cid:246)kszy spa- dek wydajno(cid:264)ci jest zwi(cid:241)zany z uaktualnianiem zawarto(cid:264)ci wy(cid:264)wietlanej na ekranie. To nie- w(cid:241)tpliwie nale(cid:276)y wzi(cid:241)(cid:232) pod uwag(cid:246), ale po uruchomieniu programu przekonasz si(cid:246), (cid:276)e spa- dek wydajno(cid:264)ci jest niezauwa(cid:276)alny. Wiele opcji W aplikacjach przy(cid:264)pieszeniomierza i (cid:276)yroskopu uaktualnienia wykresu s(cid:241) obs(cid:228)ugiwane na odmienne sposoby. Który z nich uwa(cid:276)asz za lepszy? Je(cid:276)eli preferujesz jeden z nich, wtedy bardzo (cid:228)atwo mo(cid:276)esz zmodyfikowa(cid:232) program i otrzyma(cid:232) (cid:276)(cid:241)dany sposób uaktualniania wykresu. Poniewa(cid:276) po prawej stronie wykresu program wy(cid:264)wietla warto(cid:264)(cid:232) w aktualnej sekundzie, a nast(cid:246)pnie w lew(cid:241) stron(cid:246) umieszczane s(cid:241) dane z poprzednich dziesi(cid:246)ciu sekund, zakres dla osi X zosta(cid:228) zmieniony z od 0 do 10 na od –10 do 0. Konieczne jest wi(cid:246)c wprowadzenie 36 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę dwóch zmian w podprocedurze setUpGUI. Pierwsza zmiana dotyczy kodu odpowiedzialnego za pocz(cid:241)tkowe przypisywanie warto(cid:264)ci x w tablicach wykresu: ! Inicjalizacja tablic u(cid:298)ywanych przez wykres. FOR t = 1 TO 100 rx(t, 1) = t/10.0 - 10 ry(t, 1) = t/10.0 - 10 rz(t, 1) = t/10.0 - 10 NEXT Druga zmiana dotyczy widocznego zakresu wykresu po jego inicjalizacji. Zamiast wy(cid:264)wietla(cid:232) warto(cid:264)ci od 0 do 10 dla osi X, program wy(cid:264)wietla warto(cid:264)ci od –10 do 0. ! Ustawienie zakresu wykresu i domeny. To trzeba zrobi(cid:252) ! po dodaniu pierwszego obiektu PlotPoint, poniewa(cid:298) ten krok ! równie(cid:298) powoduje ustawienie zakresu i domeny. p.setView(-10, -10, 0, 10, 0) Je(cid:276)eli porównujesz kod (cid:274)ród(cid:228)owy aplikacji Accelerometer i Gyroscope, to prawdopodobnie zauwa(cid:276)y(cid:228)e(cid:264), (cid:276)e zmiany s(cid:241) czysto kosmetyczne. Dotycz(cid:241) nazw zmiennych, komentarzy i etykiet, co ma na celu odwo(cid:228)ywanie si(cid:246) do (cid:276)yroskopu, a nie przy(cid:264)pieszeniomierza. Poni(cid:276)ej przedstawiono pe(cid:228)ny kod (cid:274)ród(cid:228)owy aplikacji odczytuj(cid:241)cej dane z (cid:276)yroskopu. Ten pro- gram o nazwie Gyroscope znajdziesz równie(cid:276) w katalogu O’Reilly Books w aplikacjach techBASIC i techBASIC Sampler: ! Program wy(cid:286)wietla wykresy warto(cid:286)ci pobranych z (cid:298)yroskopu w ci(cid:261)gu ! ostatnich 10 sekund w odst(cid:266)pach co 0,1 sekundy. Program oferuje funkcj(cid:266) rejestracji ! pobieranych warto(cid:286)ci i wys(cid:225)ania wyników za pomoc(cid:261) poczty elektronicznej. ! Utworzenie wykresów i tablic przechowuj(cid:261)cych punkty wykresów. DIM p as Plot, px as PlotPoint, py as PlotPoint, pz as PlotPoint DIM rx(100, 2), ry(100, 2), rz(100, 2) ! Utworzenie kontrolek. DIM quit AS Button, record AS Button, send AS Button ! Utworzenie i inicjalizacja zmiennych globalnych u(cid:298)ywanych do (cid:286)ledzenia przebiegu dzia(cid:225)ania programu. fileName$ = tempdata.txt recording = 0 ! Pobranie i ustawienie warto(cid:286)ci pocz(cid:261)tkowej czasu dla (cid:298)yroskopu. DIM t0 AS DOUBLE IF Sensors.gyroAvailable THEN WHILE t0 = 0 r = Sensors.gyro t0 = r(4) WEND END IF ! Utworzenie interfejsu u(cid:298)ytkownika. setUpGUI ! Utworzenie nowego przycisku i wype(cid:225)nienie go gradientem. ! ! Parametry: ! x - po(cid:225)o(cid:298)enie poziome. ! y - po(cid:225)o(cid:298)enie pionowe. ! title - tekst wy(cid:286)wietlany przez przycisk. ! ! Warto(cid:286)(cid:252) zwrotna: nowy przycisk. FUNCTION newButton (x, y, title AS STRING) AS Button DIM b AS Button (cid:347)yroskop (cid:95) 37 Kup książkęPoleć książkę b = Graphics.newButton(x, y) b.setTitle(title) b.setBackgroundColor(1, 1, 1) b.setGradientColor(0.6, 0.6, 0.6) newButton = b END FUNCTION ! Ta podprocedura jest wywo(cid:225)ywana, gdy nic innego si(cid:266) nie dzieje. ! Sprawdza, czy od ostatniego odczytania warto(cid:286)ci (cid:298)yroskopu ! up(cid:225)yn(cid:266)(cid:225)o ju(cid:298) co najmniej 0,1 sekundy. Je(cid:286)li tak, nast(cid:266)puje wówczas ! pobranie i wy(cid:286)wietlenie nowych danych. ! ! Parametry: ! time - godzina wyst(cid:261)pienia zdarzenia. SUB nullEvent (time AS DOUBLE) r = Sensors.gyro IF recording AND (t0 r(4)) THEN PRINT #1, r(1); , ; r(2); , ; r(3); , ; r(4) END IF IF r(4) t0 + 0.1 THEN WHILE r(4) t0 + 0.1 t0 = t0 + 0.1 FOR i = 1 TO 99 rx(i, 2) = rx(i + 1, 2) ry(i, 2) = ry(i + 1, 2) rz(i, 2) = rz(i + 1, 2) NEXT rx(100, 2) = r(1) ry(100, 2) = r(2) rz(100, 2) = r(3) WEND px.setPoints(rx) py.setPoints(ry) pz.setPoints(rz) END IF END SUB ! Ostatnio zarejestrowane dane b(cid:266)d(cid:261) wys(cid:225)ane za pomoc(cid:261) wiadomo(cid:286)ci e-mail. SUB sendData DIM e AS eMail e = System.newEMail IF e.canSendMail THEN e.setSubject( Gyroscope data ) e.setMessage( Gyroscope data ) e.addAttachment(fileName$, text/plain ) e.send ELSE button = Graphics.showAlert( Can t Send , _ Email cannot be sent from this device. ) END IF END SUB ! Konfiguracja interfejsu u(cid:298)ytkownika. SUB setUpGUI ! Pobieranie warto(cid:286)ci z (cid:298)yroskopu co 0,05 sekundy. Sensors.setGyroRate(0.05) ! Inicjalizacja tablic u(cid:298)ywanych przez wykres. FOR t = 1 TO 100 rx(t, 1) = t/10.0 - 10 38 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę ry(t, 1) = t/10.0 - 10 rz(t, 1) = t/10.0 - 10 NEXT ! Inicjalizacja wykresu i jego wy(cid:286)wietlenie. p = Graphics.newPlot p.setTitle( Rotation in Radians per Second ) p.setXAxisLabel( Time in Seconds ) p.setYAxisLabel( Rotation: X: Green, Y: Red, Z: Blue ) p.showGrid(1) p.setGridColor(0.8, 0.8, 0.8) p.setAllowedGestures($0042) px = p.newPlot(rx) px.setColor(0, 1, 0) px.setPointColor(0, 1, 0) py = p.newPlot(ry) py.setColor(1, 0, 0) py.setPointColor(1, 0, 0) pz = p.newPlot(rz) pz.setColor(0, 0, 1) pz.setPointColor(0, 0, 1) ! Ustawienie zakresu wykresu i domeny. To trzeba zrobi(cid:252) ! po dodaniu pierwszego obiektu PlotPoint, poniewa(cid:298) ten krok ! równie(cid:298) powoduje ustawienie zakresu i domeny. p.setView(-10, -10, 0, 10, 0) ! Wy(cid:286)wietlenie widoku przedstawiaj(cid:261)cego wykresy. Przekazanie warto(cid:286)ci 1 ! dla parametru powoduje przej(cid:286)cie do trybu pe(cid:225)nego ekranu. system.showGraphics(1) ! Zablokowanie ekranu w jego bie(cid:298)(cid:261)cej orientacji. orientation = 1 (System.orientation - 1) System.setAllowedOrientations(orientation) ! Okre(cid:286)lenie wymiarów wykresu. p.setRect(0, 0, Graphics.width, Graphics.height - 47) ! Wy(cid:286)wietlenie t(cid:225)a. Graphics.setPixelGraphics(0) Graphics.setColor(0.886, 0.886, 0.886) Graphics.fillRect(0, 0, Graphics.width, Graphics.height) ! Konfiguracja interfejsu u(cid:298)ytkownika. h = Graphics.height - 47 quit = newButton(Graphics.width - 82, h, Quit ) record = newButton(Graphics.width - 174, h, Record ) send = newButton(Graphics.width - 266, h, Send ) ! Je(cid:298)eli nie ma (cid:298)adnych danych do wys(cid:225)ania, wtedy nale(cid:298)y wy(cid:225)(cid:261)czy(cid:252) przycisk Send. IF NOT EXISTS(fileName$) THEN send.setEnabled(0) END IF ! Upewnienie si(cid:266) o dost(cid:266)pno(cid:286)ci (cid:298)yroskopu. Je(cid:298)eli czujnik jest niedost(cid:266)pny, ! nale(cid:298)y wy(cid:286)wietli(cid:252) odpowiedni komunikat i zako(cid:276)czy(cid:252) dzia(cid:225)anie programu. IF NOT Sensors.gyroAvailable THEN msg$ = This device does not have a gyroscope. msg$ = msg$ The program will exit. (cid:347)yroskop (cid:95) 39 Kup książkęPoleć książkę button = Graphics.showAlert( No Gyro , msg$) STOP END IF END SUB ! Podprocedura wywo(cid:225)ywana, gdy program powinien rozpocz(cid:261)(cid:252) ! rejestracj(cid:266) danych. Ta podprocedura zmienia nazw(cid:266) przycisku ! na Stop, otwiera plik danych wyj(cid:286)ciowych, a nast(cid:266)pnie ustawia ! flag(cid:266) wskazuj(cid:261)c(cid:261) na konieczno(cid:286)(cid:252) rejestracji danych pobieranych ! z (cid:298)yroskopu. SUB startRecording record.setTitle( Stop ) recording = 1 OPEN fileName$ FOR OUTPUT AS #1 END SUB ! Podprocedura wywo(cid:225)ywana, gdy program powinien zako(cid:276)czy(cid:252) ! rejestracj(cid:266) danych. Ta podprocedura zmienia nazw(cid:266) przycisku ! na Record, zeruje warto(cid:286)(cid:252) zmiennej recording, a nast(cid:266)pnie zamyka ! plik danych wyj(cid:286)ciowych. ! ! T(cid:266) podprocedur(cid:266) mo(cid:298)na bezpiecznie wywo(cid:225)a(cid:252), nawet ! je(cid:286)li nie zosta(cid:225)y zarejestrowane (cid:298)adne dane. SUB stopRecording IF recording THEN record.setTitle( Record ) CLOSE #1 recording = 0 send.setEnabled(1) END IF END SUB ! Obs(cid:225)uga naci(cid:286)ni(cid:266)cia dowolnego przycisku. ! ! Parametry: ! ctrl - przycisk, który zosta(cid:225) naci(cid:286)ni(cid:266)ty. ! time - godzina, o której wyst(cid:261)pi(cid:225)o zdarzenie. SUB touchUpInside (ctrl AS Button, time AS DOUBLE) IF ctrl = quit THEN stopRecording STOP ELSE IF ctrl = record THEN IF recording THEN stopRecording ELSE startRecording END IF ELSE IF ctrl = send THEN stopRecording sendData END IF END SUB Radiany czy stopnie? Osoby zajmuj(cid:241)ce si(cid:246) fizyk(cid:241), in(cid:276)ynierowie i matematycy bardzo cz(cid:246)sto pos(cid:228)uguj(cid:241) si(cid:246) radiana- mi i nie maj(cid:241) (cid:276)adnych problemów w u(cid:276)ywaniu naturalnej jednostki obrotu, jak(cid:241) w przypad- ku (cid:276)yroskopu s(cid:241) radiany na sekund(cid:246). Je(cid:264)li jednak Twoj(cid:241) reakcj(cid:241) jest „radi-co?”, to (cid:264)piesz(cid:246) wyja(cid:264)ni(cid:232), (cid:276)e bardzo (cid:228)atwo mo(cid:276)na zmodyfikowa(cid:232) program, aby warto(cid:264)ci obrotu by(cid:228)y wyra(cid:276)a- ne w stopniach na sekund(cid:246) zamiast w radianach na sekund(cid:246). Warto(cid:264)(cid:232) odczytan(cid:241) z czujnika 40 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę wystarczy pomno(cid:276)y(cid:232) przez 180/(cid:652), co spowoduje jej konwersj(cid:246) z radianów na stopnie. W j(cid:246)- zyku techBASIC znajduje si(cid:246) nawet u(cid:276)yteczna funkcja o nazwie DEG przeznaczona do wspo- mnianej konwersji. Najlepszym rozwi(cid:241)zaniem jest przeprowadzenie konwersji tu(cid:276) po od- czytaniu warto(cid:264)ci z czujnika. W podprocedurze nullEvent umie(cid:264)(cid:232) wi(cid:246)c p(cid:246)tl(cid:246) FOR: SUB nullEvent (time AS DOUBLE) r = Sensors.gyro FOR i = 1 TO 3 r(i) = DEG(r(i)) NEXT Oczywi(cid:264)cie zmianie ulegnie tak(cid:276)e zakres warto(cid:264)ci. W podprocedurze setUpGUI wprowad(cid:274) poni(cid:276)sz(cid:241) zmian(cid:246) oznaczaj(cid:241)c(cid:241) u(cid:276)ycie warto(cid:264)ci z zakresu ±500: ! Ustawienie zakresu wykresu i domeny. To trzeba zrobi(cid:252) ! po dodaniu pierwszego obiektu PlotPoint, poniewa(cid:298) ten krok ! równie(cid:298) powoduje ustawienie zakresu i domeny. p.setView(-10, -500, 0, 500, 0) Tytu(cid:228) wykresu równie(cid:276) nale(cid:276)y zmieni(cid:232), aby wskazywa(cid:228) u(cid:276)ycie nowych jednostek pomiaru. Odpowiedni wiersz tak(cid:276)e znajduje si(cid:246) w podprocedurze setUpGUI: ! Inicjalizacja wykresu i jego wy(cid:286)wietlenie. p = Graphics.newPlot p.setTitle( Rotation in Degrees per Second ) Magnetometr Pocz(cid:241)wszy od modelu iPhone 3GS, wszystkie smartfony iPhone s(cid:241) wyposa(cid:276)one w magneto- metr trójosiowy. Wymieniony czujnik jest wykorzystywany przede wszystkim jako kompas cyfrowy w aplikacjach opartych na mapach, cho(cid:232) potrafi zmierzy(cid:232) tak(cid:276)e pole magnetyczne obecne w pobli(cid:276)u urz(cid:241)dzenia. T(cid:246) drug(cid:241) mo(cid:276)liwo(cid:264)(cid:232) wykorzystamy w rozdziale 3. do zbudo- wania prostego wykrywacza metalu. Natomiast w tym rozdziale utworzymy bardzo prost(cid:241) aplikacj(cid:246) pokazan(cid:241) na rysunku 2.3. Magnetometru mo(cid:276)na u(cid:276)y(cid:232) równie(cid:276) do wyszukania przewo- dów oraz innych (cid:274)róde(cid:228) pr(cid:241)du lub po prostu mo(cid:276)na pobawi(cid:232) si(cid:246) za pomoc(cid:241) urz(cid:241)dzenia iOS i magnesów przyczepianych do lodówki. Oprogramowanie pobieraj(cid:241)ce dane z magnetometru jest niemal(cid:276)e takie samo jak pobieraj(cid:241)ce warto(cid:264)ci z (cid:276)yroskopu. Jak si(cid:246) domy(cid:264)lasz, mi(cid:246)dzy nimi istniej(cid:241) pewne oczywiste ró(cid:276)nice, na przyk(cid:228)ad odczyt danych z zupe(cid:228)nie innego czujnika, ale sama zasada dzia(cid:228)ania jest podobna jak w przypadku programów odczytuj(cid:241)cych warto(cid:264)ci z przy(cid:264)pieszeniomierza i (cid:276)yroskopu. W tabeli 2.1 wymieniono odpowiadaj(cid:241)ce sobie polecenia w poszczególnych programach. Poza tym istnieje jeszcze wiele innych oczywistych zmian kosmetycznych, takich jak dostosowa- nie nazw zmiennych, komentarzy i ci(cid:241)gów tekstowych, tak aby dotyczy(cid:228)y magnetometru. Jedyna wi(cid:246)ksza zmiana jest zwi(cid:241)zana z ogromnymi wahaniami si(cid:228)y oddzia(cid:228)ywania pól magne- tycznych. Warto(cid:264)ci maksymalne odczytywane z przy(cid:264)pieszeniomierza si(cid:246)gaj(cid:241) ±2G we wszyst- kich urz(cid:241)dzeniach iOS poza iPhone’em 5, w którym maksymalny zakres wynosi ±8G. Zdefinio- wanie skali pionowej jako ±2G sprawdza si(cid:246) doskonale. W przypadku (cid:276)yroskopu odczytywane warto(cid:264)ci rzadko b(cid:246)d(cid:241) przekracza(cid:232) 10 radianów na sekund(cid:246), a tym samym zakres ±10 dla osi Y w aplikacji Gyroscope sprawdza si(cid:246) doskonale. Jednak magnetometr jest bardzo czu(cid:228)y i mo(cid:276)e zmierzy(cid:232) si(cid:228)(cid:246) oddzia(cid:228)ywania ziemskiego pola magnetycznego. Si(cid:228)a wspomnianego pola magne- tycznego nie jest sta(cid:228)a i ogólnie zawiera si(cid:246) w przedziale od 30 do 60 mikrotesli (30–60 (cid:147)T). Magnetometr (cid:95) 41 Kup książkęPoleć książkę Rysunek 2.3. Uruchomiona aplikacja Magnetometer Tabela 2.1. Odpowiadaj(cid:241)ce sobie polecenia w poszczególnych programach Accelerometer Sensors.accel Sensors.accelAvailable Sensors.setAccelRate Gyroscope Sensors.gyro Sensors.gyroAvailable Sensors.setGyroRate Magnetometer Sensors.mag Sensors.magAvailable Sensors.setMagRate Czujnik mo(cid:276)e wykry(cid:232) znacznie silniejsze pola magnetyczne, maksymalnie do 1T, czyli 1000000 (cid:147)T. Obs(cid:228)uga warto(cid:264)ci w takim zakresie jest sporym wyzwaniem. Poni(cid:276)ej przedsta- wiono uaktualnion(cid:241) wersj(cid:246) podprocedury nullEvent, która potrafi obs(cid:228)u(cid:276)y(cid:232) tak du(cid:276)y zakres warto(cid:264)ci: ! Ta podprocedura jest wywo(cid:225)ywana, gdy nic innego si(cid:266) nie dzieje. ! Sprawdza, czy od ostatniego odczytania warto(cid:286)ci magnetometru ! up(cid:225)yn(cid:266)(cid:225)o ju(cid:298) co najmniej 0,1 sekundy. Je(cid:286)li tak, nast(cid:266)puje wówczas ! pobranie i wy(cid:286)wietlenie nowych danych. ! ! Parametry: ! time - godzina wyst(cid:261)pienia zdarzenia. SUB nullEvent (time AS DOUBLE) ! Pobranie nowych warto(cid:286)ci. m = Sensors.mag ! Je(cid:298)eli zachodzi potrzeba, warto(cid:286)(cid:252) zostaje zapisana w pliku danych wyj(cid:286)ciowych. IF recording AND (t0 m(4)) THEN PRINT #1, m(1); , ; m(2); , ; m(3); , ; m(4) END IF ! Uaktualnienie wykresu. IF m(4) t0 + 0.1 THEN ! Uaktualnienie tablic przechowuj(cid:261)cych punkty tworz(cid:261)ce wykres. WHILE m(4) t0 + 0.1 42 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę t0 = t0 + 0.1 FOR i = 1 TO 99 mx(i, 2) = mx(i + 1, 2) my(i, 2) = my(i + 1, 2) mz(i, 2) = mz(i + 1, 2) NEXT mx(100, 2) = m(1) my(100, 2) = m(2) mz(100, 2) = m(3) WEND ! Dostosowanie zakresu funkcji na podstawie maksymalnej zarejestrowanej warto(cid:286)ci. max = 0 FOR i = 1 TO 100 IF ABS(mx(i, 2)) max THEN max = ABS(mx(i, 2)) IF ABS(my(i, 2)) max THEN max = ABS(my(i, 2)) IF ABS(mz(i, 2)) max THEN max = ABS(mz(i, 2)) NEXT range = 10^(INT(LOG(max)/LOG(10)) + 1) p.setView(-10, -range, 0, range, 0) ! Uaktualnienie wykresów. px.setPoints(mx) py.setPoints(my) pz.setPoints(mz) END IF END SUB Zmiana znajduje si(cid:246) na ko(cid:254)cu podprocedury, gdzie nast(cid:246)puje dynamiczne dostosowanie zakresu. Program analizuje warto(cid:264)ci, wyszukuj(cid:241)c najwi(cid:246)ksz(cid:241). Nast(cid:246)pnie wykorzystuje pewn(cid:241) sztuczk(cid:246) matematyczn(cid:241), to znaczy na podstawie liczby ca(cid:228)kowitej z logarytmu dziesi(cid:246)tnego dla naj- wi(cid:246)kszej warto(cid:264)ci oblicza prawid(cid:228)ow(cid:241) pot(cid:246)g(cid:246) dla zakresu pionowego. Przekonajmy si(cid:246), jak takie rozwi(cid:241)zanie dzia(cid:228)a. Zaczynamy od warto(cid:264)ci odpowiadaj(cid:241)cej sile oddzia(cid:228)ywania ziemskiego pola magnetycznego, czyli 50 (cid:147)T. W takim przypadku wynik dzia(cid:228)ania LOG(50)/LOG(10) wynosi nieco poni(cid:276)ej 1,7. Wyodr(cid:246)bniamy z niego liczb(cid:246) ca(cid:228)kowit(cid:241) i dodajemy jeden, otrzymuj(cid:241)c tym samym warto(cid:264)(cid:232) 2 — to jest liczba zer, które musz(cid:241) si(cid:246) znale(cid:274)(cid:232) w zakresie. Podnosimy liczb(cid:246) 10 do obliczonej po- t(cid:246)gi (2) i otrzymujemy zakres ±100, doskonale sprawdzaj(cid:241)cy si(cid:246) podczas wy(cid:264)wietlania warto(cid:264)ci od 10 do 100. Wypróbuj kilka innych liczb, a przekonasz si(cid:246), (cid:276)e zastosowany przez nas wzór zawsze zwraca w wyniku 100 dla zakresu, gdy max wynosi wi(cid:246)cej ni(cid:276) 10, ale mniej ni(cid:276) 100. W pobli(cid:276)u urz(cid:241)dzenia iPhone lub iPad umie(cid:264)(cid:232) (cid:274)ród(cid:228)o wzgl(cid:246)dnie silnego pola magnetyczne- go, a si(cid:228)a takiego pola wzro(cid:264)nie do kilkuset (cid:147)T. Spróbuj ponownie wykona(cid:232) dzia(cid:228)ania mate- matyczne, a przekonasz si(cid:246), (cid:276)e dla warto(cid:264)ci max od 100 do 1000 zakresem b(cid:246)dzie ±1000. To niesamowity widok, gdy aplikacja automatycznie dostosowuje pionowy zakres wykresu w odpowiedzi na zmian(cid:246) si(cid:228)y pola magnetycznego. Z tym wi(cid:241)(cid:276)e si(cid:246) jednak pewna wada zasto- sowanego rozwi(cid:241)zania: r(cid:246)czne dostosowanie zakresu nie jest mo(cid:276)liwe. Wprawdzie mo(cid:276)na to zrobi(cid:232), ale program automatycznie dostosuje zakres po pobraniu nast(cid:246)pnej warto(cid:264)ci z czujni- ka. Je(cid:264)li takie rozwi(cid:241)zanie Ci nie odpowiada, to usu(cid:254) kod, który automatycznie ustala zakres. Poni(cid:276)ej przedstawiono pe(cid:228)ny kod (cid:274)ród(cid:228)owy aplikacji odczytuj(cid:241)cej dane z magnetometru. Ten program o nazwie Magnetometer znajdziesz równie(cid:276) w katalogu O’Reilly Books w aplikacjach techBASIC i techBASIC Sampler: Magnetometr (cid:95) 43 Kup książkęPoleć książkę ! Program wy(cid:286)wietla wykresy warto(cid:286)ci pobranych z magnetometru w ci(cid:261)gu ! ostatnich 10 sekund w odst(cid:266)pach co 0,1 sekundy. Program oferuje funkcj(cid:266) rejestracji ! pobieranych warto(cid:286)ci i wys(cid:225)ania wyników za pomoc(cid:261) poczty elektronicznej. ! Utworzenie wykresów i tablic przechowuj(cid:261)cych punkty wykresów. DIM p as Plot, px as PlotPoint, py as PlotPoint, pz as PlotPoint DIM mx(100, 2), my(100, 2), mz(100, 2) ! Utworzenie kontrolek. DIM quit AS Button, record AS Button, send AS Button ! Utworzenie i inicjalizacja zmiennych globalnych u(cid:298)ywanych do (cid:286)ledzenia przebiegu dzia(cid:225)ania programu. fileName$ = tempdata.txt recording = 0 ! Pobranie i ustawienie warto(cid:286)ci pocz(cid:261)tkowej czasu dla magnetometru. DIM t0 AS DOUBLE IF Sensors.magAvailable THEN WHILE t0 = 0 m = Sensors.mag t0 = m(4) WEND END IF ! Utworzenie interfejsu u(cid:298)ytkownika. setUpGUI ! Utworzenie nowego przycisku i wype(cid:225)nienie go gradientem. ! ! Parametry: ! x - po(cid:225)o(cid:298)enie poziome. ! y - po(cid:225)o(cid:298)enie pionowe. ! title - tekst wy(cid:286)wietlany przez przycisk. ! ! Warto(cid:286)(cid:252) zwrotna: nowy przycisk. FUNCTION newButton (x, y, title AS STRING) AS Button DIM b AS Button b = Graphics.newButton(x, y) b.setTitle(title) b.setBackgroundColor(1, 1, 1) b.setGradientColor(0.6, 0.6, 0.6) newButton = b END FUNCTION ! Ta podprocedura jest wywo(cid:225)ywana, gdy nic innego si(cid:266) nie dzieje. ! Sprawdza, czy od ostatniego odczytania warto(cid:286)ci magnetometru ! up(cid:225)yn(cid:266)(cid:225)o ju(cid:298) co najmniej 0,1 sekundy. Je(cid:286)li tak, nast(cid:266)puje wówczas ! pobranie i wy(cid:286)wietlenie nowych danych. ! ! Parametry: ! time - godzina wyst(cid:261)pienia zdarzenia. SUB nullEvent (time AS DOUBLE) ! Pobranie nowych warto(cid:286)ci. m = Sensors.mag ! Je(cid:298)eli zachodzi potrzeba, warto(cid:286)(cid:252) zostaje zapisana w pliku danych wyj(cid:286)ciowych. IF recording AND (t0 m(4)) THEN PRINT #1, m(1); , ; m(2); , ; m(3); , ; m(4) END IF ! Uaktualnienie wykresu. IF m(4) t0 + 0.1 THEN ! Uaktualnienie tablic przechowuj(cid:261)cych punkty tworz(cid:261)ce wykres. 44 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę WHILE m(4) t0 + 0.1 t0 = t0 + 0.1 FOR i = 1 TO 99 mx(i, 2) = mx(i + 1, 2) my(i, 2) = my(i + 1, 2) mz(i, 2) = mz(i + 1, 2) NEXT mx(100, 2) = m(1) my(100, 2) = m(2) mz(100, 2) = m(3) WEND ! Dostosowanie zakresu funkcji na podstawie maksymalnej zarejestrowanej warto(cid:286)ci. max = 0 FOR i = 1 TO 100 IF ABS(mx(i, 2)) max THEN max = ABS(mx(i, 2)) IF ABS(my(i, 2)) max THEN max = ABS(my(i, 2)) IF ABS(mz(i, 2)) max THEN max = ABS(mz(i, 2)) NEXT range = 10^(INT(LOG(max)/LOG(10)) + 1) p.setView(-10, -range, 0, range, 0) ! Uaktualnienie wykresów. px.setPoints(mx) py.setPoints(my) pz.setPoints(mz) END IF END SUB ! Ostatnio zarejestrowane dane b(cid:266)d(cid:261) wys(cid:225)ane za pomoc(cid:261) wiadomo(cid:286)ci e-mail. SUB sendData DIM e AS eMail e = System.newEMail IF e.canSendMail THEN e.setSubject( Magnetometer data ) e.setMessage( Magnetometer data ) e.addAttachment(fileName$, text/plain ) e.send ELSE button = Graphics.showAlert( Can t Send , _ Email cannot be sent from this device. ) END IF END SUB ! Konfiguracja interfejsu u(cid:298)ytkownika. SUB setUpGUI ! Pobieranie warto(cid:286)ci z magnetometru co 0,05 sekundy. Sensors.setMagRate(0.05) ! Inicjalizacja tablic u(cid:298)ywanych przez wykres. FOR t = 1 TO 100 mx(t, 1) = t/10.0 - 10 my(t, 1) = t/10.0 - 10 mz(t, 1) = t/10.0 - 10 NEXT ! Inicjalizacja wykresu i jego wy(cid:286)wietlenie. p = Graphics.newPlot p.setTitle( Magnetic Field in Micro Teslas ) p.setXAxisLabel( Time in Seconds ) p.setYAxisLabel( Field: X: Green, Y: Red, Z: Blue ) p.showGrid(1) Magnetometr (cid:95) 45 Kup książkęPoleć książkę p.setGridColor(0.8, 0.8, 0.8) p.setAllowedGestures($0042) px = p.newPlot(mx) px.setColor(0, 1, 0) px.setPointColor(0, 1, 0) py = p.newPlot(my) py.setColor(1, 0, 0) py.setPointColor(1, 0, 0) pz = p.newPlot(mz) pz.setColor(0, 0, 1) pz.setPointColor(0, 0, 1) ! Ustawienie zakresu wykresu i domeny. To trzeba zrobi(cid:252) ! po dodaniu pierwszego obiektu PlotPoint, poniewa(cid:298) ten krok ! równie(cid:298) powoduje ustawienie zakresu i domeny. p.setView(-10, -10, 0, 10, 0) ! Wy(cid:286)wietlenie widoku przedstawiaj(cid:261)cego wykresy. Przekazanie warto(cid:286)ci 1 ! dla parametru powoduje przej(cid:286)cie do trybu pe(cid:225)nego ekranu. system.showGraphics(1) ! Zablokowanie ekranu w jego bie(cid:298)(cid:261)cej orientacji. orientation = 1 (System.orientation - 1) System.setAllowedOrientations(orientation) ! Okre(cid:286)lenie wymiarów wykresu. p.setRect(0, 0, Graphics.width, Graphics.height - 47) ! Wy(cid:286)wietlenie t(cid:225)a. Graphics.setPixelGraphics(0) Graphics.setColor(0.886, 0.886, 0.886) Graphics.fillRect(0, 0, Graphics.width, Graphics.height) ! Konfiguracja interfejsu u(cid:298)ytkownika. h = Graphics.height - 47 quit = newButton(Graphics.width - 82, h, Quit ) record = newButton(Graphics.width - 174, h, Record ) send = newButton(Graphics.width - 266, h, Send ) ! Je(cid:298)eli nie ma (cid:298)adnych danych do wys(cid:225)ania, wtedy nale(cid:298)y wy(cid:225)(cid:261)czy(cid:252) przycisk Send. IF NOT EXISTS(fileName$) THEN send.setEnabled(0) END IF ! Upewnienie si(cid:266) o dost(cid:266)pno(cid:286)ci magnetometru. Je(cid:298)eli czujnik jest niedost(cid:266)pny, ! nale(cid:298)y wy(cid:286)wietli(cid:252) odpowiedni komunikat i zako(cid:276)czy(cid:252) dzia(cid:225)anie programu. IF NOT Sensors.magAvailable THEN msg$ = This device does not have a magnetometer. msg$ = msg$ The program will exit. button = Graphics.showAlert( No Magnetometer , msg$) STOP END IF END SUB ! Podprocedura wywo(cid:225)ywana, gdy program powinien rozpocz(cid:261)(cid:252) ! rejestracj(cid:266) danych. Ta podprocedura zmienia nazw(cid:266) przycisku ! na Stop, otwiera plik danych wyj(cid:286)ciowych, a nast(cid:266)pnie ustawia ! flag(cid:266) wskazuj(cid:261)c(cid:261) na konieczno(cid:286)(cid:252) rejestracji danych pobieranych ! z magnetometru. SUB startRecording 46 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę record.setTitle( Stop ) recording = 1 OPEN fileName$ FOR OUTPUT AS #1 END SUB ! Podprocedura wywo(cid:225)ywana, gdy program powinien zako(cid:276)czy(cid:252) ! rejestracj(cid:266) danych. Ta podprocedura zmienia nazw(cid:266) przycisku ! na Record, zeruje warto(cid:286)(cid:252) zmiennej recording, a nast(cid:266)pnie zamyka ! plik danych wyj(cid:286)ciowych. ! ! T(cid:266) podprocedur(cid:266) mo(cid:298)na bezpiecznie wywo(cid:225)a(cid:252) nawet ! je(cid:286)li nie zosta(cid:225)y zarejestrowane jakiekolwiek dane. SUB stopRecording IF recording THEN record.setTitle( Record ) CLOSE #1 recording = 0 send.setEnabled(1) END IF END SUB ! Obs(cid:225)uga naci(cid:286)ni(cid:266)cia dowolnego przycisku. ! ! Parametry: ! ctrl - przycisk, który zosta(cid:225) naci(cid:286)ni(cid:266)ty. ! time - godzina, o której wyst(cid:261)pi(cid:225)o zdarzenie. SUB touchUpInside (ctrl AS Button, time AS DOUBLE) IF ctrl = quit THEN stopRecording STOP ELSE IF ctrl = record THEN IF recording THEN stopRecording ELSE startRecording END IF ELSE IF ctrl = send THEN stopRecording sendData END IF END SUB Uzyskanie szybszej odpowiedzi z czujnika Zaprezentowane dot(cid:241)d trzy programy pokazuj(cid:241), jak w zabawny i u(cid:276)yteczny sposób mo(cid:276)na pobra(cid:232) niezmodyfikowane warto(cid:264)ci z czujników przy(cid:264)pieszeniomierza, (cid:276)yroskopu i magne- tometru. Wspomniane programy maj(cid:241) jednak pewn(cid:241) wad(cid:246). Poniewa(cid:276) uaktualnienie (cid:264)rodo- wiska graficznego zabiera du(cid:276)(cid:241) ilo(cid:264)(cid:232) czasu, cz(cid:246)stotliwo(cid:264)(cid:232) pobierania warto(cid:264)ci z czujników jest do(cid:264)(cid:232) ograniczona. Wprawdzie istnieje mo(cid:276)liwo(cid:264)(cid:232) pozbycia si(cid:246) grafiki i jedynie odczyty- wania danych z czujników, ale takie rozwi(cid:241)zanie, cho(cid:232) niew(cid:241)tpliwie zapewnia lepsz(cid:241) wydaj- no(cid:264)(cid:232), równie(cid:276) mo(cid:276)e wi(cid:241)za(cid:232) si(cid:246) z utrat(cid:241) pewnych danych. J(cid:246)zyk techBASIC oferuje jeszcze inny sposób pobierania danych z czujników — wspomniane rozwi(cid:241)zanie pozwala na skrócenie czasu udzielania odpowiedzi przez czujniki. Pobieranie danych b(cid:246)dzie odbywa(cid:228)o si(cid:246) z mak- symaln(cid:241) szybko(cid:264)ci(cid:241) obs(cid:228)ugiwan(cid:241) przez iPhone, ale koszt takiego rozwi(cid:241)zania jest ogromny. Po wykonaniu zapytania program nie reaguje na dzia(cid:228)ania u(cid:276)ytkownika a(cid:276) do chwili zebrania wszystkich danych z czujnika. Przeanalizujmy tego rodzaju rozwi(cid:241)zanie i przy okazji prze- konajmy si(cid:246), jakie s(cid:241) inne (cid:274)ród(cid:228)a pozwalaj(cid:241)ce na jeszcze lepsze poznanie j(cid:246)zyka techBASIC. Uzyskanie szybszej odpowiedzi z czujnika (cid:95) 47 Kup książkęPoleć książkę techBASIC jest dostarczany wraz z wbudowanym systemem pomocy zawieraj(cid:241)cym informa- cje techniczne o ka(cid:276)dym poleceniu, funkcji i klasie. Je(cid:264)li korzystasz z iPada, to naci(cid:264)nij przy- cisk Source i spójrz na kod (cid:274)ród(cid:228)owy programu, a nast(cid:246)pnie naci(cid:264)nij przycisk Help znajduj(cid:241)cy si(cid:246) na pasku narz(cid:246)dziowym. Z kolei w iPhone’ie musisz przej(cid:264)(cid:232) do edycji programu, aby przycisk Help sta(cid:228) si(cid:246) widoczny. Po naci(cid:264)ni(cid:246)ciu przycisku Help na ekranie zostanie wy(cid:264)wie- tlona lista tematów pomocy pogrupowanych w odpowiednie kategorie (patrz rysunek 2.4). Rysunek 2.4. System pomocy wbudowany w aplikacj(cid:246) techBASIC Omówienie polece(cid:254) programu, na przyk(cid:228)ad polecenia PRINT u(cid:276)ytego w pierwszym programie przedstawionym w tej ksi(cid:241)(cid:276)ce, znajdziesz w kategorii Statements. Omówienie funkcji, na przyk(cid:228)ad DEG przeznaczonej do konwersji radianów na stopnie, znajdziesz w kategorii Functions. Z kolei wszystkie podprocedury wymieniono w kategorii Events, w której znajdziesz omówienie pod- procedur specjalnych, takich jak nullEvent i touchUpInside wywo(cid:228)ywanych przez techBASIC w programach opartych na zdarzeniach. W pozosta(cid:228)ych kategoriach pogrupowano predefi- niowane klasy. Chcemy bli(cid:276)ej pozna(cid:232) klas(cid:246) Sensors omówion(cid:241) w kategorii Sensor and Comm Classes pokazanej na rysunku 2.5. Naci(cid:264)nij t(cid:246) nazw(cid:246). Zobaczysz nazwy ró(cid:276)nych klas pozwalaj(cid:241)cych na uzyskanie do- st(cid:246)pu do czujników zarówno wewn(cid:246)trznych, jak i zewn(cid:246)trznych. Te klasy b(cid:246)dziemy intensywnie wykorzystywa(cid:232) w ksi(cid:241)(cid:276)ce, wi(cid:246)c warto zapozna(cid:232) si(cid:246) z po(cid:264)wi(cid:246)con(cid:241) im sekcj(cid:241) systemu pomocy. Ostatnia klasa wymieniona na li(cid:264)cie to Sensors, której u(cid:276)ywali(cid:264)my w przyk(cid:228)adach przedsta- wionych w tym rozdziale. Naci(cid:264)nij jej nazw(cid:246). Opisy poszczególnych klas rozpoczynaj(cid:241) si(cid:246) od ogólnego przedstawienia danej klasy (patrz rysunek 2.6). Zauwa(cid:276)ysz tak(cid:276)e kilka metod, któ- re powinny by(cid:232) Ci ju(cid:276) znane. My jednak szukamy nowej. Przewi(cid:254) list(cid:246) w dó(cid:228) i naci(cid:264)nij meto- d(cid:246) o nazwie sample. Na rysunku 2.7 pokazano okno zawieraj(cid:241)ce pe(cid:228)ny opis metody sample. Potrafi ona jednocze- (cid:264)nie odczytywa(cid:232) warto(cid:264)ci z wszystkich trzech czujników, co pozwala na pobieranie z nich danych z maksymaln(cid:241) szybko(cid:264)ci(cid:241) dozwolon(cid:241) przez system operacyjny. Wspomniany opis zawiera wszystkie szczegó(cid:228)owe informacje techniczne o wywo(cid:228)aniu. Znajdziesz tutaj wszyst- ko, czego potrzebujesz do utworzenia programu u(cid:276)ywaj(cid:241)cego danego wywo(cid:228)ania. 48 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę Rysunek 2.5. Kategoria Sensor and Comm Classes w systemie pomocy Rysunek 2.6. Tematy pomocy dla klasy Sensors W tym miejscu warto wspomnie(cid:232) o (cid:274)ródle, które oferuje jeszcze wi(cid:246)cej. System pomocy zosta(cid:228) zaprojektowany w taki sposób, aby mo(cid:276)na by(cid:228)o szybko znale(cid:274)(cid:232) potrzebne informacje i wy- (cid:264)wietli(cid:232) je na niewielkim ekranie. Nie zawiera zbyt wielu przyk(cid:228)adowych kodów, a tak(cid:276)e jest pobawiony rysunków. Na szcz(cid:246)(cid:264)cie dost(cid:246)pny jest podr(cid:246)cznik u(cid:276)ytkownika techBASIC, w którym znajdziesz przyk(cid:228)adowe fragmenty kodu i rysunki. Uzyskanie szybszej odpowiedzi z czujnika (cid:95) 49 Kup książkęPoleć książkę Rysunek 2.7. Opis metody sample Podr(cid:246)cznik u(cid:276)ytkownika dla techBASIC jest dost(cid:246)pny bezp(cid:228)atnie na stronie Byte Works pod adresem http://www.byteworks.us/Byte_Works/Products.html. To dokument w formacie PDF, co pozwala na jego czytanie za pomoc(cid:241) aplikacji iBooks w urz(cid:241)- dzeniach iPad i iPhone. Przegl(cid:241)daj(cid:241)c fragment po(cid:264)wi(cid:246)cony metodzie sample, znajdziemy przedstawiony poni(cid:276)ej fragment kodu. Podobnie jak wi(cid:246)kszo(cid:264)(cid:232) fragmentów kodu w podr(cid:246)czniku u(cid:276)ytkownika to jest pe(cid:228)ny, funkcjonuj(cid:241)cy program: ! Pobieranie danych z czujników przez 5 sekund. samples = 250 samp = Sensors.sample(7, 0.02, samples) ! Okre(cid:286)lenie warto(cid:286)ci (cid:286)redniej i maksymalnej ! dla ka(cid:298)dego czujnika. FOR i = 1 TO samples ax = ax + samp(i, 1) ay = ay + samp(i, 2) az = az + samp(i, 3) IF ABS(max) ABS(samp(i, 1)) THEN max = samp(i, 1) IF ABS(may) ABS(samp(i, 2)) THEN may = samp(i, 2) IF ABS(maz) ABS(samp(i, 3)) THEN maz = samp(i, 3) gx = gx + samp(i, 5) gy = gy + samp(i, 6) gz = gz + samp(i, 7) 50 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę IF ABS(mgx) ABS(samp(i, 5)) THEN mgx = samp(i, 5) IF ABS(mgy) ABS(samp(i, 6)) THEN mgy = samp(i, 6) IF ABS(mgz) ABS(samp(i, 7)) THEN mgz = samp(i, 7) mx = mx + samp(i, 9) my = my + samp(i, 10) mz = mz + samp(i, 11) IF ABS(mmx) ABS(samp(i, 9)) THEN mmx = samp(i, 9) IF ABS(mmy) ABS(samp(i, 10)) THEN mmy = samp(i, 10) IF ABS(mmz) ABS(samp(i, 11)) THEN mmz = samp(i, 11) NEXT PRINT USING Max acceleration: ##.##, ##.##, ##.## ; max, may, maz PRINT USING Max rotation: ###.##, ###.##, ###.## ; mgx, mgy, mgz PRINT USING Max magnetic field: ###.##, ###.##, ###.## ; mmx, mmy, mmz PRINT USING Average acceleration: ##.##, ##.##, ##.## ; _ ax/samples, ay/samples, az/samples PRINT USING Average rotation: ###.##, ###.##, ###.## ; _ gx/samples, gy/samples, gz/samples PRINT USING Average magnetic field: ###.##, ###.##, ###.## ; _ mx/samples, my/samples, mz/samples Cho(cid:232) niezbyt (cid:228)adny wizualnie, to jest kompletny program pobieraj(cid:241)cy z trzech omówionych dot(cid:241)d czujników warto(cid:264)ci z cz(cid:246)stotliwo(cid:264)ci(cid:241) 50 razy na sekund(cid:246). Dane s(cid:241) zbierane przez pi(cid:246)(cid:232) sekund. Nast(cid:246)pnie program oblicza i wy(cid:264)wietla warto(cid:264)ci (cid:264)rednie i maksymalne. Ten program nie jest jednym z przyk(cid:228)adów zawartych w aplikacji techBASIC. W jaki sposób mo(cid:276)na go wypróbowa(cid:232) w techBASIC? Niestety, firma Apple na(cid:228)o(cid:276)y(cid:228)a przesadnie ogromne restrykcje maj(cid:241)ce na celu ochron(cid:246) u(cid:276)ytkowników iOS. Dlatego cho(cid:232) wydaje si(cid:246) to g(cid:228)upie, ist- niej(cid:241) tylko dwa sposoby na wypróbowanie wspomnianego programu w techBASIC. Pierwszy wymaga jego samodzielnego wpisania. Drugi polega na wys(cid:228)aniu kodu (cid:274)ród(cid:228)owego w wia- domo(cid:264)ci e-mail, a nast(cid:246)pnie skopiowaniu tego kodu do nowego, pustego programu. Mimo wszystko u(cid:276)ycie poczty elektronicznej nie jest najgorszym rozwi(cid:241)zaniem. Wypróbuj ten program i przekonaj si(cid:246), jak dzia(cid:228)a. Masz ju(cid:276) wystarczaj(cid:241)co du(cid:276)(cid:241) wiedz(cid:246), aby go zmodyfikowa(cid:232) i rozbudowa(cid:232), je(cid:264)li zajdzie potrzeba. Wyznaczanie kursu W klasie Sensor po wy(cid:264)wietleniu opisu metody sample by(cid:232) mo(cid:276)e dostrzeg(cid:228)e(cid:264) dwie inne us(cid:228)ugi. Pierwsza, o nazwie heading, jest tak naprawd(cid:246) zbiorem przetworzonych informacji pobranych z magnetometru, przy(cid:264)pieszeniomierza i GPS. Zadanie, jakim jest wyszukanie kierunku na podstawie wspomnianych informacji, nie nale(cid:276)y do (cid:228)atwych, o czym si(cid:246) przekonasz w kolej- nym rozdziale. Teraz wystarczy wiedzie(cid:232), (cid:276)e wyznaczenie kursu jest ca(cid:228)kiem (cid:228)atwe. Podobnie jak w przypadku trzech u(cid:276)ywanych dot(cid:241)d czujników wszystko sprowadza si(cid:246) do odczytania warto(cid:264)ci, prawdopodobnie po u(cid:276)yciu wywo(cid:228)ania headingAvailable pozwalaj(cid:241)cego na spraw- dzenie dost(cid:246)pno(cid:264)ci omawianej us(cid:228)ugi w danym urz(cid:241)dzeniu iOS. Z tym wi(cid:241)(cid:276)e si(cid:246) jednak pe- wien problem. Pierwsze wywo(cid:228)anie heading w(cid:228)(cid:241)cza us(cid:228)ug(cid:246), co wymaga chwili czasu. Zamiast wstrzyma(cid:232) dzia(cid:228)anie programu na czas w(cid:228)(cid:241)czania us(cid:228)ugi, techBASIC zwraca ostatnio pobran(cid:241) warto(cid:264)(cid:232). Nale(cid:276)y pobra(cid:232) kilka warto(cid:264)ci, a nie tylko jedn(cid:241): Wyznaczanie kursu (cid:95) 51 Kup książkęPoleć książkę FOR I = 1 TO 10 PRINT Sensors.heading System.wait(0.5) NEXT Ten program dziesi(cid:246)ciokrotnie odczytuje warto(cid:264)ci, czekaj(cid:241)c pó(cid:228) sekundy mi(cid:246)dzy kolejnymi odczytami. Po jego uruchomieniu w moim iPadzie otrzyma(cid:228)em nast(cid:246)puj(cid:241)ce warto(cid:264)ci (puste wiersze zosta(cid:228)y usuni(cid:246)te): 0 0 -1 22182.984556 90.786407 81.723602 -1 22183.473079 92.786407 83.723602 -1 22183.965387 38.786407 29.723602 40 22184.478982 34.786407 25.723602 40 22184.987621 34.786407 25.723602 40 22185.500116 33.786407 24.723602 40 22185.989068 33.786407 24.723602 40 22186.506593 33.786407 24.723602 40 22186.99292 33.786407 24.723602 40 22187.501888 Jak mo(cid:276)esz si(cid:246) przekona(cid:232), warto(cid:264)ci pochodz(cid:241)ce z pierwszego odczytu s(cid:241) bezu(cid:276)yteczne. Pocz(cid:241)wszy od wiersza drugiego, dwie pierwsze liczby to poprawne warto(cid:264)ci kursu, podobnie jak w kompasie. Powy(cid:276)sze dane wyj(cid:264)ciowe pokazuj(cid:241), (cid:276)e iPad by(cid:228) zwrócony w kierunku wschodnim, a nast(cid:246)pnie przed czwartym odczytem obrócony nieco w kierunku pó(cid:228)nocno-wschodnim. W rzeczywisto(cid:264)ci w ogóle nie dotyka(cid:228)em iPada. To t(cid:228)umaczy potrzeb(cid:246) zastosowania trzeciej liczby w danych wyj(cid:264)ciowych. Wspomniana liczba wskazuje dok(cid:228)adno(cid:264)(cid:232) odczytu, dla pierw- szych trzech wynosi –1 i oznacza, (cid:276)e warto(cid:264)ci w ogóle nie s(cid:241) dok(cid:228)adne, oraz przypomina nam o konieczno(cid:264)ci odczekania chwili, zanim urz(cid:241)dzenie dostarczy prawid(cid:228)owe dane. Nawet po osi(cid:241)gni(cid:246)ciu pe(cid:228)nej gotowo(cid:264)ci do pracy i podawania prawid(cid:228)owych warto(cid:264)ci dok(cid:228)adno(cid:264)(cid:232) nie jest zbyt dobra. System iOS wskazuje, (cid:276)e kurs jest podawany z dok(cid:228)adno(cid:264)ci(cid:241) do 40 stopni. Ostatnia warto(cid:264)(cid:232) w danych wyj(cid:264)ciowych wskazuje godzin(cid:246), o której nast(cid:241)pi(cid:228) odczyt warto(cid:264)ci. Po(cid:293)o(cid:348)enie Ostatnia us(cid:228)uga w klasie Sensors to us(cid:228)uga podaj(cid:241)ca informacje o po(cid:228)o(cid:276)eniu. Czy dane po- chodz(cid:241) z nowego czujnika, czy powstaj(cid:241) na podstawie informacji pobranych z zewn(cid:246)trznych czujników tworz(cid:241)cych system satelitarnego GPS? My(cid:264)l(cid:246), (cid:276)e to po(cid:228)(cid:241)czenie obu wspomnianych rozwi(cid:241)za(cid:254). W ka(cid:276)dym b(cid:241)d(cid:274) razie ta us(cid:228)uga jest u(cid:276)ywana podobnie jak us(cid:228)uga przeznaczona do wyznaczania kursu, a ponadto równie(cid:276) potrzebuje nieco czasu, zanim osi(cid:241)gnie pe(cid:228)n(cid:241) go- towo(cid:264)(cid:232) do pracy i podawania prawid(cid:228)owych warto(cid:264)ci. Poni(cid:276)ej przedstawiono krótki program pokazuj(cid:241)cy, jak odczytywa(cid:232) informacje o po(cid:228)o(cid:276)eniu. Ten fragment kodu zosta(cid:228) skopiowany bezpo(cid:264)rednio ze znajduj(cid:241)cego si(cid:246) w podr(cid:246)czniku u(cid:276)ytkownika techBASIC fragmentu pre- zentuj(cid:241)cego polecenie location: location = sensors.location(30) PRINT USING Latitude : ####.### ; location(1) PRINT USING Longitude : ####.### ; location(2) PRINT USING Altitude : #####.## ; location(3) PRINT USING Horiz. Error: ####.### ; location(4) PRINT USING Vert. Error : ####.### ; location(5) PRINT USING Speed : ####.### ; location(6) PRINT USING Direction : #### ; location(7) PRINT Time stamp : ; location(8) 52 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę Po uruchomieniu powy(cid:276)szego kodu w moim urz(cid:241)dzeniu otrzyma(cid:228)em dane o po(cid:228)o(cid:276)eniu, któ- re okaza(cid:228)y si(cid:246) ca(cid:228)kiem dok(cid:228)adne! W poni(cid:276)szych danych wyj(cid:264)ciowych usun(cid:241)(cid:228)em pewne liczby pozwalaj(cid:241)ce na dok(cid:228)adne okre(cid:264)lenie mojego po(cid:228)o(cid:276)enia. Latitude : 35.xxx Longitude : -106.xxx Altitude : 1514.xx Horiz. Error: 65.000 Vert. Error : 44.790 Speed : -1.000 Direction : -1 Time stamp : 24355.097656 Zrozumienie pierwszych pi(cid:246)ciu warto(cid:264)ci nie powinno nastr(cid:246)cza(cid:232) trudno(cid:264)ci, jednostk(cid:241) miary dla odleg(cid:228)o(cid:264)ci jest metr. Szybko(cid:264)(cid:232) (Speed) i kierunek (Direction) s(cid:241) obliczane na podstawie serii informacji o po(cid:228)o(cid:276)eniu. Je(cid:276)eli te warto(cid:264)ci nie mog(cid:241) by(cid:232) obliczone, jak ma to miejsce w omawianym przyk(cid:228)adzie, po- niewa(cid:276) iPad le(cid:276)y nieruchomo na biurku, wtedy wy(cid:264)wietlane s(cid:241) warto(cid:264)ci –1. Kierunek nie jest kursem wed(cid:228)ug kompasu, ale rzeczywistym kierunkiem ruchu. Na ko(cid:254)cu danych wyj(cid:264)ciowych znajduje si(cid:246) znacznik czasu wskazuj(cid:241)cy godzin(cid:246), o której po- brano dane warto(cid:264)ci. Twój w(cid:293)asny tricorder W ten sposób otrzyma(cid:228)e(cid:264) w(cid:228)asny tricorder. Za jego pomoc(cid:241) mo(cid:276)esz wy(cid:264)wietla(cid:232), rejestrowa(cid:232) oraz wysy(cid:228)a(cid:232) przez poczt(cid:246) e-mail dane dotycz(cid:241)ce przy(cid:264)pieszenia, obrotu i si(cid:228)y pola magne- tycznego. Dowiedzia(cid:228)e(cid:264) si(cid:246) równie(cid:276), jak dzi(cid:246)ki kilku dodatkowym wywo(cid:228)aniom uzyska(cid:232) do- st(cid:246)p do informacji o kursie, po(cid:228)o(cid:276)eniu, kierunku ruchu oraz szybko(cid:264)ci. W rozdziale 3. wykorzystamy zdobyt(cid:241) dot(cid:241)d wiedz(cid:246) do opracowania wykrywacza metalu opartego na magnetometrze. Nieco pó(cid:274)niej, w rozdziale 7., powrócimy do przy(cid:264)pieszenio- mierza, cho(cid:232) wtedy przy(cid:264)pieszeniomierzem b(cid:246)dzie zdalne urz(cid:241)dzenie. Przekonasz si(cid:246), jak na podstawie danych przy(cid:264)pieszeniomierza okre(cid:264)li(cid:232) szybko(cid:264)(cid:232) i pokonan(cid:241) odleg(cid:228)o(cid:264)(cid:232), a tak(cid:276)e jak u(cid:276)y(cid:232) przy(cid:264)pieszeniomierza do okre(cid:264)lenia pu(cid:228)apu dla modelu rakiety. Twój w(cid:293)asny tricorder (cid:95) 53 Kup książkęPoleć książkę 54 (cid:95) Rozdzia(cid:293) 2. Uzyskanie dost(cid:253)pu do innych wbudowanych czujników Kup książkęPoleć książkę Skorowidz kod (cid:274)ród(cid:228)owy, 43 konwersja na wykrywacz metalu, 60 rzeczywisto(cid:264)ci rozszerzonej, 135 SensorTag, 100, 103 techBasic, 65 dost(cid:246)p do urz(cid:241)dze(cid:254), 66 techBasic Sampler, 15, 65 (cid:276)yroskop, 34 Apps, 86 Arduino dioda LED, 274 Firmata, 211 przeniesienie oprogramowania, 213 instalacja oprogramowania, 211 Serial Port, 214 sterowanie, 211 (cid:264)rodowisko uruchomieniowe, 211 Wi-Fi, 271 WiFly, 273 WiFly Terminal, 274 Arduino Uno, 195, 208 ASCII, 178 atrybut 0xAA01, 151 0xAA02, 150 AA11, 117 AA12, 117 AA13, 118 AA21, 146 AA22, 146 AA31, 139 AA32, 139 $0001, 234 $0003, 234 $0006, 234 $0012, 234 $00FFFF, 126 $F4, 228 0xAA01, 151 0xAA02, 150 A AA11, 117 AA12, 113, 117 AA13, 113, 118 AA21, 146 AA22, 146 AA31, 139 AA32, 139 AA33, 140 AA42, 124 AA43, 125 AA51, 133 accel, 17 Accel, 18 kod (cid:274)ród(cid:228)owy programu, 19 Accelerometer, 17, 20, 21 interfejs u(cid:276)ytkownika konfiguracja, 24 przygotowanie, 22 tworzenie przycisku, 26 zdefiniowanie funkcji, 27 kod (cid:274)ród(cid:228)owy programu, 21 licznik czasu, 22 obiekt wiadomo(cid:264)ci e-mail, 30 obs(cid:228)uga zdarze(cid:254), 27 pobieranie i obs(cid:228)uga danych z przy(cid:264)pieszeniomierza, 30 polecenia, 42 Quit, 28 Record, 28 rejestracja danych, 28 Send, 28, 30 Stop, 28 wykresy inicjalizacja, 24 inicjalizacja tablic, 24 obiekt definiuj(cid:241)cy osie, 25 uaktualnienie, 31 ustawienie zakresu, 25 wielko(cid:264)(cid:232), 26 wy(cid:264)wietlanie t(cid:228)a, 26 wy(cid:264)wietlenie widoku, 25 zablokowanie ekranu w bie(cid:276)(cid:241)cej orientacji, 26 zako(cid:254)czenie dzia(cid:228)ania, 22 zapisywanie danych w pliku, 28 zmienne, 22 znacznik czasu, 22 addPlant, 93 adres IP, 264 advertise, 233, 236 advertisement, 100 AGND, 69 AK8973, 56, 63 Alldatasheet, 56 analiza danych, 183 plik CSV, 184 plik danych, 183 tag, 184 ANGLE, 226 aplikacja Gyroscope, 35 Magnetometer, 42
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Projekty elektroniczne na iPhone i iPad. Niekonwencjonalne gadżety z technologią Arduino i techBASIC
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: