{"id":3414,"date":"2021-11-19T12:39:00","date_gmt":"2021-11-19T12:39:00","guid":{"rendered":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=3414"},"modified":"2021-12-10T21:47:10","modified_gmt":"2021-12-10T21:47:10","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-2-3-2-2-2-2-2-2-2-2-3-2-2-2-2","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=3414","title":{"rendered":"Powolutku&#8230; czujnik odleg\u0142o\u015bci"},"content":{"rendered":"\n<p>Poznajemy ultrad\u017awi\u0119kowy czujnik odleg\u0142o\u015bci &#8211; uk\u0142ad HC-SR04. Emituje on fale d\u017awi\u0119kowe o cz\u0119stotliwo\u015bci 40 kHz (czyli spoza zakresu s\u0142yszalno\u015bci cz\u0142owieka) i czeka na jej powr\u00f3t. Mierz\u0105c czas nadej\u015bcia tej informacji (powrotnej) znamy odleg\u0142o\u015b\u0107 do obiektu, od kt\u00f3rego odbi\u0142a si\u0119 fala d\u017awi\u0119kowa (a w\u0142a\u015bciwie 2x odleg\u0142o\u015b\u0107, bo fala pokona\u0142a drog\u0119 w jedn\u0105 stron\u0119 i z powrotem). <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"380\" height=\"334\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/12\/HC-SR04-Ultrasonic-Distance-Sensor-Pinout.png\" alt=\"\" class=\"wp-image-3420\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/12\/HC-SR04-Ultrasonic-Distance-Sensor-Pinout.png 380w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/12\/HC-SR04-Ultrasonic-Distance-Sensor-Pinout-300x264.png 300w\" sizes=\"auto, (max-width: 380px) 100vw, 380px\" \/><figcaption>PINOUT: czyli jak pod\u0142\u0105czy\u0107 uk\u0142ad. VCC=5V.<\/figcaption><\/figure><\/div>\n\n\n\n<p>Dzia\u0142anie uk\u0142adu odbywa si\u0119 zgodnie z nast\u0119puj\u0105cym protoko\u0142em (schematem):<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>w\u0142\u0105czamy TRIG  (stan wysoki =5V) na 10 us aby uruchomi\u0107 procedur\u0119 wyemitowania d\u017awi\u0119ku (8 impuls\u00f3w 40 kHz);<\/li><li>wy\u0142\u0105czamy TRIG (stan niski =0V), pin ECHO przechodzi w stan wysoki i zmieni go na niski, gdy sygna\u0142 wr\u00f3ci (a je\u015bli nie wr\u00f3ci, ECHO zmieni si\u0119 po czasie 38 ms);<\/li><li> mierzymy czas trwania sygna\u0142u wysokiego na pinie ECHO &#8211; znaj\u0105c ten czas i zak\u0142adaj\u0105c pr\u0119dko\u015b\u0107 d\u017awi\u0119ku 340 m\/s mamy ju\u017c odleg\u0142o\u015b\u0107 do obiektu.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/lastminuteengineers.com\/arduino-sr04-ultrasonic-sensor-tutorial\/\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"565\" height=\"435\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/12\/HC-SR04-Ultrasonic-Sensor-Working-Echo-reflected-from-Obstacle.gif\" alt=\"\" class=\"wp-image-3421\"\/><\/a><figcaption>Zasada dzia\u0142ania czujnika &#8211; polecam stron\u0119 LAST MINUTE ENGINERING.<\/figcaption><\/figure>\n\n\n\n<p>Pierwszy programik wykorzystuje funkcj\u0119 <a href=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/advanced-io\/pulsein\/\" data-type=\"URL\" data-id=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/advanced-io\/pulsein\/\" target=\"_blank\" rel=\"noreferrer noopener\">pulseIn() <\/a>w celu okre\u015blenia d\u0142ugo\u015bci trwania sygna\u0142u HIGH na pinie ECHO.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define TRIG 8\n#define ECHO 7\n\nunsigned int t2;\n\nvoid setup() {\n  pinMode(TRIG, OUTPUT);\n  pinMode(ECHO, INPUT);\n  Serial.begin(9600);\n}\n\nvoid loop() {\n    digitalWrite(TRIG, 0);\n    \n    delayMicroseconds(5);  \n    digitalWrite(TRIG, 1);\n    delayMicroseconds(10);  \n    digitalWrite(TRIG, 0);\n\n    \/\/z wykorzystaniem funkcji pulseIn\n    t2=pulseIn(ECHO, HIGH);\n  \n    Serial.print(t2);\n    Serial.print(\",  \");\n    Serial.print(t2\/58.0);    \n    Serial.println(\" &#91;cm]\");\n  \n    delay(100);\n}<\/code><\/pre>\n\n\n\n<p>Nie jestem wielkim zwolennikiem funkcji pulseIn() &#8211; cho\u0107 dzia\u0142a bardzo dobrze. Do odczytu stanu pin\u00f3w s\u0142u\u017cy funkcja <a rel=\"noreferrer noopener\" href=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/digital-io\/digitalread\/\" data-type=\"URL\" data-id=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/digital-io\/digitalread\/\" target=\"_blank\">digitalRead()<\/a>, kt\u00f3r\u0105 trzeba tylko odpowiednio &#8222;zap\u0119tli\u0107&#8221; &#8212; poni\u017cszy kod w\u0142a\u015bnie to realizuje. Wykorzystujemy te\u017c funkcj\u0119 mierzenia czasu dzia\u0142ania Arduino w mikrosekundach (czyli w 1\/1000 milisekund!) czyli funkcji <a rel=\"noreferrer noopener\" href=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/time\/micros\/\" data-type=\"URL\" data-id=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/time\/micros\/\" target=\"_blank\">micros()<\/a>. Oto i kod:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define TRIG 8\n#define ECHO 7\n\nunsigned int t1,t2;\nbyte aaa;\n\nvoid setup() {\n  pinMode(TRIG, OUTPUT);\n  pinMode(ECHO, INPUT);\n  Serial.begin(9600);\n}\n\nvoid loop() {\n    digitalWrite(TRIG, 0);\n    \n    delayMicroseconds(5);  \n    digitalWrite(TRIG, 1);\n    delayMicroseconds(10);  \n    digitalWrite(TRIG, 0);\n\n    \/\/czekanie na przelaczenie pinu ECHO w stan HIGH... wszak nic nie dzieje sie natychmiast!\n    while (digitalRead(ECHO) == LOW);\n    t1=micros();\n   \n    while ((aaa=digitalRead(ECHO)) == HIGH);\/\/ Serial.println(aaa);\n    t2=micros()-t1;\n  \n    Serial.print(t2);\n    Serial.print(\",  \");\n    Serial.print(t2\/58.0);    \n    Serial.println(\" &#91;cm]\");\n  \n    delay(100);\n}<\/code><\/pre>\n\n\n\n<p>Dwie rzeczy wymagaj\u0105 wyja\u015bnienia: 1) P\u0119tle while ko\u0144cz\u0105 si\u0119 \u015brednikiem &#8211; czyli p\u0119tla nie wykonuje nic! od razu wraca do sprawdzenia warunku kontynuowania p\u0119tli &#8211; tak szybko, jak si\u0119 da; nie ma strat czasu na wypisywanie rzeczy, na jakie\u015b obliczenia&#8230;. 2) czekamy na ustawienie pinu ECHO w stan HIGH tak d\u0142ugo, jak czujnik SR_HC04 to zrobi (bo cho\u0107 protok\u00f3\u0142 o tym w\u0142a\u015bnie m\u00f3wi, to nic nie dzieje si\u0119 natychmiast &#8211; nawet \u015bwiat\u0142o ma sko\u0144czon\u0105 pr\u0119dko\u015b\u0107); dlatego pojawi\u0142a si\u0119 p\u0119tla trwaj\u0105ca tak d\u0142ugo, a\u017c stan pinu ECHO jest LOW. Po tej p\u0119tli mamy pewno\u015b\u0107, \u017ce ECHO jest ju\u017c HIGH i uruchamiamy &#8222;stoper&#8221; (zapisujemy aktualn\u0105 warto\u015b\u0107 mikrosekund) do zmiennej t1. Teraz ponownie zap\u0119tlamy program a\u017c stan pinu ECHO zmieni si\u0119 na LOW &#8211; to sygnalizuje powr\u00f3t sygna\u0142u do uk\u0142adu. Ta p\u0119tla pos\u0142uguje si\u0119 pomocnicz\u0105 zmienn\u0105 aaa (ale beznadziejna nazwa) zapisuj\u0105c\u0105 stan pinu ECHO &#8211; niby niepotrzebnie, ale mo\u017cna odkomentowa\u0107 nast\u0119pn\u0105 lini\u0119 i b\u0119dziemy widzie\u0107 jej warto\u015b\u0107. To kolejna ma\u0142a rzecz wymagaj\u0105ca komentarza. Po tej  p\u0119tli ponownie zapisujemy &#8222;stoper&#8221; &#8211; czyli aktualn\u0105 warto\u015b\u0107 mikrosekund, tworz\u0105c zmienn\u0105 t2 r\u00f3wn\u0105 r\u00f3\u017cnicy zatrzymanego czasu i warto\u015bci t1&#8230; Zmienna t2 ma teraz dok\u0142adnie takie samo znaczenie jak w pierwszym przyk\u0142adzie (programie) i dalsza cz\u0119\u015b\u0107 pozostaje niezmieniona.<\/p>\n\n\n\n<p>Kt\u00f3re rozwi\u0105zanie lepsze? W przypadku jednego czujnika pewnie pierwsze jest fajniejsze, ale gdy mamy wi\u0119cej czujek dzia\u0142aj\u0105cych jednocze\u015bnie? W\u00f3wczas rozwi\u0105zanie z pulseIn() nie zagra, bo zatrzyma wykonanie programu i nie pozwoli na wykrycie sygna\u0142u wracaj\u0105cego do innego czujnika &#8211; czyli popsuje wyniki dla drugiego, trzeciego czujnika. Drugie rozwi\u0105zanie mo\u017cna \u0142atwo rozbudowa\u0107 do wsp\u00f3\u0142pracy z wieloma czujnikami (np. wprowadzaj\u0105c zmienne t2, t3, t4&#8230; ) mierz\u0105ce czas powrotu sygna\u0142u z kolejnych czujek. Ale nie upieram si\u0119 nad wy\u017cszo\u015bci\u0105 jednego nad drugim. Mi bardziej pasuje funkcja digitalRead() i dlatego wol\u0119 drugi programik. Warto na koniec wspomnie\u0107, \u017ce jest dedykowana biblioteka do obs\u0142ugi uk\u0142adu SR-HC04 (gdzie? poszukaj!) i wiem, \u017ce \u015bwietnie nadaje si\u0119 do obs\u0142ugi wielu czujnik\u00f3w.<\/p>\n\n\n\n<p class=\"has-text-align-right\">(c) K.G. 2021<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Poznajemy ultrad\u017awi\u0119kowy czujnik odleg\u0142o\u015bci &#8211; uk\u0142ad HC-SR04. Emituje on fale d\u017awi\u0119kowe o cz\u0119stotliwo\u015bci 40 kHz (czyli spoza zakresu s\u0142yszalno\u015bci cz\u0142owieka) i czeka na jej powr\u00f3t. Mierz\u0105c czas nadej\u015bcia tej informacji (powrotnej) znamy odleg\u0142o\u015b\u0107 do obiektu, od kt\u00f3rego odbi\u0142a si\u0119 fala d\u017awi\u0119kowa (a w\u0142a\u015bciwie 2x odleg\u0142o\u015b\u0107, bo fala pokona\u0142a drog\u0119 w jedn\u0105 stron\u0119 i z powrotem). [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":3420,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[465,463,460,459,462,461,464],"class_list":{"0":"post-3414","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-40khz","9":"tag-digitalread","10":"tag-odleglosc","11":"tag-podstawy","12":"tag-pulsein","13":"tag-sr-hc04","14":"tag-ultradzwieki","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\/3414","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=3414"}],"version-history":[{"count":7,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/3414\/revisions"}],"predecessor-version":[{"id":3430,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/3414\/revisions\/3430"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/3420"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3414"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3414"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}