{"id":2810,"date":"2021-04-08T18:04:00","date_gmt":"2021-04-08T18:04:00","guid":{"rendered":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=2810"},"modified":"2021-04-21T09:51:57","modified_gmt":"2021-04-21T09:51:57","slug":"sterowanie-serwem-za-pomoca-joysticka-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-3-3-2-2-2-2-2-2-2-2-3-2-3-3-2-3-2-2-2-2-2","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=2810","title":{"rendered":"Wojny robot\u00f3w (&#8222;kanapka&#8221;) + problem: BT + serwo"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Wojny robot\u00f3w: problem &#8211; serwa i Bluetooth (BT)<\/h2>\n\n\n\n<p>Pan Rafa\u0142 oprogramowywa\u0142 sterowanie swojej &#8222;kanapki&#8221; z wykorzystaniem modu\u0142u BT. Nie jest to mo\u017ce najlepsze rozwi\u0105zanie sterowania, ale szybkie i bezproblemowe (jasne, jasne &#8211; czytaj dalej). Proste, po w\u0142\u0105czamy dwie standardowe biblioteki Servo.h oraz SoftwareSerial.h i piszemy prosty kod. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Servo.h>\n#include &lt;SoftwareSerial.h>\n\nSoftwareSerial bt(8, 9);\/\/RxD, TxD\nServo silnik;\n\nvoid setup() {\n  Serial.begin(9600);\n  bt.begin(9600);\n  silnik.attach(3);\n  Serial.println(\"start!\");\n}\n\nvoid loop() {\n  if (bt.available()){\n    char komenda=bt.readString());\n    Serial.print(\"odebrano= \");\n    Serial.println(komenda);\/\/dla sprawdzenia\n\n    switch (komenda){\n      case 'W': silnik.writeMicroseconds(1000); break;  \/\/przod\n      case 'S': silnik.writeMicroseconds(2000); break;  \/\/tyl\n      case 'X': silnik.writeMicroseconds(1500); break;  \/\/stop\n    }\/\/switch\n}<\/code><\/pre>\n\n\n\n<p><strong>A tu klops!<\/strong> Ilekro\u0107 przesy\u0142ane s\u0105 dane przez modu\u0142 BT, to serwa &#8222;wariuj\u0105&#8221;, zachowuj\u0105 si\u0119 zupe\u0142nie nieoczekiwanie. Mo\u017cna to sprawdzi\u0107 powy\u017cszym kodem gdzie przesy\u0142amy 'W&#8217; przez Bluetooth i silnik kr\u0119ci si\u0119 na maksa do przodu, a nast\u0119pnie wysy\u0142amy z apki kolejne, nic nie znacz\u0105ce znaczki (wciskamy inne, zdefiniowane przyciski, np. 'A&#8217;, 'D&#8217; itd). Te komendy powinny zosta\u0107 zignorowane (brak odpowiednich instrukcji w switch-u), a serwo powinno utrzymywa\u0107 sw\u00f3j dotychczasowy ruch. Tak si\u0119 jednak nie dzieje&#8230;<\/p>\n\n\n\n<p>Jak zawsze najpierw nale\u017ca\u0142o sprawdzi\u0107 przewody po\u0142\u0105czeniowe, ale to nie one okaza\u0142y si\u0119 przyczyn\u0105 problem\u00f3w. Grzebanie w internecie okaza\u0142o si\u0119 sukcesem &#8211; biblioteka SoftwareSerial.h korzysta z tego samego uk\u0142adu czasowego (timera) w Artudino co biblioteka Servo.h, do sterowania PWM. Chodzi o to, ze Arduino (a dok\u0142adniej ATmega 328P) posiada trzy niezale\u017cne timery: dwa 8-bitowe oraz jeden 16-to bitowy. W\u0142a\u015bnie z tego ostatniego korzystaj\u0105 dwie wspomniane biblioteki i <strong>powstaje konflikt<\/strong>!<\/p>\n\n\n\n<p>Rozwi\u0105zaniem mo\u017ce by\u0107 alternatywna biblioteka do obs\u0142ui serw: <a href=\"https:\/\/sourceforge.net\/projects\/pgahtow\/files\/Arduino%20%28v1.0%29%20libaries\/ServoTimer2.zip\/download\" data-type=\"URL\" data-id=\"https:\/\/sourceforge.net\/projects\/pgahtow\/files\/Arduino%20%28v1.0%29%20libaries\/ServoTimer2.zip\/download\" target=\"_blank\" rel=\"noreferrer noopener\">ServoTimer2<\/a>. Ju\u017c sama nazwa wskazuje, \u017ce korzysta ona z drugiego timera &#8211; nie powinno by\u0107 wi\u0119c konfliktu z SoftwareSerial.h. Lekko zamieniamy kod programiku i sprawdzamy zachowanie serw podczas przesy\u0142ania danych z BT. Klops: jednak nie pomog\u0142o.<\/p>\n\n\n\n<p>Je\u015bli nie biblioteka serw, to szukamy zamiennika do drugiej biblioteki &#8211; komunikacji szeregowej. Tutaj trafiamy na <a rel=\"noreferrer noopener\" href=\"https:\/\/www.arduino.cc\/reference\/en\/libraries\/altsoftserial\/\" data-type=\"URL\" data-id=\"https:\/\/www.arduino.cc\/reference\/en\/libraries\/altsoftserial\/\" target=\"_blank\">AltSoftSerial<\/a> i nasze nadzieje nie gasn\u0105 \ud83d\ude09 Ponownie modyfikujemy kod (uwaga: pinami do komunikacji s\u0105 &#8222;na sztywno&#8221; pin 9 oraz 10 &#8211; nie ma mo\u017cliwo\u015bci wyboru, jak w przypadku biblioteki SoftwareSerial.h).<\/p>\n\n\n\n<p>Nie poddajemy si\u0119 i stosujemy dwa zamienniki bibliotek <strong>jednocze\u015bnie<\/strong> &#8211; bum! mamy to! dzia\u0142a!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;ServoTimer2.h>\n#include &lt;AltSoftSerial.h>\n\nAltSoftSerial bt;\/\/Arduino UNO -> RxD=9, TxD=10, nie ma wyboru!\nServoTimer2 silnik;\n\nvoid setup() {\n  Serial.begin(9600);\n  bt.begin(9600);\n  silnik.attach(3);\n  Serial.println(\"start!\");\n}\n\nvoid loop() {\n  if (bt.available()){\n    char komenda=bt.readString());\n    Serial.print(\"odebrano= \");\n    Serial.println(komenda);\/\/dla sprawdzenia\n\n    switch (komenda){\n      case 'W': silnik.write(1000); break;  \/\/przod\n      case 'S': silnik.write(2000); break;  \/\/tyl\n      case 'X': silnik.write(1500); break;  \/\/stop\n    }\/\/switch\n}<\/code><\/pre>\n\n\n\n<p>Niewielkie zmiany, ale istotne. Warto zwr\u00f3ci\u0107 uwag\u0119, \u017ce funkcja <strong>write()<\/strong> dla obiekty <strong>ServoTimer2<\/strong> zapisuje mikrosekundy wype\u0142nienia, czyli dok\u0142adnie to co robi funkcja <strong>writeMicroseconds()<\/strong> z obiekty Servo (biblioteka Servo.h), co jest troch\u0119 myl\u0105ce. Wystarczy mie\u0107 to na uwadze i b\u0119dzie OK.<\/p>\n\n\n\n<p>Jeszcze jedno: wspomniany problem nie wyst\u0119puje na starszych  wersjach \u015brodowiska i bibliotek Arduino IDE. Warto sprawdzi\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wojny robot\u00f3w: trzecia &#8222;kanapka&#8221; i korki (przymy\u015blenia).<\/h2>\n\n\n\n<p>Pan Kacper buduje trzeci pojazd &#8222;kanapka&#8221;. Mamy nowe, troch\u0119 zmodyfikowane tymczasowe ko\u0142a &#8211; cho\u0107 drukarka 3D pracuje powoli, to i tak trzeba si\u0119 natrudzi\u0107 przy sk\u0142adaniu ca\u0142ej konstrukcji (jakie\u015b 3h?). <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0989-1024x576.jpg\" alt=\"\" class=\"wp-image-2812\" width=\"512\" height=\"288\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0989-1024x576.jpg 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0989-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0989-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0989-1536x864.jpg 1536w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0989.jpg 1800w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption>Trzeci pojazd. Nowe ko\u0142a. Ba(k)teria na \u015bcisk!<\/figcaption><\/figure><\/div>\n\n\n\n<p>My\u015bla\u0142em, \u017ce wykorzystanie kork\u00f3w od wina jest oryginalne &#8211; a tu si\u0119 okaza\u0142o, \u017ce takie zabiegi by\u0142y znane i (zapewne) stosowane przynajmniej od roku 1200+. \u0179r\u00f3d\u0142a historyczne donosz\u0105, \u017ce prawdziwy podr\u00f3\u017cnik awanturnik na szlaku musia\u0142 posiada\u0107 zestaw kork\u00f3w &#8211; pewnie w celach majsterkowania, bo po c\u00f3\u017c innego mia\u0142 on je w swoim ekwipunku?<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/2021-04-08_2142_1-1024x576.png\" alt=\"\" class=\"wp-image-2811\" width=\"768\" height=\"432\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/2021-04-08_2142_1-1024x576.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/2021-04-08_2142_1-300x169.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/2021-04-08_2142_1-768x432.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/2021-04-08_2142_1-1536x864.png 1536w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/2021-04-08_2142_1.png 1920w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption>Ekwipunek Geralta: korki to podstawa! <em>Witcher 3, CDPR<\/em><\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Wojny robot\u00f3w: szybko\u015b\u0107 obrotowa (RPM) silczka<\/h2>\n\n\n\n<p>Pan Tomasz z kolei zawzi\u0105\u0142 si\u0119 na zbadaniu pr\u0119dko\u015bci obrotej k\u00f3\u0142 (RPM = Revolutions Per Minute). Prosty uk\u0142ad pomiarowy (tymczasowy) pozwoli\u0142 mu zmierzy\u0107 t\u0105 pr\u0119dko\u015b\u0107. Uk\u0142ad sk\u0142ada si\u0119 z potencjometru do sterowania pr\u0119dko\u015bci\u0105 serwa Feetech FT90R (z prawej strony), oraz czujki szczelinowej (umieszczonej na &#8211; oczywi\u015bcie &#8211; korku do wina) wraz z przymocowanym ko\u0142em z\u0119batym (druk 3D). <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0985-1024x576.jpg\" alt=\"\" class=\"wp-image-2816\" width=\"512\" height=\"288\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0985-1024x576.jpg 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0985-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0985-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0985-1536x864.jpg 1536w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/04\/DSC_0985.jpg 1800w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption>Pomiar pr\u0119dko\u015bci obrotowej serwa.<\/figcaption><\/figure><\/div>\n\n\n\n<p>Pan Tomasz wykorzysta\u0142 przerwania z Arduino UNO (a dok\u0142adniej jedno, ze zboczem narastaj\u0105cym). cdn&#8230;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Maskotka<\/h2>\n\n\n\n<p>BB zako\u0144czy\u0142 prace nad p\u0142yt\u0105 g\u0142\u00f3wn\u0105 do Maskotki &#8211; aktualnie przygotowywane jest lepsze sterowanie pr\u0119dko\u015bci\u0105 k\u00f3\u0142 &#8211; kontroler PID.<\/p>\n\n\n\n<p>Kolejne spotkanie: czwartek 15:00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wojny robot\u00f3w: problem &#8211; serwa i Bluetooth (BT) Pan Rafa\u0142 oprogramowywa\u0142 sterowanie swojej &#8222;kanapki&#8221; z wykorzystaniem modu\u0142u BT. Nie jest to mo\u017ce najlepsze rozwi\u0105zanie sterowania, ale szybkie i bezproblemowe (jasne, jasne &#8211; czytaj dalej). Proste, po w\u0142\u0105czamy dwie standardowe biblioteki Servo.h oraz SoftwareSerial.h i piszemy prosty kod. A tu klops! Ilekro\u0107 przesy\u0142ane s\u0105 dane przez [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":2817,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[410,58,404,275,409,407,408,411,71,397,412,413,307],"class_list":{"0":"post-2810","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-altsoftserial","9":"tag-bluetooth","10":"tag-korek","11":"tag-pid","12":"tag-predkosc","13":"tag-problem","14":"tag-rpm","15":"tag-servotimer2","16":"tag-serwo","17":"tag-softwareserial","18":"tag-timer","19":"tag-timer2","20":"tag-wojny","22":"post-with-thumbnail","23":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2810","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=2810"}],"version-history":[{"count":10,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2810\/revisions"}],"predecessor-version":[{"id":2845,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2810\/revisions\/2845"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/2817"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2810"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2810"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2810"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}