{"id":75856,"date":"2024-02-19T14:00:23","date_gmt":"2024-02-19T13:00:23","guid":{"rendered":"https:\/\/botland.com.pl\/blog\/?p=75856"},"modified":"2026-04-08T11:01:06","modified_gmt":"2026-04-08T09:01:06","slug":"raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem","status":"publish","type":"post","link":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/","title":{"rendered":"Kurs Raspberry Pi Pico &#8211; #6 \u2013 PWM, ADC i komunikacja z komputerem"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\"> 17<\/span> <span class=\"rt-label rt-postfix\">min.<\/span><\/span>\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"75856\" class=\"elementor elementor-75856\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-27cbe3e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"27cbe3e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0f12413\" data-id=\"0f12413\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-eb90f56 elementor-widget elementor-widget-text-editor\" data-id=\"eb90f56\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400;\">W poprzedniej cz\u0119\u015bci poznali\u015bmy podstawowe zmienne, instrukcje warunkowe oraz p\u0119tle. Poza tym opowiedzia\u0142em wam nieco o b\u0142\u0119dach i prostym sposobie ich rozwi\u0105zywania. W dzisiejszym materiale przyjrzymy si\u0119 bli\u017cej kilku funkcjonalno\u015bciom mikrokontrolera RP2040. B\u0119d\u0105 to PWM, USB oraz ADC. Oczywi\u015bcie poza teoretycznym opisem poznacie te\u017c praktyczne zastosowanie tych funkcji, tak wi\u0119c zaczynajmy.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6be0988 elementor-widget elementor-widget-text-editor\" data-id=\"6be0988\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"blog-special\">\n<strong>Raspberry Pi obs\u0142uguje PWM<\/strong>, kt\u00f3ry reguluje moc przez zmian\u0119 szeroko\u015bci impuls\u00f3w. U\u017cywany jest do sterowania LED, silnikami czy serwami. Dost\u0119pne s\u0105 2 sprz\u0119towe kana\u0142y PWM, a inne piny obs\u0142uguj\u0105 PWM programowo. W Pythonie (RPi.GPIO) mo\u017cna ustawi\u0107 cz\u0119stotliwo\u015b\u0107 i wype\u0142nienie, co pozwala na p\u0142ynn\u0105 regulacj\u0119 urz\u0105dze\u0144.\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dce1440 elementor-widget elementor-widget-image\" data-id=\"dce1440\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"4Gotowy Zestaw do nauki programowania z Raspberry Pi Pico W\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc2MTU2IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMVwvNEdvdG93eS1aZXN0YXctZG8tbmF1a2ktcHJvZ3JhbW93YW5pYS16LVJhc3BiZXJyeS1QaS1QaWNvLVcuanBnIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"109\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-1024x139.jpg\" class=\"attachment-large size-large wp-image-76156\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-1024x139.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-300x41.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-768x104.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W.jpg 1429w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-fab667e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fab667e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-af7a99e\" data-id=\"af7a99e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4dca5e7 elementor-widget elementor-widget-image\" data-id=\"4dca5e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"24136_3\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc2MTYwIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMVwvMjQxMzZfMy5qcGcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"300\" height=\"273\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3-300x273.jpg\" class=\"attachment-medium size-medium wp-image-76160\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3-300x273.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3-1024x933.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3-768x700.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3.jpg 1080w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-0bfefcb\" data-id=\"0bfefcb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b415e75 elementor-widget elementor-widget-text-editor\" data-id=\"b415e75\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-weight: bolder\">Kup zestaw do nauki programowania z Raspberry Pi Pico W i skorzystaj z kursu dost\u0119pnego na Blog Botland!<\/span><\/p><p>W zestawie: modu\u0142 Raspberry Pi Pico W, p\u0142ytka stykowa, przewody, diody LED, rezystory, przyciski, fotorezystory, cyfrowe czujniki \u015bwiat\u0142a, temperatury, wilgotno\u015bci i ci\u015bnienia, wy\u015bwietlacz OLED i przew\u00f3d USB-microUSB.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-af12def elementor-align-center elementor-widget elementor-widget-button\" data-id=\"af12def\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/24136-zestaw-do-nauki-programowania-z-raspberry-pi-pico-w.html\" target=\"_blank\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">SPRAWD\u0179 W BOTLAND!<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-2037461 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"2037461\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d928989 elementor-widget elementor-widget-text-editor\" data-id=\"d928989\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-weight: bolder;\">Spis tre\u015bci:<\/span><\/p><ol style=\"background-color: #ffffff;\"><li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-1-zaczynamy\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #1<\/span>\u00a0&#8211; zaczynamy\u00a0<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-2-slow-kilka-o-programowaniu\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #2<\/span>\u00a0&#8211; s\u0142\u00f3w kilka o programowaniu<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-3-pierwszy-program\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #3<\/span>\u00a0&#8211; pierwszy program<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-4-zaczynamy-programowac\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #4<\/span>\u00a0&#8211; zaczynamy programowa\u0107<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-5-petle-zmienne-i-instrukcje-warunkowe\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #5<\/span>\u00a0&#8211; p\u0119tle, zmienne i instrukcje warunkowe\u00a0<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>\u00a0Raspberry Pi Pico \u2013 #6<\/strong> \u2013 PWM, ADC i komunikacja z komputerem<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #7 <\/span>\u00a0\u2013 poprawki w kodzie i w\u0142asne funkcje\u00a0<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-8-przerwania-i-alarmy\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico \u2013 #8<\/strong> \u2013 przerwania i alarmy<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #9<\/span>\u00a0\u2013 Teoria wska\u017anik\u00f3w i timery<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-10-tablice-struktury-i-maszyna-stanow\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico \u2013 #10<\/strong>\u00a0\u2013 Tablice, struktury i maszyna stan\u00f3w<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #11<\/span>\u00a0&#8211; Uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico \u2013 #12 \u2013<\/strong> Przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico \u2013 #13<\/strong> \u2013 Biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA<\/a><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c263abf elementor-widget elementor-widget-spacer\" data-id=\"c263abf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b98c326 elementor-widget elementor-widget-heading\" data-id=\"b98c326\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Przed wyruszeniem w drog\u0119 nale\u017cy zebra\u0107 dru\u017cyn\u0119<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc7a007 elementor-widget elementor-widget-image\" data-id=\"dc7a007\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-scaled.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_0647\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc0Nzk3IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMVwvSU1HXzA2NDctc2NhbGVkLmpwZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576.jpg\" class=\"attachment-large size-large wp-image-74797\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-300x169.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-768x432.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1536x864.jpg 1536w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-2048x1152.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Zestaw element\u00f3w do kursu Raspberry Pi Pico.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ad8abbb elementor-align-center elementor-widget elementor-widget-button\" data-id=\"ad8abbb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/24136-zestaw-do-nauki-programowania-z-raspberry-pi-pico-w.html\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">SPRAWD\u0179<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-21878d4 elementor-widget elementor-widget-text-editor\" data-id=\"21878d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Chc\u0105c uczy\u0107 si\u0119 programowania, bazuj\u0105c na rzeczywistych projektach, potrzebny b\u0119dzie oczywi\u015bcie odpowiedni sprz\u0119t, ale bez obaw &#8211; nie musisz teraz skaka\u0107 mi\u0119dzy kolejnymi artyku\u0142ami i przygotowywa\u0107 list\u0119 niezb\u0119dnych elektronicznych element\u00f3w. W sklepie\u00a0<a style=\"background-color: #ffffff\" href=\"https:\/\/botland.com.pl\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder\">Botland<\/span><\/a>\u00a0dost\u0119pny jest\u00a0<a style=\"background-color: #ffffff\" href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/24136-zestaw-do-nauki-programowania-z-raspberry-pi-pico-w.html\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder\">gotowy zestaw<\/span><\/a>, zawieraj\u0105cy wszystkie komponenty niezb\u0119dne do wykonania projekt\u00f3w opisanych w serii poradnik\u00f3w o Raspberry Pi Pico.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ed85218 elementor-widget elementor-widget-text-editor\" data-id=\"ed85218\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>W\u00a0<a href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/24136-zestaw-do-nauki-programowania-z-raspberry-pi-pico-w.html\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder\">gotowym zestawie<\/span><\/a>\u00a0element\u00f3w znajdziecie:<\/p><ul style=\"font-size: 16px;background-color: #ffffff\"><li style=\"font-size: 16px\">Raspberry Pi Pico W,<\/li><li style=\"font-size: 16px\">Przew\u00f3d microUSB,<\/li><li style=\"font-size: 16px\">P\u0142ytk\u0119 stykow\u0105,<\/li><li style=\"font-size: 16px\">Zestaw przewod\u00f3w po\u0142\u0105czeniowych w trzech rodzajach,<\/li><li style=\"font-size: 16px\">Zestaw diod LED w trzech kolorach,<\/li><li style=\"font-size: 16px\">Zestaw najczciej stosowanych w elektronice rezystor\u00f3w,<\/li><li style=\"font-size: 16px\">Przyciski Tact Switch,<\/li><li style=\"font-size: 16px\">Fotorezystory,<\/li><li style=\"font-size: 16px\">Cyfrowy czujnik \u015bwiat\u0142a,<\/li><li style=\"font-size: 16px\">Cyfrowy czujnik wilgotno\u015bci, temperatury i ci\u015bnienia,<\/li><li style=\"font-size: 16px\">Wy\u015bwietlacz OLED.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-975298d elementor-widget elementor-widget-spacer\" data-id=\"975298d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e49f196 elementor-widget elementor-widget-heading\" data-id=\"e49f196\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Modulacja szeroko\u015bci impuls\u00f3w \u2013 PWM <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0a2e30a elementor-widget elementor-widget-text-editor\" data-id=\"0a2e30a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Do tej pory sterowane przez <a href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/21574-raspberry-pi-pico-w-rp2040-arm-cortex-m0-cyw43439-wifi-5056561803173.html\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico W<\/strong><\/a> diody LED \u015bwieci\u0142y lub nie, proces ten by\u0142 zero jedynkowy i nie by\u0142o mo\u017cliwo\u015bci sterownia tym elementem w nieco bardziej \u201ep\u0142ynny\u201d spos\u00f3b. Uzyskanie sygna\u0142u analogowego ze stan\u00f3w cyfrowych nie jest wcale takim prostym zadaniem, tego typu funkcjonalno\u015b\u0107 mo\u017cna uzyska\u0107 tylko dzi\u0119ki <a href=\"https:\/\/botland.com.pl\/412-przetworniki-ac-i-ca\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>przetwornikom cyfrowo-analogowym<\/strong><\/a> (C\/A lub DAC). Istnieje jednak pewien spos\u00f3b, dzi\u0119ki kt\u00f3remu b\u0119dziemy mogli udawa\u0107, \u017ce generujemy sygna\u0142 analogowy i sterowa\u0107 dzi\u0119ki niemu jasno\u015bci\u0105 \u015bwiecenia diody LED.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d87f85a elementor-widget elementor-widget-image\" data-id=\"d87f85a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/Duty_Cycle_Examples.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"Duty_Cycle_Examples\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1ODU4IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvRHV0eV9DeWNsZV9FeGFtcGxlcy5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"542\" height=\"342\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/Duty_Cycle_Examples.png\" class=\"attachment-large size-large wp-image-75858\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/Duty_Cycle_Examples.png 542w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/Duty_Cycle_Examples-300x189.png 300w\" sizes=\"(max-width: 542px) 100vw, 542px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Przyk\u0142adowe przebiegi sygna\u0142u PWM o wype\u0142nieniu 50%, 75% i 25%. (https:\/\/en.wikipedia.org\/wiki\/Pulse-width_modulation)<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c25f9c9 elementor-widget elementor-widget-text-editor\" data-id=\"c25f9c9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\"><strong>Modulacja szeroko\u015bci impuls\u00f3w<\/strong> (PWM) to termin odnosz\u0105cy si\u0119 do funkcji implementowanej we wi\u0119kszo\u015bci wsp\u00f3\u0142czesnych <a href=\"https:\/\/botland.com.pl\/22-mikrokontrolery\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>mikrokontroler\u00f3w<\/strong><\/a>. Jak sama nazwa wskazuje, dzi\u0119ki niej b\u0119dziemy mogli manipulowa\u0107 szeroko\u015bci\u0105 pojedynczego impulsu generowanego przez <a href=\"https:\/\/botland.com.pl\/mikrokontrolery-raspberry-pi\/19536-mikrokontroler-raspberry-pi-rp2040-sc0914-5904422368371.html\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>RP2040<\/strong><\/a>. W przyk\u0142adach, kt\u00f3re przerabiali\u015bmy, zdarza\u0142o si\u0119, \u017ce dioda LED uruchamiana by\u0142a synchronicznie co p\u00f3\u0142 sekundy. W takim przypadku mo\u017cna powiedzie\u0107, \u017ce ca\u0142y impuls trwa\u0142 sekund\u0119, a jego wype\u0142nienie wynosi\u0142o 50%, poniewa\u017c dioda dzia\u0142a\u0142a przez po\u0142ow\u0119 dost\u0119pnego czasu. Jednak dla mikrokontrolera sekunda to niemal wieczno\u015b\u0107 i mo\u017ce on z powodzeniem generowa\u0107 impulsy, kt\u00f3rych czas jest znacznie kr\u00f3tszy. Do tego celu wykorzystywane s\u0105 konkretne polecenia wspierane przez wewn\u0119trzne modu\u0142y procesora, dzi\u0119ki czemu nie musimy co chwil\u0119 wstrzymywa\u0107 dzia\u0142ania uk\u0142adu.\u00a0<\/p><p style=\"font-weight: 400\">Sterowa\u0107 b\u0119dziemy wype\u0142nieniem takiego impulsu, czyli w\u0142a\u015bnie <strong>czasem, w jakim na wyprowadzeniu utrzymywany jest stan wysoki.<\/strong> Zmieniaj\u0105c wype\u0142nienie, uzyskujemy swego rodzaju imitacj\u0119 sygna\u0142u analogowego. Imitacja jest tutaj jak najbardziej poprawnym stwierdzeniem, poniewa\u017c nadal jest to sygna\u0142 cyfrowy, tylko dzi\u0119ki bezw\u0142adno\u015bci ludzkiego oka, wydawa\u0107 b\u0119dzie si\u0119, \u017ce sterujemy jasno\u015bci\u0105 \u015bwiecenia diody, jak gdyby zmienia\u0107 jej napi\u0119cie zasilania. Poza tym sygna\u0142y PWM s\u0105 z powodzeniem wykorzystywane w innych uk\u0142adach i obwodach. Znale\u017a\u0107 mo\u017cemy czujniki, w kt\u00f3rych odczytana warto\u015b\u0107, na przyk\u0142ad tlenu w powietrzu reprezentowana jest w\u0142a\u015bnie przez sygna\u0142 PWM, pojawiaj\u0105cy si\u0119 na wyj\u015bciu modu\u0142u. Poza tym sygna\u0142y, kt\u00f3rych szeroko\u015b\u0107 impulsu jest modyfikowana, wykorzystywane s\u0105 do sterowania <a href=\"https:\/\/botland.com.pl\/135-serwomechanizmy\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>serwomechanizmami<\/strong><\/a> stosowanymi w robotyce.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-19e3923 elementor-widget elementor-widget-code-highlight\" data-id=\"19e3923\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>#include \"pico\/stdlib.h\"\r\n#include \"hardware\/pwm.h\"\r\n\r\n#define GREEN_LED 0 \/\/assigning names of sspecyfic values\r\n\r\nuint8_t fill = 0;\r\nuint8_t changes = 1;\r\n\r\nint main() {\r\n    gpio_init(GREEN_LED); \/\/initialization and setting of pin mode\r\n    gpio_set_function(GREEN_LED, GPIO_FUNC_PWM);\r\n\r\n    uint8_t slice_num = pwm_gpio_to_slice_num(GREEN_LED); \/\/assignment of values to variables slice_num and channel\r\n    uint8_t channel = pwm_gpio_to_channel(GREEN_LED);\r\n    \r\n    pwm_set_wrap(slice_num, 255); \/\/set the maximum PWM range (255=100%)\r\n\r\n    pwm_set_enabled(slice_num, true); \/\/PWM signal activation\r\n    \r\n    while (true)\r\n    {\r\n        pwm_set_chan_level(slice_num, channel, fill); \/\/setting the signal filling to the value stored in fill\r\n\r\n        if (fill &lt; 255) \/\/if fill &lt;255 assign value + change\r\n        {\r\n            fill = fill + changes;\r\n        }\r\n        Else \/\/incompatible condition set fill to 0\r\n        {\r\n            fill = 0;\r\n        }\r\n\r\n        sleep_ms(10);\r\n\r\n    }\r\n    \r\n}\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-de9d098 elementor-widget elementor-widget-text-editor\" data-id=\"de9d098\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Bez zb\u0119dnego przed\u0142u\u017cania, przejd\u017amy od razu do kodu, kt\u00f3ry pozwoli w praktyce wykorzysta\u0107 sygna\u0142 PWM do sterowania diod\u0105 LED. Na potrzeby test\u00f3w tej funkcjonalno\u015bci stworzy\u0142em, nowy projekt, kt\u00f3ry nazwa\u0142em pwm_led. Natomiast sam obw\u00f3d zbudowany na p\u0142ytce stykowej pozostaje bez zmian, cho\u0107 w tym przyk\u0142adzie skorzystamy tylko z jednej diody LED.<\/p><p style=\"font-weight: 400\">Przygotowany program pozwoli sterowa\u0107 diod\u0105 LED za pomoc\u0105 sygna\u0142u PWM, innymi s\u0142owy <strong>b\u0119dziemy stopniowo rozja\u015bnia\u0107 diod\u0119<\/strong>, zwi\u0119kszaj\u0105c wype\u0142nienie impulsu. Czas, w kt\u00f3rym na wyprowadzeniu utrzymywany b\u0119dzie stan wysoki, okre\u015blimy za pomoc\u0105 liczby, przyjmuj\u0105c, \u017ce 0 oznacza 0% (dioda LED nie \u015bwieci) natomiast 255 oznacza 100% (dioda LED \u015bwieci przez ca\u0142y czas trwania impulsu).<\/p><p style=\"font-weight: 400\">Pocz\u0105tek programu wygl\u0105da znajomo, cho\u0107 znalaz\u0142y si\u0119 tam pewne nowo\u015bci. Jak mo\u017cna zauwa\u017cy\u0107, po raz pierwszy do\u0142\u0105czy\u0142em <strong>dodatkow\u0105 bibliotek\u0119 hardware\/pwm.h.<\/strong> Jest ona potrzebna, poniewa\u017c w kreowaniu sygna\u0142u PWM korzysta\u0107 b\u0119dziemy ze sprz\u0119towego wsparcia mikrokontrolera, a funkcje opisuj\u0105ce ten proces opisane zosta\u0142y w\u0142a\u015bnie w tej bibliotece. Dodatkow\u0105 paczk\u0119 instrukcji b\u0119dziemy musieli doda\u0107 te\u017c w pliku CMakeLists.txt, ale tym zajmiemy si\u0119 p\u00f3\u017aniej. Przed g\u0142\u00f3wn\u0105 funkcj\u0105 main znalaz\u0142a si\u0119 znana z wcze\u015bniejszych program\u00f3w definicja oraz deklaracja dw\u00f3ch zmiennych typu uint8_t \u2013 fill oraz changes.<\/p><p style=\"font-weight: 400\">Przy zmiennych tych musimy zatrzyma\u0107 si\u0119 na moment. W poprzednich przyk\u0142adach, zmienne deklarowane by\u0142y wewn\u0105trz funkcji main, zazwyczaj w okolicy polece\u0144, kt\u00f3re z nich korzysta\u0142y. By\u0142y to zmienne lokalne, z kt\u00f3rych korzysta\u0107 mo\u017cemy tylko wewn\u0105trz funkcji, w kt\u00f3rych zosta\u0142y one wygenerowane. Zmienne, kt\u00f3rych deklaracje umieszczone s\u0105 ponad funkcj\u0105 g\u0142\u00f3wn\u0105, okre\u015bli\u0107 mo\u017cemy mianem <strong>zmiennych globalnych<\/strong>, oznacza to, \u017ce korzysta\u0107 mo\u017cemy z nich w obr\u0119bie ca\u0142ego programu. Oczywi\u015bcie zmienne fill oraz changes, okre\u015blaj\u0105ce kolejno wype\u0142nienie oraz zmian\u0119 wype\u0142nienia przy ka\u017cdym cyklu programu, mog\u0142yby by\u0107 stworzone w dalszej cz\u0119\u015bci kodu, ale na potrzeby wyja\u015bnienia konceptu zmiennej lokalnej i globalnej umie\u015bci\u0142em je w\u0142a\u015bnie w tym miejscu. Wyja\u015bnienia wymagaj\u0105 r\u00f3wnie\u017c cyfry 0 i 1 umieszczone przy nazwach tych zmiennych. Dzi\u0119ki nim mo\u017cemy okre\u015bli\u0107 domy\u015bln\u0105 warto\u015b\u0107, kt\u00f3re zmienne przyjm\u0105 od razu po uruchomianiu programu.<\/p><p style=\"font-weight: 400\">G\u0142\u00f3wn\u0105 funkcj\u0119 main zaczynamy znanymi ju\u017c poleceniami, cho\u0107 tym razem dzi\u0119ki GPIO_FUNC_PWM wyprowadzenie przypisane do GREEN_LED pe\u0142ni\u0107 b\u0119dzie rol\u0119 pinu wspieraj\u0105cego funkcjonalno\u015b\u0107 PWM. Kolejno deklarujemy dwie zmienne slice_num oraz channel, do kt\u00f3rych od razu przypisujemy warto\u015bci odczytane przez polecenia pwm_gpio_to_slice_num i pwm_gpio_to_channel, kt\u00f3rych argumentem jest konkretny numer wyprowadzenia RP2040. Nad tym, co zosta\u0142o zapisane w tych zmiennych, nie musimy si\u0119 zastanawia\u0107, s\u0105 one potrzebne, poniewa\u017c sygna\u0142 PWM, mimo \u017ce przypisany do konkretnego wyprowadzenia okre\u015blany jest tak naprawd\u0119 przez slice, channel oraz fill, kt\u00f3re zadeklarowali\u015bmy ju\u017c wcze\u015bniej.<\/p><p style=\"font-weight: 400\">Dzi\u0119ki kolejnemu poleceniu, czyli pwm_set_wrap okre\u015blamy <strong>liczbowy zakres wype\u0142nienia sygna\u0142u PWM<\/strong>. W argumentach funkcji umieszczamy odczytany wcze\u015bniej slice oraz warto\u015b\u0107, kt\u00f3ra opisywa\u0107 b\u0119dzie 100% wype\u0142nienia pojedynczego impulsu. W przyk\u0142adzie jest to 255, ale mo\u017cna tam z powodzeniem wstawi\u0107 dowoln\u0105 warto\u015b\u0107, cho\u0107 pami\u0119ta\u0107 trzeba, \u017ce odnosi si\u0119 ona do wype\u0142nienia, czyli zmiennej fill, kt\u00f3rej typem jest uint8_t o ograniczonym zakresie. Przy wi\u0119kszych warto\u015bciach nale\u017cy rozwa\u017cy\u0107 typy zmiennych o wi\u0119kszych zakresach, takie jak uint16_t czy uint32_t. Dzi\u0119ki kolejnemu poleceniu pwm_set_enable, aktywujemy sygna\u0142 PWM na wyprowadzeniu, kt\u00f3rego warto\u015b\u0107 slice przypisana jest do slice_num.<\/p><p style=\"font-weight: 400\">W g\u0142\u00f3wnej cz\u0119\u015bci programu znalaz\u0142a si\u0119 niesko\u0144czona p\u0119tla while, w kt\u00f3rej wn\u0119trzu w pierwszym kroku ustawiamy warto\u015b\u0107 wype\u0142niania sygna\u0142u PWM na pinie opisanym przez slice_num oraz channel. Sama warto\u015b\u0107 wype\u0142nienia zapisana jest w fill, kt\u00f3rej domy\u015blna warto\u015b\u0107 to zero, tak wi\u0119c przy pierwszym uruchamianiu dioda b\u0119dzie wygaszona. Nast\u0119pnie umieszczona zosta\u0142a funkcja warunkowa, sprawdzaj\u0105ca warto\u015b\u0107 wype\u0142nienia. Je\u015bli b\u0119dzie ono mniejsze od 255 to warto\u015b\u0107 fill, zmieniona zostanie na sam\u0105 siebie z dodan\u0105 warto\u015bci\u0105 spod zmiennej changes. Innymi s\u0142owy, przy ka\u017cdym wykonaniu funkcji warunkowej wype\u0142nienie zwi\u0119kszy si\u0119 o jeden, a\u017c do momentu, gdy warunek fill &lt; 255 nie b\u0119dzie spe\u0142niony. W\u00f3wczas wype\u0142nienie zostanie z powrotem zmniejszone do zera. Na ko\u0144cu programu znalaz\u0142o si\u0119 niewielkie op\u00f3\u017anienie, wstrzymuj\u0105ce program na 10ms. Tak wi\u0119c w kr\u00f3tkim podsumowaniu p\u0119tli, kt\u00f3ra wykonywana b\u0119dzie przez Raspberry Pi Pico W, a\u017c do wy\u0142\u0105czenia zasilania, mo\u017cna powiedzie\u0107, \u017ce wype\u0142nienie sygna\u0142u PWM b\u0119dzie zwi\u0119kszane o jeden co 10ms, a\u017c do momentu, gdy przekroczy ono warto\u015b\u0107 255 i w\u00f3wczas dioda zostanie wygaszona.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-be1d1b3 elementor-widget elementor-widget-image\" data-id=\"be1d1b3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"504\" height=\"239\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/cmakelists-pwm_led.png\" class=\"attachment-large size-large wp-image-75862\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/cmakelists-pwm_led.png 504w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/cmakelists-pwm_led-300x142.png 300w\" sizes=\"(max-width: 504px) 100vw, 504px\" \/>\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">CMakeLists.txt dla projektu pwm_led.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9ef12fb elementor-widget elementor-widget-text-editor\" data-id=\"9ef12fb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Tak jak wspomnia\u0142em na pocz\u0105tku, chc\u0105c korzysta\u0107 ze sprz\u0119towego wsparcia dla sygna\u0142\u00f3w PWM, musimy doda\u0107 bibliotek\u0119 hardware\/pwm.h w pliku CMakeLists.txt. Jej deklaracje umieszczamy wewn\u0105trz polecenia target_link_libraries, tak jak na grafice powy\u017cej. W przysz\u0142o\u015bci kolejne biblioteki b\u0119dziemy zawsze oddziela\u0107 spacjami.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-412159f elementor-widget elementor-widget-video\" data-id=\"412159f\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;video_type&quot;:&quot;hosted&quot;,&quot;mute&quot;:&quot;yes&quot;,&quot;controls&quot;:&quot;yes&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"e-hosted-video elementor-wrapper elementor-open-inline\">\n\t\t\t\t\t<video class=\"elementor-video\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/pwm_led.mov\" controls=\"\" preload=\"metadata\" muted=\"muted\" controlsList=\"nodownload\"><\/video>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2f97718 elementor-widget elementor-widget-text-editor\" data-id=\"2f97718\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Uruchomiony program pwm_led powinien zachowywa\u0107 si\u0119 identycznie jak na filmie. Dioda LED rozja\u015bnia si\u0119 stopniowo i gdy osi\u0105gnie ju\u017c swoj\u0105 pe\u0142n\u0105 moc, jest wygaszana i ca\u0142y cykl rozpoczyna si\u0119 od nowa. Jednak tak jak wspomina\u0142em wcze\u015bniej, sterowanie diod\u0105 nie jest p\u0142ynne, w rzeczywisto\u015bci mruga ona z bardzo du\u017c\u0105 cz\u0119stotliwo\u015bci\u0105, tak \u017ce jest to niezauwa\u017calne dla ludzkiego oka. Przy ka\u017cdej p\u0119tli programu zwi\u0119kszane jest te\u017c czasowe wype\u0142nienie pojedynczego impulsu stanem wysokim, dzi\u0119ki czemu wydaje si\u0119 nam, \u017ce LED \u015bwieci coraz ja\u015bniej. Zach\u0119cam do eksperyment\u00f3w i zmian warto\u015bci zmiennej changes oraz czasu, na jaki wstrzymywany jest program. Poza tym mo\u017cecie spr\u00f3bowa\u0107 zmieni\u0107 liczbowy zakres wype\u0142nienia, pami\u0119taj\u0105c jednocze\u015bnie o typie zmiennej fill.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-634f45b elementor-widget elementor-widget-heading\" data-id=\"634f45b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Komunikacja z komputerem, czyli USB<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-676c4e0 elementor-widget elementor-widget-text-editor\" data-id=\"676c4e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Do tej pory korzystali\u015bmy wy\u0142\u0105cznie z samego <strong>mikrokontrolera<\/strong> i pod\u0142\u0105czonych do niego <strong>elektronicznych element\u00f3w<\/strong>. Czas to zmieni\u0107 i po raz pierwszy nawi\u0105za\u0107 komunikacj\u0119 z wi\u0119kszym urz\u0105dzeniem, jakim jest <strong>komputer<\/strong>.<\/p><p style=\"font-weight: 400\">Zazwyczaj w poradnikach bazuj\u0105cych na niewielkich platformach embedded, komunikacja z komputerem powi\u0105zana jest \u015bci\u015ble z om\u00f3wieniem interfejsu UART. Wydaje mi si\u0119, \u017ce wzi\u0119\u0142o si\u0119 to przede wszystkim z artyku\u0142\u00f3w po\u015bwi\u0119conych <a href=\"https:\/\/botland.com.pl\/234-arduino\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Arduino<\/strong><\/a>, gdzie interfejs ten jest sprz\u0119towo po\u0142\u0105czony przez pewien uk\u0142ad scalony z portem USB p\u0142ytki. Jednak projektanci <strong>Raspberry Pi Pico<\/strong>, jak i samego mikrokontrolera RP2040 zdecydowali si\u0119 na nieco bardziej wyrafinowane rozwi\u0105zanie. Oczywi\u015bcie procesor dysponuje sprz\u0119towym wsparciem UARTa, ale z komputerem komunikacj\u0119 mo\u017cna nawi\u0105za\u0107 pro\u015bciej, <strong>poprzez USB<\/strong>. Gniazdo microUSB widoczne na laminacie RPI nie s\u0142u\u017cy tylko do zasilania i programowania, ale mo\u017cna r\u00f3wnie\u017c dzi\u0119ki niemu wymienia\u0107 dane z komputerem. Do wspomnianego tutaj UARTa, kt\u00f3ry jest jednym z najprostszych interfejs\u00f3w szeregowych, wr\u00f3cimy w jednym z ko\u0144cowych artyku\u0142\u00f3w z tej serii.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f007839 elementor-widget elementor-widget-image\" data-id=\"f007839\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0740-scaled.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_0740\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1ODcwIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvSU1HXzA3NDAtc2NhbGVkLmpwZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0740-1024x576.jpg\" class=\"attachment-large size-large wp-image-75870\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0740-1024x576.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0740-300x169.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0740-768x432.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0740-1536x864.jpg 1536w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0740-2048x1152.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Z\u0142\u0105cze microUSB na p\u0142ytce RPI Pico W.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-896ac9e elementor-widget elementor-widget-text-editor\" data-id=\"896ac9e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Jednak zanim przejdziemy do programu, chcia\u0142bym opowiedzie\u0107 wam nieco o samym USB. Pierwszym skojarzeniem z USB jest przede wszystkim rodzaj z\u0142\u0105cza, kt\u00f3re mo\u017cemy spotka\u0107 we wi\u0119kszo\u015bci obecnie produkowanych urz\u0105dze\u0144. Z\u0142\u0105cza te wyst\u0119puj\u0105 w kilku standardach i rodzajach r\u00f3\u017cni\u0105cych si\u0119 mi\u0119dzy sob\u0105 fizycznymi wymiarami, ilo\u015bci\u0105 po\u0142\u0105cze\u0144 oraz parametrami elektrycznymi. Dla nas jednak najwa\u017cniejsze b\u0119dzie, \u017ce <strong>USB<\/strong> (ang. Universal serial bus) <strong>jest<\/strong> <strong>uniwersaln\u0105 magistral\u0105 szeregow\u0105<\/strong>, kt\u00f3ra pozwala przesy\u0142a\u0107 dane mi\u0119dzy dwoma urz\u0105dzeniami. Do tego celu w podstawowej konfiguracji wykorzystywana jest para sygna\u0142\u00f3w D+ i D-, kt\u00f3re opr\u00f3cz przewod\u00f3w zasilaj\u0105cych mo\u017cna znale\u017a\u0107 w standardowym przewodzie USB. Na p\u0142ytce, z kt\u00f3rej korzystamy, wyprowadzenia z\u0142\u0105cza USB po\u0142\u0105czone s\u0105 bezpo\u015brednio z mikrokontrolerem, tak wi\u0119c pod\u0142\u0105czaj\u0105c przew\u00f3d do komputera, \u0142\u0105czymy si\u0119 z procesorem bez jakichkolwiek po\u015brednik\u00f3w. RP2040 wspiera sprz\u0119towo ten protok\u00f3\u0142, dzi\u0119ki czemu ju\u017c za moment poka\u017ce wam kilka przyk\u0142ad\u00f3w, w kt\u00f3rych dzi\u0119ki prostej instrukcji b\u0119dziemy mogli przesy\u0142a\u0107 komunikaty, kt\u00f3re pojawi\u0105 si\u0119 na ekranie komputera. Takie rozwi\u0105zanie jest niezwykle przydatne w procesie programowania i debugowania. Do tej pory nasze programy by\u0142y proste i nie by\u0142o potrzeby tworzenie w nich tak zwanych \u201eflag\u201d, ale ju\u017c za moment przejdziemy do bardziej rozbudowanych konstrukcji, w kt\u00f3rych umieszcza\u0107 b\u0119dziemy odpowiednie komunikaty. Dzi\u0119ki nim b\u0119dziemy na bie\u017c\u0105co wiedzie\u0107, kt\u00f3ry fragment kodu jest wykonywany przez mikrokontroler.<\/p><p style=\"font-weight: 400\">Obw\u00f3d, kt\u00f3ry zbudowali\u015bmy wcze\u015bniej, mo\u017ce pozosta\u0107 bez zmian, pocz\u0105tkowo korzysta\u0107 b\u0119dziemy tylko z p\u0142ytki i przewodu USB, ale w kolejnych kodach spr\u00f3bujemy sterowa\u0107 r\u00f3wnie\u017c diod\u0105 LED.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-27fc433 elementor-widget elementor-widget-heading\" data-id=\"27fc433\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Wysy\u0142anie komunikat\u00f3w do komputera<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-703ab8c elementor-widget elementor-widget-code-highlight\" data-id=\"703ab8c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>#include \"pico\/stdlib.h\"\r\n\r\nint main() {\r\n    stdio_init_all(); \/\/initialization of the stdio.h library\r\n    \r\n    while(true) {\r\n        printf(\"RPI Pico W wysyla komunikat\\n\");\r\n        sleep_ms(1000);\r\n    }\r\n}\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f707769 elementor-widget elementor-widget-text-editor\" data-id=\"f707769\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Na potrzeb\u0119 kolejnych przyk\u0142ad\u00f3w, przygotowa\u0142em projekt pod nazw\u0105 usb_communication i to z niego b\u0119d\u0119 korzysta\u0107 w tym i kolejnych programach.<\/p><p style=\"font-weight: 400\">Na pierwszy ogie\u0144 we\u017amy niezwykle prosty kod, kt\u00f3rego zadaniem b\u0119dzie przesy\u0142a\u0107 do komputera co sekund\u0119 tekst \u201eRPI Pico W wysyla komunikat\u201d. Jak wida\u0107, zadanie to realizuje funkcja printf, kt\u00f3ra jest jednym z podstawowych polece\u0144 j\u0119zyka C. Dzi\u0119ki niej mo\u017cemy budowa\u0107 komunikaty z\u0142o\u017cone z samego tekstu lub tekstu wraz ze zmiennymi, o czym p\u00f3\u017aniej. Komunikat, kt\u00f3ry chcemy wys\u0142a\u0107 do komputera, umieszczany jest w podw\u00f3jnym cudzys\u0142owie, poza tym na jego ko\u0144cu zauwa\u017cy\u0107 mo\u017cecie tajemnicze \u2018\\n\u2019. Jest to znak ko\u0144ca linii, nie b\u0119dzie on widoczny, ale dzi\u0119ki niemu komputer b\u0119dzie wiedzia\u0142, \u017ce kolejny otrzymany tekst nale\u017cy wy\u015bwietli\u0107 w nowej linii.<\/p><p style=\"font-weight: 400\">Aby polecenie printf zosta\u0142o poprawnie skompilowane, musimy do\u0142\u0105czy\u0107 w programie bibliotek\u0119 &lt;stdio.h&gt;, w kt\u00f3rej zawarto ca\u0142kiem sporo bazowych funkcji j\u0119zyka C. Poza tym bibliotek ta musi zosta\u0107 zainicjalizowana, s\u0142u\u017cy do tego konstrukcja stdio_init_all().<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-69ae74e elementor-widget elementor-widget-image\" data-id=\"69ae74e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/cmakelists-usb1.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"cmakelists usb1\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1ODc0IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvY21ha2VsaXN0cy11c2IxLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"527\" height=\"299\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/cmakelists-usb1.png\" class=\"attachment-large size-large wp-image-75874\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/cmakelists-usb1.png 527w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/cmakelists-usb1-300x170.png 300w\" sizes=\"(max-width: 527px) 100vw, 527px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">CMakeLists.txt dla usb_communication.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d3f12ed elementor-widget elementor-widget-text-editor\" data-id=\"d3f12ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Je\u015bli chcemy, aby projekt skompilowa\u0142\u00a0si\u0119 poprawnie, musimy doda\u0107 te\u017c trzy polecenia do pliku CMakeLists.txt, z kt\u00f3rych jedno jest komentarzem.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4903c52 elementor-widget elementor-widget-code-highlight\" data-id=\"4903c52\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp># enable usb output, disable uart output\r\npico_enable_stdio_usb(usb_communication 1) \r\npico_enable_stdio_uart(usb_communication 0)\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-73d7740 elementor-widget elementor-widget-text-editor\" data-id=\"73d7740\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Dzi\u0119ki nim aktywujemy tak zwany strumie\u0144 wyj\u015bciowy na porcie USB, dezaktywuj\u0105c jednocze\u015bnie wyj\u015bcie UARTa.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cc01cff elementor-widget elementor-widget-image\" data-id=\"cc01cff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb1.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"serial usb1\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1ODc4IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvc2VyaWFsLXVzYjEucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"177\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb1-1024x227.png\" class=\"attachment-large size-large wp-image-75878\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb1-1024x227.png 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb1-300x66.png 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb1-768x170.png 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb1.png 1377w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Komunikaty widoczne w monitorze portu szeregowego.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce8f62b elementor-widget elementor-widget-text-editor\" data-id=\"ce8f62b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Po zbudowaniu projektu i wrzuceniu pliku .uf2 do pami\u0119ci RPI, p\u0142ytka zg\u0142osi si\u0119 jako urz\u0105dzenie szeregowe USB pod jednym z port\u00f3w COM. Szczeg\u00f3\u0142y mo\u017cna podejrze\u0107 w mened\u017cerze urz\u0105dze\u0144. Chc\u0105c sprawdzi\u0107 wysy\u0142ane przez mikrokontroler komunikaty, mo\u017cna skorzysta\u0107 z dowolnego programu pozwalaj\u0105cego zarz\u0105dza\u0107 portami szeregowymi lub wykorzysta\u0107 do tego celu funkcjonalno\u015b\u0107 wbudowan\u0105 w Visual Studio Code. W dolnej cz\u0119\u015bci znajdziemy SERIAL MONITOR, po kt\u00f3rego otwarciu zobaczymy kilka opcji. Najwa\u017cniejsz\u0105 z nich jest Port, to w\u0142a\u015bnie tam pojawi si\u0119 RPI pod nazw\u0105 Urz\u0105dzenie szeregowe USB, w moim przypadku przypisane do portu COM3. Jako \u017ce jest to w rzeczywisto\u015bci wirtualny port szeregowy, to nie musimy zwraca\u0107 uwagi na pozosta\u0142e opcje. Po klikni\u0119ciu przycisku Start Monitoring port zostanie otwarty, a na ekranie komputera powinien pojawi\u0107 si\u0119 komunikat wysy\u0142any przez procesor \u201eRPI Pico W wysyla komunikat\u201d. Dzi\u0119ki zastosowaniu znaku ko\u0144ca linii (\\n), ka\u017cdy z nich zaczyna\u0107 b\u0119dzie si\u0119 od nowej linii.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-78adcc8 elementor-widget elementor-widget-heading\" data-id=\"78adcc8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Komunikaty liczbowe<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0f160ae elementor-widget elementor-widget-code-highlight\" data-id=\"0f160ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>#include \"pico\/stdlib.h\"\r\n\r\nuint8_t counter = 0;\r\nfloat pi = 3.1415926;\r\n\r\nint main() {\r\n    stdio_init_all(); \/\/initialization of the stdio.h library\r\n    \r\n    while(true) {\r\n        printf(\"RPI Pico W wysyla komunikat\\n\");\r\n        printf(\"counter value = %d\\n\", counter); \/\/%d = counter variable\r\n        printf(\"pi = %f\\n\", pi); \/\/%f = pi variable\r\n        counter++;\r\n        sleep_ms(1000);\r\n    }\r\n}\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f476d1b elementor-widget elementor-widget-text-editor\" data-id=\"f476d1b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Poza samymi komunikatami w postaci czystego tekstu istnieje mo\u017cliwo\u015b\u0107 przesy\u0142ania zmiennych, a dok\u0142adniej zapisanych w nich warto\u015bci. Do tego celu r\u00f3wnie\u017c skorzysta\u0107 mo\u017cemy z polecenia printf, jednak w nieco zmienionej strukturze. Powy\u017cej zobaczy\u0107 mo\u017cecie rozbudowan\u0105 wersj\u0119 kodu z poprzedniego przyk\u0142adu. Doda\u0142em do niego dwie zmienne: ca\u0142kowit\u0105 \u2013 counter, kt\u00f3rej warto\u015b\u0107 startowa to zero oraz zmiennoprzecinkow\u0105 \u2013 pi, kt\u00f3ra przechowuje przybli\u017con\u0105 warto\u015b\u0107 liczby pi. W g\u0142\u00f3wniej cz\u0119\u015bci programu umie\u015bci\u0142em dwie dodatkowe funkcje printf, w kt\u00f3rych wn\u0119trzu zauwa\u017cy\u0107 mo\u017cecie do\u015b\u0107 tajemniczy zapis %d oraz %f. Dzi\u0119ki niemu do generowanego komunikatu wstawione zostan\u0105 zmienne, zapisane dalej po przecinku. Innymi s\u0142owy, %d zostanie podmieniony na warto\u015b\u0107 counter, a w miejscu %f umieszczone zostanie pi. Na sam koniec umie\u015bci\u0142em te\u017c zwi\u0119kszenie warto\u015bci counter o jeden, tak aby przy ka\u017cdym przebiegu p\u0119tli wy\u015bwietlany by\u0142 inny stan.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a39ac6d elementor-widget elementor-widget-image\" data-id=\"a39ac6d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb2.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"serial usb2\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1ODgyIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvc2VyaWFsLXVzYjIucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"281\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb2-1024x360.png\" class=\"attachment-large size-large wp-image-75882\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb2-1024x360.png 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb2-300x106.png 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb2-768x270.png 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb2.png 1364w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Komunikaty widoczne w monitorze portu szeregowego.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1d2b21b elementor-widget elementor-widget-text-editor\" data-id=\"1d2b21b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Po uruchomieniu kodu i otwarciu monitora portu szeregowego zobaczy\u0107 mo\u017cemy kolejne komunikaty wysy\u0142ane przez Raspberry Pi Pico W. Poza znanym ju\u017c ze wcze\u015bniejszego programu tekstem, zobaczy\u0107 mo\u017cemy kolejne stany zmiennej counter, zwi\u0119kszaj\u0105cej si\u0119 o jeden przy ka\u017cdym przebiegu programu oraz warto\u015b\u0107 zapisan\u0105 pod zmiennoprzecinkowym pi.<\/p><p style=\"font-weight: 400\">Konstrukcje takie jak %d i %f s\u0105 niezwykle przydatne w programowaniu, poniewa\u017c pozawalaj\u0105 w prosty spos\u00f3b ujawni\u0107 zapisane pod konkretn\u0105 zmienn\u0105 dane. Poza nimi skorzysta\u0107 mo\u017cemy te\u017c z %x (dla liczb ca\u0142kowitych wy\u015bwietlanych w formacie hex), %c (znaki ASCII, dla zmiennych typu char) lub %s (tzw. String, czyli ci\u0105gi znak\u00f3w ASCII). By\u0107 mo\u017ce zastanawiacie si\u0119 w jaki spos\u00f3b w monitorze portu szeregowego wy\u015bwietli\u0107 znak procenta lub backslash. Odpowied\u017a jest prosta, nale\u017cy u\u017cy\u0107 go dwukrotnie, czyli tworz\u0105c polecenie printf(\u201d%% \\\\\u201d); w oknie VSC zobaczymy \u2018% \\\u2019.<\/p><p style=\"font-weight: 400\">Ciekaw jestem, czy zwr\u00f3cili\u015bcie uwag\u0119, \u017ce w dw\u00f3ch ostatnich przyk\u0142adach skorzysta\u0142em z j\u0119zyka polskiego. Mam tutaj na my\u015bli \u201eRPI Pico wysyla komunikat\u201d, je\u015bli wy\u0142apali\u015bcie ten szczeg\u00f3\u0142 to bardzo dobrze. Komunikat ten napisa\u0142em celowo, aby m\u00f3c teraz przypomnie\u0107 o dobrej zasadzie, jak\u0105 jest stosowanie j\u0119zyka angielskiego. Polski jest dopuszczalny, ale dobrym zwyczajem jest zapisywa\u0107 wszystkie komunikaty i komentarze po angielsku.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4139584 elementor-widget elementor-widget-heading\" data-id=\"4139584\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Sterowanie diod\u0105 LED z komputera<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d38a296 elementor-widget elementor-widget-code-highlight\" data-id=\"d38a296\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>#include \"pico\/stdlib.h\"\r\n\r\n#define RED_LED 2\r\nuint8_t led_state = 0;\r\nchar user_input;\r\n\r\nint main() {\r\n    stdio_init_all(); \/\/initialization of the stdio.h library\r\n\r\n    gpio_init(RED_LED);\r\n    gpio_set_dir(RED_LED, GPIO_OUT);\r\n    \r\n    while(true) {\r\n        \r\n        printf(\"Enter 0 or 1 to control the LED\\n\");\r\n        user_input = getchar(); \/\/writing the first received character to a variable\r\n\r\n        if(user_input == '1'){ \/\/condition checking the received sign\r\n            gpio_put(RED_LED, 1);\r\n            printf(\"LED activated\\n\");\r\n        }\r\n        else if(user_input == '0'){\r\n            gpio_put(RED_LED, 0);\r\n            printf(\"LED off\\n\");\r\n        }\r\n        else\r\n        {\r\n            printf(\"Incorrect character entered\\n\");\r\n        }\r\n        \r\n    }\r\n}\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cf3398b elementor-widget elementor-widget-text-editor\" data-id=\"cf3398b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Ostatnim programem, kt\u00f3ry przeanalizujemy, aby lepiej pozna\u0107 interfejs USB b\u0119dzie <strong>komunikacja dwustronna<\/strong>. Dzi\u0119ki widocznemu wy\u017cej programowi b\u0119dziemy mogli sterowa\u0107 \u015bwieceniem diody LED z poziomu Serial Monitora. RPI Pico W b\u0119dzie przechwytywa\u0107 pierwszy wys\u0142any przez komputer znak i na jego podstawie decydowa\u0107 o uruchomieniu lub dezaktywacji diody.<\/p><p style=\"font-weight: 400\">Program korzysta z dw\u00f3ch zmiennych led_state, kt\u00f3ra przechowuje stan diody LED, czyli zero \u2013 dioda nie \u015bwieci oraz jeden \u2013 p\u00f3\u0142przewodnik emituje fotony. Drug\u0105 zmienn\u0105 jest user_input, w kt\u00f3rej zapisywa\u0107 b\u0119dziemy znak wprowadzony z klawiatury komputera i przes\u0142any do RP2040.<\/p><p style=\"font-weight: 400\">G\u0142\u00f3wn\u0105 cz\u0119\u015b\u0107 programu mo\u017cemy podzieli\u0107 na dwie cz\u0119\u015bci, w pierwszej wy\u015bwietlimy komunikat z pro\u015bb\u0105 o wpisanie zera lub jedynki i dalej zareagujemy na dane przes\u0142ane z komputera. Dzi\u0119ki funkcji getchar() w zmiennej user_input zapiszemy pierwszy znak odebrany przez mikrokontroler. Podkre\u015blenie, \u017ce jest to pierwszy znak, jest tutaj niezwykle wa\u017cne, poniewa\u017c komputer przes\u0142a\u0107 mo\u017ce ci\u0105g znak\u00f3w, ale tak\u0105 sytuacj\u0119 opisz\u0119 na ko\u0144cu tego podrozdzia\u0142u. W drugiej cz\u0119\u015bci programu znalaz\u0142a si\u0119 <strong>kaskadowa instrukcja warunkowa<\/strong>. Do tej pory korzystali\u015bmy z pojedynczego ifa skojarzonego z poleceniem else. Tym razem wykorzystamy r\u00f3wnie\u017c co\u015b takiego jak else if, jest to zabieg niezb\u0119dny, gdy sprawdza\u0107 b\u0119dziemy dwa warunki, odnosz\u0105ce si\u0119 do tej samej zmiennej. Program w funkcji warunkowej sprawdza warto\u015b\u0107 user_input. Je\u015bli przechowuje ona warto\u015b\u0107 1, innymi s\u0142owy, komputer przes\u0142a\u0142 do mikrokontrolera znak jedynki, w\u00f3wczas dioda LED zostanie uruchomiona. Analogicznie, je\u015bli w user_input zapisane b\u0119dzie zero, dioda zostanie wy\u0142\u0105czona. W ostatnim punkcie rozpatrywana jest sytuacja, w kt\u00f3rej \u017caden z warunk\u00f3w nie zostanie spe\u0142niony. W takim przypadku za\u0142o\u017cy\u0107 mo\u017cemy, \u017ce z klawiatury komputera wprowadzony zosta\u0142\u00a0niepoprawny znak i taki te\u017c komunikat zostanie wy\u015bwietlony.<\/p><p style=\"font-weight: 400\">Wyja\u015bnieniu wymaga te\u017c samo zastosowanie funkcji kaskadowej. Czy polecenie else if, mo\u017cna zosta\u0107 zast\u0105pione przez zwyk\u0142ego ifa? Pewnie domy\u015blacie si\u0119, \u017ce nie i jest to poprawna odpowied\u017a. Wyobra\u017amy sobie jednak, \u017ce zosta\u0142o tam umieszczone polecenie if. Wysy\u0142amy do mikrokontrolera znak jeden, sprawdzany jest pierwszy warunek, kt\u00f3ry jest spe\u0142niony i dioda zaczyna \u015bwieci\u0107. Sprawdzamy kolejny warunek, jest on niepoprawny, a dalej procesor napotyka polecenie else, kt\u00f3re musi wykona\u0107, poniewa\u017c poprzedni warunek nie zosta\u0142 spe\u0142niony. W takie sytuacji dioda zostaje aktywowana i jednocze\u015bnie zobaczymy komunikat o niepoprawnym znaku. W\u0142a\u015bnie takim sytuacjom zapobiega kaskadowa instrukcja warunkowa. Sprawdzamy w niej niezale\u017cnie dwa warunki i wystarczy, \u017ce tylko jeden z nich b\u0119dzie spe\u0142niony, a kod zapisany w bloku else nie zostanie wykonany. Komunikat o niepoprawnym znaku zobaczymy tylko, gdy oba warunki nie zostan\u0105 spe\u0142nione.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dd5e7d0 elementor-widget elementor-widget-image\" data-id=\"dd5e7d0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb3.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"serial usb3\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1ODg2IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvc2VyaWFsLXVzYjMucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"161\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb3-1024x206.png\" class=\"attachment-large size-large wp-image-75886\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb3-1024x206.png 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb3-300x60.png 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb3-768x154.png 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb3-1536x308.png 1536w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-usb3.png 1584w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Sterowanie diod\u0105 LED z serial monitora.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dcc600c elementor-widget elementor-widget-text-editor\" data-id=\"dcc600c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Po wrzuceniu pliku .uf2 do pami\u0119ci RPI uruchomi\u0107 mo\u017cemy serial monitor i spr\u00f3bowa\u0107 uruchomi\u0107 diod\u0119 LED. Co wa\u017cnie przy pierwszym uruchomieniu, prawdopodobnie nie zobaczycie komunikatu z pro\u015bb\u0105 o wprowadzenie zera lub jedynki. Dzieje si\u0119 tak, poniewa\u017c wysy\u0142any jest on niemal od razu po uruchomieniu kodu. W tego typu sytuacjach, gdy w czasie prototypowania chcieliby\u015bmy, aby program nie startowa\u0142 od razu, mo\u017cna skorzysta\u0107 z prymitywnego rozwi\u0105zania, jakim jest funkcja sleep_ms. Umieszczaj\u0105c j\u0105 dla przyk\u0142adu przed startem niesko\u0144czonej p\u0119tli while, a w jej argumencie umieszczaj\u0105c 10s, b\u0119dziemy mie\u0107 wystarczaj\u0105co czasu, aby uruchomi\u0107 monitor portu szeregowego przed startem g\u0142\u00f3wnej cz\u0119\u015bci kodu. Mo\u017cecie spr\u00f3bowa\u0107 wprowadzi\u0107 tak\u0105 modyfikacj\u0119.<\/p><p style=\"font-weight: 400\">Pojedyncze znaki lub wi\u0119kszy tekst mo\u017cemy wysy\u0142a\u0107 dzi\u0119ki dolnej belce widocznej w \u015brodowisku programistycznym. Po wpisaniu 1 i klikni\u0119ciu klawisza enter dioda zacznie \u015bwieci\u0107, natomiast gdy wy\u015blemy 0, LED zostanie wy\u0142\u0105czony. Poza tym na ekranie komputera zobaczymy te\u017c odpowiednie komunikaty \u201eLED activated\u201d lub \u201eLED off\u201d. W sytuacji, gdy wy\u015blemy dowolny inny znak, mikrokontroler poinformuje nas, \u017ce jest on niepoprawny.<\/p><p style=\"font-weight: 400\">Wcze\u015bniej wspomnia\u0142em, \u017ce procesor do zmiennej user_input zapisywa\u0107 b\u0119dzie zawsze pierwszy otrzymany znak. Co si\u0119 jednak stanie, gdy spr\u00f3bujemy wys\u0142a\u0107 mu ci\u0105g znak\u00f3w? Dla przyk\u0142adu wy\u015blijcie teraz co\u015b takiego jak: \u201e501\u201d. Po wys\u0142aniu dioda b\u0119dzie \u015bwieci\u0107, a na ekranie komputera zobaczycie co\u015b dziwnego, czyli komunikat o niepoprawnym znaku, wy\u0142\u0105czeniu diody i w\u0142\u0105czeniu diody. Przeanalizujmy jednak ten przypadek dok\u0142adniej. RP2040 otrzymuje ci\u0105g znak\u00f3w \u201e501\u201d, kt\u00f3ry zapisywany jest w odpowiednim buforze. Wykonuj\u0105cy si\u0119 program odczytuje pi\u0105tk\u0119, kt\u00f3ra z za\u0142o\u017cenia jest niepoprawnym znakiem i taki komunikat zostaje wy\u015bwietlony. P\u0119tla wraca na pocz\u0105tek, ale w buforze znajduj\u0105 si\u0119 kolejne dane, pi\u0105tka zosta\u0142a ju\u017c wcze\u015bniej usuni\u0119ta, ale kolejne jest zero, dlatego program wy\u0142\u0105cza diod\u0119 LED. Kolejne wykonanie p\u0119tli, w buforze umieszczone s\u0105 jakie\u015b dane, dlatego mikrokontroler my\u015bli, \u017ce u\u017cytkownik wys\u0142a\u0142 kolejne znaki. Jest to jedynka, w efekcie czego dioda zostanie uruchomiona. Dopiero przy kolejnym wykonaniu p\u0119tli bufor b\u0119dzie pusty i program b\u0119dzie czeka\u0107 na dane wprowadzane za pomoc\u0105 klawiatury. Tak wi\u0119c w przypadku, gdy wy\u015blemy do mikrokontrolera wi\u0119kszy tekst, tam zostanie obs\u0142u\u017cony w ca\u0142o\u015bci i uk\u0142ad zareaguje na ka\u017cdy pojedynczy znak.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5854cad elementor-widget elementor-widget-heading\" data-id=\"5854cad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Przetwornik ADC<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9987602 elementor-widget elementor-widget-image\" data-id=\"9987602\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/adc_uc.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"adc_uc\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1ODkwIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvYWRjX3VjLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"851\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/adc_uc-963x1024.png\" class=\"attachment-large size-large wp-image-75890\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/adc_uc-963x1024.png 963w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/adc_uc-282x300.png 282w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/adc_uc-768x817.png 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/adc_uc.png 972w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Przetwornik ADC w RP2040. (https:\/\/datasheets.raspberrypi.com\/rp2040\/rp2040-datasheet.pdf)<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ae64401 elementor-widget elementor-widget-text-editor\" data-id=\"ae64401\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Za pomoc\u0105 sygna\u0142u PWM starali\u015bmy si\u0119 na sw\u00f3j spos\u00f3b imitowa\u0107 sygna\u0142 analogowy, tak aby wydawa\u0142o nam si\u0119, \u017ce dioda LED sterowana jest w p\u0142ynny spos\u00f3b. By\u0142a to jednak tylko imitacja, bo jak ju\u017c wiecie, w rzeczywisto\u015bci nadal by\u0142 to sygna\u0142 w stu procentach cyfrowy. W tym podrozdziale zajmiemy si\u0119 prawdziwym sygna\u0142em analogowym, jednak nie b\u0119dziemy go generowa\u0107, a jedynie odczytywa\u0107.<\/p><p><span style=\"font-weight: 400\">We wn\u0119trzu wsp\u00f3\u0142czesnych mikrokontroler\u00f3w znale\u017a\u0107 mo\u017cemy co\u015b takiego jak <\/span><b>ADC<\/b>. Dok\u0142adniej jest to <b>przetwornik ADC<\/b> (ang. Analog-digital converter) umo\u017cliwiaj\u0105cy konwersj\u0119 sygna\u0142u analogowego do postaci cyfrowej. W rzeczywisto\u015bci dzia\u0142a to w ten spos\u00f3b, \u017ce uk\u0142ad przypisuje konkretn\u0105 warto\u015b\u0107 liczbow\u0105 do odczytanego z zewn\u0119trznego wyprowadzenia napi\u0119cia. O tym, jaka to b\u0119dzie warto\u015b\u0107, decyduje przede wszystkim rozdzielczo\u015b\u0107 przetwornika. Procesor umieszczony na p\u0142ytce RPI Pico W wyposa\u017cony zosta\u0142 w 12 bitowy przetwornik, przez co sygna\u0142\u00a0analogowy mo\u017ce przyj\u0105\u0107 warto\u015b\u0107 z zakresu od 0 do 4095. Spotka\u0107 mo\u017cna si\u0119 te\u017c z 8 lub 16 bitowymi przetwornikami i zasad\u0105 jest, \u017ce im wy\u017csza rozdzielczo\u015b\u0107, tym dok\u0142adniejszy b\u0119dzie pomiar. Dla przyk\u0142adu w 8 bitowych konstrukcjach zakres odczytu mie\u015bci si\u0119 mi\u0119dzy 0 a 255, przez co jest on mniejszy i pomiar jest mniej dok\u0142adny. Pami\u0119ta\u0107 trzeba te\u017c, \u017ce mierzony sygna\u0142 musi by\u0107 napi\u0119ciowo zgodny z mikrokontrolerem. RP2040 operuje na logice 3,3V, dlatego mierzony sygna\u0142 nigdy nie powinien przekracza\u0107 tej warto\u015bci, w przeciwnym razie mo\u017cemy uszkodzi\u0107 uk\u0142ad.<\/p><p style=\"font-weight: 400\">W Raspberry Pi Pico W dost\u0119pnych jest pi\u0119\u0107 wej\u015b\u0107, do kt\u00f3rych pod\u0142\u0105czy\u0107 mo\u017cemy sygna\u0142 analogowy, z czego jeden zarezerwowany jest dla wewn\u0119trznego czujnika temperatury, umieszczonego bezpo\u015brednio w krzemie. Pozosta\u0142e wej\u015bcia po\u0142\u0105czone s\u0105 z zewn\u0119trznymi wyprowadzeniami o numerach 26, 27, 28 i 29. Warto te\u017c wspomnie\u0107, \u017ce tak naprawd\u0119 RP2040 wyposa\u017cono tylko w jeden przetwornik ADC, kt\u00f3ry obs\u0142uguje wszystkie mo\u017cliwe \u017ar\u00f3d\u0142a sygna\u0142u analogowego. S\u0105 one prze\u0142\u0105czane przez specjalny multiplekser i dopiero w\u00f3wczas sygna\u0142 poddawany jest konwersji. Takie rozwi\u0105zanie jest stosowane do\u015b\u0107 powszechnie, przede wszystkim przez fakt, \u017ce przetworniki s\u0105 do\u015b\u0107 skomplikowanymi i drogimi w produkcji konstrukcjami.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce116aa elementor-widget elementor-widget-image\" data-id=\"ce116aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0791-scaled.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_0791\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1ODk0IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvSU1HXzA3OTEtc2NhbGVkLmpwZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0791-1024x576.jpg\" class=\"attachment-large size-large wp-image-75894\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0791-1024x576.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0791-300x169.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0791-768x432.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0791-1536x864.jpg 1536w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0791-2048x1152.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Obw\u00f3d do test\u00f3w fotorezystora.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-31af6b7 elementor-widget elementor-widget-text-editor\" data-id=\"31af6b7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Dzia\u0142anie przetwornika ADC przetestujemy w rzeczywistych warunkach, dzi\u0119ki pod\u0142\u0105czonemu do RPI fotorezystorowi, kt\u00f3ry zmienia warto\u015b\u0107 swojej rezystancji pod wp\u0142ywem padaj\u0105cego na jego lico \u015bwiat\u0142a. Jednak nie b\u0119dzie on pod\u0142\u0105czony tak po prostu &#8211; aby stworzy\u0107 sygna\u0142 analogowy, zbudowa\u0107 musimy dzielnik napi\u0119cia z\u0142o\u017cony ze wspomnianego elementu oraz rezystora o warto\u015bci 1,2k\u03a9. Jedno z wyprowadze\u0144 fotorezystora pod\u0142\u0105czamy do napi\u0119cia 3,3V dost\u0119pnego na wyprowadzeniu numer 36. Osobi\u015bcie napi\u0119cie to wyprowadzi\u0142em do oznaczonej czerwonym kolorem magistrali na p\u0142ytce stykowej. Drugie wyprowadzenie musimy po\u0142\u0105czy\u0107 z pierwsz\u0105 n\u00f3\u017ck\u0105 rezystora, natomiast drug\u0105 ko\u0144c\u00f3wk\u0119 rezystora pod\u0142\u0105czamy do masy. Sygna\u0142 odczytywa\u0107 b\u0119dziemy w miejscu po\u0142\u0105czenia rezystora i fotorezystora, pod\u0142\u0105czamy je przewodowo do pinu GP26, oznaczanego na pinoucie p\u0142ytki jako ADC0.<\/p><p style=\"font-weight: 400\">Rozwi\u0105zanie z dzielnikiem napi\u0119cia jest niezb\u0119dne, poniewa\u017c gdyby\u015bmy pod\u0142\u0105czyli fotorezystor do RPI tak po prostu, uzyskiwaliby\u015bmy napi\u0119cie zbli\u017cone do 3,3V, niezale\u017cnie od padaj\u0105cej na element wi\u0105zki \u015bwiat\u0142a. Zamianie ulega\u0142aby rezystancja oraz p\u0142yn\u0105cy pr\u0105d, ale napi\u0119cie by\u0142oby zawsze takie samo. Jednak dzi\u0119ki dodatkowemu rezystorowi, mo\u017cemy podzieli\u0107 odk\u0142adaj\u0105ce si\u0119 na elementach napi\u0119cie na dwie cz\u0119\u015bci, kt\u00f3re zale\u017cne b\u0119d\u0105 w\u0142a\u015bnie od rezystancji. Wi\u0119cej \u015bwiat\u0142a padaj\u0105cego na fotorezystor oznacza zmniejszenie jego rezystancji, wzrost pr\u0105du i obni\u017cenie odk\u0142adaj\u0105cego si\u0119 na nim napi\u0119cia. Wi\u0119ksz\u0105 cz\u0119\u015b\u0107 napi\u0119cia przechwytuje w\u00f3wczas rezystor, na kt\u00f3rym to w rzeczywisto\u015bci wykonujemy pomiar. Nale\u017cy pami\u0119ta\u0107, \u017ce napi\u0119cie odczytujemy wzgl\u0119dem masy, dlatego, tak naprawd\u0119 mierzymy rezystor, a nie fotorezystor. Analogicznie, gdy \u015bwiat\u0142a jest mniej, op\u00f3r fotorezystora ro\u015bnie i odk\u0142ada si\u0119 na nim coraz wi\u0119ksze napi\u0119cie, jednocze\u015bnie obni\u017caj\u0105c r\u00f3\u017cnic\u0119 potencja\u0142\u00f3w na rezystorze. Kto\u015b m\u00f3g\u0142by zapyta\u0107, dlaczego zbudowa\u0142em w\u0142a\u015bnie taki obw\u00f3d i czy mo\u017cna zamieni\u0107 miejscami rezystor z fotorezystorem? Oczywi\u015bcie elementy te mo\u017cna zamieni\u0107 miejscami, ale w\u00f3wczas odwr\u00f3cimy dzia\u0142anie uk\u0142adu. W moim rozwi\u0105zaniu odczytywane napi\u0119cie b\u0119dzie ros\u0142o wraz ze wzrostem ilo\u015bci foton\u00f3w padaj\u0105cych na fotorezystor, po zamianie element\u00f3w dzia\u0142a\u0142oby to odwrotnie, co wydaje mi si\u0119 mniej intuicyjne.<\/p><p style=\"font-weight: 400\">Po tym nieco d\u0142u\u017cszym wst\u0119pie mo\u017cemy przej\u015b\u0107 do programowania. Na potrzeby test\u00f3w przygotowa\u0142em projekt nazwany photoresistor_adc. Jego zadaniem b\u0119dzie odczytanie sygna\u0142u z pinu GP26 i przes\u0142anie liczbowej warto\u015bci poprzez USB do komputera, dzi\u0119ki czemu b\u0119dziemy mogli podejrze\u0107 j\u0105 w serial monitorze.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-50ddb68 elementor-widget elementor-widget-code-highlight\" data-id=\"50ddb68\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>#include \"pico\/stdlib.h\"\r\n#include \"hardware\/adc.h\"\r\n\r\nint main() {\r\n    stdio_init_all();\r\n\r\n    adc_init(); \/\/ADC initialization\r\n\r\n    adc_gpio_init(26); \/\/assignment to ADC pin 26 (ADC0)\r\n    adc_select_input(0);\r\n\r\n    while(true) {\r\n        \r\n        uint16_t result = adc_read(); \/\/ADC value reading\r\n        float voltage_value = result * (3.3\/4095); \/\/ADC to voltage conversion\r\n        printf(\"Read ADC: value = %d, voltage = %f V\\n\", result, voltage_value);\r\n        \r\n        sleep_ms(500);\r\n    }\r\n}\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5b3eccc elementor-widget elementor-widget-text-editor\" data-id=\"5b3eccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Program, kt\u00f3ry wsp\u00f3lnie om\u00f3wimy, jest do\u015b\u0107 kr\u00f3tki, ale znalaz\u0142o si\u0119 w nim kilka nowo\u015bci, kt\u00f3re za chwil\u0119 poznacie. Jako \u017ce korzysta\u0107 b\u0119dziemy z kolejnej wbudowanej w mikrokontroler funkcjonalno\u015bci, do\u0142\u0105czy\u0107 musimy odpowiedni\u0105 bibliotek\u0119, a b\u0119dzie to hardware\/adc.h. Pami\u0119tajcie o dodaniu jej w pliku CMakeLists.txt, poza tym w projekcie korzystamy te\u017c ze strumienia wyj\u015bciowego USB i go r\u00f3wnie\u017c nale\u017cy aktywowa\u0107 w tym pliku, podobnie jak w poprzednich przyk\u0142adach.<\/p><p style=\"font-weight: 400\">W pierwszej cz\u0119\u015bci programu inicjalizujemy przetwornik ADC, dzi\u0119ki poleceniu adc_init(), a tak\u017ce wybieramy wykorzystywany port. W pierwszej funkcji wybieramy odpowiedni numer GPxx, natomiast adc_select_input odpowiada za wyb\u00f3r sygna\u0142u ADC, kt\u00f3ry przekazany zostanie do przetwornika, przez wcze\u015bniej wspomniany multiplekser.<\/p><p style=\"font-weight: 400\">W g\u0142\u00f3wnej cz\u0119\u015bci programu tworzymy zmienn\u0105 result, kt\u00f3ra dzi\u0119ki u\u017cyciu funkcji adc_read() przechowywa\u0107 b\u0119dzie liczbow\u0105 warto\u015b\u0107 sygna\u0142u ADC, odczytan\u0105 z pinu GP26. W kolejnym kroku generujemy zmiennoprzecinkow\u0105 voltage_value, poniewa\u017c poza liczbow\u0105 warto\u015bci\u0105 ADC warto by\u0142oby te\u017c zna\u0107 konkretne napi\u0119cie, jakie pojawia si\u0119 na wyprowadzeniu RPI Pico W. R\u00f3\u017cnic\u0119 potencja\u0142\u00f3w mo\u017cemy obliczy\u0107, korzystaj\u0105c z prostej zale\u017cno\u015bci:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-33f6b0c elementor-widget elementor-widget-text-editor\" data-id=\"33f6b0c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">4095 = 3,3V<\/p><p style=\"font-weight: 400\">1 = xV<\/p><p style=\"font-weight: 400\">4095x = 3,3V<\/p><p style=\"font-weight: 400\">x = 3,3V\/4095 = 0,000805V<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-548987e elementor-widget elementor-widget-text-editor\" data-id=\"548987e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Dzi\u0119ki niej wiemy, \u017ce ka\u017cde zwi\u0119kszenie warto\u015bci ADC o jeden odpowiada w rzeczywisto\u015bci wzrostowi napi\u0119cia o oko\u0142o 0,000805V. W j\u0119zyku C z powodzeniem mo\u017cna tworzy\u0107 r\u00f3\u017cnego rodzaju matematyczne dzia\u0142ania, dlatego, aby RP2040 m\u00f3g\u0142 przes\u0142a\u0107 nam odpowiedni\u0105 warto\u015b\u0107, kt\u00f3ra zostanie dalej wy\u015bwietlona, przygotujemy proste obliczenie matematyczne. Chc\u0105c uzyska\u0107 warto\u015b\u0107 napi\u0119cia odpowiadaj\u0105c\u0105 warto\u015bci ADC, wystarczy, \u017ce przemno\u017cymy j\u0105 przez obliczon\u0105 chwil\u0119 wcze\u015bniej warto\u015b\u0107. Umo\u017cliwia nam to operator gwiazdki (*), mno\u017cymy warto\u015b\u0107 zmiennej result przez (3.3\/4095). Oczywi\u015bcie mo\u017cna by tu wstawi\u0107 po prostu 0,000805, ale nic nie stoi na przeszkodzie, aby mikrokontroler sam wyznaczy\u0142 odpowiedni\u0105 warto\u015b\u0107. Dlatego dzi\u0119ki operatorowi (\/) dzielimy 3,3 przez 4095. Zauwa\u017ccie, \u017ce dzia\u0142anie to umieszczone jest w nawiasie, gdyby go zabrak\u0142o, uk\u0142ad najpierw wykona\u0142by operacj\u0119 mno\u017cenia a dopiero p\u00f3\u017aniej dzielenie, uzyskuj\u0105c w\u00f3wczas niepoprawny wynik. Warto wiedzie\u0107, \u017ce C wspiera znan\u0105 z matematyki i realizowan\u0105 dzi\u0119ki nawiasom kolejno\u015b\u0107 wykonywania dzia\u0142a\u0144.<\/p>\n<p style=\"font-weight: 400\">W ostatnim punkcie, dzi\u0119ki znanej ju\u017c funkcji printf wysy\u0142amy do komputera odpowiedni komunikat zawieraj\u0105cy zmienn\u0105 result oraz voltage_value.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-153ffab elementor-widget elementor-widget-image\" data-id=\"153ffab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-adc.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"serial adc\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1OTAzIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvc2VyaWFsLWFkYy5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"249\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-adc-1024x319.png\" class=\"attachment-large size-large wp-image-75903\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-adc-1024x319.png 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-adc-300x94.png 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-adc-768x239.png 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-adc-1536x479.png 1536w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/serial-adc.png 1585w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Warto\u015bci ADC i napi\u0119cia przesy\u0142ane przez RPI.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f640fa3 elementor-widget elementor-widget-text-editor\" data-id=\"f640fa3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Po uruchomieniu programu i otwarciu serial monitora obserwowa\u0107 mo\u017cemy zmieniaj\u0105c\u0105 si\u0119 liczbow\u0105 reprezentacj\u0119 ADC i napi\u0119cia na ekranie naszych komputer\u00f3w. Warto\u015bci te rosn\u0105 wraz z ilo\u015bci\u0105 padaj\u0105cego na fotorezystor \u015bwiat\u0142a.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-4f4e167 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4f4e167\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-9a554f5\" data-id=\"9a554f5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4428e0c elementor-widget elementor-widget-image\" data-id=\"4428e0c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/RPP130-FOTOREZYSTOR-0001.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"RPP130 FOTOREZYSTOR 0001\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1OTA3IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvUlBQMTMwLUZPVE9SRVpZU1RPUi0wMDAxLmpwZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"852\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/RPP130-FOTOREZYSTOR-0001.jpg\" class=\"attachment-large size-large wp-image-75907\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/RPP130-FOTOREZYSTOR-0001.jpg 800w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/RPP130-FOTOREZYSTOR-0001-282x300.jpg 282w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/RPP130-FOTOREZYSTOR-0001-768x818.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Uszkodzony fotorezystor RPP130 z lat 80. (http:\/\/www.cemi.cba.pl\/fotorezystor.html)<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-e7617fb\" data-id=\"e7617fb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2d1f947 elementor-widget elementor-widget-image\" data-id=\"2d1f947\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0792.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_0792\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1OTExIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvSU1HXzA3OTIuanBnIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0792-1024x576.jpg\" class=\"attachment-large size-large wp-image-75911\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0792-1024x576.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0792-300x169.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0792-768x432.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0792.jpg 1299w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Wsp\u00f3\u0142czesny fotorezystor.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-f3b1c3a elementor-widget elementor-widget-text-editor\" data-id=\"f3b1c3a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Na koniec chcia\u0142bym pokaza\u0107 wam dwie ciekawe fotografie zwi\u0105zane z fotorezystorami. Te optoelektroniczne elementy zbudowane s\u0105 z cienkich, p\u00f3\u0142przewodnikowych \u015bcie\u017cek, nanoszonych na pod\u0142o\u017ce z dielektryka. Wykorzystany materia\u0142\u00a0p\u00f3\u0142przewodnikowy zale\u017cy od konkretnego typu fotorezystora i jego charakterystyki widmowej, ale powszechnie spotykanymi materia\u0142ami s\u0105: siarczek kadmu (CdS), siarczek o\u0142owiu (PbS), selenek o\u0142owiu (PbSe) lub antymonek indu (InSb). Ka\u017cdy fotorezystor, podobnie jak inne elementy elektroniczne produkowany musi by\u0107 w sterylnych warunkach, ale b\u0142\u0119dy mog\u0105 zdarzy\u0107 si\u0119 zawsze. Na zdj\u0119ciu po prawej stronie zobaczy\u0107 mo\u017cecie zwyczajny, poprawnie wykonany fotorezystor. Natomiast na lewej fotografii znalaz\u0142\u00a0si\u0119 uszkodzony w czasie produkcji element o oznaczeniu RPP130 pochodz\u0105cy z nieistniej\u0105cych ju\u017c Toru\u0144skich zak\u0142ad\u00f3w Unitra TOMI. Przyczyn\u0105 awarii, by\u0142a prawdopodobnie para wodna, kt\u00f3ra osiad\u0142a na strukturze fotorezystora przed umieszczeniem go w hermetycznej obudowie.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-808a094 elementor-widget elementor-widget-image\" data-id=\"808a094\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0794.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_0794\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc1OTE1IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMlwvSU1HXzA3OTQuanBnIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0794-1024x576.jpg\" class=\"attachment-large size-large wp-image-75915\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0794-1024x576.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0794-300x169.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0794-768x432.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/IMG_0794.jpg 1383w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Uszkodzony fotorezystor.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0c86489 elementor-widget elementor-widget-text-editor\" data-id=\"0c86489\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Jednak tego typu uszkodzenie to domena nie tylko wiekowych fotorezystor\u00f3w z lat 80. Na zdj\u0119ciu powy\u017cej zobaczy\u0107 mo\u017cecie ciekawy przypadek wsp\u00f3\u0142czesnego fotorezystora o podobnym uszkodzeniu. Dzi\u0119ki swojej nietypowej strukturze charakteryzuje si\u0119 on znacznie wi\u0119ksz\u0105 oporno\u015bci\u0105 ni\u017c katalogowe 15k\u03a9.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f43ad06 elementor-widget elementor-widget-heading\" data-id=\"f43ad06\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Kilka s\u0142\u00f3w na koniec\u2026<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a1834dc elementor-widget elementor-widget-text-editor\" data-id=\"a1834dc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Kolejny materia\u0142 o Raspberry Pi Pico W za nami. Tym razem poznali\u015bmy modulacj\u0119 szeroko\u015bci impuls\u00f3w PWM i wykorzystali\u015bmy t\u0105 funkcjonalno\u015b\u0107 do sterowania diod\u0105 LED. Poza tym opowiedzia\u0142em wam, w jaki spos\u00f3b nawi\u0105za\u0107 komunikacj\u0119 z komputerem, dzi\u0119ki czemu w kolejnych programach, w prosty spos\u00f3b b\u0119dziemy mogli wy\u015bwietla\u0107 informacj\u0119 przesy\u0142ane przez RP2040 na jego ekranie. Poza tym uruchomili\u015bmy fotorezystor, korzystaj\u0105c z przetwornika ADC. W kolejnym artykule wykorzystamy zdobyt\u0105 do tej pory wiedz\u0119 i przygotujemy wsp\u00f3lnie nieco wi\u0119kszy program.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fd3350f elementor-widget elementor-widget-spacer\" data-id=\"fd3350f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3bc6aa8 elementor-widget elementor-widget-text-editor\" data-id=\"3bc6aa8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u0179r\u00f3d\u0142a:<\/p><ul><li>https:\/\/datasheets.raspberrypi.com\/rp2040\/rp2040-datasheet.pdf<\/li><li>https:\/\/datasheets.raspberrypi.com\/picow\/pico-w-datasheet.pdf<\/li><li>https:\/\/www.raspberrypi.com\/products\/rp2040\/<\/li><li>https:\/\/www.raspberrypi.com\/documentation\/microcontrollers\/raspberry-pi-pico.html<\/li><li>https:\/\/en.wikipedia.org\/wiki\/Pulse-width_modulation<\/li><li>http:\/\/www.cemi.cba.pl\/fotorezystor.html<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>W tej cz\u0119\u015bci kursu przyjrzymy si\u0119 bli\u017cej kilku funkcjonalno\u015bciom mikrokontrolera RP2040: PWM, USB oraz ADC.  Poza teoretycznym opisem poznacie te\u017c praktyczne zastosowanie tych funkcji.<\/p>\n","protected":false},"author":34,"featured_media":76278,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,21,134],"tags":[],"class_list":["post-75856","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-elektronika","category-programowanie","category-raspberry-pi"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kurs Raspberry Pi Pico - #6 \u2013 PWM, ADC i komunikacja z komputerem - Botland<\/title>\n<meta name=\"description\" content=\"W tej cz\u0119\u015bci kursu przyjrzymy si\u0119 bli\u017cej kilku funkcjonalno\u015bciom mikrokontrolera RP2040: PWM, USB oraz ADC. Poza teoretycznym opisem poznacie te\u017c praktyczne zastosowanie tych funkcji.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kurs Raspberry Pi Pico - #6 \u2013 PWM, ADC i komunikacja z komputerem - Botland\" \/>\n<meta property=\"og:description\" content=\"W tej cz\u0119\u015bci kursu przyjrzymy si\u0119 bli\u017cej kilku funkcjonalno\u015bciom mikrokontrolera RP2040: PWM, USB oraz ADC. Poza teoretycznym opisem poznacie te\u017c praktyczne zastosowanie tych funkcji.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/\" \/>\n<meta property=\"og:site_name\" content=\"Botland\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/Botland\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-19T13:00:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-08T09:01:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1510\" \/>\n\t<meta property=\"og:image:height\" content=\"755\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Rafa\u0142 Bartoszak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rafa\u0142 Bartoszak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"31 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/\"},\"author\":{\"name\":\"Rafa\u0142 Bartoszak\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\"},\"headline\":\"Kurs Raspberry Pi Pico &#8211; #6 \u2013 PWM, ADC i komunikacja z komputerem\",\"datePublished\":\"2024-02-19T13:00:23+00:00\",\"dateModified\":\"2026-04-08T09:01:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/\"},\"wordCount\":5685,\"publisher\":{\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/1.png\",\"articleSection\":[\"Elektronika\",\"Programowanie\",\"Raspberry Pi\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/\",\"name\":\"Kurs Raspberry Pi Pico - #6 \u2013 PWM, ADC i komunikacja z komputerem - Botland\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/1.png\",\"datePublished\":\"2024-02-19T13:00:23+00:00\",\"dateModified\":\"2026-04-08T09:01:06+00:00\",\"description\":\"W tej cz\u0119\u015bci kursu przyjrzymy si\u0119 bli\u017cej kilku funkcjonalno\u015bciom mikrokontrolera RP2040: PWM, USB oraz ADC. Poza teoretycznym opisem poznacie te\u017c praktyczne zastosowanie tych funkcji.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/#primaryimage\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/1.png\",\"contentUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/1.png\",\"width\":1510,\"height\":755},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kurs Raspberry Pi&nbsp;Pico &#8211; #6 \u2013 PWM, ADC i&nbsp;komunikacja z&nbsp;komputerem\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/botland.de\\\/blog\\\/\",\"name\":\"Botland\",\"description\":\"Blog Raspberry Pi, Arduino, elektronika i robotyka - Botland\",\"publisher\":{\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/botland.de\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#organization\",\"name\":\"Botland\",\"url\":\"https:\\\/\\\/botland.de\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/botland.store\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/logo_kolor_WP_2-1.png\",\"contentUrl\":\"https:\\\/\\\/botland.store\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/logo_kolor_WP_2-1.png\",\"width\":250,\"height\":57,\"caption\":\"Botland\"},\"image\":{\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/facebook.com\\\/Botland\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\",\"name\":\"Rafa\u0142 Bartoszak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/IMG_21531-300x300.jpg\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/IMG_21531-300x300.jpg\",\"contentUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/IMG_21531-300x300.jpg\",\"caption\":\"Rafa\u0142 Bartoszak\"},\"description\":\"Wsp\u00f3\u0142pracuj\u0105cy z Botlandem elektronik, kt\u00f3ry dzieli si\u0119 swoj\u0105 wiedz\u0105 w internecie. Entuzjasta system\u00f3w cyfrowych, uk\u0142ad\u00f3w programowalnych i mikroelektroniki. Pasjonat historii, ze szczeg\u00f3lnym naciskiem na wiek XX.\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/author\\\/rafal-bartoszak\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kurs Raspberry Pi Pico - #6 \u2013 PWM, ADC i komunikacja z komputerem - Botland","description":"W tej cz\u0119\u015bci kursu przyjrzymy si\u0119 bli\u017cej kilku funkcjonalno\u015bciom mikrokontrolera RP2040: PWM, USB oraz ADC. Poza teoretycznym opisem poznacie te\u017c praktyczne zastosowanie tych funkcji.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/","og_locale":"pl_PL","og_type":"article","og_title":"Kurs Raspberry Pi Pico - #6 \u2013 PWM, ADC i komunikacja z komputerem - Botland","og_description":"W tej cz\u0119\u015bci kursu przyjrzymy si\u0119 bli\u017cej kilku funkcjonalno\u015bciom mikrokontrolera RP2040: PWM, USB oraz ADC. Poza teoretycznym opisem poznacie te\u017c praktyczne zastosowanie tych funkcji.","og_url":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/","og_site_name":"Botland","article_publisher":"https:\/\/facebook.com\/Botland\/","article_published_time":"2024-02-19T13:00:23+00:00","article_modified_time":"2026-04-08T09:01:06+00:00","og_image":[{"width":1510,"height":755,"url":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/1.png","type":"image\/png"}],"author":"Rafa\u0142 Bartoszak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Rafa\u0142 Bartoszak","Szacowany czas czytania":"31 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/#article","isPartOf":{"@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/"},"author":{"name":"Rafa\u0142 Bartoszak","@id":"https:\/\/botland.de\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215"},"headline":"Kurs Raspberry Pi Pico &#8211; #6 \u2013 PWM, ADC i komunikacja z komputerem","datePublished":"2024-02-19T13:00:23+00:00","dateModified":"2026-04-08T09:01:06+00:00","mainEntityOfPage":{"@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/"},"wordCount":5685,"publisher":{"@id":"https:\/\/botland.de\/blog\/#organization"},"image":{"@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/#primaryimage"},"thumbnailUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/1.png","articleSection":["Elektronika","Programowanie","Raspberry Pi"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/","url":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/","name":"Kurs Raspberry Pi Pico - #6 \u2013 PWM, ADC i komunikacja z komputerem - Botland","isPartOf":{"@id":"https:\/\/botland.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/#primaryimage"},"image":{"@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/#primaryimage"},"thumbnailUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/1.png","datePublished":"2024-02-19T13:00:23+00:00","dateModified":"2026-04-08T09:01:06+00:00","description":"W tej cz\u0119\u015bci kursu przyjrzymy si\u0119 bli\u017cej kilku funkcjonalno\u015bciom mikrokontrolera RP2040: PWM, USB oraz ADC. Poza teoretycznym opisem poznacie te\u017c praktyczne zastosowanie tych funkcji.","breadcrumb":{"@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/#primaryimage","url":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/1.png","contentUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/02\/1.png","width":1510,"height":755},{"@type":"BreadcrumbList","@id":"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/botland.com.pl\/blog\/"},{"@type":"ListItem","position":2,"name":"Kurs Raspberry Pi&nbsp;Pico &#8211; #6 \u2013 PWM, ADC i&nbsp;komunikacja z&nbsp;komputerem"}]},{"@type":"WebSite","@id":"https:\/\/botland.de\/blog\/#website","url":"https:\/\/botland.de\/blog\/","name":"Botland","description":"Blog Raspberry Pi, Arduino, elektronika i robotyka - Botland","publisher":{"@id":"https:\/\/botland.de\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/botland.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/botland.de\/blog\/#organization","name":"Botland","url":"https:\/\/botland.de\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.de\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/botland.store\/blog\/wp-content\/uploads\/2018\/04\/logo_kolor_WP_2-1.png","contentUrl":"https:\/\/botland.store\/blog\/wp-content\/uploads\/2018\/04\/logo_kolor_WP_2-1.png","width":250,"height":57,"caption":"Botland"},"image":{"@id":"https:\/\/botland.de\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/Botland\/"]},{"@type":"Person","@id":"https:\/\/botland.de\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215","name":"Rafa\u0142 Bartoszak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2023\/07\/IMG_21531-300x300.jpg","url":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2023\/07\/IMG_21531-300x300.jpg","contentUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2023\/07\/IMG_21531-300x300.jpg","caption":"Rafa\u0142 Bartoszak"},"description":"Wsp\u00f3\u0142pracuj\u0105cy z Botlandem elektronik, kt\u00f3ry dzieli si\u0119 swoj\u0105 wiedz\u0105 w internecie. Entuzjasta system\u00f3w cyfrowych, uk\u0142ad\u00f3w programowalnych i mikroelektroniki. Pasjonat historii, ze szczeg\u00f3lnym naciskiem na wiek XX.","url":"https:\/\/botland.com.pl\/blog\/author\/rafal-bartoszak\/"}]}},"_links":{"self":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/posts\/75856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/comments?post=75856"}],"version-history":[{"count":0,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/posts\/75856\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/media\/76278"}],"wp:attachment":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/media?parent=75856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/categories?post=75856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/tags?post=75856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}