{"id":1052,"date":"2018-01-20T06:55:55","date_gmt":"2018-01-20T06:55:55","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1052"},"modified":"2018-01-20T06:58:16","modified_gmt":"2018-01-20T06:58:16","slug":"sterowanie-servem-za-pomoca-potencjometru","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1052","title":{"rendered":"Sterowanie servem za pomoc\u0105 potencjometru"},"content":{"rendered":"<p>Na ostatnich zaj\u0119ciach \u0142\u0105czyli\u015bmy wiedz\u0119 nabyt\u0105 na dw\u00f3ch poprzednich spotkaniach, czyli dzia\u0142anie potencjometru oraz serva. Chcieli\u015bmy wykorzysta\u0107 mo\u017cliwo\u015b\u0107 zmiany nastawy potencjometru, w celu sterowania ramionami serwomechanizmu. Podobnie jak na zaj\u0119ciach przed\u015bwi\u0105tecznych, wykorzystamy do tego komendy biblioteki steruj\u0105cej servami.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1057\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/01\/20180116_172055-e1516309694299-169x300.jpg\" alt=\"\" width=\"169\" height=\"300\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/01\/20180116_172055-e1516309694299-169x300.jpg 169w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/01\/20180116_172055-e1516309694299-768x1365.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/01\/20180116_172055-e1516309694299-576x1024.jpg 576w\" sizes=\"auto, (max-width: 169px) 100vw, 169px\" \/><\/p>\n<h1>Sterowanie serva<\/h1>\n<pre class=\"lang:arduino decode:true\" title=\"Pod\u0142\u0105czanie serva\">#include &lt;Servo.h&gt;\r\nServo silnik;\r\n\r\nvoid setup (){\r\n  Serial.begin(9600);\r\n  silnik.attach(3);\r\n}\r\n<\/pre>\n<p>Servo pod\u0142\u0105czamy tak samo jak na <a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1020\">przed\u015bwi\u0105tecznych zaj\u0119ciach<\/a>, jednak w tym przypadku u\u017cywamy 3 pinu, a sam mechanizm nazywamy <strong>silnikiem <\/strong>(linia #2 i #6).<\/p>\n<h1>Wykorzystanie potencjometru<\/h1>\n<pre class=\"lang:arduino mark:4 decode:true\" title=\"Program steruj\u0105cy servem\">int pot;\r\nvoid loop(){\r\n   pot=analogRead(A0);\/\/odczytujemy liczby z zakresu od 0 do 1023\r\n   pot=pot*180.0\/1023;\/\/zamienimy na liczby od 0 do 180\r\n   Serial.print(pot);\r\n   silnik.write(pot);\r\n}<\/pre>\n<p>Na pocz\u0105tku deklarujemy zmienn\u0105 zapisuj\u0105c\u0105 stan potencjometru. W ciele funkcji <em>void loop()<\/em> pod\u0142\u0105czamy potencjometr do portu analogowego&nbsp;<strong>A0<\/strong>. Linia #4 przelicza zakres potencjometru. Jak pami\u0119tamy, wynosi on od 0 do 1023, natomiast stopnie wychylenia serva chcemy wyra\u017ca\u0107 w zakresie 0-180. 180 konwertujemy na zmienn\u0105 typu <em>float<\/em> dopisuj\u0105c do niej cz\u0119\u015b\u0107 dziesi\u0119tn\u0105 w celu <strong>unikni\u0119cia dzielenia ca\u0142kowitego<\/strong>. W innym wypadku otrzymywaliby\u015bmy nieprawdziwe wyniki, poniewa\u017c wynikiem dzielenia 180\/1023 zawsze b\u0119dzie 0, przez co ca\u0142e dzia\u0142anie r\u00f3wnie\u017c wyniesie 0. Przy zapisie 180.0\/1023 mamy do czynienia z dzieleniem rzeczywistym, kt\u00f3rego wynikiem b\u0119dzie liczba rzeczywista. Nast\u0119pnie przy przemno\u017ceniu przez zmienn\u0105 ca\u0142kowit\u0105 <em>pot<\/em> dostaniemy r\u00f3wnie\u017c liczb\u0119 rzeczywist\u0105. Ostateczny wynik jest rzutowany na liczb\u0119 ca\u0142kowit\u0105 w momencie przypisania operatorem r\u00f3wno\u015bci.<\/p>\n<h1>Ulepszenie &#8211; dodatkowy <em>if<\/em><\/h1>\n<p>W celu ulepszenia naszego kodu, chcieli\u015bmy aby po\u0142o\u017cenie ramion serwa by\u0142o aktualizowane jedynie wtedy, kiedy zmienimy po\u0142o\u017cenie potencjometru. Tym samym chcemy unikn\u0105\u0107 sytuacji wydawania polecenia &#8222;ustaw serwo na pozycj\u0119 XX&#8221; je\u015bli w\u0142a\u015bnie aktualn\u0105 pozycj\u0105 jest XX (nie ma to sensu, mimo tego, \u017ce to dzia\u0142a &#8211; jak w naszym pierwszym, prostym programie). U\u017cyli\u015bmy do tego instrukcji steruj\u0105cej<strong> if<\/strong>.&nbsp;W linii #1 dopisali\u015bmy kolejn\u0105 zmienn\u0105 nazwan\u0105 <strong>old<\/strong>, kt\u00f3ra ma za zadanie zapisywa\u0107 poprzedni stan po\u0142o\u017cenia potencjometru (odczytanego napi\u0119cia). W warunkach <em>if<\/em>-a sprawdzamy, czy zmienna <em>pot<\/em> (czyli aktualny stan potencjometru), r\u00f3\u017cni si\u0119 od zmiennej <em>old<\/em> (czyli jego poprzedni stan).&nbsp; Je\u015bli nie, funkcja <em>Serial.print()<\/em> nic nie wypisze i nie zmieniamy po\u0142o\u017cenia serwa. W przeciwnym przypadku zostanie wypisane nowe napi\u0119cie, a ramiona serwa zmieni\u0105 po\u0142o\u017cenie. Na ko\u0144cu przypisujemy zmienn\u0105 <strong>old<\/strong> do <strong>pot<\/strong>, aby m\u00f3c dokona\u0107 nowego por\u00f3wnania w kolejnej iteracji p\u0119tli.<strong>&nbsp;<\/strong><\/p>\n<pre class=\"lang:arduino mark:1,6,9 decode:true\" title=\"Ulepszony program\">int pot, old; \/\/old - zmienna zapisujaca poprzedni odczyt\r\n\r\nvoid loop(){\r\n  pot=analogRead(A0);\r\n  pot=pot*180.0\/1023.0; \r\n  if (pot!=old){ \/\/aby zmieniac polozenie tylko wtedy, kiedy sie zmienilo, a nie wyswietlac polozenie ciagle\r\n   Serial.print(pot);\r\n   silnik.write(pot);\r\n   old=pot; \r\n  }\r\n}<\/pre>\n<h1>Podsumowanie<\/h1>\n<p>Dzi\u0119ki naszemu programowi mo\u017cemy sterowa\u0107 ramionami serwa kr\u0119c\u0105c potencjometrem. Przeliczenie warto\u015bci napi\u0119cia na stopnie umo\u017cliwia do\u015b\u0107 precyzyjne ustawienie serva.<\/p>\n<p>2018, Ewelina (c)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na ostatnich zaj\u0119ciach \u0142\u0105czyli\u015bmy wiedz\u0119 nabyt\u0105 na dw\u00f3ch poprzednich spotkaniach, czyli dzia\u0142anie potencjometru oraz serva. Chcieli\u015bmy wykorzysta\u0107 mo\u017cliwo\u015b\u0107 zmiany nastawy potencjometru, w celu sterowania ramionami serwomechanizmu. Podobnie jak na zaj\u0119ciach przed\u015bwi\u0105tecznych, wykorzystamy do tego komendy biblioteki steruj\u0105cej servami. Sterowanie serva #include &lt;Servo.h&gt; Servo silnik; void setup (){ Serial.begin(9600); silnik.attach(3); } Servo pod\u0142\u0105czamy tak samo jak [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":1055,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[67,94,204,72,71,205],"class_list":{"0":"post-1052","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-analogread","9":"tag-potencjometr","10":"tag-serial-print","11":"tag-servo","12":"tag-serwo","13":"tag-serwomechanizm","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\/1052","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\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1052"}],"version-history":[{"count":10,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/1052\/revisions"}],"predecessor-version":[{"id":1066,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/1052\/revisions\/1066"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/1055"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1052"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1052"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1052"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}