{"id":404,"date":"2024-01-08T21:44:50","date_gmt":"2024-01-08T20:44:50","guid":{"rendered":"https:\/\/techscout.pl\/?p=404"},"modified":"2024-01-11T13:59:57","modified_gmt":"2024-01-11T12:59:57","slug":"przywitaj-sie-z-arduino","status":"publish","type":"post","link":"https:\/\/techscout.pl\/index.php\/2024\/01\/08\/przywitaj-sie-z-arduino\/","title":{"rendered":"Przywitaj si\u0119 z Arduino"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Po\u015br\u00f3d wielu urz\u0105dze\u0144, kt\u00f3re mo\u017cemy zbudowa\u0107 w oparciu o serwomechanizmy dzi\u015b przyjrzymy si\u0119 tej konstrukcji przypominaj\u0105cej rami\u0119 robota. Konstrukcja zwiera 6 serwomechanizm\u00f3w, przez co daje mo\u017cliwo\u015b\u0107 praktycznie dowolnego ustawienia ramienia w przestrzeni. Zbudowanie i oprogramowanie ca\u0142o\u015bci to niew\u0105tpliwie niez\u0142a zabawa. Ale zacznijmy od pocz\u0105tku&#8230;.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"693\" height=\"751\" src=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie1.png\" alt=\"\" class=\"wp-image-514\" style=\"width:598px;height:auto\" srcset=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie1.png 693w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie1-277x300.png 277w\" sizes=\"auto, (max-width: 693px) 100vw, 693px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sterowanie serwomechanizmem wydaje si\u0119 do\u015b\u0107 z\u0142o\u017cone, a ramieniem zawieraj\u0105cym ich kilka mo\u017ce odstrasza\u0107. Z pomoc\u0105 przychodz\u0105 nam jednak dost\u0119pne w \u015brodowisku Arduino biblioteki, kt\u00f3re umo\u017cliwiaj\u0105 proste ustawienie ka\u017cdego do\u0142\u0105czonego serwomechanizmu na \u017c\u0105dan\u0105 pozycj\u0119. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak pod\u0142\u0105czy\u0107 serwo?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Klasyczny serwomechanizm ma 3 przewody. Dwa z nich s\u0142u\u017c\u0105 do zasilania (czerwony [+] oraz czarny [-]) a \u017c\u00f3\u0142ty do sterowania po\u0142o\u017ceniem. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"600\" src=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/servo-1.png\" alt=\"\" class=\"wp-image-519\" style=\"width:410px;height:auto\" srcset=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/servo-1.png 600w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/servo-1-300x300.png 300w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/servo-1-150x150.png 150w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Zdj\u0119cie przyk\u0142adowego serwomechanizmu z wyprowadzonymi 3 przewodami<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Taki mechanizm nie daje mo\u017cliwo\u015bci odczytania aktualnej pozycji serwomechanizmu, to jest urz\u0105dzenie wykonawcze. Brak mo\u017cliwo\u015bci odczytania po\u0142o\u017cenia powoduje problem przy starcie uk\u0142adu, gdy\u017c po w\u0142\u0105czeniu zasilania b\u0119dzie ono d\u0105\u017cy\u0107 do pozycji pocz\u0105tkowej, wykonuj\u0105c przy tym bardzo gwa\u0142towny ruch. Zjawisko to zaobserwujemy r\u00f3wnie\u017c uruchamiaj\u0105c nasze robotyczne rami\u0119, wi\u0119c przed w\u0142\u0105czeniem zasilania najlepiej je wyprostowa\u0107 i takie po\u0142o\u017cenie za\u0142o\u017cy\u0107 w kodzie jako pozycj\u0119 pocz\u0105tkow\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zasilanie (przewody czerwony i czarny) pod\u0142\u0105czamy bezpo\u015brednio do \u017ar\u00f3d\u0142a napi\u0119cia o du\u017cej wydajno\u015bci (np. akumulator lub zasilacz laboratoryjny). Wydajno\u015b\u0107 \u017ar\u00f3d\u0142a zasilania dobieramy zale\u017cnie od parametr\u00f3w u\u017cytych serwomechanizm\u00f3w, dla omawianego ramienia to min 3A. Przew\u00f3d sterowania (\u017c\u00f3\u0142ty) oraz r\u00f3wnolegle mas\u0119 (czarny) do\u0142\u0105czamy do Arduino. Po stronie Arduino do sterowania ka\u017cdym z serwomechanizm\u00f3w wykorzystujemy wybrany PIN PWM. Analogicznie, do pozosta\u0142ych PIN\u00f3w w Arduino pod\u0142\u0105czamy pozosta\u0142e serwomechanizmy i mo\u017cemy przyst\u0105pi\u0107 do pisania kodu. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"831\" src=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/arduino_servo-1024x831.png\" alt=\"\" class=\"wp-image-518\" style=\"width:561px;height:auto\" srcset=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/arduino_servo-1024x831.png 1024w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/arduino_servo-300x243.png 300w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/arduino_servo-768x623.png 768w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/arduino_servo.png 1170w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Sterowanie PWM<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sterowanie odbywa si\u0119 przez generowanie sygna\u0142u PWM, kt\u00f3ry w zale\u017cno\u015bci od czasu jego wype\u0142nienia wskazuje na po\u017c\u0105danie po\u0142o\u017cenie serwomechanizmu. Sygna\u0142 powinien mie\u0107 cz\u0119stotliwo\u015b\u0107 ok 50Hz.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"542\" height=\"342\" src=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/pwm.png\" alt=\"PWM\" class=\"wp-image-521\" srcset=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/pwm.png 542w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/pwm-300x189.png 300w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/pwm-540x342.png 540w\" sizes=\"auto, (max-width: 542px) 100vw, 542px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">\u0179r\u00f3d\u0142o grafiki: Wikipedia<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"360\" src=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/rc_servo.gif\" alt=\"Sygna\u0142 PWM sterownika RC do serwemechanizmu.\" class=\"wp-image-540\" style=\"width:840px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Zmiany w sygnale PWM widoczne na oscyloskopie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Powy\u017cej widoczny jest sygna\u0142 steruj\u0105cy serwomechanizmem i jego zmiana po zmianie wychylenia dr\u0105\u017cka w pilocie RC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Piszemy kod<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wykorzystujemy tu bibliotek\u0119 Servo.h, kt\u00f3ra zapewnia generowanie sygna\u0142u steruj\u0105cego PWM. Sterowanie odbywa si\u0119 przez wywo\u0142ywanie funkcji, napisanej z u\u017cyciem wspomnianej biblioteki.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>setServoPosition(int servoNumber, int targetAngle, int speed)<\/strong>, w kt\u00f3rej parametry to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>servoNumber- numer serwomechanizmu (1-6)<\/li>\n\n\n\n<li>targetAngle &#8211; zadane ustawienie &#8211; k\u0105t (0-180)<\/li>\n\n\n\n<li>speed &#8211; szybko\u015b\u0107 ruchu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nasze ramie b\u0119dzie wykonywa\u0107 powtarzaj\u0105cy si\u0119 ruch, dlatego szereg wywo\u0142a\u0144 tej funkcji znajduje si\u0119 w p\u0119tli. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Servo.h&gt;\n\nServo servos&#91;6]; \/\/ Tablica serwomechanizm\u00f3w\nint servoPins&#91;6] = {2, 3, 4, 5, 6, 7}; \/\/ Numery pin\u00f3w, do kt\u00f3rych s\u0105 pod\u0142\u0105czone serwomechanizmy\n\nvoid setup() {\n  for (int i = 0; i &lt; 6; i++) {\n    servos&#91;i].attach(servoPins&#91;i]);\n  }\n  \/\/ id_servo (1-6 liczone od do\u0142u), angle (0-180), speed (1 szybko, 30 wolno)\n  setServoPosition(1, 175, 10); \/\/ obr\u00f3t do pozycji pocz\u0105tkowej\n  setServoPosition(2, 90, 10); \n  setServoPosition(3, 90, 10); \n  setServoPosition(4, 90, 10); \n  setServoPosition(5, 80, 10); \n  setServoPosition(6, 90, 10); \/\/ szczypce otwarte\n\n}\n\nvoid loop() {\n  setServoPosition(6, 90, 20); \/\/szczypce otwarte\n\n  setServoPosition(4, 180, 20); \n  setServoPosition(2, 75, 20); \n  setServoPosition(3, 45, 20); \n  setServoPosition(6, 150, 20); \/\/szczypce zamkniete\n  \n  setServoPosition(3, 90, 20); \n  setServoPosition(2, 90, 20); \n  setServoPosition(1, 90, 30); \/\/obrot\n\n  setServoPosition(4, 180, 20); \n  setServoPosition(3, 45, 20); \n  setServoPosition(2, 75, 20); \n  setServoPosition(6, 90, 20); \/\/szczypce otwarte\n\n  setServoPosition(2, 90, 20); \n  setServoPosition(3, 90, 20); \n  setServoPosition(4, 90, 20); \n  setServoPosition(1, 175, 30); \/\/obrot  \n  delay(1000);  \n}\n\n\nvoid setServoPosition(int servoNumber, int targetAngle, int speed) {\n  if (servoNumber &gt;= 1 &amp;&amp; servoNumber &lt;= 6) {\n    Servo servo = servos&#91;servoNumber - 1];\n    int currentAngle = servo.read();\n    \n    if (currentAngle &lt; targetAngle) {\n      for (int angle = currentAngle; angle &lt;= targetAngle; angle++) {\n        servo.write(angle);\n        delay(speed);\n      }\n    } else if (currentAngle &gt; targetAngle) {\n      for (int angle = currentAngle; angle &gt;= targetAngle; angle--) {\n        servo.write(angle);\n        delay(speed);\n      }\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Efekt dzia\u0142ania programu mo\u017cemy zaobserwowa\u0107 na filmie:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"responsive-embed widescreen\"><iframe loading=\"lazy\" title=\"Rami\u0119 robota sterowane przez Arduino.\" width=\"1000\" height=\"563\" src=\"https:\/\/www.youtube.com\/embed\/h8txwPprwEQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">  <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pomys\u0142y na rozbudow\u0119<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Przedstawiony kod to jedynie przyk\u0142ad. Rozwi\u0105zanie mo\u017cna rozbudowa\u0107 np. o poni\u017csze pomys\u0142y:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>czujnik obecno\u015bci podnoszonego przedmiotu i uruchamianie ruchu po jego wykryciu<\/li>\n\n\n\n<li>dodanie drugiego kosza i umieszczanie przedmiotu naprzemiennie w 2 koszach<\/li>\n\n\n\n<li>dodanie czujnika ultrad\u017awi\u0119kowego do wyszukania podnoszonego przedmiotu woko\u0142o ramienia<\/li>\n\n\n\n<li>pokazywanie przez rami\u0119 r\u00f3\u017cnych gest\u00f3w<\/li>\n\n\n\n<li>wykonywanie przez rami\u0119 innych czynno\u015bci np. wciskanie prze\u0142\u0105cznika w\u0142\u0105czaj\u0105cego o\u015bwietlenie<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"1024\" data-id=\"531\" src=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/vlcsnap-2023-11-15-12h55m40s062-576x1024.png\" alt=\"\" class=\"wp-image-531\" srcset=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/vlcsnap-2023-11-15-12h55m40s062-576x1024.png 576w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/vlcsnap-2023-11-15-12h55m40s062-169x300.png 169w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/vlcsnap-2023-11-15-12h55m40s062-768x1365.png 768w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/vlcsnap-2023-11-15-12h55m40s062-864x1536.png 864w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/vlcsnap-2023-11-15-12h55m40s062.png 1080w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"1024\" data-id=\"530\" src=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie2-576x1024.png\" alt=\"\" class=\"wp-image-530\" srcset=\"https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie2-576x1024.png 576w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie2-169x300.png 169w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie2-768x1365.png 768w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie2-864x1536.png 864w, https:\/\/techscout.pl\/wp-content\/uploads\/2024\/01\/ramie2.png 1080w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podsumowuj\u0105c. Robotyczne rami\u0119 ma bardzo du\u017ce walory edukacyjne. Uczy programowania, mechaniki i elektroniki. Z\u0142o\u017cenie ramienia wymaga cierpliwo\u015bci i precyzji, konieczne jest samodzielne zbudowanie podestu a \u015brubki wymagaj\u0105 zabezpieczenia ich przed odkr\u0119caniem np. klejem. Niew\u0105tpliwie rami\u0119 mo\u017ce stanowi\u0107 element wielu ciekawych pomys\u0142\u00f3w i by\u0107 wst\u0119pem do zabawy z wi\u0119kszymi projektami zwi\u0105zanymi z robotyk\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Udanej zabawy!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Po\u015br\u00f3d wielu urz\u0105dze\u0144, kt\u00f3re mo\u017cemy zbudowa\u0107 w oparciu o serwomechanizmy dzi\u015b przyjrzymy si\u0119 tej konstrukcji przypominaj\u0105cej rami\u0119 robota. Konstrukcja zwiera 6 serwomechanizm\u00f3w, przez co daje mo\u017cliwo\u015b\u0107 praktycznie dowolnego ustawienia ramienia w przestrzeni. Zbudowanie i oprogramowanie ca\u0142o\u015bci to niew\u0105tpliwie niez\u0142a zabawa&#8230;.<\/p>\n","protected":false},"author":2,"featured_media":405,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[21,23,22],"class_list":["post-404","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","tag-arduino","tag-programowanie","tag-servo"],"_links":{"self":[{"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/posts\/404","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/comments?post=404"}],"version-history":[{"count":25,"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/posts\/404\/revisions"}],"predecessor-version":[{"id":548,"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/posts\/404\/revisions\/548"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/media\/405"}],"wp:attachment":[{"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/media?parent=404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/categories?post=404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techscout.pl\/index.php\/wp-json\/wp\/v2\/tags?post=404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}