Page 1


Tytuł oryginału: Arduino in Action Tłumaczenie: Jacek Janczyk (wstęp, rozdz. 1 – 4), Andrzej Watrak (rozdz. 5 - 13, dodatki) Projekt okładki: Studio Gravite/Olsztyn Obarek, Pokoński, Pazdrijowski, Zaprucki ISBN: 978-83-246-6356-9 Original edition copyright © 2013 by Manning Publications Co. All rights reserved Polish edition copyright © 2014 by HELION SA. All rights reserved. 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 bierze jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Wydawnictwo HELION nie ponosi 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) Materiały graficzne na okładce zostały wykorzystane za zgodą Shutterstock Images LLC. Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/arduak.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/arduak 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Ăci WstÚp 11 PodziÚkowania O ksiÈĝce 15

CZ}¥m I

13

ZACZYNAMY 19

Rozdziaï 1. Witaj, Arduino 1.1. 1.2.

1.3.

1.4.

1.5.

1.6.

1.7. 1.8.

Kup książkę

21

Krótka historia Arduino 22 Arduino 23 1.2.1. Arduino Uno 23 1.2.2. Arduino Duemilanove 24 1.2.3. Arduino Ethernet 24 1.2.4. Arduino Mega 25 1.2.5. Inne wersje Arduino 25 1.2.6. Atak klonów 27 1.2.7. Zaczynamy pracÚ z Arduino 28 Przygotowywanie Ărodowiska pracy 28 1.3.1. Oprogramowanie dla Arduino 28 1.3.2. Podstawowa konfiguracja sprzÚtu 29 1.3.3. Twój niezbÚdnik Arduino 29 Niech coĂ siÚ wydarzy! 30 1.4.1. Twoja pierwsza migajÈca dioda ĂwiecÈca 30 1.4.2. Szkic bïyskajÈcy diodÈ ĂwiecÈcÈ 30 1.4.3. ’Èczymy wszystko razem 31 1.4.4. ’adowanie i testowanie programu 32 Poznajemy zintegrowane Ărodowisko programistyczne 33 1.5.1. Edytor kodu 34 1.5.2. Monitor portu szeregowego 34 1.5.3. Wyïapywanie bïÚdów 36 1.5.4. Przetwarzanie kodu 36 Budowa szkicu 37 1.6.1. Procedura „setup” 37 1.6.2. Nieskoñczona pÚtla 37 Komentowanie kodu 38 Podsumowanie 39

Poleć książkę


4

Spis treĂci

Rozdziaï 2. Cyfrowe wejĂcia i wyjĂcia 2.1.

2.2.

2.3.

2.4.

2.5.

41

Zaczynamy 41 2.1.1. Wykorzystanie pïytki stykowej 42 2.1.2. Schemat obwodu 42 2.1.3. Diody ĂwiecÈce 44 2.1.4. PoïÈczenia 44 2.1.5. Szkic bïyskajÈcy piÚcioma diodami 44 2.1.6. Zaïadowanie i test 47 PrzejÚcie kontroli 47 2.2.1. Schemat obwodu 47 2.2.2. PoïÈczenia 47 2.2.3. WtrÈcajÈce siÚ przerwania 49 2.2.4. Szkic pozwalajÈcy kontrolowaÊ diody przy pomocy przycisku 2.2.5. Zaïadowanie i test 52 2.2.6. Czas na przerwÚ 52 2.2.7. Zaïadowanie i test 53 Miernik refleksu 53 2.3.1. Schemat obwodu 53 2.3.2. PoïÈczenia 53 2.3.3. Szkic do pomiaru refleksu 53 2.3.4. Zaïadowanie i test 56 Miernik refleksu — kto naprawdÚ jest najszybszy? 56 2.4.1. Szkic do pomiaru refleksu 57 2.4.2. Zaïadowanie i test 58 Podsumowanie 58

Rozdziaï 3. Proste projekty: wejĂcie i wyjĂcie 3.1.

3.2.

3.3.

3.4.

61

Pora na Ăwiat analogowy 62 3.1.1. Jaka jest róĝnica pomiÚdzy sygnaïem analogowym i cyfrowym? 3.1.2. Odczyt sygnaïu z potencjometru 63 3.1.3. PodïÈczanie elementów 64 3.1.4. Szkic do odczytu ustawienia potencjometru 64 3.1.5. Zaïadowanie i test 66 Przetwornik piezoelektryczny 67 3.2.1. Schemat obwodu 68 3.2.2. PoïÈczenia 69 3.2.3. Szkic pozwalajÈcy mierzyÊ impulsy pochodzÈce z przetwornika piezoelektrycznego 70 3.2.4. Zaïadowanie i test 72 3.2.5. Obwód z dodanym gïoĂniczkiem 72 3.2.6. PoïÈczenia 72 3.2.7. Szkic generujÈcy děwiÚk 74 3.2.8. Zaïadowanie i test 74 Budowa pentatonicznej klawiatury muzycznej 75 3.3.1. Schemat obwodu 75 3.3.2. PoïÈczenia 75 3.3.3. Szkic obsïugujÈcy klawiaturÚ pentatonicznÈ 77 3.3.4. Zaïadowanie i test 78 Podsumowanie 79

Kup książkę

49

62

Poleć książkę


5

Spis treĂci

CZ}¥m II

ZAPRZ}GAMY ARDUINO DO PRACY 81

Rozdziaï 4. Rozszerzanie Arduino 4.1. 4.2. 4.3.

4.4. 4.5.

4.6.

ZwiÚkszanie moĝliwoĂci Arduino poprzez dodatkowe biblioteki programistyczne 84 Biblioteka podstawowa 84 Biblioteki standardowe 85 4.3.1. Projektowanie sterowane testami przy uĝyciu biblioteki ArduinoTestSuite 4.3.2. Zapisywanie wartoĂci w pamiÚci EEPROM 86 4.3.3. Zapisywanie wiÚkszych iloĂci danych na kartach SD 87 4.3.4. PodïÈczanie do sieci w standardzie Ethernet 89 4.3.5. Komunikacja szeregowa z uĝyciem protokoïu Firmata 90 4.3.6. WyĂwietlanie informacji przy uĝyciu biblioteki LiquidCrystal 91 4.3.7. Sterowanie serwomechanizmami 92 4.3.8. Sterowanie silnikiem krokowym 92 4.3.9. Komunikacja z urzÈdzeniami na magistrali SPI 93 4.3.10. Komunikacja przy uĝyciu magistrali dwuprzewodowej 95 4.3.11. Uzyskiwanie wiÚkszej liczby portów szeregowych przy pomocy biblioteki SoftwareSerial 95 Biblioteki udostÚpnione przez uĝytkowników 98 4.4.1. Instalowanie nowej biblioteki 98 Rozbudowa Arduino przy uĝyciu nakïadek 99 4.5.1. Popularne nakïadki 99 4.5.2. Puïapka: czy to bÚdzie dziaïaÊ z moim Arduino? 102 Podsumowanie 103

Rozdziaï 5. Arduino w ruchu 5.1.

5.2.

5.3.

Kup książkę

83

85

105

Nabieranie prÚdkoĂci z silnikami prÈdu staïego 106 5.1.1. Uruchamianie i zatrzymywanie silnika 107 5.1.2. Szkic uruchamiajÈcy i zatrzymujÈcy maïy silnik prÈdu staïego 108 5.1.3. ’Èczenie komponentów 108 5.1.4. Zaïadowanie i test szkicu 110 Sterowanie prÚdkoĂciÈ i obracanie silnika w przeciwnym kierunku 111 5.2.1. Modulacja PWM przybywa na ratunek 112 5.2.2. Mostek H do sterowania silnikiem 112 5.2.3. Ukïad L293D 114 5.2.4. ’Èczenie elementów 115 5.2.5. Szkic sterujÈcy ukïadem L293D 116 5.2.6. Zaïadowanie i test szkicu 117 5.2.7. Zmiana prÚdkoĂci obrotów silnika 117 5.2.8. Zaïadowanie i test szkicu 118 Silniki krokowe: jeden krok naraz 119 5.3.1. Silniki bipolarne i unipolarne 119 5.3.2. ’Èczenie komponentów 122 5.3.3. Funkcje biblioteki silnika krokowego 123 5.3.4. Szkic sterujÈcy silnikiem krokowym 125 5.3.5. Zaïadowanie i test szkicu 126

Poleć książkę


6

Spis treĂci 5.4.

5.5.

5.6. 5.7.

Serwomechanizmy nie sÈ takie straszne 126 5.4.1. Sterowanie serwomechanizmem 126 5.4.2. Funkcje i metody sterujÈce serwomechanizmem 127 5.4.3. Szkic sterujÈcy serwomechanizmem 128 5.4.4. ’Èczenie komponentów 129 5.4.5. Zaïadowanie i test szkicu 129 Wielka siïa maïego silnika bezszczotkowego 130 5.5.1. Dlaczego bez szczotek 130 5.5.2. Sterowanie 131 5.5.3. Szkic sterujÈcy silnikiem bezszczotkowym 132 5.5.4. ’Èczenie komponentów 134 5.5.5. Zaïadowanie i test szkicu 134 5.5.6. Obroty w przeciwnym kierunku 135 5.5.7. Szkic zmieniajÈcy kierunek obrotów silnika bezszczotkowego 5.5.8. ’Èczenie komponentów 136 5.5.9. Zaïadowanie i test szkicu 136 Nakïadka sterujÈca kilkoma silnikami 136 Podsumowanie 137

Rozdziaï 6. Wykrywanie przedmiotów 6.1.

6.2.

6.3.

6.4.

7.2.

139

UltraděwiÚkowe wykrywanie przedmiotów 139 6.1.1. Wybór czujnika ultraděwiÚkowego 140 6.1.2. Trzy lub cztery przewody 141 6.1.3. Szkice do ultraděwiÚkowego wykrywania przedmiotów 142 6.1.4. ’Èczenie elementów 144 6.1.5. Zaïadowanie i test szkicu 145 Pomiar odlegïoĂci za pomocÈ podczerwieni 145 6.2.1. ’Èczenie czujników podczerwieni i ultraděwiÚkowego 146 6.2.2. Czujnik Sharp GP2D12 146 6.2.3. Nieliniowy algorytm obliczania odlegïoĂci 146 6.2.4. Szkic do pomiaru odlegïoĂci 147 6.2.5. ’Èczenie elementów 149 6.2.6. Zaïadowanie i test szkicu 149 Wykrywanie ruchu metodÈ pasywnej podczerwieni 149 6.3.1. Uĝycie czujnika Parallax 151 6.3.2. Szkic do wykrywania ruchu za pomocÈ podczerwieni 151 6.3.3. ’Èczenie elementów 152 6.3.4. Zaïadowanie i test szkicu 153 Podsumowanie 154

Rozdziaï 7. WyĂwietlacze LCD 7.1.

135

155

Wprowadzenie do wyĂwietlaczy LCD 156 7.1.1. CiÈgi znaków: zmienne typu String i char 156 Równolegïy wyĂwietlacz znakowy Hitachi HD44780 158 7.2.1. WyĂwietlacz 4-bitowy czy 8-bitowy? 159 7.2.2. Biblioteka i funkcje 159 7.2.3. Schemat ukïadu 159 7.2.4. ’Èczenie komponentów w trybie 4-bitowym 160

Kup książkę

Poleć książkę


7

Spis treĂci

7.3.

7.4.

7.5.

7.2.5. Szkic sterujÈcy wyĂwietlaczem Hitachi HD44780 162 7.2.6. Zaïadowanie i test szkicu 163 Stacja meteorologiczna z szeregowym wyĂwietlaczem LCD 164 7.3.1. WyĂwietlacze szeregowe i równolegïe 164 7.3.2. Biblioteka SerLCD i jej funkcje 165 7.3.3. Czujnik temperatury Maxim DS18B20 166 7.3.4. Biblioteki OneWire i DallasTemperature 167 7.3.5. Schemat ukïadu 167 7.3.6. ’Èczenie wszystkich komponentów 167 7.3.7. Szkic dla stacji meteorologicznej z wyĂwietlaczem LCD 169 7.3.8. Zaïadowanie i test szkicu 170 WyĂwietlacz graficzny Samsung KS0108 171 7.4.1. Biblioteka i funkcje 171 7.4.2. Schemat poïÈczeñ 171 7.4.3. ’Èczenie wszystkich komponentów 172 7.4.4. Szkic do rysowania na wyĂwietlaczu graficznym 173 7.4.5. Zaïadowanie i test szkicu 175 Podsumowanie 176

Rozdziaï 8. Komunikacja 8.1.

8.2.

8.3.

8.4.

8.5.

8.6.

Kup książkę

177

Technologia Ethernet 178 8.1.1. Biblioteka Ethernet 179 8.1.2. Nakïadka Ethernet z kartÈ SD 180 Serwer WWW Arduino 181 8.2.1. Konfiguracja serwera 181 8.2.2. Szkic konfigurujÈcy serwer WWW 182 8.2.3. Zaïadowanie i test szkicu 184 8.2.4. Usuwanie usterek 184 mwir, Êwir — komunikacja z portalem Twitter 184 8.3.1. Twitter i tokeny 185 8.3.2. Biblioteki i funkcje 185 8.3.3. Schemat ukïadu i poïÈczenia komponentów 185 8.3.4. Szkic do wysyïania tweeta po naciĂniÚciu przycisku 8.3.5. Zaïadowanie i test szkicu 187 ’ÈcznoĂÊ Wi-Fi 188 8.4.1. Nakïadka Arduino WiFi 189 8.4.2. Biblioteka WiFi i jej funkcje 190 8.4.3. Ruchy ciaïa i bezprzewodowe przyspieszeniomierze 8.4.4. ’Èczenie komponentów 192 8.4.5. Szkic do komunikacji Bluetooth 193 8.4.6. Zaïadowanie i test szkicu 196 Bezprzewodowa ïÈcznoĂÊ Bluetooth 196 8.5.1. Pïyta ArduinoBT 196 8.5.2. Dodawanie moduïu Bluetooth 198 8.5.3. NawiÈzywanie poïÈczenia Bluetooth 198 8.5.4. Szkic do komunikacji Bluetooth 199 Interfejs SPI 200 8.6.1. Biblioteka SPI 200 8.6.2. UrzÈdzenia SPI i potencjometry cyfrowe 201

186

192

Poleć książkę


8

Spis treĂci

8.7.

8.8.

8.9.

8.6.3. Schemat ukïadu i poïÈczenia elementów 202 8.6.4. Szkic cyfrowego sterownika diod LED 203 Rejestrowanie danych 204 8.7.1. Rodzaje pamiÚci 205 8.7.2. Karty SD i biblioteka SD 205 8.7.3. Szkic rejestrujÈcy na karcie SD dane z czujnika 206 Serwis Xively 207 8.8.1. Tworzenie konta i pobieranie klucza API 208 8.8.2. Tworzenie nowego kanaïu danych 208 8.8.3. Szkic do rejestrowania danych z czujnika w serwisie Xively 8.8.4. Zaïadowanie i test szkicu 211 Podsumowanie 212

Rozdziaï 9. Czas na gry 9.1.

9.2.

9.3.

213

Nintendo Wii pozdrawia CiÚ 213 9.1.1. Kontroler Wii Nunchuk 214 9.1.2. PoïÈczenie z kontrolerem Nunchuk 216 9.1.3. Wii zaczyna mówiÊ 218 9.1.4. Wii testuje 226 WejĂcie konsoli Xbox na rynek 227 9.2.1. PoïÈczenie 228 9.2.2. Biblioteka hosta USB 229 9.2.3. Pozyskiwanie informacji o kontrolerze Xbox za pomocÈ nakïadki hosta USB 229 9.2.4. ObowiÈzek raportowania przez kontroler Xbox 9.2.5. Czas na uruchomienie 233 9.2.6. ’Èczenie za pomocÈ kodu 233 9.2.7. Szkic Xboxhid.ino 235 9.2.8. ’Èczenie i testowanie ukïadów 239 Podsumowanie 239

Rozdziaï 10. Integracja Arduino z urzÈdzeniami iOS

231

241

10.1. PodïÈczanie urzÈdzenia iOS do Arduino 243 10.1.1. Przewód szeregowy Redpark 243 10.1.2. Ostateczne poïÈczenie 244 10.2. Kod iOS 245 10.2.1. Tworzenie jednookienkowej aplikacji w Ărodowisku Xcode 10.2.2. Tworzenie kodu 250 10.3. Angaĝujemy Arduino 253 10.3.1. Szkic do sterowania diodÈ LED z urzÈdzenia iOS 253 10.3.2. Testowanie szkicu 254 10.4. Zróbmy coĂ wiÚcej w Xcode 255 10.4.1. Dodawanie kontrolki Slider 255 10.5. Obsïuga suwaka w Arduino 259 10.5.1. Ukïad Arduino do obsïugi suwaka 260 10.5.2. Testowanie ukïadu 261

Kup książkę

209

245

Poleć książkę


9

Spis treĂci 10.6. Wysyïanie danych do urzÈdzenia iOS 262 10.6.1. Kodowanie w Ărodowisku Xcode 262 10.6.2. Podczerwony czujnik odlegïoĂci GP2D12 10.6.3. Test 267 10.7. Podsumowanie 267

Rozdziaï 11. Elektroniczne gadĝety

265

269

11.1. Wprowadzenie do pïyty LilyPad 270 11.1.1. Akcesoria LilyPad 271 11.1.2. PrzewodzÈce nici i tkaniny 272 11.2. Kurtka z wyïÈcznikami 274 11.3. Osobiste pianino 276 11.4. Pïyta Arduino Pro Mini 279 11.5. Inteligentne sïuchawki 280 11.6. Kurtka z kompasem 282 11.7. Podsumowanie 286

Rozdziaï 12. Stosowanie nakïadek

287

12.1. Podstawowe informacje o nakïadkach 287 12.2. Nakïadka silnikowa Adafruit 288 12.2.1. Biblioteka AFMotor 289 12.2.2. Zastosowanie nakïadki z silnikiem krokowym 290 12.2.3. Zastosowanie nakïadki z silnikiem prÈdu staïego 292 12.2.4. Zakup nakïadki silnikowej 294 12.3. Jak zbudowaÊ wïasnÈ nakïadkÚ 295 12.3.1. PamiÚÊ 295 12.3.2. Przesuwniki poziomów 296 12.3.3. Uchwyt karty SD 296 12.3.4. PodïÈczanie karty SD do pïyty Arduino 297 12.3.5. Przygotowywanie pïyty perforowanej 299 12.3.6. Test nakïadki 302 12.4. Podsumowanie 303

Rozdziaï 13. Integracja z oprogramowaniem

305

13.1. Kanaï komunikacji szeregowej 306 13.2. Serwomechanizm ĂledzÈcy twarz 307 13.2.1. Montaĝ mechanizmu ĂledzÈcego twarz 308 13.2.2. Kod do Ăledzenia twarzy 309 13.3. Zastosowanie oprogramowania Firmata do budowy equalizera 13.3.1. Zastosowanie Firmata w Twojej aplikacji 314 13.3.2. Analiza děwiÚku w Ărodowisku Processing 315 13.3.3. Montaĝ elementów equalizera 315 13.3.4. Kod equalizera 316 13.4. Zastosowanie Pure Data do budowy syntezatora 319 13.4.1. Montaĝ komponentów syntezatora 320 13.4.2. Kod syntezatora 320

Kup książkę

313

Poleć książkę


10

Spis treĂci 13.5. Zastosowanie jÚzyka Python do mierzenia temperatury 13.5.1. Biblioteka szeregowa w jÚzyku Python 324 13.5.2. Montaĝ komponentów termometru 325 13.5.3. Kod monitorujÈcy temperaturÚ 326 13.6. Podsumowanie 328

Dodatek A A.1. A.2. A.3.

Windows 329 A.1.1. Instalacja sterowników do pïyty Arduino Mac OS X 332 Linux 333

Dodatek B B.1. B.2.

B.3.

B.4.

B.5. B.6.

C.2.

PodrÚcznik kodowania

329 329

337

Historia jÚzyka Arduino 337 Zmienne 338 B.2.1. Typy zmiennych 339 B.2.2. Tabele 340 B.2.3. CiÈgi znaków 341 B.2.4. Staïe 341 B.2.5. ZasiÚg zmiennych 342 PrzejÚcie kontroli 343 B.3.1. Instrukcje if, else, else if 344 B.3.2. Instrukcja switch-case 346 B.3.3. Operatory logiczne 347 ZapÚtlenie 348 B.4.1. PÚtla for 348 B.4.2. PÚtla while 349 B.4.3. PÚtla do while 350 Funkcje 350 Podsumowanie 351

Dodatek C C.1.

Instalacja Ărodowiska Arduino IDE

324

Biblioteki

353

Anatomia biblioteki 353 C.1.1. Plik .h (nagïówkowy) 353 C.1.2. Plik .cpp 354 Uĝycie biblioteki 355 C.2.1. Zastosowanie biblioteki w szkicu 355 C.2.2. Rozpowszechnianie biblioteki 356

Dodatek D

Lista komponentów

357

Dodatek E

Przydatne odnoĂniki

361

Skorowidz

363

Kup książkę

Poleć książkę


Komunikacja

Rozdziaá ten omawia: Q

konfiguracjĊ serwera WWW udostĊpniającego dane z Arduino,

Q

przesyáanie komunikatów z Arduino do portalu Twitter,

Q

komunikacjĊ z Arduino za pomocą WiFi i Bluetooth,

Q

Q

zapisywanie danych na karcie SD i w sieci Internet w serwisie Xively, komunikacjĊ z innymi urządzeniami za pomocą protokoáu SPI (ang. Serial Peripheral Interface, szeregowy interfejs urządzeĔ peryferyjnych).

W poprzednim rozdziale dowiedziaïeĂ siÚ, jak otrzymywaÊ za pomocÈ wyĂwietlaczy LCD wizualnÈ informacjÚ zwrotnÈ z Arduino. Wyobraě sobie moĝliwoĂÊ prezentowania informacji z Arduino na zewnÚtrznym ekranie i przesyïanie jej przez Internet w szeroki Ăwiat! A gdyby jeszcze moĝna byïo zdalnie sterowaÊ pïytÈ Arduino? PodïÈczenie Arduino do Internetu i zdalne wysyïanie danych do Twojego komputera to dwie z wielu moĝliwych form komunikacji dostÚpnych w Arduino. Przyjrzymy siÚ komunikacji wykorzystujÈcej technologie Ethernet, WiFi, Bluetooth i SPI. Poniewaĝ wiele Twoich projektów bÚdzie wykorzystywaÊ komunikacjÚ przez Internet, zajmijmy siÚ niÈ od razu i sprawděmy, jak Arduino moĝe przesyïaÊ dane przez sieÊ komputerowÈ.

Kup książkę

Poleć książkę


178

ROZDZIAà 8. Komunikacja

8.1. Technologia Ethernet JednÈ z najbardziej uĝytecznych form komunikacji dostÚpnych w Arduino jest technologia Ethernet. Jest to przyjÚty standard budowy sieci komputerowych, umoĝliwiajÈcy urzÈdzeniom wszelkiego rodzaju komunikacjÚ miÚdzy sobÈ poprzez wysyïanie i odbieranie strumieni danych (zwanych pakietami lub ramkami). Technologia Ethernet umoĝliwia wyjÈtkowo szybkÈ i niezawodnÈ transmisjÚ danych przez sieÊ. Kaĝde urzÈdzenie posiada unikalny identyfikator zwany adresem IP, umoĝliwiajÈcy komunikacjÚ przy uĝyciu róĝnych protokoïów sieciowych. Komunikacja Arduino z sieciÈ Internet jest prosta dziÚki nakïadce i bibliotece Ethernet, ale zanim omówimy te komponenty, poznajmy kilka pojÚÊ zwiÈzanych z sieciami komputerowymi. Nawet jeĝeli juĝ je znasz, warto przypomnieÊ sobie terminologiÚ i technologie opisane w tabeli 8.1. Tabela 8.1. NajwaĪniejsze terminy i pojĊcia technologii Ethernet Termin

Opis

Ethernet

Ethernet jest standardową technologią wykorzystywaną do budowy sieci komputerowych, opisującą sposób przesyáania danych pomiĊdzy komputerami lub innymi urządzeniami przez sieü przewodową.

Protokóá

Protokoáy są to przyjĊte jĊzyki komunikacji umoĪliwiające urządzeniom porozumiewanie siĊ miĊdzy sobą. Aby dwa urządzenia mogáy siĊ ze sobą komunikowaü, muszą uĪywaü tego samego jĊzyka. Na przykáad protokóá HTTP (ang. Hypertext Transfer Protocol, protokóá przesyáania dokumentów hipertekstowych) jest powszechnie stosowanym protokoáem, który moĪesz wykorzystaü w páycie Arduino skonfigurowanej jako serwer WWW. Protokóá HTTP okreĞla jĊzyk, dziĊki któremu serwer WWW Arduino rozumie komunikaty i zapytania odbierane od innych systemów, na przykáad komputerów z przeglądarkami.

Adres MAC

Adres MAC (ang. Media Access Control, kontrola dostĊpu do medium) jest to unikatowy identyfikator przypisywany urządzeniom wykorzystującym Ethernet lub inną technologiĊ sieciową. Adres MAC umoĪliwia jednoznaczne zidentyfikowanie urządzenia w sieci, aby mogáo komunikowaü siĊ z innymi. Nakáadka Ethernet Arduino posiada etykietĊ z przypisanym adresem MAC.

TCP/IP

Protokoáy TCP (ang. Transmission Control Protocol, protokóá sterowania transmisją danych) oraz IP (ang. Internet Protocol, protokóá internetowy) umoĪliwiają przesyáanie komunikatów przez globalną sieü Internet (bĊdącą fundamentem znanej i lubianej przez nas sieci WWW).

Adres IP

Adres IP jest to unikatowy identyfikator wykorzystywany przez urządzenia i serwery do identyfikacji w globalnej sieci Internet. Na przykáad przy otwieraniu strony internetowej www.helion.pl usáuga DNS (ang. Directory Name Service, usáuga sáownika nazw) zamienia adres http://www.helion.pl na numeryczny adres IP 188.117.147.100.

Lokalny adres IP

Lokalny adres IP jest podobny do zwykáego adresu IP, ale jest uĪywany w szczególnoĞci do komunikacji pomiĊdzy komputerami i urządzeniami w lokalnej sieci. Na przykáad w Twojej domowej sieci kaĪdy komputer ma przypisany lokalny adres IP, uĪywany do komunikacji z routerem i innymi komputerami.

Sieci komputerowe i technologia Ethernet sÈ zïoĝonymi zagadnieniami, których peïne poznanie moĝe zajÈÊ caïe lata, ale w tabeli 8.1 wymienione sÈ najbardziej podstawowe pojÚcia, które musisz znaÊ, aby zrozumieÊ pozostaïÈ czÚĂÊ tego rozdziaïu. Teraz, po zapoznaniu siÚ z tabelÈ, przejděmy do biblioteki Ethernet i sprawděmy, do czego sïuĝy.

Kup książkę

Poleć książkę


179

8.1. Technologia Ethernet

8.1.1. Biblioteka Ethernet

Biblioteka Ethernet jest dostarczana razem ze Ărodowiskiem Arduino IDE. Umoĝliwia ona konfiguracjÚ nakïadki Ethernet i komunikacjÚ ze Ăwiatem zewnÚtrznym oraz skonfigurowanie do czterech (w sumie) równolegle dziaïajÈcych serwerów i klientów. Serwer przyjmuje poïÈczenia przychodzÈce od klientów, po czym wysyïa i odbiera dane. Natomiast klient najpierw zestawia z serwerem poïÈczenie wychodzÈce, dziÚki któremu moĝe wysyïaÊ i odbieraÊ od niego dane. WiÚcej na ten temat powiemy wkrótce, ale teraz spójrzmy na tabelÚ 8.2, zawierajÈcÈ przeglÈd funkcji dostÚpnych w bibliotece Ethernet. Tabela 8.2. Przegląd funkcji klas Ethernet, Server i Client dostĊpnych w bibliotece Ethernet Funkcja

Opis

Ethernet.begin(mac) Ethernet.begin(mac, ip) Ethernet.begin(mac, ip, brama) Ethernet.begin(mac, ip, brama, ´podsieè)

Inicjuje bibliotekĊ za pomocą adresu MAC nakáadki i automatycznie konfiguruje adres IP za pomocą serwera DHCP. Opcjonalnie moĪna rĊcznie podaü adres IP, bramĊ (najczĊĞciej jest to adres IP routera) i maskĊ podsieci (informującą nakáadkĊ, jak interpretowaü adres IP; domyĞlna maska to 255.255.255.0).

Server(port)

Tworzy serwer nasáuchujący na okreĞlonym porcie.

Server.begin()

Uruchamia serwer oczekujący na komunikaty.

Server.available()

Zwraca obiekt klienta, jeĪeli są juĪ odebrane od niego dane.

Server.write()

Wysyáa dane do wszystkich podáączonych klientów.

Server.print()

Wysyáa dane do wszystkich klientów. Liczby są wysyáane jako ciągi znaków ASCII, na przykáad liczba 123 jest wysyáana jako ciąg trzech znaków: ‘1’, ‘2’ i ‘3’.

Server.println()

Dziaáa podobnie jak Server.print() , ale dodatkowo wysyáa znak nowego wiersza na koĔcu kaĪdego komunikatu.

Client(ip, port)

Tworzy obiekt klienta, który moĪe áączyü siĊ z okreĞlonym adresem IP i portem.

Client.connected()

Zwraca informacjĊ, czy klient jest poáączony z serwerem. JeĪeli poáączenie jest zamkniĊte, a jakieĞ dane wciąĪ nie są odczytane, funkcja zwraca wartoĞü true.

Client.connect()

Nawiązuje poáączenie.

Client.write()

Wysyáa dane do serwera.

Client.print()

Wysyáa dane do serwera. Liczby są wysyáane jako ciągi znaków ASCII, na przykáad liczba 123 jest wysyáana jako ciąg trzech znaków: ‘1’, ‘2’ i ‘3’.

Client.println()

Dziaáa podobnie jak Client.print() , ale dodatkowo wysyáa znak nowego wiersza na koĔcu kaĪdego komunikatu.

Client.available()

Zwraca liczbĊ bajtów gotowych do odczytania (liczbĊ bajtów wysáanych przez serwer).

Client.read()

Odczytuje nastĊpny bajt odebrany z serwera.

Client.flush()

Usuwa wszystkie bajty wysáane do klienta, ale jeszcze przez niego nieodczytane.

Client.stop()

Zamyka poáączenie z serwerem.

Oprócz klas Ethernet, Server oraz Client biblioteka Ethernet zawiera przydatne klasy ogólnego przeznaczenia, obsïugujÈce protokóï UDP (ang. User Datagram Protocol,

Kup książkę

Poleć książkę


180

ROZDZIAà 8. Komunikacja

protokóï danych uĝytkownika) do rozgïaszania informacji w sieci. Jeĝeli serwer lub klient nie jest wymagany, moĝesz do wysyïania i odbierania danych z Arduino uĝyÊ klasy EthernetUDP. Tabela 8.3 zawiera szczegóïowy opis funkcji tej klasy. Tabela 8.3. Przegląd gáównych funkcji klasy EthernetUDP w bibliotece Ethernet Funkcja

Opis

EthernetUDP.begin(port)

Inicjuje obiekt UDP i okreĞla port do nasáuchu.

EthernetUDP.read(bufor_pakietów, maks_wielkoħè)

Odczytuje z bufora pakiety UDP.

EthernetUDP.write(komunikat)

Wysyáa komunikat do innego urządzenia.

EthernetUDP.beginPacket(ip, port)

OkreĞla adres IP i port urządzenia docelowego. Funkcja musi byü wywoáana przed wysáaniem komunikatu.

EthernetUDP.endPacket()

KoĔczy komunikat. Funkcja wywoáywana po wysáaniu komunikatu.

EthernetUDP.parsePacket()

Sprawdza, czy jakiĞ komunikat oczekuje na odczytanie.

EthernetUDP.available()

Zwraca iloĞü danych odebranych i gotowych do odczytania.

Teraz, kiedy znamy juĝ funkcje i klasy biblioteki Ethernet, przyjrzyjmy siÚ samej nakïadce. NakïadkÚ stosuje siÚ w celu rozszerzenia funkcjonalnoĂci sprzÚtowych Arduino. DziÚki niej moĝesz podïÈczyÊ pïytÚ do sieci Ethernet. 8.1.2. Nakáadka Ethernet z kartą SD

Oryginalna nakïadka Ethernet jest kamieniem milowym w rozwoju platformy Arduino. Umoĝliwia ona komunikacjÚ projektów z innymi urzÈdzeniami przez sieÊ komputerowÈ lub Internet. Nakïadka wykorzystuje ukïad WIZnet W5100 i oferuje obsïugÚ stosu IP wraz z protokoïami TCP i UDP poprzez ïÈcza Ethernet 10/100 Mbit/s. Nakïadka jest wyposaĝona w standardowe gniazdo RJ45 umoĝliwiajÈce poïÈczenie i wspóïpracÚ z modemem, routerem lub innymi standardowymi urzÈdzeniami. Nowsza, szeroko dostÚpna wersja nakïadki zawiera ulepszenie w postaci slotu na kartÚ microSD. DziÚki niemu moĝna odczytywaÊ i zapisywaÊ pliki (za pomocÈ biblioteki SD, po umieszczeniu karty SD w slocie). Naleĝy pamiÚtaÊ, ĝe zarówno ukïad W5100, jak i karta SD komunikujÈ siÚ z Arduino za pomocÈ interfejsu SPI (wiÚcej informacji na temat komunikacji SPI znajduje siÚ w podrozdziale 8.6). W wiÚkszoĂci pïyt Arduino wykorzystywane sÈ w tym celu piny nr 11, 12 i 13, natomiast w pïycie Mega piny 50, 51 i 52. W obu pïytach pin nr 10 jest uĝywany do wybrania do komunikacji ukïadu W5100, natomiast pin nr 4 do wybrania karty SD. Jest to istotne z tego wzglÚdu, ĝe nie moĝna tych pinów uĝywaÊ jako wejĂciowych lub wyjĂciowych pinów ogólnego przeznaczenia. UWAGA: Zarówno ukïad W5100, jak i karta SD korzystajÈ z szyny SPI, ale tylko

jedno z nich moĝe byÊ aktywne w danej chwili. Aby móc korzystaÊ z karty SD, naleĝy skonfigurowaÊ pin nr 4 jako wyjĂcie i ustawiÊ na nim stan wysoki (HIGH). Natomiast w przypadku ukïadu W5100 naleĝy jako wyjĂcie skonfigurowaÊ pin nr 10 i ustawiÊ na nim stan wysoki. SprzÚtowego pinu SS (w wiÚkszoĂci pïyt jest

Kup książkę

Poleć książkę


181

8.2. Serwer WWW Arduino

to pin nr 10, a w pïycie Mega nr 53) moĝna nie uĝywaÊ, ale aby móc korzystaÊ z karty SD, biblioteki Ethernet i interfejsu SPI, trzeba ustawiÊ go jako wyjĂcie (domyĂlna konfiguracja).

8.2. Serwer WWW Arduino MajÈc w maïym palcu podstawy technologii, bibliotekÚ i nakïadkÚ, moĝesz zaczÈÊ pracÚ nad swoim pierwszym projektem wykorzystujÈcym Ethernet. Zbudujesz serwer WWW, czyli system odpowiadajÈcy na zapytania wysyïane przez klientów i wysyïajÈcy do nich dane (jak przedstawia rysunek 8.1). Aby to osiÈgnÈÊ, wykorzystasz klasy Server oraz Client z biblioteki Ethernet.

Rysunek 8.1. Schemat komunikacji klienta z serwerem WWW Arduino

8.2.1. Konfiguracja serwera

Do skonfigurowania serwera bÚdziesz potrzebowaÊ pewnych informacji. Po pierwsze, musisz znaÊ adres MAC swojej nakïadki Ethernet. Powinien on byÊ wydrukowany na etykiecie na nakïadce. W kodzie serwera adres MAC zapiszesz w tabeli bajtów, na przykïad tak: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

PamiÚtaj, ĝe jest to unikatowy adres sprzÚtowy, wykorzystywany przez nakïadkÚ do bezpoĂredniej komunikacji z innymi urzÈdzeniami przez sieÊ Ethernet. Jeĝeli posiadasz starÈ nakïadkÚ bez etykiety albo jÈ zgubiïeĂ, moĝesz wykorzystaÊ adres MAC z powyĝszego przykïadu. Jeĝeli do sieci jest doïÈczonych wiÚcej niĝ jedno urzÈdzenie, waĝne jest, aby kaĝde posiadaïo swój wïasny unikatowy adres MAC. W nastÚpnym kroku bÚdziesz potrzebowaÊ adresu IP. Od wersji 1.0 Arduino wbudowana biblioteka Ethernet obsïuguje protokóï DHCP (Dynamic Host Configuration Protocol, protokóï dynamicznego konfigurowania urzÈdzenia), umoĝliwiajÈcy Arduino automatyczne przypisanie adresu IP. Adres IP zostanie automatycznie skonfigurowany niezaleĝnie od tego, czy pïyta jest podïÈczona bezpoĂrednio do modemu, czy do routera, o ile tylko na tych urzÈdzeniach jest wïÈczona usïuga DHCP (zazwyczaj jest). Jeĝeli w Twojej sieci nie jest uĝywany protokóï DHCP albo uĝywasz wersji Arduino starszej niĝ 1.0, musisz dowiedzieÊ siÚ, jaki adres IP ma router, i rÚcznie przypisaÊ nakïadce Ethernet jakiĂ inny adres IP. W zaleĝnoĂci od konfiguracji jest kilka sposobów wykonania tej operacji. Jeĝeli pïyta Arduino jest podïÈczona bezpoĂrednio do modemu, jego adres IP jest przypisany przez operatora internetowego ISP. W takim przypadku najprostszym

Kup książkę

Poleć książkę


182

ROZDZIAà 8. Komunikacja

sposobem poznania adresu IP jest podïÈczenie komputera do modemu i skorzystanie z jednej z wielu stron w Internecie rozpoznajÈcych Twój adres IP. (Proste wyszukanie frazy „adres IP” powinno pomóc w znalezieniu odpowiedniej strony, ewentualnie moĝesz skorzystaÊ z http://www.adres-ip.pl.) ZwróÊ uwagÚ, ĝe adres IP Twojego routera jest automatycznie przypisywany przez operatora ISP i moĝe siÚ zmieniaÊ od czasu do czasu. Jeĝeli pïyta Arduino jest doïÈczona do sieci przez router, musisz rÚcznie przypisaÊ do nakïadki jakiĂ niewykorzystywany adres IP. Aby to zrobiÊ, musisz posiadaÊ nieco wiÚcej informacji na temat konfiguracji swojej sieci. Adres IP routera moĝesz poznaÊ, korzystajÈc z komputera doïÈczonego do sieci i opisanej wyĝej usïugi internetowej. Moĝesz równieĝ otworzyÊ panel administracyjny swojego routera, wpisujÈc w przeglÈdarce jego domyĂlny adres IP. Na przykïad w przypadku urzÈdzeñ Linksys jest to adres http://192.168.1.1, a dla innych marek http://10.0.0.1. Jeĝeli Twój router ma np. adres 192.168.1.1, musisz nakïadce Ethernet nadaÊ adres 192.168.1.x, gdzie x oznacza dowolnÈ liczbÚ od 2 do 254. Kaĝdy komputer lub inne urzÈdzenie w sieci posiada swój unikatowy adres 192.168.1.x, w którym ostatnia liczba identyfikuje to urzÈdzenie w sieci. Dlatego musisz siÚ upewniÊ, ĝe Twoja nakïadka nie wchodzi w konflikt z innymi urzÈdzeniami. Ta sama zasada obowiÈzuje, gdy Twój router wykorzystuje innÈ adresacjÚ, na przykïad 10.0.0.x. Jeĝeli musisz rÚcznie przypisaÊ adres IP, moĝesz wykorzystaÊ obiekt IPAddress, na przykïad: IPAddress manualIP(192, 168, 1, 2);

Liczby w powyĝszym kodzie oznaczajÈ adres, który chcesz przypisaÊ. Na koniec jeĝeli jesteĂ podïÈczony do sieci i wykorzystujesz router do poïÈczenia z Internetem, musisz równieĝ ustawiÊ jego adres IP jako bramÚ. Utwórz tabelÚ typu byte i zapisz w niej adres IP routera, który bÚdzie uĝyty jako adres bramy. Poniĝej przedstawiony jest przykïad: byte gateway[] = { 192, 168, 1, 1};

Teraz, kiedy znasz juĝ konfiguracjÚ IP sieci, przejděmy do kodu. 8.2.2. Szkic konfigurujący serwer WWW

Listing 8.1 stanowi praktyczne zastosowanie omówionych wczeĂniej zagadnieñ do skonfigurowania serwera WWW na pïycie Arduino. Serwer bÚdzie miaï za zadanie doïÈczyÊ siÚ do Internetu (lub do sieci lokalnej), przyjmowaÊ poïÈczenia przychodzÈce od klientów (wysyïane przez przeglÈdarki) i odpowiadaÊ wïasnym komunikatem. Listing jest doskonaïym szablonem do tworzenia niemal dowolnej aplikacji serwerowej. Listing 8.1. Serwer WWW na páycie Arduino

#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

Kup książkę

Przypisanie unikatowego adresu MAC

Poleć książkę


183

8.2. Serwer WWW Arduino IPAddress manualIP(192,168,1,120); EthernetServer server(80);

RĊczne przypisanie adresu IP, jeĪeli DHCP nie dziaáa Inicjalizacja serwera

boolean dhcpConnected = false; void setup() { Poáączenie za pomocą DHCP if (!Ethernet.begin(mac)){ RĊczne poáączenie, jeĪeli DHCP nie dziaáa Ethernet.begin(mac, manualIP); } Uruchomienie serwera server.begin(); } void loop() { EthernetClient client = server.available(); Oczekiwanie na poáączenia if (client) { od klientów boolean currentLineIsBlank = true; while (client.connected()) { Poáączenie i odczyt danych od klienta if (client.available()) { char c = client.read(); if (c == '\n' && currentLineIsBlank) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("Witaj, jestem Twoim serwerem Arduino!"); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(1); client.stop(); }

Koniec zapytania i odesáanie odpowiedzi do klienta

Zwáoka na odczytanie danych przez klienta ZamkniĊcie poáączenia

}

Najpierw inicjowany jest serwer HTTP na porcie nr 80 . Po zainicjowaniu moĝesz spróbowaÊ podïÈczyÊ Arduino do sieci Ethernet, korzystajÈc z usïugi DHCP , a jeĝeli nie bÚdzie to moĝliwe, rÚcznie przypisujÈc adres . Dalej nastÚpuje uruchomienie serwera i w gïównej pÚtli rozpoczyna siÚ nasïuchiwanie poïÈczeñ . Gdy do serwera podïÈczy siÚ klient i odebrane zostanÈ dane, wówczas znak nowego wiersza bÚdzie oznaczaï koniec komunikatu, po czym do klienta zostanie odesïana odpowiedě .

Kup książkę

Poleć książkę


184

ROZDZIAà 8. Komunikacja

8.2.3. Zaáadowanie i test szkicu

Skopiuj dokïadnie kod z listingu 8.1 do Ărodowiska Arduino IDE. Teraz moĝesz zaïadowaÊ szkic do Arduino. Po zaïadowaniu i uruchomieniu kodu moĝesz zdalnie poïÈczyÊ siÚ z serwerem Arduino, otwierajÈc w dowolnej przeglÈdarce adres http://twój_adres_arduino. Twoja przeglÈdarka (klient) wyĂle do serwera ĝÈdanie poïÈczenia, który z kolei odpowie komunikatem „Witaj, jestem Twoim serwerem Arduino!”. Tak to dziaïa. Chcesz otrzymywaÊ rzeczywiste dane? PodïÈcz potencjometr lub czujnik do wejĂcia analogowego nr 0 i zamieñ wiersz: client.println("Witaj, jestem Twoim serwerem Arduino!");

na nastÚpujÈcy: client.println(analogRead(0));

Mamy nadziejÚ, ĝe szkic zadziaïa bez problemów, ale jeĝeli nie otrzymasz ĝadnej odpowiedzi, przeczytaj poniĝszy punkt poĂwiÚcony usuwaniu usterek. 8.2.4. Usuwanie usterek

Jeĝeli nie moĝesz nawiÈzaÊ poïÈczenia z Arduino, pierwszÈ rzeczÈ, którÈ naleĝy sprawdziÊ, sÈ ustawienia adresu IP. Jeĝeli jesteĂ absolutnie pewny, ĝe konfiguracja IP jest poprawna i jesteĂ podïÈczony do sieci domowej, moĝliwe, ĝe musisz skonfigurowaÊ na routerze przekierowanie portów. Przekierowanie portów powoduje, ĝe router w specjalny sposób przesyïa komunikaty przeznaczone dla Twojego Arduino. Konfiguracja przekierowania portów nie jest trudna; musisz jÈ wykonaÊ na swoim routerze. Aby uzyskaÊ wiÚcej informacji, zajrzyj do dokumentacji routera, jak ustawiÊ przekierowanie na adres IP Arduino. To powinno rozwiÈzaÊ problem.

8.3. ûwir, üwir — komunikacja z portalem Twitter Tworzenie serwera WWW komunikujÈcego siÚ ze Ăwiatem zewnÚtrznym to wspaniaïe zajÚcie, ale innÈ uĝytecznÈ opcjÈ jest poïÈczenie z usïugami w Internecie. JednÈ z usïug, z której warto skorzystaÊ, jest portal Twitter. Zasada dziaïania portalu Twitter jest prosta. Jeĝeli masz w nim swoje konto, moĝesz rozsyïaÊ w caïej sieci Twitter tweety (komunikaty) o dïugoĂci maksymalnie 140 znaków. Uĝytkownicy mogÈ zapisywaÊ siÚ do Twojego kanaïu i automatycznie otrzymywaÊ aktualizacje Twoich tweetów. Ale to nie wszystko. Twitter dobrze wspóïpracuje z innymi usïugami, czyli moĝesz równieĝ automatycznie wysyïaÊ swoje tweety do konta w portalu Facebook. Czy nie byïoby wspaniale skonfigurowaÊ kanaï Twitter dostarczajÈcy aktualnych informacji o tym, co siÚ dzieje z Twoim Arduino? Jest to moĝliwe. W tym podrozdziale dowiesz siÚ, jak skonfigurowaÊ Arduino i nakïadkÚ Ethernet, aby po naciĂniÚciu przycisku podïÈczonego do pïyty automatycznie wysyïaÊ komunikaty do portalu Twitter.

Kup książkę

Poleć książkę


185

8.3. mwir, Êwir — komunikacja z portalem Twitter

8.3.1. Twitter i tokeny

Jeĝeli nie masz jeszcze konta w portalu Twitter albo na potrzeby tego projektu chcesz zaïoĝyÊ nowe, odwiedě stronÚ www.twitter.com i utwórz konto. NastÚpnie pobierz specjalny token, który umoĝliwi autoryzacjÚ Arduino podczas wysyïania komunikatów przez Twoje konto. Ten token umoĝliwia poĂredniemu serwerowi WWW mediacjÚ pomiÚdzy Arduino a portalem Twitter. Moĝliwa jest równieĝ bezpoĂrednia komunikacja z portalem, ale korzystanie z usïugi poĂredniczÈcej jest lepsze, poniewaĝ zapobiega przerwaniu wykonywania Twojego kodu w przypadku, gdy Twitter zmieni swój protokóï komunikacyjny lub sposób autoryzacji. Równieĝ biblioteka Twitter jest mniejsza dziÚki usïudze poĂredniczÈcej. OszczÚdza siÚ w ten sposób cennÈ pamiÚÊ Arduino. Aby pobraÊ token, otwórz stronÚ http://arduino-tweet.appspot.com i kliknij odnoĂnik Step 1: Get a token to post a message using OAuth (Krok 1. Pobierz token do wysyïania komunikatów za pomocÈ usïugi OAuth). Po skonfigurowaniu konta pora przyjrzeÊ siÚ bliĝej bibliotece, z której bÚdziemy korzystaÊ. 8.3.2. Biblioteki i funkcje

Aby móc komunikowaÊ siÚ z portalem Twitter, musisz zainstalowaÊ bibliotekÚ Twitter, dostÚpnÈ pod adresem www.arduino.cc/playground/Code/TwitterLibrary. Po pobraniu biblioteki zapisz jÈ w folderze sketchbook lub libraries. Tabela 8.4 przedstawia opis funkcji zawartych w bibliotece Twitter. Tabela 8.4. Przegląd funkcji biblioteki Twitter Funkcja

Opis

Twitter(string token)

Konstruktor klasy, przyjmujący token jako argument.

bool post(const char *komunikat)

Rozpoczyna wysyáanie komunikatu. Zwraca wartoĞü true po pomyĞlnym nawiązaniu poáączenia z portalem Twitter lub false w przypadku báĊdu.

bool checkStatus(Print *debug)

Sprawdza, czy Īądanie opublikowania komunikatu jest wciąĪ realizowane (moĪna pominąü argument debug, jeĪeli nie jest wymagana informacja zwrotna).

int status()

Zwraca kod HTTP odpowiedzi z portalu Twitter, na przykáad 200 OK Status jest dostĊpny dopiero po opublikowaniu komunikatu, gdy funkcja checkStatus() zwróci wartoĞü false.

int wait(Print *debug)

Czeka na zakoĔczenie publikacji komunikatu. Zwraca kod HTTP odpowiedzi z portalu Twitter.

8.3.3. Schemat ukáadu i poáączenia komponentów

Jeĝeli konto w portalu Twitter i Ărodowisko Arduino IDE sÈ skonfigurowane, zbudujmy prosty ukïad wysyïajÈcy tweeta, gdy uĝytkownik naciĂnie przycisk. Przylutuj przycisk do pïyty lub zbuduj ukïad na pïycie prototypowej. PodïÈcz jednÈ z koñcówek przycisku z pinem 5 V, a drugÈ z pinem masy GND poprzez rezystor obniĝajÈcy 100 kȍ. TÚ samÈ koñcówkÚ przycisku (podïÈczonÈ do masy) doïÈcz do wejĂcia cyfrowego nr 2, jak pokazuje rysunek 8.2.

Kup książkę

Poleć książkę


186

ROZDZIAà 8. Komunikacja

Rysunek 8.2. Prosty ukáad do wysyáania tweetów po naciĞniĊciu przycisku

8.3.4. Szkic do wysyáania tweeta po naciĞniĊciu przycisku

Po podïÈczeniu przycisku i umieszczeniu na Arduino nakïadki Ethernet skopiuj poniĝszy kod (listing 8.2) do Ărodowiska Arduino IDE i moĝesz zaczynaÊ. Przeczytaj uwaĝnie komentarze w kodzie i upewnij siÚ, ĝe kod zawiera ustawienia odpowiadajÈce konfiguracji Twojej sieci. Jeĝeli potrzebujesz wyjaĂnieñ dotyczÈcych jakiegoĂ pojÚcia sieciowego lub terminu, wróÊ do podrozdziaïu 8.1. Listing 8.2. Szkic do wysyáania komunikatu do portalu Twitter po naciĞniĊciu przycisku

#include <SPI.h> #include <Ethernet.h> #include <Twitter.h> Przypisanie unikatowego

adresu MAC byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress manualIP(192,168,1,120); RĊczne przypisanie adresu IP,

int b1Pin = 2; int pressCount = 0;

Kup książkę

jeĪeli DHCP nie dziaáa OkreĞlenie pinu przycisku

Poleć książkę


187

8.3. mwir, Êwir — komunikacja z portalem Twitter Twitter twitter("TWOJ-TOKEN");

Inicjalizacja tokena do portalu Twitter

void setup() { Poáączenie delay(1000); za pomocą DHCP if(!Ethernet.begin(mac)){ RĊczne poáączenie, jeĪeli DHCP nie dziaáa Ethernet.begin(mac, manualIP); } Zestawienie poáączenia szeregowego Serial.begin(9600); } void sendTweet(const char msgToSend[]) { Serial.println("Laczenie..."); if (twitter.post(msgToSend)) { int status = twitter.wait(&Serial); if (status == 200) { Serial.println("OK."); } else { Serial.print("Blad : kod "); Serial.println(status); } } else { Serial.println("Polaczenie nieudane."); } }

Sformatowanie i wysáanie tweeta

void loop() { if(digitalRead(b1Pin) == HIGH) { pressCount++; sendTweet("Liczba nacisniec przycisku: " + pressCount); delay(2000); } }

Sprawdzenie przycisku i wysáanie tweeta

Najpierw Arduino próbuje podïÈczyÊ siÚ do sieci Ethernet, korzystajÈc z usïugi DHCP , a jeĝeli nie bÚdzie to moĝliwe, za pomocÈ rÚcznie przypisanego adresu IP . Po podïÈczeniu otwierane jest poïÈczenie szeregowe, poprzez które wysyïane sÈ komunikaty diagnostyczne do monitora portu szeregowego . Jeĝeli poïÈczenie z portalem zostanie nawiÈzane, zastosowana zostanie funkcja sendTweet, odpowiednio formatujÈca i wysyïajÈca tweeta . Kod sprawdza, czy zostaï naciĂniÚty przycisk, po czym wysyïa tweeta . 8.3.5. Zaáadowanie i test szkicu

Jeĝeli jesteĂ pewien, ĝe szkic zawiera poprawne dane, skompiluj go i zaïaduj do Arduino. Teraz moĝesz rozgïaszaÊ naciĂniÚcia przycisku w portalu Twitter. Sprawdě, czy pïyta Arduino wykonuje kod i czy jest podïÈczona do Internetu przewodem Ethernet. To jest caïa konfiguracja.

Kup książkę

Poleć książkę


188

ROZDZIAà 8. Komunikacja

NaciĂnij przycisk podïÈczony do Arduino i zaloguj siÚ do portalu Twitter. PowinieneĂ w nim zobaczyÊ ostatni tweet o treĂci „Liczba nacisniec przycisku: 1”, jak pokazuje rysunek 8.3. Po kaĝdym naciĂniÚciu przycisku pojawi siÚ nowy tweet ze zwiÚkszajÈcÈ siÚ liczbÈ naciĂniÚÊ. Fajna zabawa.

Rysunek 8.3. Widok tweetu w portalu Twitter po naciĞniĊciu przycisku

UWAGA: Twitter blokuje wielokrotne wysyïanie w krótkim przedziale czasu tego

samego komunikatu. W listingu 8.2 komunikat jest zmieniany po kaĝdym naciĂniÚciu przycisku (zwiÚkszana jest liczba naciĂniÚÊ), a wiÚc nie bÚdzie problemu z wysïaniem tweeta. W wiÚkszoĂci przypadków okresowego wysyïania komunikatów lub komunikatów róĝniÈcych siÚ miÚdzy sobÈ ten problem nie powinien wystÈpiÊ. Niemniej jednak warto o tym pamiÚtaÊ. Jak zapewne siÚ domyĂlasz, moĝesz rozgïaszaÊ wiele innych poĝytecznych informacji, nie tylko dotyczÈcych naciĂniÚcia przycisku. Na przykïad czujnik moĝe wysyïaÊ sygnaï, gdy drzwi do Twojego domu zostanÈ otwarte lub zamkniÚte. Moĝesz wysyïaÊ bieĝÈce dane i przedstawiaÊ je w swojej galerii. To tylko zarys moĝliwoĂci.

8.4. àącznoĞü Wi-Fi Nakïadka Ethernet bïyskawicznie podïÈczy TwojÈ pïytÚ Arduino do sieci, ale w niektórych sytuacjach przydaje siÚ ïÈcznoĂÊ bezprzewodowa. Na przykïad gdy musisz odbieraÊ na bieĝÈco dane z samobieĝnego robota wïasnej konstrukcji albo gdy Twój ukïad musi byÊ podïÈczony do sieci, a w pobliĝu nie ma ïÈcza ani routera przewodowego. SiÚgnij wtedy po nakïadkÚ WiFi, eleganckie rozwiÈzanie umoĝliwiajÈce podïÈczenie Arduino do sieci bezprzewodowej i przesyïanie danych. UWAGA: Jeĝeli posiadasz nakïadkÚ SparkFun WiFly (popularny odpowiednik oficjalnej nakïadki Arduino WiFi) albo z jakiegoĂ powodu musisz jÈ wykorzystaÊ w projekcie, na stronie internetowej oryginalnego wydania ksiÈĝki znajdziesz odpowiednio zmienionÈ wersjÚ tego podrozdziaïu (w jÚzyku angielskim). OdnoĂnik do niego zamieĂciliĂmy w dodatku E.

Kup książkę

Poleć książkę


189

8.4. ’ÈcznoĂÊ Wi-Fi

8.4.1. Nakáadka Arduino WiFi

Nakïadka Arduino WiFi umoĝliwia podïÈczenie pïyty do dowolnej sieci bezprzewodowej typu 802.11b/g. Wykorzystuje moduï bezprzewodowy H&D Wireless HDG104, oferujÈcy uzyskanie zoptymalizowanego, energooszczÚdnego poïÈczenia radiowego. Nakïadka umoĝliwia komunikacjÚ za pomocÈ protokoïów TCP i UDP, a jej uĝycie jest bardzo proste i polega na zamontowaniu na pïycie Arduino i wpisaniu w szkicu kilku wierszy kodu wykorzystujÈcego bibliotekÚ WiFi. ’Èczówki nakïadki posiadajÈ w górnej czÚĂci gniazda, umoĝliwiajÈce ïatwe wykorzystanie pinów Arduino albo zaïoĝenie dodatkowych nakïadek. Oprócz obsïugi sieci bezprzewodowych w standardzie 802.11b/g nakïadka WiFi oferuje szyfrowanie WEP oraz WPA2. Po zaïadowaniu szkicu i skonfigurowaniu pïyty Arduino moĝna jÈ odïÈczyÊ od komputera, zasiliÊ z zewnÚtrznego ěródïa i zestawiÊ dwukierunkowÈ komunikacjÚ z dowolnego miejsca w zasiÚgu routera bezprzewodowego. Ale to nie wszystko. Nakïadka WiFi zawiera równieĝ slot na kartÚ microSD, który moĝe byÊ wykorzystany zarówno przez pïytÚ Arduino Uno, jak i Mega, dziÚki prostej w uĝyciu bibliotece SD. Jest to bardzo przydatna funkcjonalnoĂÊ, jeĝeli zamierzasz zapisaÊ dane, a nastÚpnie przesïaÊ je przez sieÊ. W podrozdziale 8.7 dowiesz siÚ dokïadnie, jak korzystaÊ z biblioteki SD. WaĪna informacja na temat pinów wejĞcia/wyjĞcia Nakáadka Arduino WiFi oraz czytnik kart SD komunikują siĊ z Arduino za pomocą szyny SPI (opisanej niĪej w podrozdziale 8.6), którą cechuje kilka istotnych szczegóáów związanych z wykorzystaniem pinów wejĞcia/wyjĞcia. W páycie Arduino Uno komunikacja jest realizowana na pinach nr 11, 12 i 13, natomiast w páycie Mega na pinach nr 50, 51 i 52. W obu páytach pin nr 10 jest uĪywany do wybrania do komunikacji ukáadu HDG104, natomiast pin nr 4 do wybrania czytnika karty SD. SprzĊtowy pin SS w páycie Mega (pin cyfrowy nr 53) nie jest uĪywany ani przez czytnik kart, ani przez ukáad HDG104, ale musi byü skonfigurowany jako wyjĞcie, aby interfejs SPI dziaáaá prawidáowo. Pin cyfrowy nr 7 jest uĪywany do przesyáania danych pomiĊdzy nakáadką WiFi a Arduino. Bardzo waĪne jest wiĊc, aby Īaden z wymienionych wyĪej pinów nie byá wykorzystywany do innych operacji wejĞcia/ wyjĞcia. I wreszcie poniewaĪ zarówno ukáad HDG104 w nakáadce WiFi, jak równieĪ czytnik kart SD korzystają z tej samej szyny SPI, tylko jeden z komponentów moĪe byü aktywny w danej chwili. JeĪeli wykorzystywane są oba, biblioteki SD oraz WiFi realizują ich obsáugĊ automatycznie. Ale jeĪeli jest wykorzystywany tylko jeden z nich, naleĪy jawnie odseparowaü drugi (jeĪeli nie jest uĪywany czytnik kard SD, naleĪy go rĊcznie odseparowaü), jak pokazuje przykáadowy kod.

Konstrukcja nakïadki WiFi jest starannie przemyĂlana i oprócz nawiÈzywania poïÈczeñ bezprzewodowych oferuje szereg przydatnych funkcjonalnoĂci. Jej budowa jest caïkowicie otwarta. Nakïadka jest wyposaĝona w port Micro-USB na potrzeby przyszïych aktualizacji wbudowanego oprogramowania. Zawiera równieĝ seriÚ diod LED dostarczajÈcych przydatnych informacji, takich jak status poïÈczenia (zielona dioda LINK), bïÚdy transmisji (czerwona dioda ERROR) i wysyïanie lub odbieranie danych (niebieska dioda DATA).

Kup książkę

Poleć książkę


190

ROZDZIAà 8. Komunikacja

JAK UĩYWAû NAKàADKI WIFI ZE STARSZYMI PàYTAMI ARDUINO?

Nakïadka WiFi wykorzystuje pin IOREF, dostÚpny w nowszych wersjach pïyty Arduino, do wykrywania napiÚcia odniesienia dla pinów wejĂcia/wyjĂcia, do których jest podïÈczona. Oznacza to, ĝe w przypadku zastosowania pïyty Arduino Uno lub Mega2560 w wersji wczeĂniejszej niĝ REV3 trzeba koniecznie zewrzeÊ piny nakïadki IOREF oraz 3.3V (pokazane na rysunku 8.4).

Rysunek 8.4. Ukáad pinów nakáadki WiFi

8.4.2. Biblioteka WiFi i jej funkcje

Biblioteka WiFi realizuje niskopoziomowÈ komunikacjÚ bezprzewodowÈ i obsïuguje wiele poleceñ i funkcjonalnoĂci oferowanych przez nakïadkÚ. W tym miejscu warto zapoznaÊ siÚ z tabelÈ 8.5, zawierajÈcÈ przeglÈd najwaĝniejszych funkcji z biblioteki WiFi. Po przejrzeniu tabeli 8.5 moĝesz przejĂÊ do opisu przykïadowego projektu, w którym przez sieÊ bezprzewodowÈ bÚdÈ przesyïane dane z czujnika gestów.

Kup książkę

Poleć książkę


191

8.4. ’ÈcznoĂÊ Wi-Fi Tabela 8.5. Przegląd funkcji klas WiFi, WiFiServer oraz WiFiClient Funkcja

Opis

WiFi.begin()

Inicjuje bibliotekĊ WiFi i rozpoczyna komunikacjĊ z urządzeniem. UmoĪliwia podáączenie do dowolnej otwartej sieci, jak równieĪ do sieci zabezpieczonej z szyfrowaniem WPA po podaniu identyfikatora SSID i hasáa oraz sieci z szyfrowaniem WEP po podaniu indeksu i klucza (w szyfrowaniu WEP mogą byü zastosowane cztery klucze, dlatego trzeba podaü jego indeks). Funkcja zwraca status poáączenia z siecią WiFi.

WiFi.begin(char[] ssid) WiFi.begin(char[] ssid, ´char[] haslo) WiFi.begin(char[] ssid, int iindeksKlucza, char[] klucz) WiFi.disconnect()

Odáącza siĊ od bieĪącej sieci.

WiFi.SSID()

Odczytuje identyfikator SSID bieĪącej sieci i zwraca go jako ciąg znaków typu String.

WiFi.BSSID(bssid)

Odczytuje adres MAC routera, z którym jest nawiązane poáączenie, i umieszcza go w 6-bajtowej tabeli przekazanej jako argument (na przykáad byte bssid[6]).

WiFi.RSSI()

Zwraca siáĊ sygnaáu poáączenia jako liczbĊ typu Long.

WiFi.encryptionType()

Zwraca rodzaj szyfrowania bieĪącego (lub wskazanego) punktu dostĊpowego. Zwracana wartoĞü jest typu byte. W przypadku szyfrowania TKIP (WPA) = 2, WEP = 5, CCMP (WPA) = 4, NONE = 7, AUTO = 8.

WiFi.encryptionType ´(wifiAccessPoint) WiFi.scanNetworks()

Zwraca wartoĞü typu byte zawierającą liczbĊ wykrytych sieci bezprzewodowych.

WiFi.getSocket()

Zwraca pierwsze dostĊpne gniazdo poáączenia.

WiFi.macAddress()

Zwraca 6-bajtową tabelĊ zawierającą adres MAC nakáadki WiFi.

WiFi.localIP()

Zwraca adres IP nakáadki (jako obiekt typu IPAddress).

WiFi.subnetMask()

Zwraca maskĊ podsieci nakáadki (jako obiekt typu IPAddress).

WiFi.gatewayIP()

Zwraca adres IP bramy (jako obiekt typu IPAddress).

WiFiServer(int port)

Tworzy serwer nasáuchujący na zadanym porcie.

WiFiServer.begin()

Uruchamia serwer oczekujący na komunikaty.

WiFiServer.available()

Zwraca obiekt klienta, jeĪeli są juĪ odebrane od niego dane.

WiFiServer.write(data)

Wysyáa dane (typu byte lub char) do wszystkich doáączonych klientów.

WiFiServer.print()

Wysyáa dane do wszystkich klientów. Liczby są wysyáane jako ciągi znaków ASCII, na przykáad liczba 123 jest wysyáana jako ciąg trzech znaków: ‘1’, ‘2’ i ‘3’.

WiFiServer.println()

Dziaáa podobnie jak WiFiServer.print(), ale dodatkowo wysyáa znak nowego wiersza na koĔcu kaĪdego komunikatu.

WiFiClient()

Tworzy obiekt klienta, który moĪe áączyü siĊ z okreĞlonym adresem IP i portem okreĞlonym w funkcji connect().

WiFiClient.connected()

Zwraca informacjĊ, czy klient jest poáączony z serwerem. JeĪeli poáączenie jest zamkniĊte, a jakieĞ dane wciąĪ nie są odczytane, funkcja zwróci wartoĞü true.

WiFiClient.connect(ip, port)

Nawiązuje poáączenie z okreĞlonym adresem IP i portem. Adres URL jest zamieniany na adres IP.

WiFiClient.connect(URL, port) WiFiClient.write(data)

Wysyáa dane (typu byte lub char) do serwera.

WiFiClient.print()

Wysyáa dane do klienta. Liczby są wysyáane jako ciągi znaków ASCII, na przykáad liczba 123 jest wysyáana jako ciąg trzech znaków: ‘1’, ‘2’ i ‘3’.

Kup książkę

Poleć książkę


192

ROZDZIAà 8. Komunikacja

Tabela 8.5. Przegląd funkcji klas WiFi, WiFiServer oraz WiFiClient — ciąg dalszy Funkcja

Opis

WiFiClient.println()

Dziaáa podobnie jak WiFiClient.print() , ale dodatkowo wysyáa znak nowego wiersza na koĔcu kaĪdego komunikatu.

WiFiClient.available()

Zwraca liczbĊ bajtów gotowych do odczytania (liczbĊ bajtów wysáanych przez serwer).

WiFiClient.read()

Odczytuje nastĊpny bajt odebrany z serwera.

WiFiClient.flush()

Usuwa wszystkie bajty wysáane do klienta, ale jeszcze przez niego nieodczytane.

WiFiClient.stop()

Zamyka poáączenie z serwerem.

8.4.3. Ruchy ciaáa i bezprzewodowe przyspieszeniomierze

W tym przykïadzie zastosujesz Arduino z funkcjÈ WiFi do bezprzewodowego przesyïania danych z przyspieszeniomierza. Przyspieszeniomierze to czujniki znakomicie nadajÈce siÚ do realizacji wszelkiego rodzaju interakcji za pomocÈ ruchów ciaïa. Moĝna dziÚki nim testowaÊ nowe scenariusze gier (jak w popularnych konsolach Nintendo Wii) lub po umieszczeniu ich na ciele tancerza wykorzystywaÊ jego ruchy do sterowania efektami wizualnymi i děwiÚkowymi. Przyspieszeniomierzy moĝna równieĝ uĝywaÊ do wspomagania osób niepeïnosprawnych fizycznie. Jak widzisz, jest mnóstwo praktycznych zastosowañ przyspieszeniomierzy i na pewno przychodzÈ Ci do gïowy kolejne. W tym przykïadzie bÚdÈ Ci potrzebne: Q Q Q

pïyta Arduino, nakïadka Arduino WiFi, przynajmniej jeden przyspieszeniomierz.

W przykïadzie uĝyjesz jÚzyka Processing do utworzenia serwera, za pomocÈ którego bÚdziesz przesyïaÊ i analizowaÊ dane z bezprzewodowych przyspieszeniomierzy. 8.4.4. àączenie komponentów

PodïÈczenie nakïadki WiFi jest bardzo proste i polega na zaïoĝeniu jej bezpoĂrednio na pïytÚ Arduino od jej wierzchniej strony. Sposób podïÈczenia przyspieszeniomierza jest róĝny i zaleĝy od zastosowanego modelu. Jeĝeli korzystasz z trójosiowego przyspieszeniomierza ADXL335 posiadajÈcego niezaleĝne wyjĂcia analogowe dla kaĝdej osi (x, y, z), poïÈcz go zgodnie z rysunkiem 8.5. Jeĝeli posiadasz inny model, poïÈczenia mogÈ byÊ podobne albo zamiast wejĂciowych pinów analogowych mogÈ byÊ zastosowane piny PWM. W przypadku zastosowania innego rodzaju przyspieszeniomierza zajrzyj do jego danych technicznych lub dokumentacji, jak go poprawnie podïÈczyÊ. Po podïÈczeniu nakïadki WiFi i przyspieszeniomierza moĝesz zaczÈÊ tañczyÊ rockand-rolla.

Kup książkę

Poleć książkę


193

8.4. ’ÈcznoĂÊ Wi-Fi

Rysunek 8.5. Schemat podáączenia przyspieszeniomierza analogowego do Arduino

8.4.5. Szkic do komunikacji Bluetooth

Do bezprzewodowego przesyïania z Arduino danych z przyspieszeniomierza do serwera dziaïajÈcego na Twoim komputerze uĝyjesz biblioteki WiFi. Zaraz, serwer na Twoim komputerze? Jak to zrobiÊ? Zastosujesz Ărodowisko programistyczne o nazwie Processing. Jeĝeli nie masz go zainstalowanego na swoim komputerze, otwórz stronÚ www.processing.org i pobierz najnowszÈ wersjÚ oprogramowania. Jeĝeli nie korzystaïeĂ wczeĂniej z tego Ărodowiska, nie przejmuj siÚ. Kod z listingu 8.4 wyglÈda znajomo i jest podobny do tego, który pisaïeĂ juĝ wczeĂniej. Ale najpierw zajmijmy siÚ stronÈ Arduino i poniĝszym kodem (listing 8.3). Listing 8.3. Kod klienta dla Arduino obsáugującego przyspieszeniomierz

#include <WiFi.h> char ssid[] = "nazwa_sieci"; Ustawienie nazwy sieci Ustawienie klucza sieci char pass[] = "klucz_sieci"; Ustawienie adresu serwera IPAddress server_address(192,168,0,1); Ustawienie portu serwera int server_port = 10000;

Kup książkę

Poleć książkę


194

ROZDZIAà 8. Komunikacja

int status = WL_IDLE_STATUS; WiFiClient client;

Obiekt klienta WiFi

void setup() { Serial.begin(9600); connectToNetwork(); }

Zestawienie poáączenia szeregowego Próba poáączenia z siecią

void connectToNetwork(){ while ( status != WL_CONNECTED) { Serial.print("Proba polaczenia z SSID: "); Serial.println(ssid); Poáączenie z siecią status = WiFi.begin(ssid, pass); Oczekiwanie na poáączenie z siecią delay(10000);

} printWifiStatus(); } void loop() { Sprawdzenie, czy jest poáączenie z siecią if(status == WL_CONNECTED){ if(!client.connected()) Poáączenie z serwerem { client.connect(server_address, server_port); delay(1000); } else { Serial.print("Polaczony, przesylanie danych do "); Serial.println(server_address); Odczyt i wysáanie client.print("x: "); bieĪących danych client.print(analogRead(0)); z przyspieszeniomierza client.print(" y: "); client.print(analogRead(1)); client.print(" z: "); client.println(analogRead(2)); } delay(20); Zwáoka 20 ms przed nastĊpną próbą poáączenia } else{ Serial.println("Siec WiFi niedostepna"); connectToNetwork(); } } void printWifiStatus() { Serial.print("SSID: "); Serial.println(WiFi.SSID()); IPAddress ip = WiFi.localIP(); Serial.print("Adres IP: "); Serial.println(ip); long rssi = WiFi.RSSI(); Serial.print("Sila sygnalu (RSSI): ");

Kup książkę

Poleć książkę


195

8.4. ’ÈcznoĂÊ Wi-Fi

}

Serial.print(rssi); Serial.println(" dBm");

Po zaimportowaniu potrzebnych bibliotek i okreĂleniu kilku szczegóïów dotyczÈcych konfiguracji sieci i serwera tworzony jest obiekt WiFiClient . NastÚpnie w funkcji setup inicjowana jest biblioteka obsïugujÈca transmisjÚ szeregowÈ na potrzeby diagnostyki , po czym podejmowana jest próba nawiÈzania poïÈczenia sieciowego za pomocÈ utworzonej funkcji connectToNetwork . Póěniej kod próbuje wybraÊ sieci WiFi za pomocÈ funkcji WiFi.begin i przez 10 sekund oczekuje na poïÈczenie . Potem nastÚpuje wejĂcie do gïównej pÚtli. Jeĝeli udaïo siÚ poïÈczyÊ z sieciÈ , ale nie ma jeszcze poïÈczenia z serwerem , podejmowana jest próba poïÈczenia siÚ z nim. Jeĝeli poïÈczenie z serwerem juĝ jest nawiÈzane, z przyspieszeniomierza odczytywane sÈ bieĝÈce dane i wysyïane do serwera . W listingu 8.4 przejdziemy do Ărodowiska Processing i utworzymy serwer, który bÚdzie przyjmowaï poïÈczenia przychodzÈce od klientów (Arduino) i wyĂwietlaï na ekranie odbierane komunikaty. Aby dowiedzieÊ siÚ nieco wiÚcej na temat Ărodowiska Processing, zajrzyj do podrozdziaïu 13.2. Listing 8.4. Szkic Processing odbierający od klienta Arduino dane z przyspieszeniomierza

import processing.net.*;

Import biblioteki sieciowej Processing

int direction = 1; Ustawienie kierunku tekstu boolean serverRunning = false; Utworzenie ciągu dla danych z przyspieszeniomierza String currentData = ""; Server myServer;

Utworzenie obiektu serwera

void setup() { Ustawienie wielkoĞci okna size(400, 400); textFont(createFont("SansSerif", 16)); Inicjalizacja serwera myServer = new Server(this, 10000); serverRunning = true; printData(); } void printData() { background(0); text("Dane z bezprzewodowego przyspieszeniomierza: ", 15, 25); text(currentData, 15, 60); } void draw() { Sprawdzenie komunikatów od klienta Client thisClient = myServer.available(); if (thisClient != null) { if (thisClient.available() > 0) { Rozpakowanie currentData = "komunikat od: " + thisClient.ip() + " : " + i wyĞwietlenie thisClient.readString(); danych printData();

Kup książkę

Poleć książkę


196

ROZDZIAà 8. Komunikacja }

}

}

Po skonfigurowaniu w funkcji setup okna i czcionki do wyĂwietlania danych tworzona jest instancja serwera oczekujÈcego na poïÈczenia przychodzÈce od klientów . Funkcja draw, podobna do funkcji loop Arduino, bez przerwy sprawdza, czy nadeszïy poïÈczenia od klientów . Jeĝeli tak, wyodrÚbnia komunikat (funkcja thisClient.readString()), doïÈcza do niego dodatkowe informacje, na przykïad adres IP klienta, i wyĂwietla w oknie . 8.4.6. Zaáadowanie i test szkicu

To wszystko, co trzeba zrobiÊ w tym projekcie. Kliknij przycisk Run w Ărodowisku Processing. Na ekranie pojawi siÚ okno i uruchomi serwer. Zaïaduj szkic do Arduino. Jeĝeli Twoja sieÊ jest skonfigurowana prawidïowo (Arduino i komputer znajdujÈ siÚ w tej samej sieci WiFi i w szkicu podaïeĂ jako adres serwera adres IP swojego komputera), w oknie programu Processing powinny zaczÈÊ pojawiaÊ siÚ wartoĂci odbierane z przyspieszeniomierza. Jeĝeli masz ochotÚ na wiÚcej, dobrym poczÈtkiem moĝe byÊ wyodrÚbnienie z odebranego ciÈgu znaków poszczególnych danych z przyspieszeniomierza i przedstawienie ich w trójwymiarowym (x, y, z) widoku na ekranie.

8.5. Bezprzewodowa áącznoĞü Bluetooth ’ÈcznoĂÊ WiFi nie jest jedynÈ dostÚpnÈ formÈ bezprzewodowej komunikacji komputera i Arduino. InnÈ dobrÈ opcjÈ jest Bluetooth, bezprzewodowa technologia popularnie stosowana w sïuchawkach do telefonów komórkowych i urzÈdzeniach peryferyjnych. Technologia Bluetooth zostaïa opracowana przez firmÚ Ericsson jako otwarty standard, bÚdÈcy alternatywÈ do tradycyjnej przewodowej komunikacji szeregowej. Z zaïoĝenia sïuĝy do ïÈcznoĂci na niewielkich odlegïoĂciach, tj. jej zasiÚg i prÚdkoĂÊ transmisji sÈ ograniczone. Niemniej jednak w wiÚkszoĂci przypadków zapewnia wystarczajÈcÈ prÚdkoĂÊ, jakoĂÊ i bezpieczeñstwo transmisji. Poniewaĝ urzÈdzenia Bluetooth sÈ widoczne w systemie operacyjnym jako wirtualne porty szeregowe (na rysunku 8.6 wewnÚtrzne urzÈdzenie Bluetooth w laptopie z systemem Windows jest widoczne na liĂcie urzÈdzeñ Ărodowiska Arduino IDE jako zwykïy port szeregowy), przesyïanie danych z Arduino jest bardzo proste. Stosowane sÈ te same polecenia jak w zwykïej komunikacji szeregowej. Oznacza to, ĝe niezaleĝnie od tego, czy Twój szkic wysyïa dane do komputera przez standardowe ïÈcze USB, czy Bluetooth, kod pozostaje ten sam. My uwielbiamy takÈ przenoĂnoĂÊ kodu. 8.5.1. Páyta ArduinoBT

Pïyta ArduinoBT (przedstawiona na rysunku 8.7) jest to Arduino z wbudowanym moduïem Bluetooth do komunikacji bezprzewodowej. Pïyta moĝe pracowaÊ przy minimalnym napiÚciu zasilajÈcym 1,2 V, dziÚki czemu oszczÚdzana jest bateria. W odróĝnieniu

Kup książkę

Poleć książkę


197

8.5. Bezprzewodowa ïÈcznoĂÊ Bluetooth

Rysunek 8.6. Widok przedstawiający urządzenie Bluetooth komputera jako port szeregowy

Rysunek 8.7. ArduinoBT, czyli páyta Arduino z wbudowanym moduáem Bluetooth

od innych modeli z podobnymi ukïadami ATmega, pïyta ArduinoBT posiada dwa dodatkowe wejĂcia analogowe (razem 8), ale nie sÈ do nich przylutowane ïÈczówki. Aby wykorzystaÊ dodatkowe wejĂcia, naleĝy bezpoĂrednio do ich wyprowadzeñ przylutowaÊ przewody lub dwie dodatkowe ïÈczówki (zalecany sposób). UWAGA: Nie wolno uĝywaÊ pinu nr 7, poniewaĝ sïuĝy wyïÈcznie do resetowania

moduïu.

Kup książkę

Poleć książkę


198

ROZDZIAà 8. Komunikacja

8.5.2. Dodawanie moduáu Bluetooth

Jeĝeli nie posiadasz pïyty ArduinoBT lub w projekcie musi byÊ uĝyty inny model pïyty Arduino, to nie jesteĂ jedynym, który znalazï siÚ w takiej sytuacji. DostÚpnych jest wiele moduïów Bluetooth, na przykïad z serii BlueSMiRF (zalecanej), oferowanej przez SparkFun. Moduïy z tej serii doïÈcza siÚ do linii szeregowych RX/TX Arduino, a wiÚc w bardzo prosty sposób. Jak przedstawia rysunek 8.8, wystarczy po prostu poïÈczyÊ pin Vcc moduïu z pinem 5 V Arduino, a nastÚpnie piny GND obu ukïadów. Na koniec naleĝy poïÈczyÊ linie komunikacyjne, tj. pin RX moduïu BlueSMiRF z pinem TX pïyty Arduino oraz TX moduïu z RX pïyty.

Rysunek 8.8. Schemat poáączenia moduáu BlueSMiRF Silver z Arduino

UWAGA: Poniewaĝ moduï Bluetooth przejmuje sterowanie liniami RX/TX Arduino, naleĝy go odïÈczyÊ przed zaïadowaniem szkicu do pïyty przez ïÈcze USB.

8.5.3. Nawiązywanie poáączenia Bluetooth

Pierwszym krokiem w uruchamianiu komunikacji Bluetooth jest skojarzenie Arduino z komputerem. Na tym etapie komputer tworzy wirtualny port szeregowy do komunikacji z Arduino za pomocÈ Bluetooth. Wiele dzisiejszych laptopów jest wyposaĝonych

Kup książkę

Poleć książkę


199

8.5. Bezprzewodowa ïÈcznoĂÊ Bluetooth

we wbudowany moduï Bluetooth, ale jeĝeli Twój komputer go nie posiada, moĝesz zakupiÊ moduï Bluetooth z ïÈczem USB za niecaïe 150 zï — jest to znakomity prezent dla kaĝdego hobbisty i miïoĂnika Arduino. Proces kojarzenia pïyty ArduinoBT z komputerem jest róĝny i zaleĝy od systemu operacyjnego, ale ustawienia sÈ takie same. Jeĝeli uĝywasz ArduinoBT, musisz odszukaÊ w systemie urzÈdzenie o nazwie ARDUINOBT — lub inne o podobnej nazwie, jeĝeli posiadasz zewnÚtrzny moduï Bluetooth — a nastÚpnie poïÈczyÊ siÚ z nim, uĝywajÈc kodu 1234. To wszystko. Powinien pojawiÊ siÚ komunikat o nawiÈzaniu poïÈczenia Bluetooth pomiÚdzy komputerem a Arduino. Teraz moĝesz korzystaÊ ze Ărodowiska Arduino IDE w zwykïy sposób. 8.5.4. Szkic do komunikacji Bluetooth

Kod dla Arduino z funkcjonalnoĂciÈ Bluetooth niczym siÚ nie róĝni od kodu wykorzystujÈcego ïÈcze USB. PamiÚtaj, ĝe moduï Bluetooth jest widoczny w systemie operacyjnym jako wirtualny port szeregowy, wiÚc moĝesz uĝywaÊ dokïadnie takich samych znanych Ci poleceñ Serial.print. Jedynym szczegóïem, o którym musisz pamiÚtaÊ, jest koniecznoĂÊ ustawienia takiej samej prÚdkoĂci transmisji pomiÚdzy Arduino a moduïem Bluetooth komputera. W przypadku pïyty ArduinoBT jest to 115 200 bodów. W funkcji setup musisz ustawiÊ odpowiedniÈ prÚdkoĂÊ przy otwieraniu poïÈczenia szeregowego, na przykïad poleceniem Serial.begin(115200). Kod przedstawiony na listingu 8.5 nie robi niczego wyjÈtkowego, ale pokazuje, jak prosty moĝe byÊ szkic wykorzystujÈcy komunikacjÚ Bluetooth. Konfigurowana jest odpowiednia prÚdkoĂÊ transmisji, po czym co sekundÚ jest rozsyïany przez bezprzewodowy port szeregowy komunikat zawierajÈcy losowÈ liczbÚ. CiekawÈ cechÈ kodu jest moĝliwoĂÊ uĝycia go w Twoich obecnych projektach. Wystarczy tylko zmieniÊ polecenia print i moĝna wysyïaÊ odczyty z dowolnego czujnika zastosowanego w projekcie. Listing 8.5. Szkic testowy Bluetooth

void setup(){ Serial.begin(115200); } void loop(){ Serial.print(random(1024)); delay(1000); }

UWAGA: Jeĝeli komunikaty nie sÈ wysyïane poprawnie, sprawdě prÚdkoĂÊ transmisji. Niektóre moduïy Bluetooth mogÈ stosowaÊ prÚdkoĂÊ 9600 bodów lub innÈ.

Gratulacje, poznaïeĂ juĝ wiÚkszoĂÊ sposobów komunikacji przewodowej i bezprzewodowej dostÚpnych w Arduino. Komunikacja jest jednak szerokim pojÚciem, a przesyïanie danych przez sieÊ nie jest jej jedynÈ moĝliwÈ formÈ. W kolejnych czÚĂciach

Kup książkę

Poleć książkę


200

ROZDZIAà 8. Komunikacja

rozdziaïu poznasz ciekawy kanaï komunikacyjny o nazwie SPI (ang. Serial Peripheral Interface, szeregowy interfejs urzÈdzeñ peryferyjnych). Jest to bardzo skuteczna metoda komunikacji Arduino z innymi urzÈdzeniami.

8.6. Interfejs SPI Interfejs SPI jest to protokóï synchronicznej transmisji danych, umoĝliwiajÈcy szybkÈ komunikacjÚ na niewielkich odlegïoĂciach pomiÚdzy kilkoma mikrokontrolerami i urzÈdzeniami peryferyjnymi. Zastosowana jest w nim analogia do pana i niewolnika (master – slave), gdzie jedno z urzÈdzeñ (zazwyczaj mikrokontroler) jest typu master i steruje doïÈczonymi urzÈdzeniami peryferyjnymi typu slave. Zazwyczaj komunikacja SPI jest realizowana za pomocÈ trzech linii: Q Q Q

MISO — wejĂcie urzÈdzenia master, wyjĂcie urzÈdzenia slave; MOSI — wyjĂcie urzÈdzenia master, wejĂcie urzÈdzenia slave; SCK — linia zegara.

Dziaïanie tych trzech linii jest doĂÊ proste: linia MISO sïuĝy do przesyïania danych z urzÈdzenia slave do urzÈdzenia master, linia MOSI z urzÈdzenia master do urzÈdzenia slave, a SCK (oznaczana niekiedy SCLK lub Clock) jest sygnaïem zegara synchronizujÈcym transmisjÚ danych. Kaĝde urzÈdzenie peryferyjne posiada równieĝ pin SS (ang. slave select, wybór urzÈdzenia slave), który moĝe byÊ uĝyty do wybrania urzÈdzenia do komunikacji. Pojawienie siÚ poziomu niskiego (LOW) na pinie SS informuje urzÈdzenie slave, ĝe nastÈpi komunikacja z urzÈdzeniem master, natomiast stan wysoki (HIGH) oznacza, ĝe naleĝy zignorowaÊ komunikacjÚ. DziÚki pinowi SS moĝna podïÈczyÊ kilka urzÈdzeñ wykorzystujÈcych te same trzy linie komunikacyjne i przeïÈczaÊ siÚ na jedno z nich w danej chwili poprzez ustawienie odpowiednio stanu wysokiego lub niskiego. Rysunek 8.9 zawiera obrazowe przedstawienie komunikacji SPI. PrzydatnÈ cechÈ komunikacji SPI jest niezaleĝnoĂÊ linii MISO oraz MOSI, dziÚki czemu moĝna ich uĝywaÊ jednoczeĂnie (w odróĝnieniu od innych protokoïów, na przykïad I2C, wykorzystujÈcych jednÈ liniÚ do komunikacji w obu kierunkach). Przy konfigurowaniu poïÈczenia SPI w Arduino skorzystaj Rysunek 8.9. Kanaá komunikacyjny SPI z tabeli 8.6. 8.6.1. Biblioteka SPI

Aby uïatwiÊ Ci pracÚ, przyjaciele z Arduino stworzyli bibliotekÚ SPI, dziÚki której moĝesz szybko skonfigurowaÊ komunikacjÚ. Tabela 8.7 zawiera listÚ funkcji z tej biblioteki, z których bÚdziesz korzystaÊ podczas komunikacji z urzÈdzeniami za pomocÈ protokoïu SPI.

Kup książkę

Poleć książkę


201

8.6. Interfejs SPI Tabela 8.6. Opis linii SPI páyty Arduino Pin Arduino (oprócz modelu Mega)

Pin Arduino Mega

Slave select (wybór urządzenia slave) lub chip select (wybór ukáadu) (SS/CS)

10

53

WyjĞcie urządzenia master, wejĞcie urządzenia slave lub wejĞcie szeregowe (MOSI/SDI)

11

51

WejĞcie urządzenia master, wyjĞcie urządzenia slave lub wyjĞcie szeregowe (MISO/SDO)

12

50

Sygnaá zegara (SCK/SCLK)

13

52

Linia SPI

Tabela 8.7. Funkcje biblioteki SPI Funkcja

Opis

begin()

Inicjuje szynĊ SPI, ustawia piny SCK, MOSI oraz SS jako wyjĞcia (stan niski na SCK i MOSI, wysoki na SS).

end()

Blokuje szynĊ SPI.

setBitOrder(kolejnoħè)

Ustawia kolejnoĞü przesuwania bitów podczas wysyáania i odbierania danych przez szynĊ SPI. Dopuszczalne parametry to LSBFIRST (least-significant bit first, najpierw najmniej znaczący bit) i MSBFIRST (most-significant bit first, najpierw najbardziej znaczący bit).

setClockDivider(amt)

Ustawia dzielnik zegara SPI w odniesieniu do zegara systemowego. DomyĞlną wartoĞcią jest 4 (jedna czwarta czĊstotliwoĞci zegara systemowego). Inne dopuszczalne wartoĞci to 2, 4, 8, 16, 32, 64 i 128.

byte transfer(dane)

Przesyáa przez szynĊ SPI jeden bajt danych w obu kierunkach. Parametr dane oznacza bajt do wysáania. Funkcja zwraca bajt odczytany z szyny.

setDataMode(tryb)

Ustawia tryb zegara (biegunowoĞü i fazĊ). Dopuszczalne wartoĞci to SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3.

Po zapoznaniu siÚ z powyĝszymi funkcjami moĝesz przystÈpiÊ do podïÈczania urzÈdzenia peryferyjnego do Arduino i nawiÈzaÊ z nim komunikacjÚ przez interfejs SPI. 8.6.2. Urządzenia SPI i potencjometry cyfrowe

Za pomocÈ interfejsu SPI mogÈ komunikowaÊ siÚ urzÈdzenia róĝnego typu, poczÈwszy od kolorowych wyĂwietlaczy LCD, poprzez magnetometry, na sterowanych kolorowych panelach LED skoñczywszy. Opisana wczeĂniej nakïadka Ethernet i czytnik kart SD równieĝ wykorzystujÈ interfejs SPI do komunikacji z Arduino. Podstawowa zasada komunikacji w przypadku wszystkich wyĝej wymienionych urzÈdzeñ jest taka sama. Dlatego w celu zademonstrowania zastosowania interfejsu SPI uĝyjemy potencjometru cyfrowego AD5206 firmy Analog Devices. Potencjometry cyfrowe sÈ bardzo podobne do swoich analogowych odpowiedników, których uĝywamy na co dzieñ, z tym jednym wyjÈtkiem, ĝe sÈ regulowane elektronicznie, a nie rÚcznie. Model AD5206 zawiera szeĂÊ wbudowanych niezaleĝnych potencjometrów, z których moĝna jedoczeĂnie korzystaÊ. Na rynku dostÚpnych jest równieĝ wiele potencjometrów w innych konfiguracjach.

Kup książkę

Poleć książkę


202

ROZDZIAà 8. Komunikacja

W tym przykïadzie wykorzystamy cztery wbudowane potencjometry do sterowania jasnoĂciÈ czterech niezaleĝnych diod LED. Jak zapewne siÚ domyĂlasz, potencjometr cyfrowy moĝe byÊ uĝyty do sterowania dowolnym urzÈdzeniem wymagajÈcym zmieniajÈcego siÚ napiÚcia. Przejděmy zatem do rzeczy i zobaczmy, jak poïÈczyÊ ze sobÈ wszystkie elementy. 8.6.3. Schemat ukáadu i poáączenia elementów

PierwszÈ rzeczÈ, którÈ musisz zrobiÊ, jest sprawdzenie danych technicznych zastosowanego potencjometru cyfrowego. Komunikacja SPI wymaga czterech pinów (MOSI/ SDI, MISO/SDO, SS/CS oraz SCK), musisz wiÚc je odnaleěÊ na swoim potencjometrze, korzystajÈc z dokumentacji. Schemat na rysunku 8.10 przedstawia ukïad pinów potencjometru cyfrowego AD5206 oraz sposób jego poïÈczenia z Arduino i diodami LED.

Rysunek 8.10. Cztery diody LED sterowane za pomocą cyfrowego potencjometru AD5206

Najpierw musisz wykonaÊ poïÈczenia zasilajÈce. PoïÈcz pin VDD potencjometru AD5206 z pinem 5 V Arduino, jak równieĝ poïÈcz ze sobÈ piny GND. NastÚpnie poïÈcz pin VSS potencjometru AD5206 z pinem GND Arduino. Po wykonaniu gïównych poïÈczeñ zasilajÈcych moĝesz zajÈÊ siÚ poïÈczeniami SPI. Najpierw poïÈcz pin CS potencjometru (ang. chip/slave select) z pinem cyfrowym nr 10 pïyty Arduino, a nastÚpnie pin SDI (MOSI) potencjometru z pinem cyfrowym nr 11 Arduino. Poniewaĝ bÚdziesz korzystaÊ tylko z linii MOSI, nie musisz podïÈczaÊ pinu MISO (SDO).

Kup książkę

Poleć książkę


203

8.6. Interfejs SPI

Pozostaï tylko pin SCK, wymagany w komunikacji SPI, zatem podïÈcz go do pinu cyfrowego nr 13 pïyty Arduino. To jest wszystko, co dotyczy zasilania ukïadów i komunikacji SPI. Trzeba jeszcze wykonaÊ poïÈczenia potencjometrów. Na rysunku 8.10 kaĝdy z szeĂciu potencjometrów posiada trzy piny, na przykïad A1, B1 oraz W1. Moĝesz je traktowaÊ jak koñcówki zwykïego potencjometru. Wszystkie piny A podïÈcz do pinu 5 V pïyty Arduino, wszystkie piny B do pinu GND. Piny W to suwaki, na których pojawia siÚ zmieniajÈce siÚ napiÚcie. Piny te podïÈcz do dodatnich koñcówek (anod) diod LED poprzez rezystor (wartoĂÊ 220 ȍ powinna byÊ odpowiednia, ale moĝesz jÈ obliczyÊ, aby uzyskaÊ odpowiedniÈ jasnoĂÊ konkretnych zastosowanych diod LED). PodïÈcz ujemne koñcówki (katody) diod LED do pinu GND Arduino i gotowe! Teraz przyjrzyjmy siÚ prostemu szkicowi zmniejszajÈcemu i zwiÚkszajÈcemu jasnoĂÊ diod LED i zobaczmy potencjometry cyfrowe w akcji. 8.6.4. Szkic cyfrowego sterownika diod LED

Po poïÈczeniu wszystkich elementów czas na uruchomienie potencjometrów cyfrowych. W poniĝszym szkicu kolejno regulowana jest jasnoĂÊ kaĝdej diody. W tym celu kaĝda z nich jest niezaleĝnie wybierana za pomocÈ interfejsu SPI. Skopiuj dokïadnie listing 8.6 do Ărodowiska Arduino IDE. Listing 8.6. Potencjometry cyfrowe do regulacji jasnoĞci diod LED za pomocą interfejsu SPI

#include <SPI.h> Import biblioteki SPI const int slaveSelectPin = 10; OkreĞlenie pinu slave select int numLeds = 4; void setup() { Ustawienie pinu slave select jako wyjĞcia pinMode(slaveSelectPin, OUTPUT); Wáączenie komunikacji SPI SPI.begin(); } void setLed(int reg, int level) { Ustawienie stanu niskiego na pinie slave select digitalWrite(slaveSelectPin, LOW); Wybranie rejestru SPI.transfer(reg); Wysáanie danych SPI.transfer(level); Ustawienie stanu wysokiego na pinie slave select digitalWrite(slaveSelectPin, HIGH); } void loop() { for(int i=0; i<numLeds; i++) { for (int j=50; j<=255; j++) { setLed(i,j); delay(20); }

Kup książkę

Poleć książkę


204

ROZDZIAà 8. Komunikacja delay(500); for (int j=255; j>=50; j--) { setLed(i,j); delay(20); } }

}

Po zaimportowaniu biblioteki SPI i zadeklarowaniu zmiennych konfigurowany jest jako wyjĂcie pin wyboru urzÈdzenia slave . NastÚpnie za pomocÈ funkcji begin nawiÈzywana jest komunikacja SPI . Sterowanie diodÈ LED za pomocÈ interfejsu SPI jest procesem zïoĝonym z czterech kroków, dlatego w tym celu utworzona zostaïa funkcja setLed(), która wykonuje wszystkie kroki przy kaĝdym wywoïaniu: 1. Na pinie SS jest ustawiany stan niski (LOW) w celu wybrania urzÈdzenia slave, z którym bÚdzie nawiÈzana komunikacja . NastÚpnie interfejs SPI oczekuje dwóch komunikatów: jednego z informacjÈ o rejestrze, który zostanie uĝyty, a drugi z wpisywanÈ do rejestru wartoĂciÈ. 2. Potencjometr AD5206 posiada szeĂÊ rejestrów, a diody LED sÈ doïÈczone do rejestrów o numerach 0 – 3. Moĝna wiÚc wywoïaÊ funkcjÚ SPI.transfer() z parametrem oznaczajÈcym numer diody LED (0 – 3), która ma byÊ wysterowana . 3. Funkcja SPI.transfer() jest wywoïywana ponownie z liczbÈ (0 – 255) okreĂlajÈcÈ jasnoĂÊ diody . Ukïad AD5206 zawiera cyfrowe potencjometry 8-bitowe, dlatego maksymalna wartoĂÊ jasnoĂci jest równa 255. 4. Po przesïaniu danych moĝna na wyjĂciu SS ustawiÊ stan wysoki (HIGH) i to wszystko . W funkcji loop() wybierana jest kolejno kaĝda dioda i co 20 milisekund jej jasnoĂÊ jest zwiÚkszana, a nastÚpnie co 20 milisekund zmniejszana. Moĝesz dowolnie zmieniaÊ kod i uzyskiwaÊ przy uĝyciu diod LED inne ciekawe efekty wizualne. To wszystko na temat kodu. Zaïaduj szkic do Arduino i diody powinny zmieniaÊ jasnoĂÊ wraz ze zmieniajÈcym siÚ napiÚciem bez rÚcznego sterowania i bez uĝycia sygnaïu PWM. Gratulacje! PoznaïeĂ wïaĂnie jedno z bardziej zaawansowanych zastosowañ Arduino. Teraz przyjrzymy siÚ innemu waĝnemu obszarowi, czÚsto wykorzystujÈcemu komunikacjÚ SPI: logowaniu danych.

8.7. Rejestrowanie danych Czujniki doskonale nadajÈ siÚ do zbierania danych o stanie jakiejĂ rzeczy. Ale jak zmieniajÈ siÚ wskazania czujnika w czasie i czy ta informacja jest przydatna? Zastanówmy siÚ na chwilÚ nad muzykÈ. Muzyka to zjawisko fizyczne, które moĝna traktowaÊ jako ciÈg zdarzeñ pojawiajÈcych siÚ w okreĂlonym przedziale czasu. Kaĝde

Kup książkę

Poleć książkę


205

8.7. Rejestrowanie danych

zdarzenie moĝe mieÊ róĝne cechy, takie jak ton (okreĂlajÈcy, jak wysoka lub niska jest nuta), amplitudÚ (gïoĂnoĂÊ) i barwÚ (jakoĂÊ), opisujÈce brzmienie kaĝdej nuty lub děwiÚku. Kaĝda nuta lub zdarzenie z osobna nie stanowi muzyki. Dopiero gdy sÈ kolejno odgrywane, zgodnie z kompozycjÈ, tworzone sÈ pomiÚdzy nimi róĝne relacje. Powstaje melodia i rytm, w przestrzeni tworzone sÈ struktury wyĝszego rzÚdu. Nawet amator z „dÚbowym” uchem z ïatwoĂciÈ rozpozna te relacje. Chociaĝ nie moĝemy ich opisaÊ przy uĝyciu terminów muzycznych, potrafimy je odczuÊ i wyraziÊ. Jest tak dlatego, ĝe ludzki mózg posiada pamiÚÊ dïugo- i krótkoterminowÈ, mogÈcÈ przechowywaÊ relacje miÚdzy odgrywanymi děwiÚkami, a nawet porównywaÊ je z relacjami w bibliotece děwiÚków usïyszanych w przeszïoĂci. Nasze mózgi mogÈ przypomnieÊ sobie i poïÈczyÊ zdarzenia! Podobnie jeĝeli chcesz poznaÊ strukturÚ i relacje wyĝszego rzÚdu pomiÚdzy danymi odbieranymi z czujników, musisz je zbieraÊ przez pewien okres czasu, a potem przeanalizowaÊ. W tej czÚĂci rozdziaïu przyjrzymy siÚ, jak rejestrowaÊ dane za pomocÈ Arduino. 8.7.1. Rodzaje pamiĊci

Aby rejestrowaÊ dane lokalnie na Arduino, musisz mieÊ gdzie je zapisaÊ. Zazwyczaj wykorzystuje siÚ w tym celu jakÈĂ zewnÚtrznÈ pamiÚÊ, na przykïad w Twoim komputerze, telefonie komórkowym lub pendrivie. PamiÚÊ zewnÚtrzna ma tÚ cennÈ cechÚ, ĝe dane w niej zapisane pozostajÈ zapamiÚtane nawet po wyïÈczeniu zasilania. Ta zasada dotyczy równieĝ wbudowanej w Arduino pamiÚci EEPROM. ZawartoĂÊ pamiÚci EEPROM jest przechowywana nawet po wyïÈczeniu zasilania Arduino, ale jej wielkoĂÊ jest bardzo ograniczona. W zaleĝnoĂci od modelu pïyty dostÚpnych jest od 512 do 4096 bajtów. Dlatego pamiÚÊ EEPROM nadaje siÚ do przechowywania zmiennych i niewielkich iloĂci danych, które muszÈ byÊ dostÚpne pomiÚdzy kolejnymi wïÈczeniami Arduino, ale nie nadaje siÚ do wiÚkszoĂci zastosowañ obejmujÈcych rejestrowanie danych. Dlatego czÚsto bÚdziesz korzystaÊ z zewnÚtrznych rozwiÈzañ, takich jak karta SD (ang. Secure Digital, bezpieczny cyfrowy zapis) lub pamiÚÊ USB. 8.7.2. Karty SD i biblioteka SD

Uĝycie karty SD jest jednym z najlepszych sposobów przechowywania danych w pamiÚci zewnÚtrznej. DostÚpne sÈ karty o duĝych pojemnoĂciach, oferujÈcych mnóstwo przestrzeni nie tylko na rejestrowane dane, ale równieĝ na innego rodzaju pliki (na przykïad muzykÚ lub obrazy). Dla pïyty Arduino jest dostÚpna biblioteka SD, dziÚki której odczytywanie i zapis danych na karcie SD sÈ proste. Tabela 8.8 zawiera przeglÈd najwaĝniejszych funkcji klasy SD z biblioteki SD, ale dostÚpnych jest znacznie wiÚcej funkcji klasy File, sïuĝÈcych do odczytu i zapisu plików. Tabela 8.9 zawiera listÚ najwaĝniejszych funkcji tej klasy, natomiast peïna lista jest dostÚpna w dokumentacji w Internecie pod adresem www.arduino.cc/en/Reference/SD. Niezaleĝnie od tego, czy uĝywasz nakïadki SD, czy czytnika wbudowanego w nakïadkÚ Ethernet, biblioteki SD uĝywa siÚ w taki sam sposób. Jeĝeli dobrze znasz funkcje opisane wczeĂniej, to jesteĂ w peïni gotowy do napisania szkicu rejestrujÈcego rzeczywiste dane.

Kup książkę

Poleć książkę


206

ROZDZIAà 8. Komunikacja

Tabela 8.8. Funkcje klasy SD z biblioteki SD Funkcja

Opis

begin(chipSelect)

Inicjuje bibliotekĊ SD i kartĊ, opcjonalnie moĪna wskazaü pin do wyboru ukáadu.

exists()

Sprawdza, czy plik lub katalog istnieje na karcie SD.

mkdir("/katalog/do/utworzenia") rmdir("/katalog/do/usuniecia")

Tworzy lub usuwa katalog z karty SD.

open("plik/do/otwarcia", tryb) remove("plik/do/usuniecia")

Otwiera lub usuwa plik o zadanej ĞcieĪce. Przy otwieraniu pliku moĪna okreĞliü tryb FILE_READ (odczyt) lub FILE_WRITE (zapis), jeĪeli zachodzi potrzeba ograniczenia do niego dostĊpu tylko do odczytu lub tylko do zapisu.

Tabela 8.9. Funkcje klasy File z biblioteki SD Funkcja

Opis

available()

Sprawdza, czy w pliku dostĊpne są bajty do odczytu.

close()

Zamyka plik i sprawdza, czy wszystkie dane zostaáy zapisane na karcie SD.

flush()

Zapisuje fizycznie dane na karcie SD. Funkcja wykorzystywana przez close().

print() println() write()

Zapisuje dane do pliku.

read()

Odczytuje bajt z pliku.

8.7.3. Szkic rejestrujący na karcie SD dane z czujnika

W tej czÚĂci rozdziaïu utworzysz prosty szkic rejestrujÈcy w pliku na karcie SD dane z czujnika doïÈczonego do jednego z wejĂÊ analogowych (nr 0). Listing 8.7 przedstawia taki przykïadowy szkic. Listing 8.7. Rejestrator danych na karcie SD

#include <SD.h>

Doáączenie biblioteki SD

const int chipSelect = 4; void setup() { Serial.begin(9600); Zainicjowanie portu szeregowego do diagnostyki Serial.print("Inicjalizacja karty SD..."); pinMode(10, OUTPUT); Ustawienie domyĞlnego pinu slave select jako wyjĞcia if (!SD.begin(chipSelect)) { Serial.println("Blad karty lub karta niedostepna"); return; } Serial.println("Karta zainicjowana.");

Sprawdzenie karty SD

} void loop() {

Kup książkę

Poleć książkę


207

8.8. Serwis Xively String dataString = ""; int data = analogRead(0); dataString += String(sensor);

Utworzenie zmiennej String na dane z czujnika Odczyt danych z czujnika i zapisanie w dataString

File dataFile = SD.open("datalog.txt", FILE_WRITE); Otwarcie pliku, zapis

danych i zamkniĊcie if (dataFile) { dataFile.println(dataString); dataFile.close(); Serial.println(dataString); WyĞwietlenie danych } na monitorze w celu diagnostyki else { Serial.println("Blad otwarcia pliku datalog.txt"); }

}

Rejestrowanie danych nie moĝe juĝ byÊ prostsze. Najpierw musisz sprawdziÊ, czy karta SD jest dostÚpna . Jeĝeli tak, wszystko jest gotowe do dziaïania, a jeĝeli karta nie jest dostÚpna, nastÚpuje powrót z programu. Po skonfigurowaniu karty moĝna zaczÈÊ wykonywaÊ gïównÈ pÚtlÚ, utworzyÊ obiekt typu String do przechowywania danych , a nastÚpnie odczytaÊ bieĝÈce dane z czujnika i umieĂciÊ je w tym obiekcie . Dalej ma miejsce otwarcie pliku, zapisanie w nim danych i zamkniÚcie . Na potrzeby diagnostyki bïÚdów moĝesz dane wyĂwietliÊ na monitorze portu szeregowego . Do wejĂcia analogowego moĝesz doïÈczyÊ dowolny czujnik, na przykïad potencjometr, czujnik temperatury lub dalmierz ultraděwiÚkowy. Gdy dane zostanÈ zapisane, umieĂÊ kartÚ SD w czytniku swojego komputera i otwórz plik w dowolnym edytorze tekstowym lub Ărodowisku programistycznym. Teraz moĝesz przedstawiÊ dane w graficznej formie, dziÚki której z pewnoĂciÈ lepiej poznasz ich przebieg. Jeĝeli chcesz udostÚpniÊ zarejestrowane dane na zewnÈtrz, to przekazywanie karty SD nie jest najlepszym sposobem. Do tego celu moĝesz uĝyÊ serwisu Xively, usïugi internetowej do udostÚpniania bieĝÈcych danych uĝytkownikom na caïym Ăwiecie.

8.8. Serwis Xively Xively, dawniej Pachube, jest bardzo interesujÈcym otwartym serwisem sïuĝÈcym do udostÚpniania w formie kanaïów bieĝÈcych danych w Internecie. Moĝesz w nim tworzyÊ kanaïy publiczne i prywatne, do których mogÈ doïÈczaÊ siÚ serwery i klienci, aby wysyïaÊ i odczytywaÊ dane z dowolnego miejsca na Ăwiecie. Dane sÈ przesyïane w formacie czytelnym dla czïowieka (XML), a serwis Xively oferuje interesujÈce metody ich wizualizacji i monitorowania przez Internet. W tym podrozdziale zastosujesz pïytÚ Arduino wyposaĝonÈ w ïÈcze Ethernet do wysyïania danych z czujnika do kanaïu w serwisie Xively, jak równieĝ do odbierania danych innego kanaïu. A wiÚc zaczynamy.

Kup książkę

Poleć książkę


208

ROZDZIAà 8. Komunikacja

8.8.1. Tworzenie konta i pobieranie klucza API

Pierwszym krokiem jest utworzenie konta w serwisie Xively pod adresem www. xively.com i pobranie klucza API. Klucz API jest potrzebny do tworzenia, usuwania, pobierania, edycji i aktualizacji kanaïów danych. Jeĝeli udostÚpniasz swoje projekty innym uĝytkownikom, powinieneĂ utworzyÊ swój prywatny gïówny klucz API (Master API) i przy uĝyciu panelu sterujÈcego Xively utworzyÊ nowy klucz do udostÚpniania danych. DziÚki kluczom udostÚpniajÈcym masz peïnÈ kontrolÚ nad danymi i funkcjonalnoĂciami dostÚpnymi dla innych uĝytkowników. Po utworzeniu konta zaloguj siÚ do serwisu i korzystajÈc z gïównego menu, przejdě do strony Master Keys (przedstawionej na rysunku 8.11). Moĝesz tam utworzyÊ swój gïówny klucz Master API. Po utworzeniu klucza zanotuj go i trzymaj pod rÚkÈ, gdyĝ bÚdzie potrzebny póěniej.

Rysunek 8.11. Widok gáównego klucza w serwisie Xively

8.8.2. Tworzenie nowego kanaáu danych

Teraz utwórz nowy kanaï, do którego bÚdziesz wysyïaÊ dane odczytane z czujnika. Jeĝeli jesteĂ zalogowany do swojego konta, wybierz polecenie menu WEB TOOLS/DEVELOP, a nastÚpnie kliknij duĝÈ ikonÚ Add Device. Wprowadě nazwÚ i opis czujnika i kliknij przycisk Add Device. W nastÚpnym oknie kliknij przycisk Add Channel. Pojawi siÚ widok podobny do przedstawionego na rysunku 8.12. Nadaj kanaïowi tytuï i kilka tagów opisu (oczywiĂcie moĝesz je póěniej zmieniÊ), zanotuj identyfikator kanaïu Feed ID i kliknij przycisk Save Channel. Twój nowy kanaï zostaï utworzony. Twój kanaï jest skonfigurowany i gotowy do odbierania informacji. MajÈc utworzone konto, klucz API (API Key) i identyfikator kanaïu (Feed ID), moĝesz przejĂÊ do szkicu rejestrujÈcego dane, opisanego w punkcie 8.8.3. Jeĝeli nie zapisaïeĂ identyfikatora kanaïu, moĝesz go odnaleěÊ po otwarciu jego strony (po prostu kliknij w panelu Xively nazwÚ kanaïu).

Kup książkę

Poleć książkę


209

8.8. Serwis Xively

Rysunek 8.12. Tworzenie nowego kanaáu do rejestrowania danych czujnika w serwisie Xively

8.8.3. Szkic do rejestrowania danych z czujnika w serwisie Xively

Komunikacja z serwisem Xively jest prosta. W tym przykïadzie bÚdziesz rejestrowaÊ co 10 sekund odczyty z potencjometru. UWAGA: Aby lepiej przedstawiÊ zasadÚ komunikacji z serwisem Xively, w tym przykïadzie nawiÈzanie poïÈczenia i wysyïanie wszystkich danych jest realizowane rÚcznie. Po zapoznaniu siÚ z funkcjonowaniem komunikacji moĝesz oszczÚdziÊ kilka wierszy kodu. W tym celu zajrzyj do opisu doskonaïej biblioteki Xively, dostÚpnej pod adresem https://xively.com/dev/libraries.

Wprowadě kod z listingu 8.8 do Ărodowiska Arduino IDE. Listing 8.8. Kod rejestrujący dane z czujnika w serwisie Xively

#include <SPI.h> #include <Ethernet.h> #define APIKEY "TWOJ KLUCZ API" #define FEEDID 12345 #define PROJECTNAME "Arduino w akcji"

Kup książkę

Konfiguracja kanaáu Xively

Poleć książkę


210

ROZDZIAà 8. Komunikacja

Konfiguracja ustawieĔ sieciowych byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(192,168,0,120); Utworzenie obiektu serwera WWW EthernetClient client;

long lastConnectionTime = 0; boolean lastConnected = false; const int postingInterval = 10000;

Interwaá aktualizacji danych w Xively

void setup() { Otwarcie poáączenia sieciowego if (!Ethernet.begin(mac)) { Ethernet.begin(mac, ip); } Serial.begin(9600); Otwarcie poáączenia szeregowego do diagnostyki } void loop() { ZapamiĊtanie bieĪących danych z czujnika int sensorReading = analogRead(A0); if (client.available()) { char c = client.read(); Serial.print(c); }

WyĞwietlenie odebranych danych w celu diagnostyki

if (!client.connected() && lastConnected) { Serial.println(); Serial.println("Rozlaczony."); client.stop(); }

Zatrzymanie klienta, jeĪeli nie jest poáączony

if(!client.connected() && (millis() - lastConnectionTime > ´postingInterval)) { sendData(sensorReading); } lastConnected = client.connected();

Wywoáanie sendData, jeĪeli przyszáa pora

Ustawienie zmiennej Boolean dla timera

} void sendData(int thisData) { Poáączenie z kanaáem Xively if (client.connect("api.xively.com", 80)) { Serial.println("Laczenie..."); Polecenie PUT i inicjacja komunikacji client.print("PUT /v2/feeds/"); client.print(FEEDID); client.println(".csv HTTP/1.1"); client.println("Host: api.xively.com "); Wysáanie klucza API client.print("X-ApiKey: "); client.println(APIKEY); client.print("User-Agent: "); client.println(PROJECTNAME); client.print("Content-Length: "); int thisLength = 8 + getLength(thisData); client.println(thisLength); client.println("Content-Type: text/csv"); client.println("Connection: close"); client.println();

Kup książkę

Poleć książkę


211

8.8. Serwis Xively client.print("czujnik1, "); client.println(thisData);

Wysáanie danych do Xively

} else { Serial.println("Blad polaczenia."); Serial.println("Rozlaczony."); client.stop(); } lastConnectionTime = millis();

ZapamiĊtanie bieĪącego czasu

} int getLength(int someValue) { int digits = 1; int dividend = someValue /10; while (dividend > 0) { dividend = dividend /10; digits++; } return digits; }

Najpierw musisz zmieniÊ ustawienia swojego kanaïu w serwisie Xively . Upewnij siÚ, ĝe Twój klucz API jest zamkniÚty w cudzysïowie, poniewaĝ bÚdzie przekazywany jako ciÈg typu String. NastÚpnie skonfiguruj ustawienia sieciowe, podaj adres MAC i rÚcznie ustaw adres IP , jeĝeli podczas nawiÈzywania poïÈczenia nie jest dostÚpna usïuga DHCP . Dalej nastÚpuje wejĂcie w gïównÈ funkcjÚ loop(), w której odczytywane sÈ bieĝÈce dane z czujnika . Funkcja sprawdza, czy nadeszïy dane, i wyĂwietla je na konsoli na potrzeby diagnostyki kodu . Jeĝeli byïeĂ wczeĂniej poïÈczony z serwisem, ale juĝ siÚ rozïÈczyïeĂ, musisz zatrzymaÊ klienta . Na koniec jeĝeli nie jesteĂ poïÈczony, a upïynÈï pewien odstÚp czasu pomiÚdzy wysyïanymi komunikatami, musisz siÚ ponownie poïÈczyÊ z serwisem i wysïaÊ bieĝÈce dane . W kodzie wywoïywana jest funkcja sendData(). Jest to funkcja pomocnicza nawiÈzujÈca poïÈczenie z kanaïem Xively i wysyïajÈca dane. Najpierw musisz wysïaÊ polecenie PUT inicjujÈce poïÈczenie z kanaïem , a nastÚpnie podaÊ swój klucz API . Dalej funkcja formatuje komunikat (dane) i przesyïa je do serwisu Xively . Na koniec zapisywany jest czas wysïania komunikatu , na podstawie którego obliczany jest czas wysïania nastÚpnego komunikatu. 8.8.4. Zaáadowanie i test szkicu

Teraz moĝesz podïÈczyÊ do pïyty nakïadkÚ Ethernet i przewód USB i zaïadowaÊ szkic. To caïa konfiguracja. Otwórz widok swojego kanaïu na stronie Xively. PowinieneĂ zobaczyÊ zapisywane w nim dane z czujnika. Jeĝeli nie widzisz danych, otwórz Ărodowisko Arduino IDE i kliknij ikonÚ monitora portu szeregowego, aby zdiagnozowaÊ problem.

Kup książkę

Poleć książkę


212

ROZDZIAà 8. Komunikacja

8.9. Podsumowanie W tym rozdziale zaczÈïeĂ poznawaÊ szczegóïy szerokiego spektrum form komunikacji dostÚpnych w Arduino. ZaczÈïeĂ od podïÈczenia pïyty do sieci i do Internetu. Za pomocÈ nakïadki Ethernet zamieniïeĂ Arduino w serwer dostarczajÈcy uĝytkownikowi informacji na kaĝde jego ĝÈdanie. Potem wykonaïeĂ nastÚpny krok i poïÈczyïeĂ Arduino z portalem Twitter, w którym rozsyïaïeĂ na caïy Ăwiat komunikaty o naciĂniÚciach przycisku. Poniewaĝ bezprzewodowa komunikacja z Arduino przydaje siÚ w bardzo wielu zastosowaniach, dowiedziaïeĂ siÚ równieĝ, jak wykorzystaÊ do tego celu technologie WiFi i Bluetooth. Kanaïy komunikacyjne dostÚpne w Arduino sÈ dalekosiÚĝne i dostÚpnych jest wiele sposobów przesyïania danych pomiÚdzy innymi urzÈdzeniami i akcesoriami peryferyjnymi. Jednym z takich kanaïów jest interfejs SPI i w tym rozdziale dowiedziaïeĂ siÚ, jak inne urzÈdzenia i nakïadki (na przykïad karta SD lub nakïadka Ethernet) wykorzystujÈ ten interfejs do komunikacji z Arduino. WykorzystaïeĂ nawet SPI do sterowania cyfrowymi potencjometrami. MajÈc do dyspozycji wszystkie wszechstronne metody komunikacji, przyjrzeliĂmy siÚ nastÚpnie rejestrowaniu danych, tj. kluczowemu aspektowi komunikacji i interakcji miÚdzy urzÈdzeniami. DowiedziaïeĂ siÚ nie tylko, jak przechowywaÊ informacjÚ w lokalnej pamiÚci Arduino, ale równieĝ jak jÈ rejestrowaÊ w Internecie, korzystajÈc z uniwersalnego serwisu Xively. Teraz tylko od Ciebie zaleĝy, jakie dane chcesz udostÚpniÊ i w jaki sposób. Moĝesz obsïugiwaÊ zdalnie czujniki w róĝnych otoczeniach, a ich odczyty przesyïaÊ do kanaïu i póěniej przedstawiaÊ w swojej galerii. Moĝesz podïÈczyÊ siÚ do innych publicznych kanaïów rejestrujÈcych róĝnorakie dane, poczÈwszy od wstrzÈsów sejsmicznych, poprzez temperaturÚ, wilgotnoĂÊ, punkt rosy, na wilgotnoĂci gleby w ogrodzie skoñczywszy, a nastÚpnie wykorzystywaÊ je w swojej wirtualnej przestrzeni. Kaĝdy taki scenariusz oferuje niemal nieograniczone moĝliwoĂci przesyïania i interpretacji wszelkiego typu danych. Projekty opisane w tym rozdziale stanowiÈ zaledwie wierzchoïek góry lodowej. Opisane formy komunikacji moĝesz wykorzystywaÊ na wiele sposobów, a ich nieprzebrana liczba sprawia, ĝe Arduino jest potÚĝnym narzÚdziem komunikacyjnym. Zastanów siÚ nad celem swojego projektu i zadecyduj, czy podïÈczenie go do Internetu i udostÚpnienie caïemu Ăwiatu do wglÈdu i wykorzystania go bÚdzie poĝyteczne. Czy moĝesz w projekcie wykorzystaÊ dostÚpne zasoby? Czy jest potrzebna komunikacja z innymi urzÈdzeniami peryferyjnymi? Czy przyda siÚ rejestrowanie jakichĂ danych zmieniajÈcych siÚ w czasie? Arduino daje Ci do rÚki wszelkie niezbÚdne narzÚdzia. Ale nie zatrzymujmy siÚ w tym miejscu. Teraz, w rozdziale 9., zobaczysz, jak Arduino moĝe wspóïpracowaÊ z urzÈdzeniami do gier, takimi jak kontrolery Nintendo Wii Nunchuk oraz Xbox.

Kup książkę

Poleć książkę


Skorowidz A adapter P4B, 244 RS232-TTL, 242 TTL-RS232, 244 WiiChuck, 217 ADC, Analog/Digital Converter, 63 adres IP, 178, 182 MAC, 178, 181 akcesoria LilyPad, 271 algorytm obliczania odlegïoĂci, 146 analiza děwiÚku, 315 FFT, 315 analogowe wyjĂcie, 61 anatomia biblioteki, 353 anoda, 44 aplikacja IOSArduino, 268 Pd, 322 Processing, 307 Python, 326 aplikacje jednookienkowe, 246 Arduino, 23 Duemilanove, 24 Ethernet, 24 LilyPad, 25 Mega, 25 Nano, 26 Uno, 23, 32

B biblioteka, 353 AFMotor, 289 ArduinoNunchuk, 218 ArduinoTestSuite, 86 DallasTemperature, 167 EEPROM, 87 Ethernet, 89, 179 Firmata, 90, 317 GLCDks0108, 171 hidboot, 233

Kup książkę

hosta USB, 229 LiquidCrystal, 85, 91, 159 Minim, 315 OneWire, 167 OpenCV, 310 podstawowa, 84 pySerial, 324 SD, 88, 189, 205 sdFat, 88 SDFat, 303 Serial, 307 SerLCD, 165 Servo, 92, 127 SoftwareSerial, 95–97, 165 SPI, 94, 200 Stepper, 93, 123 Twitter, 185 WiFi, 190 Wire, 95 biblioteki programistyczne, 84 standardowe, 85 uĝytkowników, 98 bipolarny tranzystor NPN, 108 Bluetooth, 193, 196 bïÚdy, 36 bïyskanie rozpoczynanie, 49 zatrzymywanie, 49 bod, 58 budowa szkicu, 37 budowanie equalizera, 313 syntezatora, 319

C ciÈgi znaków, 341 CNC, computer numerical control, 119 cyfrowe wyjĂcia, 41 czas reakcji, 56, 57 czujnik Devantech SRF05, 143 Maxim DS18B20, 166, 168 Parallax, 151

Parallax Ping, 142 Parallax PIR, 149, 151 QRE1113, 280 Sharp GP2D12, 146, 242, 265 czujniki odbiciowe, 280 odksztaïcenia, 274 odlegïoĂci, 140, 242, 265 podczerwieni, 139 temperatury, 166, 168 uderzenia, 68, 70 ultraděwiÚkowe, 139

D deskryptor interfejsu, 231 konfiguracji, 230 urzÈdzenia, 230 DHCP, Dynamic Host Configuration Protocol, 181 dioda Zenera, 70 diody ĂwiecÈce, 30, 44, 46 dodanie etykiet, 262 kontrolki Slider, 255 outletu moveSlider, 256 tagu, 256 doïÈczanie biblioteki, 85 dostÚp do pinów, 220 dziaïanie aplikacji Processing, 312 děwiÚk, 74

E echo pozorne, 146 echolokacja, 140 edytor kodu, 34 elektroniczne gadĝety, 269 equalizer, 313, 315 ESC, electronic speed controller, 131 Ethernet, 89, 178 etykieta, 262

Poleć książkę


364

Skorowidz

F fale ultraděwiÚkowe, 140 faza sygnaïu zegarowego, 94 Firmata, 313, 314 format big-endian, 233 little-endian, 233 raportu wejĂciowego, 232 funkcja, 350 analogRead, 66 analogWrite, 92, 113 attachInterrupt, 50 delay, 51 digitalWrite, 46 mills, 51 nunchuk_setpowerpins, 219 random, 56 Serial.print, 58 Serial.println, 58 setBitOrder, 94 setClockDivider, 94 setDataMode, 94 Stepper, 123 steps, 124 funkcje biblioteki Ethernet, 90, 179 Firmata, 91 GLCDks0108, 172 LiquidCrystal, 91, 160 SD, 88, 206 SerLCD, 166 Servo, 92, 93, 128 silnika krokowego, 123 SoftwareSerial, 96 SPI, 94, 201 Twitter, 185 WiFi, 190 Wire, 96 funkcje klasy EthernetUDP, 180 String, 157

G generator liczb pseudolosowych, 56 generowanie děwiÚku, 74 gïoĂniczek, 72 GPS, 97 graficzne Ărodowisko programistyczne, 319 gry, 213

Kup książkę

I IDE, 33, 329 informacje o nakïadkach, 287 o temperaturze, 327 inicjalizacja tabeli, 158 instalacja Arduino IDE Linux, 333 Mac OS X, 332 Windows, 329 instalowanie bibliotek, 98 instrukcja break, 52 else, 344 else if, 344 if, 344 switch-case, 346 integracja z oprogramowaniem, 305 inteligentne sïuchawki, 280 interfejs SPI, 200

J jÚzyk Arduino, 337 funkcje, 350 instrukcje sterujÈce, 343 pÚtle, 348 zmienne, 338 Java, 310 Processing, 307 Python, 324 joystick, 215

K kamera, 308 kanaï komunikacji szeregowej, 306 komunikacyjny, 208, 212 karta SD, 87, 180, 205, 296 SDHC, 88 sieciowa Ethernet, 100 katoda, 44 kÈt kroku silnika, 120 obrotu serwomechanizmu, 127 kierunek obrotów silnika, 112 klasa Client, 179 Ethernet, 179 EthernetUDP, 180 File, 206 SD, 206

Serial, 307 Server, 179 String, 157 WiFi, 191 WiFiClient, 191 WiFiServer, 191 klawiatura muzyczna, 61, 75 klient, 179, 181 klony Arduino, 27 klucz API, 208 kod equalizera, 316 klienta, 193 monitorujÈcy temperaturÚ, 326 syntezatora, 320 komentarz jednoliniowy, 38 wieloliniowy, 38 kompas HMC5883L, 282 komponenty, 357 komunikacja, 177 Bluetooth, 193, 196 Ethernet, 178 klienta z serwerem, 181 SPI, 200, 204 szeregowa, 90, 305 w jÚzyku processing, 307 Wi-Fi, 188 z aplikacjami, 305 z kontrolerem, 218 z portalem, 184 z urzÈdzeniami, 93 konfiguracja IP sieci, 182 kontrolera Nunchuk, 218 poïÈczenia szeregowego, 306 serwera WWW, 181 sprzÚtu, 29 konsola Xbox 360, 227 konstruktor klasy Serial, 307 kontroler ENC28J60, 101 ESC, 133 Nunchuk, 214–217, 222, 227 silnika bezszczotkowego, 131 Wii Nunchuk, 214 Xbox, 228–233, 239 kontrolery do gier, 227 prÚdkoĂci, 132 kontrolka Slider, 255, 260 koñcówki silnika krokowego, 121 kurtka z kompasem, 282 z wyïÈcznikami, 274

Poleć książkę


365

Skorowidz

L LCD, liquid crystal display, 156 liczby pseudolosowe, 56 linie SPI, 201 lista komponentów, 357

’ ïadowanie programu, 32 szkicu, 37 ïÈczenie czujników podczerwieni i ultraděwiÚkowego, 146 ïÈcznoĂÊ bezprzewodowa, 188, 196

M magistrala czteroprzewodowa, 93 dwuprzewodowa, 95 I2C, 95 SPI, 93 magnetometr HMC5883L, 285 makro _BV, 221 mapa otoczenia, 151 masa, 162 metoda convertToCelsius, 326 pasywnej podczerwieni, 149 subtraktywna, 319 miernik refleksu, 41, 53–56 gotowe poïÈczenia, 55 gotowy obwód, 59 mierzenie impulsów, 70 temperatury, 324 migajÈca dioda ĂwiecÈca, 30 mikrokontroler, 87 modulacja szerokoĂci impulsów, PWM, 62, 111 moduï BlueSMiRF Silver, 198 Bluetooth, 199 Bluetooth Mate Silver, 282 monitor portu szeregowego, 34, 35 mostek H, 112, 114 MSB, Most Significant Bit, 94

N najbardziej znaczÈcy bit, 94 nakïadka, 99 Arduino Ethernet, 101 Arduino WiFi, 189 Ethernet, 180 hosta USB, 239

Kup książkę

silnikowa, 136, 288 silnikowa Adafruit, 288, 290 WiFi, 189 WiFly firmy SparkFun, 102 wïasna, 295 pamiÚÊ, 295 pïyta perforowana, 299 podïÈczanie karty SD, 297 przesuwniki poziomów, 296 test, 302 uchwyt karty SD, 296 nakïadki Arduino, 287 prototypowe, 102 napiÚcie przebicia, 70 nawiÈzywanie poïÈczenia Bluetooth, 198

O obliczanie odlegïoĂci, 146 wartoĂci rezystora, 44 obracanie silnika, 111 obroty silnika, 111 obrót przyspieszeniomierza trójosiowego, 215 serwomechanizmu, 126 obsïuga przewodu szeregowego Redpark, 253 przyspieszeniomierza, 193 sieci bezprzewodowych, 189 suwaka, 259, 260 obwód z przetwornikiem, 69 odbieranie komunikatów, 195 odbijanie styków, 51 odbiornik GPS, 97 odczyt sygnaïu, 63 ustawienia potencjometru, 64 okno edytora, 34, 35 operatory logiczne, 347 relacji, 343 oprogramowanie, 28 oprogramowanie Firmata, 319

P pakiet Redpark SDK, 242, 245 pamiÚÊ, 205, 295 pamiÚÊ EEPROM, 87 pentatoniczna klawiatura muzyczna, 61, 75

pÚtla do while, 350 for, 348 while, 349 pÚtle nieskoñczone, 37 pianino osobiste, 276 piezoelektrycznoĂÊ, 67 piny przejĂciówki, 299 rozwarte, 109 szyny I2C, 216 wspólne, 109 zwarte, 109 PIR, passive infrared, 149 plik hidboot.cpp, 233 hidboot.h, 233 osx.py, 281 ViewController.h, 250, 263 ViewController.m, 251, 257 Xboxhidboot.cpp, 234 Xboxhidboot.h, 234 plik win.py, 281 pliki .cpp, 354 .h, 353 pïyta Arduino Pro Mini, 279 ArduinoBT, 196, 199 LilyPad, 270 LilyPad Simple, 271 Mega, 216 NunChucky, 217 pïyty perforowane, 299 projektowe, 295 stykowe, 42 pïywanie sygnaïu, 47 podczerwony czujnik odlegïoĂci, 265 podïÈczenie czujnika Devantech SRF05, 145 czujnika GP2D12, 149, 150 czujnika Parallax, 144, 153 czujników temperatury, 326 diod LED, 316 do komputera, 31 karty SD, 296 kontrolera Xbox, 239 potencjometrów do miksera, 321 potencjometru, 65 przyspieszeniomierza, 193 serwomechanizmów, 310 serwomechanizmu do nakïadki silnikowej, 293 SparkFun FTDI do LilyPad, 271 urzÈdzenia iOS, 243

Poleć książkę


366

Skorowidz

podïÈczenie wyĂwietlacza Hitachi HD44780, 164 wyĂwietlacza LCD, 160 zasilania i regulacji kontrastu, 161 polaryzacja przetwornika, 70 sygnaïu zegarowego, 94 poïÈczenie adaptera TTL-RS232 z Arduino, 244 BlueSMiRF Silver z Arduino, 198 diody z rezystorem, 45 Hitachi HD44780 z Arduino, 163 przesuwnika z kartÈ SD, 301 przycisków i gïoĂnika, 278 serwomechanizmu z pïytÈ, 130 silnika z ukïadem L293D, 115 szeregowe, 32, 307 telefonu z Arduino, 254 ukïadu L293D z silnikiem, 124 USB, 32 Wi-Fi, 100 wyĂwietlacza z Arduino, 161, 168 z kontrolerem, 216 pomiar czasu reakcji, 56, 57 odlegïoĂci, 147 za pomocÈ czujnika, 142 za pomocÈ podczerwieni, 145 port, 220 COMx, 32 szeregowy, 33, 58 portal Twitter, 184 porty cyfrowe, 37 potencjometr, 61, 63 AD5206, 202 cyfrowy, 201, 203 dostrojczy, 63 prezentacja tekstu, 163 prÚdkoĂÊ transmisji szeregowej, 37 Processing analiza děwiÚku, 313, 315 komunikacja szeregowa, 307 Ăledzenie twarzy, 312 program Firmata, 317 iOS Developer Program, 242 programowanie urzÈdzeñ iOS, 241 projekt IOSArduino, 262 projektowanie sterowane testami, TDD, 86 protokóï, 178 DHCP, 181 Firmata, 90

Kup książkę

SPI, 93, 200 synchronicznej transmisji danych, 200 TWI, 218 UDP, 179 USB, 229 próg, threshold, 71 przejĂciówki, 299 przekaěnik dwubiegunowy przeïÈczny, DPDT, 107 jednobiegunowy przeïÈczny, SPDT, 107 przeïÈcznik, 107 przerwanie, interrupt, 47, 51 przesuwnik poziomu, 296 74HC4050, 301 przetwarzanie kodu, 36 przetwornik analogowo-cyfrowy, A/C, 63, 79 piezoelektryczny, 61, 66–71 przewody magistrali SPI, 93 przewodzÈca wstÈĝka, 273 nitka, 272 tkanina, 273 przewód szeregowy Redpark, 242, 243 przycisk sterujÈcy, 48 przyspieszeniomierz, 192 trójosiowy, 215 Pure Data, 319 PWM, Pulse Width Modulation, 62, 111 Python mierzenie temperatury, 324

R raport wejĂciowy, 232 regulacja jasnoĂci, 203 kontrastu, 162 rejestrowanie danych, 204, 206 rejestry, 220 rezystory ograniczajÈce, 44 podciÈgajÈce, 49 ĂciÈgajÈce, 49 rodzaje pamiÚci, 205 przejĂciówek, 299 przewodzÈcych nici, 273 przewodzÈcych tkanin, 273 silników bezszczotkowych, 130 silników krokowych, 119

ROV, Remotely Operated Vehicle, 11 RS232, 243, 305 ruchy ciaïa, 192 rysowanie na wyĂwietlaczu, 173, 174

S schemat ukïadu stacji meteorologicznej, 168 sekwencja bïyskania diod, 47 serwer, 179 SMTP, 327 WWW, 181, 182 serwis Xively, 207 serwomechanizm, 92, 126 ĂledzÈcy twarz, 307 sieÊ bezprzewodowa, 189 Ethernet, 89, 101 silnik bezszczotkowy, 130 sterowanie kierunkiem, 134, 135 sterowanie prÚdkoĂciÈ, 134 z wirnikiem wewnÚtrznym, 130 z wirnikiem zewnÚtrznym, 130 silnik krokowy, 92, 105, 119, 290 bipolarny, 119, 122 unipolarny, 119 silnik prÈdu staïego, 106 obracanie, 111 sterowanie kierunkiem, 112 sterowanie prÚdkoĂciÈ, 111, 112, 117 szkic uruchamiajÈcy, 108 wïÈczanie, 107 silnik z przekïadniÈ, 106 skala pentatoniczna, 79 SPDT, single pole double throw, 107 specyfikacja silnika bipolarnego, 122 SPI, Serial Peripheral Interface, 177, 200 stacja meteorologiczna, 164, 168 staïe, 341 stan HIGH, 46 LOW, 46 sterowanie diodÈ, 204, 253 diodÈ LED, 253 numeryczne, 119 serwomechanizmami, 92, 126, 128 silnikami, 100, 111 silnikiem bezszczotkowym, 131 silnikiem krokowym, 92, 123

Poleć książkę


367

Skorowidz sterownik HD44780, 91 Hitachi HD44780, 159 wyĂwietlacza LCD, 158 stosowanie nakïadek, 287 struktura danych Haar Cascade, 311 suwak, 259, 260 sygnaï analogowy, 61 symbol tranzystora NPN, 109 symbole potencjometru, 64 syntezator, 319, 320 syntezowanie děwiÚku, 319 szerokoĂÊ impulsu, 127 szkic, 37 compass.ino, 283 cyfrowego sterownika diod, 203 dla czujnika Devantech SRF05, 143 dla czujnika Parallax PING, 142 dla kontrolera ESC, 133 dla stacji meteorologicznej, 169 do komunikacji Bluetooth, 193 do komunikacji z aplikacjÈ Pd, 323 do komunikacji z kontrolerem Nunchuk, 224 do obsïugi suwaka, 260 do pomiaru odlegïoĂci, 147 do pomiaru refleksu, 53, 57 do rejestrowania danych, 209 do rysowania, 173, 174 do Ăledzenia twarzy, 311 do wysyïania tweeta, 186 generujÈcy děwiÚk, 74 headphones.ino, 280 konfigurujÈcy serwer WWW, 182 MotorDriving.pde, 290 obracajÈcy serwomechanizm, 128 obsïugujÈcy klawiaturÚ pentatonicznÈ, 77 odczytujÈcy odlegïoĂÊ, 266 PotToMotors.pde, 292 rejestrujÈcy dane, 206 SDShieldWriter.pde, 302 sterujÈcy obrotami silnika bezszczotkowego, 135 sterujÈcy silnikiem bezszczotkowym, 132 sterujÈcy silnikiem krokowym, 125 sterujÈcy ukïadem L293D, 116 sterujÈcy wyĂwietlaczem, 162 testowy Bluetooth, 199 TurnSignals.ino, 275 uruchamiajÈcy silnik, 108 urzÈdzenia theremin, 148

Kup książkę

USB_desc, 230 WearablePiano.ino, 277 Xboxhid.ino, 235 szyfrowanie WEP, 189 WPA2, 189 szyna I2C, 216

¥ Ăledzenie twarzy, 307–309 Arduino, 311 Processing, 312 Ărodowisko Processing, 193 Xcode, 242, 245

T tabela prawdy dla ukïadu L293D, 116 tabele, 340 tabele typu char, 158 tablica ledArray, 46 TCP/IP, 178 TDD, test-driven development, 86 technologia Bluetooth, 196 Ethernet, 178 temperatura, 324–327 termometr, 325 termometr Texas Instruments LM35, 325 testowanie programu, 32 token, 185 transformacja Fouriera, FFT, 315 tranzystor 2N2222, 107 NPN, 109 tryb wyzwalania przerwania, 51 tryby transmisji, 94 trymer, 63 TWI, Two Wire Interface, 95 Twitter, 184 tworzenie akcji, 249 aplikacji, 245–252 kanaïu danych, 208 kodu, 250 obiektu Arduino, 314 w czasie rzeczywistym, 319 typy tranzystorów, 109 typy zmiennych, 339

U uchwyt do karty SD, 297 UDP, User Datagram Protocol, 179 ukïad ATMega328, 220 HDG104, 189 KS0108, 171 L293D, 114, 123, 137 pinów czujnika temperatury, 169 dla przesuwnika poziomów, 297 nakïadki WiFi, 190 przekaěnika, 109 przekaěnika DPDT, 110 ukïadu L293D, 115 w zïÈczu DB-9, 244 wyĂwietlacza KS0108, 173, 174 W5100, 180 ultraděwiÚki, 139 uruchamianie urzÈdzeñ HID, 233 urzÈdzenia iOS, 241 SPI, 201 urzÈdzenie typu master, 200 typu slave, 200 usïuga DHCP, 181 ustawienia potencjometru, 64 uĝycie biblioteki, 355

W walidator kodu, 36 wartoĂÊ progowa, 71 wartoĂÊ rezystora, 44 wejĂcia analogowe, 61, 63 cyfrowe, 41 widok tweetu, 188 Wi-Fi, 102, 188 wïÈczanie silnika, 107 poprzez ukïad L293D, 117 schemat ukïadu, 110 wyjĂcia analogowe, 63 wykrywanie przedmiotów, 139 ruchu, 149, 151 wysyïanie danych, 262 komunikatu, 186 tweetów, 186 ĝÈdañ, 224

Poleć książkę


368

Skorowidz

wyĂwietlacz Hitachi HD44780, 158 Samsung KS0108, 171 SparkFun, 283 wyĂwietlacze 4-bitowe, 159 8-bitowe, 159 graficzne, 171 LCD, 155, 156 równolegïe, 158, 164 szeregowe, 164 znakowe, 158

Kup książkę

wyĂwietlanie danych, 222 informacji, 91 wyzwalanie zboczem narastajÈcym, 51 opadajÈcym, 51

Z zakup nakïadki silnikowej, 294 zasiÚg zmiennych, 342 zasilanie, 162

zastosowanie nakïadki z silnikiem krokowym, 290 z silnikiem prÈdu staïego, 292 zestaw Lynx Pan and Tilt, 309 zintegrowane Ărodowisko programistyczne, 33, 329 zïÈcze kart microSD, 89 Lightning, 242 zmienne, 338 globalne, 342 lokalne, 342 typu String, 157

Poleć książkę


Arduino w akcji