{"id":526,"date":"2017-01-17T19:07:04","date_gmt":"2017-01-17T19:07:04","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=526"},"modified":"2017-01-18T20:42:38","modified_gmt":"2017-01-18T20:42:38","slug":"processing-oscyloskop-starcie-nr-2","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=526","title":{"rendered":"Processing &#8212; oscyloskop (starcie nr 2)"},"content":{"rendered":"<h2>Oscyloskop<\/h2>\n<p>Kontynuujemy poznawanie <a href=\"http:\/\/processing.org\">processinga<\/a>. Pod\u0105\u017camy w kierunku stworzenia aplikacji, kt\u00f3ra b\u0119dzie wy\u015bwietla\u0107 napi\u0119cia z port\u00f3w Arduino UNO (A0, A1..A5) &#8211; czyli taki softwarowy <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Oscyloskop\">oscyloskop<\/a>. Na poprzednich zaj\u0119ciach przekonali\u015bmy si\u0119, \u017ce wysy\u0142anie liczb z poziomu Arduino za pomoc\u0105 Serial.println(analogRead(A0)) kiepski pomys\u0142, bo<\/p>\n<ul>\n<li>ka\u017cda cyfra w wysy\u0142anej liczbie to 1 bajt, np. liczba &#8222;1017&#8221; to a\u017c 5 bajt\u00f3w (4 cyfry + znacznik ko\u0144ca linii)<\/li>\n<li>jest k\u0142opot z odczytem liczb przesy\u0142anych jako napisy, gdy\u017c trzeba je odczytywa\u0107 jako napis (tablica znak\u00f3w) a nast\u0119pnie zamieni\u0107 napis na liczb\u0119 &#8211; skoplikowane i powolne. Bez takiej procedury odczytu liczby b\u0119d\u0105 b\u0142\u0119dnie wczytywane i dodatkowo b\u0119d\u0105 pojawia\u0107 si\u0119 nadmiarowe liczby (\u015bmieci) odpowiadaj\u0105ce znacznikowi ko\u0144ca linii.<\/li>\n<\/ul>\n<p>Dlatego te\u017c musimy zmieni\u0107 spos\u00f3b wysy\u0142ania liczb z Arduino &#8211; bez udzia\u0142u Serial.println.&nbsp;<\/p>\n<h2>W\u0142asny protok\u00f3\u0142<\/h2>\n<p>B\u0119dziemy wykorzystywa\u0107 metod\u0119&nbsp;<strong>Serial.write(<\/strong><em>dana<\/em><strong>)<\/strong> &#8211; kt\u00f3ra wysy\u0142a pojedynczy bajt przez komunikacj\u0119 szeregow\u0105. Nie jest wysy\u0142any \u017caden znacznik ko\u0144ca linii, a na dodatek liczba z zakresu 0..255 wymaga wys\u0142ania tylko jednego bajta &#8211; du\u017ca oszcz\u0119dno\u015b\u0107 w por\u00f3wnaniu do Serial.println(). Z tego samego powodu liczba z przedzia\u0142u 0..65535 b\u0119dzie wymaga\u0107 wys\u0142ania tylko 2 bajt\u00f3w. Oszcz\u0119dno\u015b\u0107 na transmisji (a wi\u0119c na szybko\u015bci!) widoczny jest od razu.<\/p>\n<p>Jest jednak pewien problem &#8211; skoro wysy\u0142amy tylko jeden bajt, bo jak wys\u0142a\u0107 liczb\u0119 typu <strong>int <\/strong>(czyli 2 bajty)?<strong>&nbsp;<\/strong>Przecie\u017c wyj\u015bcia analogowe w Arduino UNO s\u0105 10-cio bitowe, czyli generuj\u0105 liczby z zakresu 0..1023 (2 bajty = int). Rozwi\u0105zujemy to wysy\u0142aj\u0105c te dwa bajty buduj\u0105ce liczb\u0119 typu <strong>int<\/strong>&nbsp;oddzielnie &#8211; najpierw bajt starszy, potem m\u0142odszy (za chwil\u0119 b\u0119dzie to wyja\u015bnione). Brzmi do\u015b\u0107 zawile, ale tak nie jest &#8211; prosz\u0119 przyjrze\u0107 si\u0119 poni\u017cszemu programikowi:<\/p>\n<pre class=\"lang:arduino decode:true\">void setup(){\r\nSerial.begin(9600);\r\n}\r\n\r\nvoid loop(){\r\n  int dana = analogRead(A0);\r\n  Serial.write( 0xff);\r\n  Serial.write( (dana&gt;&gt;8) &amp; 0xff);\r\n  Serial.write( dana &amp; 0xff);\r\n}\r\n<\/pre>\n<p>W tym programie wysy\u0142amy liczb\u0119 odczytan\u0105 z portu A0 Arduino jako 3 bajty &#8211; dwa bajty to ten odczyt- liczba int, ale przed nim wysy\u0142am &#8222;flag\u0119&#8221; informuj\u0105c\u0105, \u017ce podaj\u0119 w\u0142a\u015bnie liczb\u0119 typu int. Ta flaga jest potrzebna w sytuacjach, gdy z jakiego\u015b powodu rozsynchronizuje si\u0119 nam transmisja i w\u00f3wczas nie b\u0119dziemy w stanie okre\u015bli\u0107, kt\u00f3ry bajt jest pierwszym, a kt\u00f3ry drugim buduj\u0105cym liczb\u0119 typu int. Dzi\u0119ki istnieniu flagi (u mnie liczby 0xff czyli 255 dziesi\u0119tnie) zawsze b\u0119dziemy wiedzie\u0107 prawid\u0142ow\u0105 kolejno\u015b\u0107.&nbsp;<\/p>\n<p>Warto\u015b\u0107 flagi nie ma znaczenia, ja wygra\u0142em 255 &#8211; ale ka\u017cdy mo\u017ce wpisa\u0107 swoj\u0105 ulubion\u0105 liczb\u0119 z przedzia\u0142u 0..255 (oczywi\u015bcie, gdy zmieni warto\u015b\u0107 flagi to przy odczycie liczby nale\u017cy to uwzgl\u0119dni\u0107).<\/p>\n<p>W kodowaniu liczby pos\u0142uguj\u0119 si\u0119 poj\u0119ciami &#8222;starszego&#8221; i &#8222;m\u0142odszego&#8221; bajtu &#8211; w ko\u0144cu liczba typu <strong>int<\/strong> to 2 bajty (=16 bit\u00f3w), wi\u0119c pierwszy z nich (pierwsze 8 bit\u00f3w) niech si\u0119 nazywa &#8222;starszy&#8221;, a drugi (kolejne 8 bit\u00f3w) &#8211; &#8222;m\u0142odszy&#8221;. Kodowanie polega na:<\/p>\n<ul>\n<li>przesuni\u0119cie liczby o 8 bit\u00f3w w prawo, w ten spos\u00f3b mamy now\u0105 liczb\u0119 (w zapisie bitowym) jako 8-zer i 8 bit\u00f3w z pierwotnej liczby, czyli tylko ten &#8222;starszy&#8221; bajt w\u0142a\u015bnie<\/li>\n<li>iloczyn logiczny z bajtem o warto\u015bci 255 (szesnastkowo 0xff) zwr\u00f3ci nam w\u0142a\u015bnie ten starszy bajt &#8211; kt\u00f3ry wysy\u0142amy przez Serial.write jako pierwszy<\/li>\n<li>iloczyn logiczny danej liczby int <strong>bez wykonywania przesuni\u0119cia<\/strong> z bajtem 255 (szesnastkowo 0xff) &#8222;wycina&#8221; nam starszy bajt, pozostawiaj\u0105c jedynie m\u0142odszy bajt &#8211; kt\u00f3ry wysy\u0142amy drugim poleceniem Serial.write<\/li>\n<\/ul>\n<p>W ten spos\u00f3b wysy\u0142amy liczby odczytywane z portu A0 &#8211; przy czym teraz do ich ogl\u0105dania nie mo\u017cemy u\u017cy\u0107 <em>Monitora portu szeregowego<\/em> z Arduino IDE &#8211; gdy\u017c zobaczymy tylko &#8222;krzaczki&#8221; (nawet bez ko\u0144ca linii, no chyba, \u017ce przypadkowo trafi si\u0119 liczba 13 &#8211; kt\u00f3ry jest znakiem Entera). Jak wi\u0119c odczytywa\u0107 takie liczby? Trzeba wykona\u0107 operacj\u0119 odwrotn\u0105, czyli:<\/p>\n<ol>\n<li>czeka\u0107 na nadej\u015bcie 3 bajt\u00f3w do portu szeregowego,<\/li>\n<li>sprawdzi\u0107, czy pierwszy z nich to nasza flaga &#8211; u nas 0xff,<\/li>\n<li>je\u015bli <strong>nie<\/strong>, to wracam do punktu&nbsp;punktu 1,<\/li>\n<li>je\u015bli jednak <strong>tak<\/strong>, to wczytujemy kolejny bajt, przesuwamy go w lewo o 8 bit\u00f3w, robimy sum\u0119 logiczn\u0105 ze wczytanym nast\u0119pnym bajtem,<\/li>\n<li>wracamy do 1. i odczytujemy kolejn\u0105 liczb\u0119.<\/li>\n<\/ol>\n<p>Skomplikowane? mo\u017ce tak, mo\u017ce nie&#8230; zale\u017cy dla kogo \ud83d\ude09 Czy nasz protok\u00f3\u0142 jest dobry? Tyle o ile&#8230; ma co prawda informacj\u0119 o pocz\u0105tku liczby (to plus), ale nie ma jakiej\u015b sumy kontrolnej, sprawdzaj\u0105cej poprawno\u015b\u0107 wys\u0142anej daje (to minus). Ale jest prosty i szybki (przesuwanie lit\u00f3w i liczenie iloczynu\/sumy bitowej to &#8222;pestka&#8221;, nawet dla Arduino) &#8211; to kolejny plus, kt\u00f3ry przewa\u017ca o jego wykorzystaniu. Pami\u0119tajmy, \u017ce zale\u017cy nam na wykre\u015blaniu liczb z otrzymywanych z przetwornika analogowo-cyfrowego Arduino, kt\u00f3ry pracuje z cz\u0119sto\u015bci\u0105 10k &#8211; nadaje wi\u0119c 10 000 liczb na sekund\u0119. Sprawdzi\u0142em, \u017ce operacje kodowania liczb w naszym protokole skutkuj\u0105 nadawaniem oko\u0142o 9000 liczb na ka\u017cd\u0105 sekund\u0119, czyli ca\u0142kiem dobrze.<\/p>\n<p>Podsumowuj\u0105c: nadajemy flag\u0119 (0xff), potem starszy bajt, a potem m\u0142odszy. Kto\u015b mo\u017ce nie zna\u0107 naszego protoko\u0142u i odczytywa\u0107 (dobr\u0105) flag\u0119, a potem 2 bajty <strong>ALE<\/strong> my\u015ble\u0107, \u017ce to m\u0142odszy i starszy bajt &#8211; <strong>w odwrotnej<\/strong> kolejno\u015bci ni\u017c my to zrobili\u015bmy. Wi\u0119c zbudowane przez niego liczba <strong>int<\/strong> nie b\u0119dzie t\u0105 liczb\u0105, kt\u00f3r\u0105 my wys\u0142ali\u015bmy. Chc\u0105c unikn\u0105\u0107 nieporozumie\u0144 nale\u017ca\u0142oby zaznajomi\u0107 tak\u0105 osob\u0119 z naszym protoko\u0142em &#8211; i teraz ju\u017c rozumiemy, sk\u0105d si\u0119 bierze konieczno\u015b\u0107 standaryzacji w informatyce (i nie tylko).<\/p>\n<h2>Arduino + potencjometr<\/h2>\n<p>Aby mie\u0107 w pe\u0142ni kontrol\u0119 nad tym, co robimy, proponuj\u0119 zacz\u0105\u0107 od wysy\u0142ania liczb z portu analogowego Arduino z <a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=465\">wykorzystaniem potencjometru<\/a> &#8211; temat wielokrotnie przez nas wa\u0142kowany. Tym razem jednak nie u\u017cywamy p\u0142ytki stykowej i przewod\u00f3w, a pod\u0142\u0105czymy potencjometr&nbsp;bezpo\u015brednio do port\u00f3w analogowych Arduino, o tak:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-536\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/5-300x169.jpg\" alt=\"5\" width=\"557\" height=\"314\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/5-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/5-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/5-1024x576.jpg 1024w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><\/p>\n<p>W ten spos\u00f3b <strong>tracimy<\/strong> 2 porty analogowe (<strong>zamieniaj\u0105c<\/strong> ich funkcj\u0119 na porty cyfrowe), a 3-ci wykorzystujemy do odczyty napi\u0119cia. Pozbywamy si\u0119 konieczno\u015bci stosowania p\u0142ytki stykowej &#8211; co\u015b za co\u015b. W tym przypadku chodzi mi o maksymalne uproszczenie kwestii po stronie Arduino, a skupienie si\u0119 na processingu. Dodam tylko, \u017ce na pinie A0 musz\u0119 w\u0142\u0105czy\u0107 napi\u0119cie 5V,a na pinie A4 napi\u0119cie 0V z wykorzystaniem funkcji pinMode(OUTPUT) i digitalWrite().<\/p>\n<p>Skech \u0142\u0105cz\u0105cy w sobie wysy\u0142anie danych w naszym protokole ze wspomnianym &#8222;sprytnym&#8221; (ale kosztownym!) pod\u0142\u0105czeniu potencjometru:<\/p>\n<pre class=\"lang:arduino decode:true \">#define OUT A2\r\n#define POWER A0\r\n#define GND A4\r\n\r\nvoid setup() {\r\n Serial.begin(9600);\r\n pinMode(POWER, OUTPUT);\r\n pinMode(GND, OUTPUT);\r\n digitalWrite(GND, 0);\r\n digitalWrite(POWER, 1);\r\n}\r\n\r\nvoid loop() {\r\n int val=analogRead(OUT);\r\n\/\/ Serial.println( val);\r\n \r\n Serial.write( 0xff);\r\n Serial.write( (val&gt;&gt;8) &amp; 0xff);\r\n Serial.write( val &amp; 0xff);\r\n}\r\n<\/pre>\n<p>Oczywi\u015bcie w przysz\u0142o\u015bci zast\u0105pimy potencjometr jakimi\u015b czujkami &#8211; np. <a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=508\">pola magnetycznego<\/a>, natomiast na chwil\u0119 obecn\u0105 bawimy si\u0119 potencjometrem (daje to nam pe\u0142n\u0105 kontrol\u0119 nad kre\u015blonym wykresem).<\/p>\n<h2>Processing &#8211; funkcja odczytu<\/h2>\n<p>Dodajemy do naszego projektu (z poprzednich zaj\u0119\u0107) funkcj\u0119 odczytu danych &#8211; uwzgl\u0119dniaj\u0105cych nasz protok\u00f3\u0142<\/p>\n<pre class=\"lang:arduino decode:true\">int getValue(){\r\n int value = -1;\r\n while (port.available() &gt;= 3){\r\n if (port.read() == 0xff)\r\n     value = (port.read() &lt;&lt;8) | (port.read()); \r\n }\r\n return value;\r\n}\r\n<\/pre>\n<p>Nazwa\u0142em j\u0105 getValue() i jak wida\u0107 realizuje wspomniany wy\u017cej spos\u00f3b odczytywania liczby typu <strong>int<\/strong>. Najpierw czekamy na (przynajmniej) 3 bajty w buforze, potem odczytuje pierwszy por\u00f3wnuj\u0105c do flagi, a nast\u0119pnie tworz\u0119 liczb\u0119 typu int ze starszego i m\u0142odszego bajtu.<\/p>\n<h2>Wy\u015bwietlamy s\u0142upki (dane)<\/h2>\n<p>W g\u0142\u00f3wnej funkcji processinga &#8211; funkcji draw() &#8211; dodajemy rysowanie prostok\u0105ta o wysoko\u015bci odpowiadaj\u0105cej otrzymanej liczbie z portu szeregowego. Funkcja rysuj\u0105ca prostok\u0105t to&nbsp;<strong>rect(x0, y0, szer, wys)<\/strong> &#8211; gdzie para (x0,y0) to lewy-dolny wierzcho\u0142ek rysowanego prostok\u0105ta, o wysoko\u015bci&nbsp;<em>wys&nbsp;<\/em>i szerko\u015bci&nbsp;<em>szer.<\/em> Ca\u0142y kod poni\u017cej:<\/p>\n<pre class=\"lang:arduino decode:true\">int xPos=0;\r\n\r\nvoid draw(){\r\n int w=getValue(); \r\n println(w);\r\n \r\n rect(xPos, height, 10, height-w);\r\n xPos=xPos+10;\r\n if (xPos&gt;=width){\r\n    xPos=0;\r\n    background(0);\r\n }\r\n}\r\n<\/pre>\n<p>Rysowanie jest bardzo prymitywne &#8211; dla ka\u017cdej otrzymanej i odczytanej liczby rysuj\u0119 prostok\u0105t od do\u0142u ekrany &#8211; czyli wsp\u00f3\u0142rz\u0119dna lewego-dolnego rogu naszego prostko\u0105ta to (xPos,hight). Dlaczego y-kowa wsp\u00f3\u0142rz\u0119dna wynosi height, czyli wysoko\u015b\u0107 okienka? Dzieje si\u0119 tak dlatego, \u017ce uk\u0142ad wsp\u00f3\u0142rz\u0119dnych w grafice processinga jest inny ni\u017c ten z lekcji matematyki\/fizyki ze szko\u0142y &#8211; o ile wsp\u00f3\u0142rz\u0119dne x-owe rosn\u0105 w prawo, to wsp\u00f3\u0142rz\u0119dne y-kowe rosn\u0105 z g\u00f3ry na d\u00f3\u0142, przy czym punkt (0,0) jest lewym, g\u00f3rnym rogiem okienka. Szeroko\u015b\u0107 prostok\u0105ta ustalam na 10 punkt\u00f3w, a wysoko\u015b\u0107 &#8211; odpowiednio do wczytanej liczby (u mnie nazwanej <strong>w<\/strong>). Dlatego wysoko\u015b\u0107 ta wynosi <strong>height &#8211; w<\/strong>. Po narysowaniu zwi\u0119kszam zmienn\u0105 xPos w programie o 10 pikseli, by kolejny prostok\u0105t rysowa\u0142 si\u0119 obok tego w\u0142a\u015bnie narysowanego. Kolejna linia kodu sprawdza, czy oby nie &#8222;wyszed\u0142em&#8221; z warto\u015bci\u0105 xPos poza szeroko\u015b\u0107 okienka (sprawdzam, czy xPos&gt;width) i je\u015bli tak jest, to&nbsp;zeruj\u0119 zmienn\u0105 xPos i czyszcz\u0119 ekran graficzny. Poni\u017cej wynik dzia\u0142ania programu:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-530\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/oscy2.png\" alt=\"oscy2\" width=\"801\" height=\"511\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/oscy2.png 801w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/oscy2-300x191.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/oscy2-768x490.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/01\/oscy2-800x511.png 800w\" sizes=\"auto, (max-width: 801px) 100vw, 801px\" \/><\/p>\n<p>Kr\u0119cimy potencjometrem w lewo i prawo i obserujemy wykres na ekranie komputera &#8211; w spos\u00f3b kontrolowany (potencjometr) wysy\u0142amy dane do preocessinga. Widzimy, \u017ce dane wi\u0119ksze ni\u017c 800 wylatuj\u0105 poza ekran &#8211; tym zajmiemy si\u0119 na kolejnych zaj\u0119ciach.<\/p>\n<h2>Ulepszenia:<\/h2>\n<p>Kilka rzeczy od razu przychodzi do g\u0142owy:<\/p>\n<ul>\n<li>kolor s\u0142upk\u00f3w &#8211; mo\u017ce niech zale\u017cy od rysowanej warto\u015bci? w ten spos\u00f3b b\u0119dziemy mie\u0107 kolorowe wykresiki, a kt\u00f3\u017c nie lubi kolor\u00f3w \ud83d\ude09<\/li>\n<li>mo\u017ce amiast prostok\u0105t\u00f3w rysowa\u0107 <strong>linie<\/strong>? Jak wiadomo &#8211; do rysowania linii w processingu potrzebujemy wsp\u00f3\u0142rz\u0119dnych pocz\u0105tka (x0,y0) i ko\u0144ca (x1,y2). Dlatego aby to zrealizwa\u0107, musimy pami\u0119ta\u0107 warto\u015b\u0107 poprzedniej danej, a po narysowaniu linii zamieni\u0107 t\u0105 warto\u015b\u0107 na aktualn\u0105.<\/li>\n<\/ul>\n<h2>Czego si\u0119 dzi\u015b nauczy\u0142e\u015b<\/h2>\n<ul>\n<li>nowa funkcja w Arduino: Serial.<strong>write()<\/strong><\/li>\n<li>dlaczego stosujemy Serial.write() a nie Serial.println()<\/li>\n<li>tworzenie (prostego) protoko\u0142u<\/li>\n<li>liczba int = 2 bajty, bajt &#8222;starszy&#8221; i &#8222;m\u0142odszy&#8221;, operacje na bitach<\/li>\n<li>processing: rysowanie prostok\u0105t\u00f3w<\/li>\n<\/ul>\n<h2>(ci\u0105gle) pozostaje kilka kwestii do rozwi\u0105zania:<\/h2>\n<ul>\n<li><del>poprawne wczytywanie liczb (z Arduino wysy\u0142amy 0..1023, a processing &#8222;widzi&#8221; tylko jakie\u015b ma\u0142e liczby, &lt;30?)<\/del><\/li>\n<li>skalowanie wykresu &#8211; czyli chcemy mie\u0107 tak, by liczby z zakresu 0..1023 zawsze mie\u015bci\u0142y si\u0119 na ekranie, a nie &#8222;wyskakiwa\u0142y&#8221; poza aktualn\u0105 wysoko\u015b\u0107 ekranu<\/li>\n<li>\u0142adniejsza grafika<\/li>\n<\/ul>\n<p>Zapraszam na kolejne zaj\u0119cia!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oscyloskop Kontynuujemy poznawanie processinga. Pod\u0105\u017camy w kierunku stworzenia aplikacji, kt\u00f3ra b\u0119dzie wy\u015bwietla\u0107 napi\u0119cia z port\u00f3w Arduino UNO (A0, A1..A5) &#8211; czyli taki softwarowy oscyloskop. Na poprzednich zaj\u0119ciach przekonali\u015bmy si\u0119, \u017ce wysy\u0142anie liczb z poziomu Arduino za pomoc\u0105 Serial.println(analogRead(A0)) kiepski pomys\u0142, bo ka\u017cda cyfra w wysy\u0142anej liczbie to 1 bajt, np. liczba &#8222;1017&#8221; to a\u017c 5 [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":530,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[116,109,115,113,42,110,111,114,112],"class_list":{"0":"post-526","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-flaga","9":"tag-grafika","10":"tag-kodowanie","11":"tag-mlodszy-bajt","12":"tag-processing","13":"tag-protokol","14":"tag-serial-write","15":"tag-starszy-bajt","16":"tag-write","18":"post-with-thumbnail","19":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=526"}],"version-history":[{"count":11,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/526\/revisions"}],"predecessor-version":[{"id":539,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/526\/revisions\/539"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/530"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}