{"id":1020,"date":"2017-12-19T12:18:33","date_gmt":"2017-12-19T12:18:33","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1020"},"modified":"2018-01-26T15:16:37","modified_gmt":"2018-01-26T15:16:37","slug":"laczenie-rejestrow-przesuwnych-oraz-sterowanie-serwomechanizmami","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1020","title":{"rendered":"\u0141\u0105czenie rejestr\u00f3w przesuwnych oraz sterowanie serwomechanizmami."},"content":{"rendered":"<p>Na ostatnim spotkaniu przed przerw\u0105 \u015bwi\u0105teczn\u0105 rozwin\u0119li\u015bmy projekt rozpocz\u0119ty na poprzednich zaj\u0119ciach tj. wy\u015bwietlanie cyfr przy pomocy wy\u015bwietlacza siedmiosegmentowego oraz rejestru przesuwnego. G\u0142\u00f3wn\u0105 korzy\u015bci\u0105 tej metody jest u\u017cycie jedynie trzech pin\u00f3w cyfrowych Arduino. Okazuje si\u0119, \u017ce do\u0142\u0105czenie drugiego wy\u015bwietlacza siedmiosegmentowego wymaga pod\u0142\u0105czenia drugiego rejestru przesuwnego, ale liczba pin\u00f3w cyfrowych pozostaje taka sama !<\/p>\n<p>Logika stosowania wielu rejestr\u00f3w przesuwnych mo\u017ce by\u0107 por\u00f3wnana do tworzenia jednego rejestru, kt\u00f3ry przed\u0142u\u017camy kolejnymi chipami 74HC595.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/bildr.org\/blog\/wp-content\/uploads\/2011\/02\/74HC595_3.png\"><\/p>\n<p>Pod\u0142\u0105czenie drugiego uk\u0142adu scalonego 74HC595 ogranicza si\u0119 do pod\u0142\u0105czenia pin\u00f3w RCLK oraz SRCLK do tych samych pin\u00f3w arduino co odpowiadaj\u0105ce RCLK oraz SRCLK piny pierwszego rejestru. B\u0119dzie to oznacza\u0142o, \u017ce nowy chip b\u0119dzie on otrzymywa\u0142 te same sygna\u0142y steruj\u0105ce co pierwszy. R\u00f3\u017cnic\u0105 jest pod\u0142\u0105czenie pinu SER. Zamiast bezpo\u015brednio do Arduino, pod\u0142\u0105czamy ten pin do wyj\u015bcia 9 naszego pierwszego rejestru przesuwnego. Dzi\u0119ki temu ca\u0142o\u015b\u0107 b\u0119dzie funkcjonowa\u0142a jak jeden, przed\u0142u\u017cony rejestr przesuwny.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-994\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/piny-270x300.png\" alt=\"\" width=\"270\" height=\"300\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/piny-270x300.png 270w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/piny.png 312w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Nasuwa si\u0119 pytanie: jak zmodyfikowa\u0107 ostatnio napisany przez nas program tak, by poprawnie dzia\u0142a\u0142?<br \/>\nOdpowied\u017a jest prosta. Przygotowali\u015bmy si\u0119 na to ju\u017c na poprzednim spotkaniu i wystarczy wprowadzi\u0107 now\u0105 warto\u015b\u0107 dla zmiennej ileScalakow (widocznej od razu w pierwszej linijce kodu), tak by r\u00f3wna\u0142a si\u0119 liczbie zastosowanych rejestr\u00f3w, czyli 2:<\/p>\n<h3>Ca\u0142y kod pozwalaj\u0105cy sprawdzi\u0107 dzia\u0142anie wy\u015bwietlaczy<\/h3>\n<pre class=\"lang:arduino decode:true \" title=\"Deklarowanie zmiennych\">#define ileScalakow 2\r\n#define ilePinow ileScalakow * 8\r\nint SER=8; \r\nint RCLK=9;\r\nint SRCLK=10; \r\nint rejestr[ilePinow];\r\n\r\nvoid setup(){\r\n  pinMode(SER, OUTPUT);\r\n  pinMode(RCLK, OUTPUT);\r\n  pinMode(SRCLK, OUTPUT);\r\n  czyscRejestr();\r\n  zapiszRejestr();\r\n}\r\nvoid czyscRejestr(){\r\n  for(int i=0; i&lt;ilePinow; i++)\r\n    rejestr[i]=LOW;\r\n}\r\nvoid zapiszRejestr(){\r\n  digitalWrite(RCLK, LOW); \r\n  for(int i=ilePinow-1; i&gt;=0; i--){\r\n    digitalWrite(SRCLK, LOW);\r\n    digitalWrite(SER, rejestr[i]);\r\n    digitalWrite(SRCLK, HIGH); \r\n  }\r\n  digitalWrite(RCLK, HIGH); \r\n}\r\nvoid ustawPin(int ktory, int wartosc){\r\n  rejestr[ktory]=wartosc;\r\n}\r\n\r\nvoid loop(){\r\n  int i;\r\n  for(i=0;i&lt;ilePinow;i++)\r\n    ustawPin(i, LOW);\r\n    zapiszRejestr();\r\n    delay(500);\r\n   for(i=0;i&lt;ilePinow;i++){\r\n    ustawPin(i, HIGH);\r\n    zapiszRejestr();\r\n    delay(500);\r\n}\r\n}\r\n\r\n<\/pre>\n<p>Po tej prostej zmianie kod dzia\u0142a poprawnie. Jest to przyk\u0142ad jak odpowiednie wprowadzanie zmiennych pozwala na skalowalno\u015b\u0107 i rozwijanie kreowanych program\u00f3w.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1034\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/IMG_20171219_170949-300x169.jpg\" alt=\"\" width=\"520\" height=\"293\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/IMG_20171219_170949-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/IMG_20171219_170949-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/IMG_20171219_170949-1024x576.jpg 1024w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><\/p>\n<h2>Sterowanie serwomechanizmami<\/h2>\n<p>Serwomechanizm, lub potocznie serwo, to nic innego jak silniczek pr\u0105du sta\u0142ego sterowany PWM (modulator szeroko\u015bci impulsu) z pod\u0142\u0105czonym odpowiednim uk\u0142adem z\u0119batek. To niewielkie i niedrogie urz\u0105dzenie pozwala wygenerowa\u0107 niespodziewanie du\u017c\u0105 si\u0142\u0119 i moment obrotowy, szczeg\u00f3lnie zwa\u017cywszy na jego rozmiary i niedu\u017cy pob\u00f3r mocy (przy mini serwach np. u\u017cywanych przez nas SG92r produkcji TowerPro rz\u0119du kilku wat\u00f3w).<\/p>\n<p>Przed rozpocz\u0119ciem jakichkolwiek do\u015bwiadcze\u0144 z serwami warto pami\u0119ta\u0107 w\u0142a\u015bnie o poborze mocy. Rekomendowane jest zasilanie ich z zewn\u0119trznego \u017ar\u00f3d\u0142a mocy np. baterii lub zasilacza pr\u0105du sta\u0142ego. Przyczyn\u0105 jest niebezpiecze\u0144stwo, jakie niesie za sob\u0105 skok nat\u0119\u017cenia pr\u0105du podczas ruchu serw &#8211; pod\u0142\u0105czenie kilku na raz do Arduino mo\u017ce niechybnie doprowadzi\u0107 do spalenia sterownika.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.netlabtoolkit.org\/wp-content\/uploads\/2015\/01\/servo_connection.png\" alt=\"Znalezione obrazy dla zapytania arduino servo batteries\"><\/p>\n<h3>Tworzenie programu steruj\u0105cego serwami<\/h3>\n<p>Arduino posiada dedykowan\u0105 bibliotek\u0119 do sterowania serwami, co niezwykle u\u0142atwia sterowanie i zarz\u0105dzanie.<\/p>\n<pre class=\"lang:arduino decode:true\">#include &lt;Servo.h&gt;<\/pre>\n<p>Nasz program pozwala na wpisywanie warto\u015bci do monitora szeregowego i dyktowanie ich serwomechanizmom.<\/p>\n<pre class=\"lang:arduino decode:true\">Servo serwomechanizm;\r\nint pozycja = 90;\r\n\r\nvoid setup() \r\n{ \r\n serwomechanizm.attach(9);\r\n Serial.begin(9600);\r\n}<\/pre>\n<p>&#8222;Servo&#8221; jest form\u0105 deklaracji, \u017ce dany obiekt o nazwie &#8222;Serwmechanizm&#8221; ma by\u0107 traktowany przez interpreter kodu jako serwomechanizm. Deklarujemy je w tej samej konwencji, co np. zmienne typu integer. Traktowanie go jak serwomechanizm oznacza, \u017ce mo\u017cemy przypisa\u0107 mu jaki\u015b pin oraz pozycj\u0119 (b\u0119d\u0105 to odpowiednie zmienne w obiekcie Servo).<\/p>\n<p>W naszym kodzie w etapie setup() przypisali\u015bmy pozycj\u0119 wyj\u015bciow\u0105 90 stopni (2. linijka), pin 9 (7. linijka) oraz uruchomili\u015bmy monitor szeregowy dla cz\u0119stotliwo\u015bci 9600 baud. Nast\u0119pnie w loop() przy pomocy metody &#8222;parseInt&#8221; ka\u017cemy &#8222;nas\u0142uchiwa\u0107&#8221; warto\u015bci, kt\u00f3re zostan\u0105 przypisane zmiennej &#8222;pozycja&#8221;.<\/p>\n<pre class=\"lang:arduino decode:true\" title=\"Prosty program do sterowania serwem przez konsol\u0119 \">void loop() \r\n{ \r\n if (Serial.available() &gt; 0) {\r\npozycja = Serial.parseInt();\r\n }\r\n if (pozycja &gt; 0 &amp;&amp; pozycja &lt; 180) { \r\n serwomechanizm.write(pozycja);\r\n } else { \r\n pozycja = pozycja%160+10;\r\n serwomechanizm.write(pozycja);\r\n } \r\n \r\n}<\/pre>\n<p>Tym sposobem mo\u017cemy sterowa\u0107 serwomechanizmem z klawiatury przypisuj\u0105c mu k\u0105t od 0 do 180 stopni. Warto jednak pami\u0119ta\u0107, by unika\u0107 skrajnych pozycji takich jak 0 i 180 stopni, gdy\u017c w niekt\u00f3rych przypadkach mo\u017ce to doprowadzi\u0107 do uszkodzenia serwomechanizmu.<\/p>\n<p style=\"text-align: right;\"><em>Adnotacja: W bloku &#8222;else&#8221; umie\u015bci\u0142em zabezpieczenie, kt\u00f3re nie pozwoli r\u00f3wnie\u017c na przypisanie warto\u015bci wi\u0119kszych ni\u017c 180. By\u0142a to nadprogramowa metoda, kt\u00f3ra pozwala ograniczy\u0107 przypisywane na serwo warto\u015bci tak, by zamyka\u0142y si\u0119 pomi\u0119dzy bezpiecznymi k\u0105tami 10 &#8211; 170 stopni. Sposoby zabezpieczania zale\u017c\u0105 od nas, jednak nie warto ich zaniedbywa\u0107. Szkoda naszego sprz\u0119tu i nerw\u00f3w!<\/em><\/p>\n<p>&nbsp;<\/p>\n<h3>Pomiar pr\u0105du p\u0142yn\u0105cego przez serwo.<\/h3>\n<p>Na bardziej ciekawych czeka\u0142a r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 pomiaru pr\u0105du p\u0142yn\u0105cego przez serwo. Warto pami\u0119ta\u0107, \u017ce pomiar nat\u0119\u017cenia pr\u0105du nale\u017cy przeprowadza\u0107 szeregowo wzgl\u0119dem badanego uk\u0142adu. Oznacza to, \u017ce multimetr w trybie pomiaru pr\u0105du musi by\u0107 &#8222;po drodze&#8221; pr\u0105du mi\u0119dzy \u017ar\u00f3d\u0142em zasilania, a serwem. Dlatego zrobili\u015bmy to w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1035\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/IMG_20171219_174245-300x169.jpg\" alt=\"\" width=\"499\" height=\"281\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/IMG_20171219_174245-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/IMG_20171219_174245-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/IMG_20171219_174245-1024x576.jpg 1024w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/p>\n<p>\u0179r\u00f3d\u0142o napi\u0119cia (bez obaw, 5V i pr\u0105d zdecydowanie poni\u017cej 1 A mo\u017cna swobodnie &#8222;izolowa\u0107&#8221; suchymi d\u0142o\u0144mi) do\u0142\u0105czyli\u015bmy do czerwonej sondy multimetru, a czarn\u0105 do wej\u015bcia 5V serwa &#8211; jest to w\u0142a\u015bnie po\u0142\u0105czenie szeregowe.<\/p>\n<p>Przy okazji mogli\u015bmy zbada\u0107 warto\u015b\u0107 <strong>pr\u0105du pobieran\u0105 przez pracuj\u0105ce serwo<\/strong>. Warto\u015bci te na og\u00f3\u0142 wynosi\u0142y kilkadziesi\u0105t mA, ale czasami (w skarajnym po\u0142o\u017ceniu a tak\u017ce podczas zmiany po\u0142o\u017cenia) <strong>wynosi\u0142y 100-200 mA<\/strong>. Oznacza to, \u017ce pod\u0142\u0105czenie kilku serw do Arduino jako \u017ar\u00f3d\u0142a napi\u0119cia (a nie tylko do zadawania sygna\u0142u) sko\u0144czy\u0142oby si\u0119 <strong>spaleniem<\/strong> p\u0142ytki. Dlatego buduj\u0105c bardziej z\u0142o\u017cone uk\u0142ady z pewno\u015bci\u0105 u\u017cyjemy zewn\u0119trznych \u017ar\u00f3de\u0142 napi\u0119cia.<\/p>\n<p>Do zobaczenia na kolejnym spotkaniu!<br \/>\nMaciej (c)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na ostatnim spotkaniu przed przerw\u0105 \u015bwi\u0105teczn\u0105 rozwin\u0119li\u015bmy projekt rozpocz\u0119ty na poprzednich zaj\u0119ciach tj. wy\u015bwietlanie cyfr przy pomocy wy\u015bwietlacza siedmiosegmentowego oraz rejestru przesuwnego. G\u0142\u00f3wn\u0105 korzy\u015bci\u0105 tej metody jest u\u017cycie jedynie trzech pin\u00f3w cyfrowych Arduino. Okazuje si\u0119, \u017ce do\u0142\u0105czenie drugiego wy\u015bwietlacza siedmiosegmentowego wymaga pod\u0142\u0105czenia drugiego rejestru przesuwnego, ale liczba pin\u00f3w cyfrowych pozostaje taka sama ! Logika stosowania [&hellip;]<\/p>\n","protected":false},"author":17,"featured_media":1036,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52,1],"tags":[191,202,201,200,72,71],"class_list":{"0":"post-1020","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"category-uncategorized","9":"tag-74hc595","10":"tag-parseint","11":"tag-przesuwny","12":"tag-rejest","13":"tag-servo","14":"tag-serwo","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\/1020","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=1020"}],"version-history":[{"count":17,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/1020\/revisions"}],"predecessor-version":[{"id":1091,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/1020\/revisions\/1091"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/1036"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}