{"id":709,"date":"2017-05-16T19:46:42","date_gmt":"2017-05-16T19:46:42","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=709"},"modified":"2017-05-22T13:34:37","modified_gmt":"2017-05-22T13:34:37","slug":"joyshield-stringi-nrf24","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=709","title":{"rendered":"joyshield + stringi + nRF24"},"content":{"rendered":"<p>Dzi\u015b nowy gadget:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-710\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/joyshield-0.jpg\" alt=\"\" width=\"600\" height=\"398\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/joyshield-0.jpg 600w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/joyshield-0-300x199.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>czyli&nbsp;<strong>joy-shield.<\/strong>&nbsp;Co to ten &#8222;shield&#8221;? To rozszerzenie, z r\u00f3\u017cnymi modu\u0142ami, kt\u00f3re nadrukowane s\u0105 na p\u0142ytk\u0119 PCB i nie wymagaj\u0105 p\u0142ytki stykowej i masy przewod\u00f3w. Tak\u0105 p\u0142ytk\u0119 &#8222;wtyka&#8221; si\u0119 w piny Arduino, tworz\u0105c &#8222;kanapk\u0119&#8221;. Ten shield ma &#8222;gierkowe&#8221; przeznaczenie &#8211; cho\u0107 my go wykorzystamy do sterowania pojazdem, ale s\u0105 te\u017c inne (do internetu przez kabel eRJotk\u0119, przez sie\u0107 bezprzewodow\u0105, z kart\u0105 SD do zapisu danych, z obs\u0142ug\u0105 silnik\u00f3w i <a href=\"https:\/\/store.open-electronics.org\/index.php?_route_=Arduino\/Shield&amp;gclid=CjwKEAjw6e_IBRDvorfv2Ku79jMSJAAuiv9YvrlMEycylh8tk38oBUuVZqOkIsIjWodWL8Ao_Ms0yRoCOojw_wcB\">inne<\/a>). Warto \u0142apa\u0107 okazj\u0119 na allegro lub podobnych, bo ja sw\u00f3j shield kupi\u0142em za 25 z\u0142! A co on ma w sobie?<\/p>\n<ul>\n<li>Joystick (dwie osie + przycisk)<\/li>\n<li>cztery przyciski z kolorowymi klawiszami<\/li>\n<li>dwa dodatkowe przyciski microswich<\/li>\n<li>z\u0142\u0105cze dla modu\u0142\u00f3w transmisji radiowych:<br \/>\n&#8212; nRF24xx<br \/>\n&#8212; &nbsp;xbee<br \/>\n&#8212; APC200<\/li>\n<li>stabilizator napi\u0119cie 3.3V (do zasilania uk\u0142ad\u00f3w radiowych)<\/li>\n<\/ul>\n<p>Oczywi\u015bcie modu\u0142 (=shield) przeznaczony do wsp\u00f3\u0142pracy z p\u0142ytkami Arduino UNO, MEGA, LEONARDO itp. Warto zwr\u00f3ci\u0107 uwag\u0119 na jako\u015b\u0107 wykonania &#8211; m\u00f3j&nbsp;ma fajne opisy w \u0142atwo dost\u0119pnych miejscach.<\/p>\n<h2>Obs\u0142uga joysticka &#8211; shielda<\/h2>\n<p>Okazuje si\u0119 banalnie prosta. Czytamy po\u0142o\u017cenie dw\u00f3ch osi (x i y) &#8211; czyli porty analogowe A0 i A1 (c\u00f3\u017c, ten shield je sobie &#8222;rezerwuje&#8221; i nie mamy ich mo\u017cliwosci wykorzystywania). Wszystko \u0142adnie opisane na p\u0142ytce. Podobnie z przyciskami.<\/p>\n<pre class=\"lang:arduino decode:true\" title=\"Obs\u0142uga joysticka-shielda\">void setup() {\r\nSerial.begin(9600);\r\n}\r\nint x,y;\r\nvoid loop() {\r\n  x=analogRead(A0);\r\n  y=analogRead(A1);\r\n  Serial.print(x);\r\n  Serial.print(\"  \");\r\n  Serial.print(y);\r\n  if (digitalRead(5)==1)\r\n    Serial.print(\" niebieski\");\r\n  if (digitalRead(4)==1)\r\n    Serial.print(\" bialy\");\r\n  if (digitalRead(3)==1)\r\n    Serial.print(\" czerwony\");\r\n\/\/i tak dalej\r\n  Serial.println();\r\n  delay(100);\r\n}\r\n<\/pre>\n<p>Zwracam uwag\u0119 na &#8222;sprytne&#8221; granie metod\u0105 print oraz println wraz ze spacjami tak, aby wszystko mie\u015bci\u0142o si\u0119 w jednej linii i nie by\u0142o &#8222;pozlepiane&#8221;.<\/p>\n<p>A odczytywanie przycisk\u00f3w &#8211; skoro u\u017cywam funkcji&nbsp;<strong>digitalRead(<\/strong>pin<strong>)<\/strong> to dlaczego nie ma wcze\u015bniej&nbsp;<strong>pinMode(<\/strong>pin<strong>, INPUT)<\/strong>? Ot\u00f3\u017c&nbsp;<strong>domy\u015blnie<\/strong> piny ustawione s\u0105 w trybie INPUT, dlatego w\u0142a\u015bnie nic nie dopisywa\u0142em. Jesto to warte zapami\u0119tania, co powino nie by\u0107 trudne &#8211; w ko\u0144cu dla wej\u015b\u0107 analogowych nie ustawiali\u015bmy w tryb INPUT, czyli z wej\u015bciami cyfrowymi jest tak samo.<\/p>\n<h2>Stringi = napisy<\/h2>\n<p>Temat rzeka&#8230; trzeba zacz\u0105\u0107, czym s\u0105 tablice w C. Zauwazy\u0142em, \u017ce godnym polecenia jest artyku\u0142 na <a href=\"https:\/\/www.arduino.cc\/en\/reference\/string\">oficjalnej stronie Arduino<\/a>. Ja do\u0142\u0105czam &#8222;zrzut ekranu&#8221; z zaj\u0119\u0107.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-711\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/fibotDSC_3128.jpg\" alt=\"\" width=\"3840\" height=\"2160\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/fibotDSC_3128.jpg 3840w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/fibotDSC_3128-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/fibotDSC_3128-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/fibotDSC_3128-1024x576.jpg 1024w\" sizes=\"auto, (max-width: 3840px) 100vw, 3840px\" \/><\/p>\n<p>Jak zmieni\u0107 nasz poprzedni kod, aby dzia\u0142a\u0142 na napisach?<\/p>\n<pre class=\"lang:arduino decode:true\" title=\"Obs\u0142uga joysticka na Stringach\">void setup() {\r\n   Serial.begin(9600);\r\n}\r\n\r\nString napis;\r\nvoid loop() {\r\n  napis=String(analogRead(A0));\r\n  napis = napis + \"  \";\r\n  napis = napis + String(analogRead(A1));\r\n  if (digitalRead(5)==1)\r\n    napis = napis + String(\" niebieski\");\r\n  if (digitalRead(4)==1)\r\n    napis += String(\" bialy\");\r\n  if (digitalRead(3)==1)\r\n    napis += String(\" czerwony\");\r\n  \/\/i tak dalej\r\n  Serial.println(napis);\r\n  delay(100);\r\n}\r\n<\/pre>\n<p>Oczywi\u015bcie nic tutaj nie zyskali\u015bmy, a nawet gorzej &#8211; obs\u0142uga klasy String w Arduino jest&nbsp;<strong>zasobo\u017cerna&nbsp;<\/strong>&#8211; czyli mocno powi\u0119ksza nasz kod, ale tym si\u0119 jeszcze nie przejmujemy. Na uwag\u0119 zas\u0142uguje&nbsp;<strong>\u0142atwe<\/strong> dodawanie (<strong>\u0142\u0105czenie<\/strong>) ze sob\u0105 napis\u00f3w &#8211; realizuje to zwyk\u0142y operator&nbsp;<strong>+ (plus)<\/strong>.&nbsp;<\/p>\n<h2>Joyshield&nbsp;+ nRF24L01+<\/h2>\n<p>\u0141\u0105czy<img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-690 alignleft\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/nrf24l01-pinout-top-300x152.jpg\" alt=\"\" width=\"300\" height=\"152\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/nrf24l01-pinout-top-300x152.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/nrf24l01-pinout-top.jpg 483w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>my poznane dzi\u015b rzeczy z <a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=683\">poprzednimi zaj\u0119ciami <\/a>i nadajemy to, co robimy na naszym kontrolerze. W\u0142a\u015bnie dlatego u\u017cyli\u015bmy wersji Stringowej kodu do joysticka, bo radyjko nadawa\u0142o w\u0142a\u015bnie napisy &#8211; a nawet napisy z maksymaln\u0105 d\u0142ugo\u015bci\u0105 32 znak\u00f3w (bajt\u00f3w). Poni\u017cej kod:<\/p>\n<pre class=\"lang:default decode:true\" title=\"Joyshield + nadajemy przez nRF24\">#include &lt;SPI.h&gt;\r\n#include &lt;nRF24L01.h&gt;\r\n#include &lt;RF24.h&gt;\r\n#include &lt;printf.h&gt;\r\n\r\nRF24 radio(9, 10);\/\/CE, CS\r\n\r\nuint8_t rxAddr[6] = \"grzyb\";\r\n\r\nvoid setup(){\r\n  Serial.begin(9600);\r\n  Serial.print(\"nRF24 INIT=\");\r\n  bool ok=radio.begin();\r\n  Serial.println(ok);\r\n  printf_begin;\r\n  radio.printDetails();\r\n  radio.setRetries(15, 15);\r\n  radio.openWritingPipe(rxAddr);\r\n  \r\n  radio.stopListening();\r\n}\r\n\r\nString napis;\r\n\r\nvoid loop(){\r\n  napis = String(\"Heniek \"); \r\n  napis += String(analogRead(A0));\r\n  napis += \" \";\r\n  napis += String(analogRead(A1));\r\n  if (digitalRead(5)==1)\r\n    napis += String(\" niebieski\");\r\n  if (digitalRead(4)==1)\r\n    napis += String(\" bialy\");\r\n  if (digitalRead(3)==1) \r\n    napis += String(\" czerwony\");\r\n  \/\/i tak dalej&lt;br&gt;\r\n  radio.write(napis.c_str(), napis.length());\r\n  Serial.println(napis);\r\n  delay(100);\r\n}\r\n<\/pre>\n<p>Na uwag\u0119 zas\u0142uguje <strong>linia nr 37<\/strong>, gdzie musia\u0142em u\u017cy\u0107 nowej metody klasy String o nazwie <a href=\"https:\/\/www.arduino.cc\/en\/Reference\/CStr\">c_str()<\/a>, kt\u00f3rej zadaniem jest stworzenie napisu w stylu j\u0119zyka C (nieobiektowego). Wymuszone jest to przez metod\u0119&nbsp;<strong>write()<\/strong> klasy radio. Dodatkowo, d\u0142ugo\u015b\u0107 napisu w klasie String uzyskujemy za pomoc\u0105 metody&nbsp;<strong>length()<\/strong> &#8211; a nie&nbsp;<strong>sizeof(napis)<\/strong>, gdy\u017c to by zwr\u00f3ci\u0142o tylko rozmiar obiektu (a nie danych wewn\u0105trz tego obiektu).<\/p>\n<p>Z kolei w <strong>linii 26<\/strong>&nbsp;rozpocz\u0105\u0142em nasz napis imieniem (fikcyjnym) uczestnika ko\u0142a Fi-BOT tak, aby uruchomiony przeze mnie program odbiornika nRF m\u00f3g\u0142 \u0142atwo zidentyfikowa\u0107 kto mi nadaje (Tosiek, Heniek czy Ziuta &#8212; tak\u017ce fikcyjne imiona).<\/p>\n<h2>Co dalej?<\/h2>\n<p>Wydawa\u0107 by si\u0119 mog\u0142o, \u017ce trzeba teraz tak przygotowany kod uruchomi\u0107 do sterowania pojazdem. Nieprawda. By\u0142o by to <strong>baaaardzo k\u0142opotliwe<\/strong>. Problem polega na tym, \u017ce trzeba odczyta\u0107 napis w odbiorniku nRF umieszczonym w poje\u017adzie, a potem odczyta\u0107 aktualne wychylenie osi X i Y joya, i przyciski. Ale to trudne! Nawet przy pomocy funkcji <a href=\"https:\/\/www.arduino.cc\/en\/Reference\/StringToInt\">toInt()<\/a>&nbsp;zamieniaj\u0105cej napis na liczb\u0119 ca\u0142kowit\u0105 &#8211; bo najpier nale\u017ca\u0142o by podzieli\u0107 nasz napis na cz\u0119\u015bci &#8211; mo\u017ce przecinkami, jako\u015b tak:<\/p>\n<p>123,512,czerwony,zielony<\/p>\n<p>Czyli w\u00f3wczas przecinek (kropka, my\u015blnik &#8211; cokolwiek) by nam oddziela\u0142 jedn\u0105 informacj\u0119 od drugiej, co by by\u0142o do wykorzystania w po\u0142\u0105czeniu z metod\u0105 <a href=\"https:\/\/www.arduino.cc\/en\/Tutorial\/StringIndexOf\">indexOf()<\/a> z klasy String. Ca\u0142a procedura mog\u0142a by wygl\u0105da\u0107 jako\u015b tak:<\/p>\n<ul>\n<li>odczytujemy napis w poje\u017adzie, przes\u0142any przez joyshield (z przecinkami)<\/li>\n<li>skupiamy si\u0119 na pierwszej cz\u0119\u015bci napisu, a\u017c do pierwszego przecinka &#8211; wiemy, \u017ce ma to by\u0107 pozycja na osi X &#8211; funkcja <a href=\"https:\/\/www.arduino.cc\/en\/Tutorial\/StringSubstring\">StringSubstring()<\/a> i\/lub wspomniana indexOf()<\/li>\n<li>zamieniamy ten kr\u00f3tki podci\u0105g (od zera do 4 znak\u00f3w) na liczb\u0119 ca\u0142kowit\u0105 &#8211; metoda toInt() &#8211; i mamy ju\u017c o\u015b X<\/li>\n<li>kasujemy\/wyrzucamy z napisu pierwsz\u0105 cz\u0119\u015b\u0107 do przcinka, przechodzimy do pozycji na osi Y<\/li>\n<li>robimy podobnie, a potem<\/li>\n<li>je\u015bli napis nie jest jeszcze pusty (bo ci\u0105gle kasowali\u015bmy informacj\u0119 o osi X i Y), to znaczy, \u017ce mamy jakie\u015b przyciski<\/li>\n<li>je\u015bli jest przecinek, to znaczy, \u017ce s\u0105 nawet dwa (lub wi\u0119cej) wci\u015bni\u0119tych przycisk\u00f3w<\/li>\n<li>tworzymy pierwszy podci\u0105g a\u017c do pierwszego przecinka, por\u00f3wnujemy czy jest to &#8222;zielony&#8221;, &#8222;czerwony&#8221; itd&#8230;<\/li>\n<li>po odczytaniu przycisku kasujemy z napisu t\u0105 informacj\u0119<\/li>\n<li>je\u015bli napis niepusty, to s\u0105 kolejne przyciski&#8230;<\/li>\n<\/ul>\n<p>Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, jakie to <strong>zagmatfane<\/strong>! Dlatego na kolejnych zaj\u0119ciach b\u0119dziemy wysy\u0142a\u0107 z nadajnika nie napisy (Stringi), ale bajty z informacjami. Dwa bajty wystarcz\u0105 do podania osi X, kolejne dwa do osi Y, a jeszcze jeden &#8211; tylko jeden &#8211; do podania stanu wszystkich 7 przycisk\u00f3w na naszym shieldzie. Stworzymy <strong>w\u0142asny protok\u00f3\u0142 danych<\/strong> &#8211; podobny do tego, jakiego u\u017cywali\u015bmy przy omawianiu oscyloskopu. Dlatego zach\u0119cam do ponownego <a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=526\">wczytania si\u0119 w tamten wpis<\/a> i opis protoko\u0142u danych. W\u0142a\u015bnie to nas czeka na nast\u0119pnych zaj\u0119ciach! Ekscytuj\u0105ce, nieprawda\u017c? \ud83d\ude09<\/p>\n<p>Przypominam o spotkaniu w ten pi\u0105tek 19-maja o 14:15 w sprawie XV Festiwalu, <strong>a kolejne zaj\u0119cia we wtorek 23 maja o godz. 16:15<\/strong>. <del>Nie wiem, czy b\u0119dziemy mie\u0107 si\u0142y na 22 wi\u0119c od razu uprzedzam, \u017ce w poniedzia\u0142ek 22 maja, podczas imprezy Festiwalowej, ustalimy termin kolejnego spotkania Fi-BOTa.<\/del> Zapraszam!<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzi\u015b nowy gadget: czyli&nbsp;joy-shield.&nbsp;Co to ten &#8222;shield&#8221;? To rozszerzenie, z r\u00f3\u017cnymi modu\u0142ami, kt\u00f3re nadrukowane s\u0105 na p\u0142ytk\u0119 PCB i nie wymagaj\u0105 p\u0142ytki stykowej i masy przewod\u00f3w. Tak\u0105 p\u0142ytk\u0119 &#8222;wtyka&#8221; si\u0119 w piny Arduino, tworz\u0105c &#8222;kanapk\u0119&#8221;. Ten shield ma &#8222;gierkowe&#8221; przeznaczenie &#8211; cho\u0107 my go wykorzystamy do sterowania pojazdem, ale s\u0105 te\u017c inne (do internetu przez [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":710,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[153,154,140,142,130,155,139,152],"class_list":{"0":"post-709","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-joy","9":"tag-joystick","10":"tag-nrf","11":"tag-nrf24","12":"tag-radio","13":"tag-shield","14":"tag-spi","15":"tag-string","17":"post-with-thumbnail","18":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/709","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=709"}],"version-history":[{"count":10,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/709\/revisions"}],"predecessor-version":[{"id":723,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/709\/revisions\/723"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/710"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}