{"id":910,"date":"2017-11-21T21:11:21","date_gmt":"2017-11-21T21:11:21","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=910"},"modified":"2017-12-05T14:34:30","modified_gmt":"2017-12-05T14:34:30","slug":"komunikacja-z-naszym-arduino-monitor-szeregowy-oraz-funkcje","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=910","title":{"rendered":"Komunikacja z naszym Arduino &#8211; monitor szeregowy oraz funkcje."},"content":{"rendered":"<h2>Kolejne zaj\u0119cia Fibotu za nami!<\/h2>\n<p>Tym razem poruszyli\u015bmy tematy, kt\u00f3re pozwoli\u0142y nam pozna\u0107 nieco bardziej techniki komunikacji u\u017cytkownik &#8211; komputer &#8211; kontroler.<\/p>\n<p>Po utworzeniu znanego z pocz\u0105tkowych zaj\u0119\u0107 uk\u0142adu r\u00f3wnolegle pod\u0142\u0105czonych i adresowanych LED\u00f3w chcieli\u015bmy m\u00f3c nimi sterowa\u0107 r\u0119cznie, a nie jedynie z pomoc\u0105 gotowych algorytm\u00f3w w p\u0119tli.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-891\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/11\/DSC4995-300x168.jpg\" alt=\"\" width=\"300\" height=\"168\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/11\/DSC4995-300x168.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/11\/DSC4995-768x431.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/11\/DSC4995-1024x575.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h3><strong>LEDy po\u0142\u0105czone p\u0142ytk\u0105 stykow\u0105<\/strong><\/h3>\n<h4>By spr\u00f3bowa\u0107 czego\u015b zaawansowanego wr\u00f3cili\u015bmy do podstaw &#8211; ka\u017cdy uczestnik stworzy\u0142 znany ju\u017c uk\u0142ad pi\u0119ciu LED\u00f3w z czego ka\u017cdy by\u0142 pod\u0142\u0105czony do innego pinu cyfrowego w p\u0142ytce Arduino. Ten uk\u0142ad pozwala niezale\u017cnie kontrolowa\u0107 ka\u017cd\u0105 diod\u0119.<\/h4>\n<pre class=\"lang:default decode:true\">#define MAX 5\r\nint piny[5]={2,3,4,5,6}; \/\/ Tablica z numerami wyj\u015b\u0107 cyfrowych do kt\u00f3rych pod\u0142\u0105czone zosta\u0142y diody\r\n\r\nvoid setup(){\r\n  for(i=0;i&lt;MAX;i++) \/\/ p\u0119tla pozwalaj\u0105ca zdefiniowa\u0107 wyj\u015bcie ka\u017cdego z pin\u00f3w cyfrowych\r\n  pinMode(piny[i],OUTPUT);\r\n\r\n}<\/pre>\n<h3><strong>Monitor szeregowy i komunikacja<\/strong><\/h3>\n<h4>Wzbogacili\u015bmy nasz program o funkcje pozwalaj\u0105ce na komunikacj\u0119 przez port szeregowy, a nast\u0119pnie dodali\u015bmy mo\u017cliwo\u015b\u0107 wysy\u0142ania komend, kt\u00f3re b\u0119d\u0105 zapala\u0107 i gasi\u0107 nasze diody.<\/h4>\n<h4>Sterownik r\u00f3wnie\u017c na bie\u017c\u0105co informuje nas o tym, czy wczyta\u0142 nasz input &#8211; wy\u015bwietla\u0142 wszystkie znaki kt\u00f3re wprowadzimy do monitora szeregowego. By mie\u0107 mo\u017cliwo\u015b\u0107 wczytania wi\u0119cej ni\u017c znaku (char &#8211; 1 bajt) zastosowali\u015bmy funkcj\u0119 <a href=\"https:\/\/www.arduino.cc\/en\/Reference\/ParseInt\">parseInt<\/a>() pozwalaj\u0105c\u0105 na wczytanie ci\u0105gu znak\u00f3w, kt\u00f3ry zostanie zamienony na liczb\u0119 ca\u0142kowit\u0105. <strong>Zmienna &#8222;ile&#8221; by\u0142a wprowadzana przez u\u017cytkownika i definiowa\u0142a ile razy lampki maj\u0105 zamruga\u0107.<\/strong><\/h4>\n<pre class=\"lang:default mark:13-14 decode:true\">#define MAX 5 \/\/ liczba diod\r\nint piny[MAX]={2,3,4,5,6};\r\nint i,j;\r\n\/\/char znak;\r\nbyte znak;\r\n\r\nvoid setup(){\r\n  for(i=0;i&lt;MAX;i++)\r\n     pinMode(piny[i],OUTPUT);\r\n  Serial.begin(9600);\r\n}\r\nvoid loop(){\r\n  if(Serial.available()&gt;0){\r\n    int ile=Serial.parseInt();\r\n    Serial.print(\"Wczytalam \");\r\n    Serial.println(ile);\r\n    mig(ile);\r\n  }\r\n<\/pre>\n<h4>Warto zwr\u00f3ci\u0107 uwag\u0119 na linijk\u0119 trzynast\u0105 Serial.available() zwraca liczb\u0119 bajt\u00f3w czekaj\u0105cych na odczytanie (a aktualnie przechowywanych w buforze portu szeregowego), gdy zostanie wprowadzona przez u\u017cytkownika jaka\u015b dana wej\u015bciowa. Czytaj\u0105c jeden bajt (np. Serial.read()) zabieramy z tego bufora jeden bajt a tym samym zmniejszamy licznik danych (bajt\u00f3w) czekaj\u0105cych na odczytanie.<\/h4>\n<p><em>Adnotacja: podczas zaj\u0119\u0107 modyfikowali\u015bmy nasz program na bie\u017c\u0105co. W kodzie mo\u017cecie znale\u017a\u0107 'przestarza\u0142e&#8217; metody kt\u00f3re wprowadzili\u015bmy w ramach zapoznania si\u0119 z ideologi\u0105 zadania. Najcz\u0119\u015bciej b\u0119d\u0105 one zakomentowane w pe\u0142nym kodzie, kt\u00f3ry znajdziecie na samym dole tego wpisu. Warto zwr\u00f3ci\u0107 uwag\u0119, \u017ce przy wczytywaniu zmiennej char b\u0119d\u0105cej jednym znakiem musimy stosowa\u0107 t\u0142umaczenie na tablic\u0119 ASCII, gdy\u017c w\u0142a\u015bnie w tym formacie zapisane s\u0105 zmienne char.<\/em><\/p>\n<h3><strong>Funkcje: szkoda \u017cycia na robienie w k\u00f3\u0142ko tego samego !<\/strong><\/h3>\n<h4>Stworzywszy program pozwalaj\u0105cy na dwukierunkow\u0105 komunikacj\u0119 z naszym sterownikiem utworzyli\u015bmy funkcj\u0119 o wdzi\u0119cznej nazwie &#8222;mig()&#8221;. Tworzenie takich funkcji jest podstaw\u0105 programowania strukturalnego &#8211; chodzi o &#8222;zamykanie&#8221; logicznych cz\u0119\u015bci programu (tu: w\u0142\u0105czanie\/wy\u0142\u0105czanie wszystkich LED\u00f3w) w pewn\u0105 ca\u0142o\u015b\u0107, kt\u00f3r\u0105 nast\u0119pnie b\u0119dziemy wielokrotnie u\u017cywa\u0107.<\/h4>\n<p>Funkcja &#8222;mig()&#8221; przechodzi\u0142a kolejne stadia swojego rozwoju, od najprostrzej &#8211; <strong>bezargumentowej<\/strong>:<\/p>\n<pre class=\"lang:default decode:true\" title=\"Pierwsza wersja funkcji mig()\">void mig(){\r\n  Serial.println(\"ON\");\r\n  for(i=0;i&lt;MAX;i++)\r\n     digitalWrite(piny[i],HIGH);\r\n   delay(400);\r\n   Serial.println(\"OFF\");\r\n   for(i=0;i&lt;MAX;i++)\r\n      digitalWrite(piny[i],LOW);\r\n   delay(400);\r\n}\/\/mig<\/pre>\n<h4>Zadaniem powy\u017cszej jest jednokrotne w\u0142\u0105czenie\/wy\u0142\u0105czenie wszystkich LED-\u00f3w. Aby zrobi\u0107 to kilkukrotnie nale\u017cy wielokrotnie wykona\u0107 stworzon\u0105 funkcj\u0119 <strong>mig()<\/strong> &#8211; lub wykona\u0107 j\u0105 w p\u0119tli n-razy. Dlatego kolejna modyfikacja polega\u0142a na dodaniu <strong>argumentu do funkcji<\/strong>:<\/h4>\n<pre class=\"lang:default decode:true\" title=\"Druga wersja funkcji mig(int ile) - ile razy w\u0142\u0105cza\/wy\u0142\u0105cza\">void mig(int ile){\r\n  for (int jj=0;jj&lt;ile;jj++){\r\n    Serial.println(\"ON\");\r\n    for(i=0;i&lt;MAX;i++)\r\n      digitalWrite(piny[i],HIGH);\r\n    delay(400);\r\n    Serial.print(\"OFF x\");\r\n    Serial.println(jj+1);\r\n    for(i=0;i&lt;MAX;i++)\r\n      digitalWrite(piny[i],LOW);\r\n    delay(400);\r\n  }\/\/jj\r\n}\/\/mig<\/pre>\n<h4>jednoargumentow\u0105, kt\u00f3ra umo\u017cliwia nam wielokrotne w\u0142\u0105czenie\/wy\u0142\u0105czenie LED-\u00f3w (dodatkow p\u0119tla po zmiennej jj). Maj\u0105c taki\u0105 funkcj\u0119 mo\u017cemy kaza\u0107 miga\u0107, np. czterokrotnie przez wywo\u0142anie&nbsp;<strong>mig(4)<\/strong> &#8211; w\u00f3wczas nast\u0119puj\u0119 przekazanie liczby 4 dla parametru ile w definicji funkcji mig(int ile). Kolejna modyfikacja polega\u0142a na dodaniu dodatkowego, drugiego parametru czas okre\u015blaj\u0105cego ile ms maj\u0105 by\u0107 w\u0142\u0105czone\/wy\u0142\u0105czone LED-y.<\/h4>\n<pre class=\"lang:default decode:true\" title=\"Trzecia wersja funkcji mig(int ile, int czas)\">void mig(int ile, int czas){\r\n  for (int jj=0;jj&lt;ile;jj++){\r\n    Serial.println(\"ON\");\r\n    for(i=0;i&lt;MAX;i++)\r\n      digitalWrite(piny[i],HIGH);\r\n    delay(czas);\r\n    Serial.print(\"OFF x\");\r\n    Serial.println(jj+1);\r\n    for(i=0;i&lt;MAX;i++)\r\n      digitalWrite(piny[i],LOW);\r\n    delay(czas);\r\n  }\/\/jj\r\n}\/\/mig<\/pre>\n<h4>Ten dodatkowy parametr umo\u017cliwia nam szybkie miganie (np. czterorkotne) przez wywo\u0142anie <strong>mig(4, 100)<\/strong> lub wolne przez wywo\u0142anie <strong>mig(4,2000)<\/strong>. Podobnie jak poprzednio wywo\u0142uj\u0105c nasz\u0105 funkcj\u0119 przypisujemy warto\u015bci 4 do zmiennej ile, oraz 100 (lub 2000 w drugim przyk\u0142adzie) do zmiennej czas. Ostatnia modyfikacja to parametry domy\u015blne w j\u0119zyku C++ (nie ma tego w &#8222;czystym&#8221; C), czyli zamiana prototypu funkcji (=nag\u0142\u00f3wka) na nast\u0119puj\u0105cy:&nbsp;<\/h4>\n<pre class=\"lang:default mark:2,4-5,10 decode:true\" title=\"Ostateczna wersja funkcji mig(int ile, int czas)\">void mig(int ile, int czas=400){\r\n  for (int jj=0;jj&lt;ile;jj++){\r\n    Serial.println(\"ON\");\r\n    for(i=0;i&lt;MAX;i++)\r\n      digitalWrite(piny[i],HIGH);\r\n    delay(czas);\r\n    Serial.print(\"OFF x\");\r\n    Serial.println(jj+1);\r\n    for(i=0;i&lt;MAX;i++)\r\n      digitalWrite(piny[i],LOW);\r\n    delay(czas);\r\n  }\/\/jj\r\n}\/\/mig<\/pre>\n<h4>Powy\u017csza zmiana umo\u017cliwia wywo\u0142anie dwuargumentowej funkcji mig(int, int) nie wtylko w postaci&nbsp;<strong>mig(4,100)<\/strong> ale tak\u017ce <strong>mig(4)<\/strong> &#8211; w\u00f3wczas parametr&nbsp;<strong>czas<\/strong> przyjmie domy\u015bln\u0105 warto\u015b\u0107 400.&nbsp;&nbsp;&nbsp;<\/h4>\n<h4>Funkcja ta robi dok\u0142adnie to, o czym wspomnia\u0142em przy zmiennej &#8222;ile&#8221;. Warto\u015b\u0107 ukryta pod t\u0105 zmienn\u0105 by\u0142a kierowana do funkcji. P\u0119tla zapalaj\u0105ca (zaznaczona linijka 2) zapala i gasi (linijki 5 i 10) lampki za pomoc\u0105 znanej ju\u017c nam p\u0119tli wewn\u0119trznej (zapalaj\u0105cej ka\u017cd\u0105 diod\u0119 jedn\u0105 po drugiej w odst\u0119pie czasu rz\u0119du milisekund &#8211; linijka 4).<\/h4>\n<h4>Funkcja mia\u0142a te\u017c dodatkow\u0105, opcjonaln\u0105 zmienn\u0105 wej\u015bciow\u0105 &#8222;czas&#8221; reguluj\u0105c\u0105 odst\u0119py mi\u0119dzy zapaleniem i zgaszeniem diod za pomoc\u0105 wbudowanej funkcji &#8222;delay()&#8221;.<\/h4>\n<h3><strong>Podsumowanie:<\/strong><\/h3>\n<h4>Na tych zaj\u0119ciach zamiast pozna\u0107 nowe elementy elektroniczne jak np. znana z poprzednich zaj\u0119\u0107 czujka szczelinowa, poznali\u015bmy niezwykle kluczowe mo\u017cliwo\u015bci sterownika Arduino &#8211; komunikacj\u0119 dwukierunkow\u0105 przez monitor szeregowy. Mo\u017cliwo\u015b\u0107 bezpo\u015bredniego wysy\u0142ania sterownikowi danych wej\u015bciowych pozwala na r\u0119czne sterowanie i otwiera nas na nowe mo\u017cliwo\u015bci.<\/h4>\n<h4>Stworzyli\u015bmy swoj\u0105 w\u0142asn\u0105 funkcj\u0119 istniej\u0105c\u0105 poza p\u0119tl\u0105 g\u0142\u00f3wn\u0105, co zwi\u0119ksza przejrzysto\u015b\u0107 kodu i daje wygod\u0119 stosowania gotowych funkcji.<\/h4>\n<p style=\"text-align: left;\">To nie koniec przyg\u00f3d z komunikacj\u0105 za pomoc\u0105 monitora szeregowego. Mo\u017cliwo\u015bci implementacji tak kluczowej metody s\u0105 niezwykle szerokie.<\/p>\n<p style=\"text-align: right;\"><strong>Do zobaczenia na nast\u0119pnych zaj\u0119ciach!<\/strong><br \/>\n<em>Maciej (c) 2017 &amp; KG<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-892\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/11\/DSC4996-300x168.jpg\" alt=\"\" width=\"359\" height=\"201\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/11\/DSC4996-300x168.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/11\/DSC4996-768x431.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/11\/DSC4996-1024x575.jpg 1024w\" sizes=\"auto, (max-width: 359px) 100vw, 359px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>Pe\u0142ny kod:<\/h3>\n<pre class=\"lang:default decode:true\">#define MAX 5\r\nint piny[5]={2,3,4,5,6};\r\nint i,j;\r\n\/\/char znak;\r\nbyte znak;\r\n\r\nvoid setup(){\r\n  for(i=0;i&lt;MAX;i++)\r\n  pinMode(piny[i],OUTPUT);\r\n  Serial.begin(9600);\r\n}\r\n\r\nvoid mig(int ile, int czas=400){\r\n  for (int jj=0;jj&lt;ile;jj++){\r\n  Serial.println(\"ON\");\r\n  for(i=0;i&lt;MAX;i++)\r\n    digitalWrite(piny[i],HIGH);\r\n    delay(czas);\r\n   Serial.print(\"OFF x\");\r\n   Serial.println(jj+1);\r\n   for(i=0;i&lt;MAX;i++)\r\n    digitalWrite(piny[i],LOW);\r\n    delay(czas);\r\n  }\/\/jj\r\n}\/\/mig\r\n\r\nvoid loop(){\r\n  if(Serial.available()&gt;0){\r\n    int ile=Serial.parseInt();\r\n    \/\/znak=Serial.read(); \/\/przechowuje 1 bajt\r\n    Serial.print(\"Wczytalam \");\r\n    Serial.println(ile);\r\n \/\/   mig(znak-48); \/\/0 w tabeli ASCII to 48\r\n   mig(ile);\r\n \/\/   if (znak=='3')mig(3);\r\n \/\/  if (znak=='5')mig(5,500);\r\n    }\r\n    \r\n    \r\n<\/pre>\n<h2>&nbsp;<\/h2>\n","protected":false},"excerpt":{"rendered":"<p>Kolejne zaj\u0119cia Fibotu za nami! Tym razem poruszyli\u015bmy tematy, kt\u00f3re pozwoli\u0142y nam pozna\u0107 nieco bardziej techniki komunikacji u\u017cytkownik &#8211; komputer &#8211; kontroler. Po utworzeniu znanego z pocz\u0105tkowych zaj\u0119\u0107 uk\u0142adu r\u00f3wnolegle pod\u0142\u0105czonych i adresowanych LED\u00f3w chcieli\u015bmy m\u00f3c nimi sterowa\u0107 r\u0119cznie, a nie jedynie z pomoc\u0105 gotowych algorytm\u00f3w w p\u0119tli. LEDy po\u0142\u0105czone p\u0142ytk\u0105 stykow\u0105 By spr\u00f3bowa\u0107 czego\u015b [&hellip;]<\/p>\n","protected":false},"author":17,"featured_media":890,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[183,181,99,184,182,96],"class_list":{"0":"post-910","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-ascii","9":"tag-funkcja","10":"tag-led","11":"tag-port-szeregowy","12":"tag-read","13":"tag-serial","15":"post-with-thumbnail","16":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/910","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\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=910"}],"version-history":[{"count":5,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/910\/revisions"}],"predecessor-version":[{"id":942,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/910\/revisions\/942"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/890"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}