{"id":1262,"date":"2018-05-29T15:04:45","date_gmt":"2018-05-29T15:04:45","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1262"},"modified":"2018-06-06T06:54:59","modified_gmt":"2018-06-06T06:54:59","slug":"optymalizacja-sterowania","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1262","title":{"rendered":"Optymalizacja sterowania"},"content":{"rendered":"<h2 style=\"text-align: center;\">S\u0142owem wst\u0119pu&#8230;<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1261 size-large\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/IMG_20180529_160757_1-1024x768.jpg\" alt=\"\" width=\"640\" height=\"480\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/IMG_20180529_160757_1-1024x768.jpg 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/IMG_20180529_160757_1-300x225.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/IMG_20180529_160757_1-768x576.jpg 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Dzisiejszego dnia pracowali\u015bmy nad optymalizacj\u0105 naszego sterowania pojazdem.<\/p>\n<p>Wci\u0105\u017c u\u017cywamy do tego naszego smartfona, a konkretniej aplikacji &#8222;ArduinoRC&#8221;, kt\u00f3ra za pomoc\u0105 bluetooth w naszym telefonie \u0142\u0105czy si\u0119 z modu\u0142em Bluetooth XM-15B pod\u0142\u0105czonego do Arduino. Wi\u0119cej o tym w <a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1210\">tym artykule.<\/a><\/p>\n<p>Na poni\u017cszym zdj\u0119ciu nasz wypasiony &#8222;panel sterowania&#8221; \ud83d\ude42<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1264 size-large\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/33943942_1820375841352868_1593228048415588352_n-1024x576.png\" alt=\"\" width=\"640\" height=\"360\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/33943942_1820375841352868_1593228048415588352_n-1024x576.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/33943942_1820375841352868_1593228048415588352_n-300x169.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/33943942_1820375841352868_1593228048415588352_n-768x432.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/33943942_1820375841352868_1593228048415588352_n.png 1795w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Dotychczas nasz program dzia\u0142a\u0142 w dosy\u0107 prosty spos\u00f3b &#8211; je\u017celi Arduino odczyta\u0142o okre\u015blony znak z komunikacji szeregowej&nbsp; bluetooth, to przekazywa\u0142o do silniczka konkretne stany tak aby ko\u0142a kr\u0119ci\u0142y si\u0119 na przyk\u0142ad w prz\u00f3d.<\/p>\n<p>&nbsp;<\/p>\n<p>Poznali\u015bmy jednak g\u0142\u0119bsz\u0105 teori\u0119 sterowania i pojawi\u0142 si\u0119 nast\u0119puj\u0105cy problem:<\/p>\n<p>A wi\u0119c w aplikacji &#8222;ArduinoRC&#8221; klikamy strza\u0142k\u0119 w g\u00f3r\u0119. Za\u0142\u00f3\u017cmy \u017ce przekazywany znak to literka 'W&#8217;, po odczytaniu kt\u00f3rej k\u00f3\u0142ka maj\u0105 si\u0119 kr\u0119ci\u0107 w prz\u00f3d.&nbsp; Po przekazaniu jej komunikacj\u0105 szeregow\u0105, Arduino pos\u0142usznie uruchamia silniczki, po czym je wy\u0142\u0105cza. Gdy na telefonie tym razem przytrzymamy strza\u0142k\u0119, zamiast pojedynczego znaku 'W&#8217;, Arduino odczyta serie znak\u00f3w &#8211; &#8222;WWWWWWWWWW &#8230; &#8222;. Po ka\u017cdym z odczytanych znak\u00f3w silniczki na chwil\u0119 stan\u0105, po czym po wczytaniu nast\u0119pnego &#8211; znowu rusz\u0105. Taki efekt 'szarpania&#8217; to nienajlepsze rozwi\u0105zanie poniewa\u017c ci\u0105g\u0142e w\u0142\u0105czanie i wy\u0142\u0105czanie silniczka powoduje wi\u0119ksze zu\u017cycie baterii. Wi\u0119c zamiast sekwencji:<\/p>\n<p>w\u0142\u0105cz(1) &#8211; wy\u0142\u0105cz(1) &#8211; w\u0142\u0105cz(2) &#8211; wy\u0142\u0105cz(2) &#8211; w\u0142\u0105cz(3) &#8211; wy\u0142\u0105cz(3)<\/p>\n<p>proponujemy logiczniejsza sekwencje:<\/p>\n<p>w\u0142\u0105cz(1) &#8211; kontynuuj(2) &#8211; kontynuuj(3) &#8211; wy\u0142\u0105cz(3).<\/p>\n<p>Oczywi\u015bcie nie zobaczymy tego problemu go\u0142ym okiem, poniewa\u017c Arduino mo\u017ce odczytywa\u0107 par\u0119 tysi\u0119cy takich znak\u00f3w na sekund\u0119.<\/p>\n<h2 style=\"text-align: center;\">Rozwi\u0105zanie problemu<\/h2>\n<p>Pomys\u0142\u00f3w na rozwi\u0105zanie tego problemu by\u0142o par\u0119, trzeba by\u0142o jednak liczy\u0107 si\u0119 z tym \u017ce Arduino to nie komputer stacjonarny i warto zrobi\u0107 to w miar\u0119 mo\u017cliwo\u015bci optymalnie, aby nie za\u015bmieca\u0107 pami\u0119ci mikrokontrolera.<\/p>\n<p>Z pomoc\u0105 przysz\u0142a nam funkcja <strong>millis() <\/strong>z wbudowanej biblioteki, kt\u00f3ra zwraca <strong>czas kt\u00f3ry up\u0142yn\u0105\u0142 od w\u0142\u0105czenia urz\u0105dzenia w milisekundach<\/strong>. Utworzyli\u015bmy te\u017c par\u0119 pomocniczych zmiennych i utworzyli\u015bmy sprytny spos\u00f3b aby usprawni\u0107 prac\u0119 silnika.<\/p>\n<p>Znowu u\u017cy\u0142em swoich ponadprzeci\u0119tnych umiej\u0119tno\u015bci artystycznych oraz zaawansowanego oprogramowania do obr\u00f3bki graficznej (Paint i Gimp) aby stworzy\u0107 kilka schemat\u00f3w blokowych.<\/p>\n<p>Przedstawiaj\u0105 one po kolei:<\/p>\n<h2 style=\"text-align: center;\">1. Dzia\u0142anie g\u0142\u00f3wnej p\u0119tli loop<\/h2>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1275\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb1.png\" alt=\"\" width=\"600\" height=\"960\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb1.png 600w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb1-188x300.png 188w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Jak wida\u0107 g\u0142\u00f3wna p\u0119tla programu Arduino b\u0119dzie sk\u0142ada\u0142a si\u0119 z dw\u00f3ch blok\u00f3w: <strong>Obs\u0142ugi Bluetooth<\/strong>a, a potem <strong>Obs\u0142ugi stopu silnika<\/strong>. Tak, tylko stopu silnika, bo uruchomienie silnik\u00f3w zajdzie si\u0119 w <strong>Obs\u0142udze Bluetooth<\/strong>. Raz puszczone ko\u0142a w ruch zatrzymaj\u0105 si\u0119 dopiero w drugim bloku, po up\u0142ywie okre\u015blonego czasu.&nbsp;<\/p>\n<h2 style=\"text-align: center;\">2. Dzia\u0142anie obs\u0142ugi Bluetooth<\/h2>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1277\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb3.png\" alt=\"\" width=\"600\" height=\"960\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb3.png 600w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb3-188x300.png 188w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Powy\u017cszy schemat koncentruje si\u0119 tylko na jednej instrukcji &#8211; jedz do przodu (wczytanie W). Gdy ju\u017c wszystko b\u0119dzie dobrze dzia\u0142a\u0107 &#8211; w podobny spos\u00f3b trzeba doda\u0107 kolejne polecenia (zda do tylu, w lewo i w prawo).&nbsp;<\/p>\n<p>Sama obs\u0142uga instrukcji jazdy do przodu (obs\u0142uga 'W&#8217;) b\u0119dzie obszerniej wyt\u0142umaczona za chwil\u0119, ale ju\u017c sam schemat algorytmu du\u017co mo\u017ce wyja\u015bni\u0107:<\/p>\n<h2 style=\"text-align: center;\">3. Dzia\u0142anie obs\u0142ugi odczytania znaku 'W&#8217;<\/h2>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1276\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb2.png\" alt=\"\" width=\"600\" height=\"960\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb2.png 600w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb2-188x300.png 188w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Na pocz\u0105tku, utw\u00f3rzmy zmienn\u0105 pomocnicz\u0105 <strong>P <\/strong>i na razie przypiszmy jej liczb\u0119 <strong>0<\/strong>. B\u0119dzie to zmienna przechowuj\u0105ca czas dzia\u0142ania Arduino w milisekundach, <strong>po kt\u00f3rego przekroczeniu nasze k\u00f3\u0142ka przestan\u0105 si\u0119 kr\u0119ci\u0107<\/strong>.<\/p>\n<p>Zmienna&nbsp;<strong>DeltaT<\/strong>&nbsp;przechowywuje czas w milisekundach, przez jaki nasze k\u00f3\u0142ka maj\u0105 si\u0119 kr\u0119ci\u0107 po jednorazowym odczytaniu znaku. My akurat ustalili\u015bmy warto\u015b\u0107 <strong>100 milisekund<\/strong>, jest to optymalna warto\u015b\u0107 przy kt\u00f3rej w praktyce nasza maszyna \u015bmiga jak nale\u017cy.<\/p>\n<p>Dla lepszego wyobra\u017cenia sobie tego o czym mowa, poni\u017cej przedstawi\u0142em o\u015b przedstawiaj\u0105c\u0105 up\u0142yw czasu od w\u0142\u0105czenia Arduino. Zaznaczy\u0142em zupe\u0142nie przypadkow\u0105 warto\u015b\u0107, akurat w tym przypadku oznacza, \u017ce min\u0119\u0142o 10234 milisekund (czyli jakie\u015b 10,2 sekund od w\u0142\u0105czenia urz\u0105dzenia).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1266 size-full\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto1.png\" alt=\"\" width=\"1751\" height=\"481\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto1.png 1751w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto1-300x82.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto1-768x211.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto1-1024x281.png 1024w\" sizes=\"auto, (max-width: 1751px) 100vw, 1751px\" \/><\/p>\n<p>Kolejny krok w naszym schemacie to instrukcja warunkowa:<\/p>\n<p>Czy <strong>P&lt;milis()<\/strong> ?<\/p>\n<p>W tej chwili Arduino wywo\u0142uje funkcje <em>millis() <\/em>i por\u00f3wnuje j\u0105 ze zmienn\u0105 P. Mi\u0119dzy uruchomieniem urz\u0105dzenia a wczytaniem znaku z naszego telefonu musia\u0142a min\u0105\u0107 przynajmniej 1\/1000 sekundy. Warunek zostaje wi\u0119c spe\u0142niony &#8211; up\u0142yw czasu w milisekundach jest wi\u0119kszy od 0. Przechodzimy wi\u0119c do nast\u0119pnego bloku zgodnie ze schematem.<\/p>\n<ol>\n<li><strong>P <\/strong><strong>=<\/strong> <strong>millis()<\/strong><strong> + DeltaT<\/strong><\/li>\n<li>w\u0142\u0105czSilnik()<\/li>\n<\/ol>\n<p>1.Zmienna P przyjmuje warto\u015b\u0107 sumy <strong>aktualnego up\u0142ywu czasu &nbsp; <\/strong>i&nbsp;&nbsp; <strong>czasu przez jaki nasze k\u00f3\u0142ka maj\u0105 si\u0119 kr\u0119ci\u0107 po jednorazowym odczytaniu znaku<\/strong>.<\/p>\n<p>2.Nasz silnik uruchamia si\u0119 a wehiku\u0142 jedzie do przodu.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1267\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto2.png\" alt=\"\" width=\"1751\" height=\"481\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto2.png 1751w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto2-300x82.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto2-768x211.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto2-1024x281.png 1024w\" sizes=\"auto, (max-width: 1751px) 100vw, 1751px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Tak jak wspomina\u0142em, zmienna P b\u0119dzie przetrzymywa\u0142a czas dzia\u0142ania Arduino po kt\u00f3rym silnik przestaje dzia\u0142a\u0107 &#8211; teraz widzimy to na osi. Dzia\u0142a to mniej wi\u0119cej w ten spos\u00f3b:<\/p>\n<ol>\n<li>Wczytany zosta\u0142 sygna\u0142 'W&#8217;.<\/li>\n<li>Aktualnie min\u0119\u0142o <strong>10234<\/strong> milisekund od czasu uruchomienia urz\u0105dzenia.<\/li>\n<li>Silnik uruchamia si\u0119.<\/li>\n<li>Silnik ma pracowa\u0107 dop\u00f3ki czas dzia\u0142ania Arduino nie przekroczy <strong>10334<\/strong> milisekund.<\/li>\n<\/ol>\n<p>Ca\u0142kiem proste prawda? \ud83d\ude42<\/p>\n<p>To co opisa\u0142em do tej pory, to reakcja na pojedynczy znak 'W&#8217;. Jednak ja chc\u0119 aby m\u00f3j samochodzik podjecha\u0142 dwa metry do przodu, a co mi tam! Zobaczmy wi\u0119c co zdarzy si\u0119 je\u015bli przytrzymam strza\u0142k\u0119 w aplikacji steruj\u0105cej, a Arduino dostanie serie znak\u00f3w &#8222;WWWWWWWWWWW &#8230; &#8222;.<\/p>\n<p>Ok, analogiczna do powy\u017cszej sytuacja:<\/p>\n<ol>\n<li>Arduino odczytuje pojedynczy znak 'W&#8217;<\/li>\n<li>zmienna P przyjmuje odpowiedni\u0105 warto\u015b\u0107<\/li>\n<li>silniczek rusza<\/li>\n<\/ol>\n<p>Jednak zanim minie nasze DeltaT czyli 100 milisekund, Arduino dostaje kolejny znak &#8211; kolejne 'W&#8217;. I co teraz? Wr\u00f3\u0107my do naszego schematu blokowego nr 2 &#8211; tym razem zacznijmy dzia\u0142anie od instrukcji warunkowej (zmienne przypisuje tylko na pocz\u0105tku dzia\u0142ania programu) &#8211; i sp\u00f3jrzmy na poni\u017cszy wykres:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1268\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto3.png\" alt=\"\" width=\"1751\" height=\"481\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto3.png 1751w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto3-300x82.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto3-768x211.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/foto3-1024x281.png 1024w\" sizes=\"auto, (max-width: 1751px) 100vw, 1751px\" \/><\/p>\n<p><strong> Aktualnie nasze P jest wi\u0119ksze od czasu kt\u00f3ry up\u0142yn\u0105\u0142 dotychczas<\/strong> &#8211; rozpatruj\u0105c wi\u0119c dzia\u0142anie schematu blokowego, pierwszy warunek nie zostaje spe\u0142niony &#8211; wykonuje si\u0119 instrukcja:<\/p>\n<p><strong>P = P + DeltaT<\/strong><\/p>\n<p>Czyli zmienna P kt\u00f3ra dotychczas przyjmowa\u0142a konkretn\u0105 warto\u015b\u0107, powi\u0119kszy si\u0119 o kolejne DeltaT &#8211; czyli o 100. Oznacza to \u017ce czas dzia\u0142ania urz\u0105dzenia w kt\u00f3rym silnik ma si\u0119 wy\u0142\u0105czy\u0107 wyd\u0142u\u017ca si\u0119 o 100 milisekund.<\/p>\n<p>Po odczytywaniu kolejnych znak\u00f3w &#8211; analogicznie czas ten b\u0119dzie si\u0119 wyd\u0142u\u017ca\u0142. B\u0119dzie tym bardziej d\u0142u\u017cszy, im d\u0142u\u017cej przytrzymam strza\u0142k\u0119 i im wi\u0119cej znak\u00f3w w jednej sekwencji odczyta Arduino. Przy tym warto zauwa\u017cy\u0107 \u017ce w takiej sytuacji nasz silnik nie zatrzyma si\u0119, b\u0119dzie dzia\u0142a\u0142 dop\u00f3ki trzymam strza\u0142k\u0119. Tak wi\u0119c nasz problem zosta\u0142 rozwi\u0105zany.<\/p>\n<p>Na koniec ostatni blok programu &#8211; sprawdzenie, czy trzeba zatrzyma\u0107 silniki.<\/p>\n<h2 style=\"text-align: center;\">4. Dzia\u0142anie obs\u0142ugi stopu silnik\u00f3w<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1278 aligncenter\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb4.png\" alt=\"\" width=\"600\" height=\"960\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb4.png 600w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/05\/sb4-188x300.png 188w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>PROGRAM i obiekty<\/h2>\n<p>Teraz zapoznajmy si\u0119 z praktycznym kodem na Arduino. Naturalnie jest on obszerniejszy ni\u017c schematy blokowe, poniewa\u017c obs\u0142uguje On ca\u0142e dzia\u0142anie samochodu. W tym przyk\u0142adzie zdecydowa\u0142em si\u0119 na stworzenie klasy &#8211; jest to forma programowania obiektowego,&nbsp; co umo\u017cliwia j\u0119zyk C++. R\u00f3\u017cni si\u0119 wi\u0119c od poprzednich program\u00f3w z fi-bot-a &#8211; gdzie programowali\u015bmy strukturalnie (j\u0119zyk C). Opisz\u0119 wi\u0119c komentarzem kluczowe linijki kodu kt\u00f3rych dzia\u0142anie opisa\u0142em wcze\u015bniej.<\/p>\n<pre class=\"lang:arduino decode:true\" title=\"Sterowanie pojazdem - P. Baj\">#include &lt;SoftwareSerial.h&gt;\r\n#define RxD 2\r\n#define TxD 3\r\n#define IN1 4\r\n#define IN2 5\r\n#define IN3 6\r\n#define IN4 7\r\n\r\nSoftwareSerial btSerial(RxD,TxD);\r\nunsigned long int przod = millis();                           \r\nunsigned int delta_t=100;               \r\n\r\nclass Silnik      \/\/w tym przykladzie zdecydowalem sie na stworzenie klasy - jest to forma \r\n{                 \/\/programowania obiektowego co umozliwia j\u0119zyk C++, a nie jak w poprzednich\r\n  public:         \/\/artykulach - tylko programowania strukturalnego a'la j\u0119zyk C\r\n\r\n  void wylaczSilnik()\r\n  {\r\n    digitalWrite(IN1,HIGH);\r\n    digitalWrite(IN2,HIGH);\r\n    digitalWrite(IN3,HIGH);\r\n    digitalWrite(IN4,HIGH);\r\n  }\r\n \r\n  void doPrzodu()                        \r\n  {\r\n    digitalWrite(IN1,HIGH);\r\n    digitalWrite(IN2,LOW);\r\n    digitalWrite(IN3,HIGH);\r\n    digitalWrite(IN4,LOW);\r\n  }\r\n\r\n  void doTylu()\r\n  {\r\n    digitalWrite(IN1,LOW);\r\n    digitalWrite(IN2,HIGH);\r\n    digitalWrite(IN3,LOW);\r\n    digitalWrite(IN4,HIGH);\r\n  }\r\n\r\n  void wPrawo()\r\n  {\r\n    digitalWrite(IN1,HIGH);\r\n    digitalWrite(IN2,LOW);\r\n    digitalWrite(IN3,HIGH);\r\n    digitalWrite(IN4,HIGH);\r\n  }\r\n\r\n  void wLewo()\r\n  {\r\n     digitalWrite(IN1,HIGH);\r\n     digitalWrite(IN2,HIGH);\r\n     digitalWrite(IN3,HIGH);\r\n     digitalWrite(IN4,LOW);\r\n  }\r\n};\r\n\r\n  Silnik Maria;\r\n\r\nvoid setup() {\r\n  Serial.begin(9600);\r\n  Serial.println(\"start!\");\r\n  btSerial.begin(9600);\r\n  pinMode(4,OUTPUT);\r\n  pinMode(5,OUTPUT);\r\n  pinMode(6,OUTPUT);\r\n  pinMode(7,OUTPUT);\r\n \r\n}\r\n              \r\nvoid loop() {                          \/\/schemat blokowy nr 1\r\n  if(btSerial.available())             \/\/schemat blokowy nr 3\r\n  {\r\n    char zn=btSerial.read();           \r\n    Serial.println(zn);\r\n\r\n   \r\n    switch(zn)\r\n    {\r\n      case 'W':                        \/\/schemat blokowy nr 2\r\n      if(przod&lt;millis())               \r\n      {\r\n        przod=millis()+delta_t;        \r\n        Maria.doPrzodu();\r\n      }\r\n\r\n      else                              \r\n      {\r\n        przod+=delta_t;\r\n      }\r\n\r\n      break;\r\n\r\n      case 'S':\r\n      if(przod&lt;millis())\r\n      {\r\n        przod=millis()+delta_t;\r\n        Maria.doTylu();\r\n      }\r\n\r\n      else\r\n      {\r\n        przod+=delta_t;\r\n      }\r\n     \r\n      break;\r\n\r\n      case 'A':\r\n      if(przod&lt;millis())\r\n      {\r\n        przod=millis()+delta_t;\r\n        Maria.wLewo();\r\n      }\r\n\r\n      else\r\n      {\r\n        przod+=delta_t;\r\n      }\r\n      break;\r\n     \r\n      case 'D':\r\n      if(przod&lt;millis())\r\n      {\r\n        przod=millis()+delta_t;\r\n        Maria.wPrawo();\r\n      }\r\n\r\n      else\r\n      {\r\n        przod+=delta_t;\r\n      }\r\n      break;\r\n    }\r\n  }\r\n\r\n  if(millis()&gt;przod)                    \/\/schemat blokowy nr 4\r\n    {\r\n      Maria.wylaczSilnik();             \r\n    }\r\n}<\/pre>\n<p>To by by\u0142o na tyle, b\u0105d\u017acie na bie\u017c\u0105co \ud83d\ude42<\/p>\n<p>Pozdrawiam!<\/p>\n<p style=\"text-align: right;\">(c) Przemys\u0142aw Baj 2018<\/p>\n","protected":false},"excerpt":{"rendered":"<p>S\u0142owem wst\u0119pu&#8230; Dzisiejszego dnia pracowali\u015bmy nad optymalizacj\u0105 naszego sterowania pojazdem. Wci\u0105\u017c u\u017cywamy do tego naszego smartfona, a konkretniej aplikacji &#8222;ArduinoRC&#8221;, kt\u00f3ra za pomoc\u0105 bluetooth w naszym telefonie \u0142\u0105czy si\u0119 z modu\u0142em Bluetooth XM-15B pod\u0142\u0105czonego do Arduino. Wi\u0119cej o tym w tym artykule. Na poni\u017cszym zdj\u0119ciu nasz wypasiony &#8222;panel sterowania&#8221; \ud83d\ude42 &nbsp; Dotychczas nasz program dzia\u0142a\u0142 [&hellip;]<\/p>\n","protected":false},"author":22,"featured_media":1277,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[61,58,234,177,78,15,233],"class_list":{"0":"post-1262","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-android","9":"tag-bluetooth","10":"tag-maskotka","11":"tag-millis","12":"tag-robot","13":"tag-silniki","14":"tag-sterowanie","16":"post-with-thumbnail","17":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/1262","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\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1262"}],"version-history":[{"count":10,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/1262\/revisions"}],"predecessor-version":[{"id":1283,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/1262\/revisions\/1283"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/1277"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1262"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1262"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}