Jekyll2021-08-09T09:08:30+00:00/feed.xmlPiotr Krzemiński - blogEverything what I fancy in my spare time.[POC] Wyświetlacz cieczowy2020-04-19T10:00:00+00:002020-04-19T10:00:00+00:00/2020/04/19/poc-wyswietlacz-cieczowy<p><img src="/assets/Liquid-1024x565.png" alt="Przykład" /></p>
<p>Wyobraźmy sobie, że mamy przezroczystą rurkę, którą możemy ukształtować w dowolny sposób, oraz porcje cieczy i
powietrza, które możemy dozować do rurki w precyzyjny sposób. Dzięki temu można tworzyć przeróżne wzory, które ukazują
się naszym oczom dopiero gdy ciecz i powietrze dotrą na swoje końcowe pozycje.</p>
<p>Właśnie ten pomysł chciałem sprawdzić w poniższym Proof of Concept. Napisałem symulator takiego wyświetlacza. Poniżej
dwie symulacje:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/UTgLZqh54_E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/K39X4eilpRA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>Kod symulatora dostępny jest na moim GitHubie:</p>
<p><a href="https://github.com/krzema12/PipeWithLiquidDisplay">https://github.com/krzema12/PipeWithLiquidDisplay</a></p>
<p>Może kiedyś uda się to zbudować :)</p>Syntezator dźwięku pisany funkcyjnie w Kotlinie2018-12-23T10:00:00+00:002018-12-23T10:00:00+00:00/2018/12/23/syntezator-dzwieku-pisany-funkcyjnie-w-kotlinie<p><img src="/assets/waveform.jpeg" alt="Fala" /></p>
<p>Taki projekt-piaskownica w zakresie programowania w Kotlinie i z wykorzystaniem stylu funkcyjnego, a przy okazji zabawa
z generowaniem fali dźwiękowej od podstaw.</p>
<p>Po więcej informacji zapraszam do repozytorium na GitHubie i pliku README:</p>
<p><a href="https://github.com/krzema12/fsynth">https://github.com/krzema12/fsynth</a></p>Symulacja grawitacji w terminalu opartym o technologie webowe2018-02-19T10:00:00+00:002018-02-19T10:00:00+00:00/2018/02/19/symulacja-grawitacji-w-terminalu-opartym-o-technologie-webowe<p><img src="/assets/HypergravityDemoScreenshot.png" alt="DemoScreenshot" /></p>
<p>Gdy prowadzisz właśnie wykład i wyświetlasz swój ekran setkom ludzi, ta sztuczka może na nowo zwrócić ich uwagę w Twoją
stronę :)</p>
<p>Framework <a href="https://electronjs.org/">Electron</a>, umożliwiający tworzenie aplikacji desktopowych z wykorzystaniem HTML, JS
i wszelkich innych technologii webowych, doczekał się kolejnego projektu w nim stworzonego: Hyper. Jest to emulator
terminala umożliwiający modyfikowanie i rozszerzanie w wyjątkowy sposób, a mianowicie w gruncie rzeczy mamy dostęp do
drzewa DOM tego co pokazuje główne okno, którego zawartość to po prostu dokument HTML. Gdy zdałem sobie z tego sprawę,
postanowiłem puścić wodze fantazji i już po kilku dniach mogłem bawić się tym:</p>
<p><img src="https://user-images.githubusercontent.com/3110813/35337934-d11d8afc-011c-11e8-9131-6c0bf23ec669.gif" alt="Animacja" /></p>
<p>Jest to wtyczka do wyżej wspomnianego terminala. Wykorzystałem silnik fizyki <a href="http://brm.io/matter-js/">Matter.js</a> by
policzyć kolizje. Wydajność jest akceptowalna – przy mało skomplikowanej zawartości terminala animacja jest płynna,
dopiero przy wielu drobnych elementach widać wyraźnie zacinanie. Kod nie jest jeszcze zoptymalizowany pod wydajność,
więc zdecydowanie jest to obszar do rozwoju :)</p>
<p>Plugin nazywa się <strong>hypergravity</strong> i każdy może go zainstalować w swoim terminalu ponieważ jest
<a href="https://www.npmjs.com/package/hypergravity">dostępny w npm</a>. Zapraszam również do zajrzenia do kodu i być może
dorzucenia czegoś od siebie? Repo na GitHubie:</p>
<p><a href="https://github.com/krzema12/hypergravity">https://github.com/krzema12/hypergravity</a></p>Echo LED Simulator2016-12-16T10:00:00+00:002016-12-16T10:00:00+00:00/2016/12/16/echo-led-simulator<p><img src="/assets/Rainbow.gif" alt="Animacja" /></p>
<p>Co by było gdyby… <a href="https://www.youtube.com/watch?v=KkOCeAtKHIc">Amazon Echo</a>, oprócz kilku standardowych animacji,
udostępniało możliwość sterowania jego LED-ami w dowolny sposób? Można puścić wodze fantazji i zaprogramować ciekawe
animacje za pomocą tego małego frameworka.</p>
<p>Kto wie, może twórcy Echo kiedyś udostępnią taką możliwość i ten prosty proof of concept stanie się emulatorem
rzeczywistego urządzenia.</p>
<p>Projekt zrobiony dosłownie w weekend, w nagłym przypływie wolnego czasu i z chęcią poćwiczenia AngularJS i Less
(preprocesora CSS). Najbardziej dumny jestem paradoksalnie ze kodu w Less, w którym udało mi się w ciekawy,
parametryczny sposób opisać
<a href="https://github.com/krzema12/EchoLedSimulator/blob/master/styles.less#L83-L126">rozmieszczenie diód</a> oraz z ogólnego,
dość realnego wyglądu symulatora, co jest możliwe dzięki zastosowaniu masek i odpowiedniego trybu mieszania kolorów
(<em>blendingu</em>).</p>
<p>Projekt na GitHubie: <a href="https://github.com/krzema12/EchoLedSimulator">https://github.com/krzema12/EchoLedSimulator</a></p>Neon Plot czyli rysowanie funkcji w Pythonie2015-02-20T10:00:00+00:002015-02-20T10:00:00+00:00/2015/02/20/neon-plot-czyli-rysowanie-funkcji-w-pythonie<p><img src="/assets/Neon-Plot-1.0-1024x626.png" alt="Zrzut ekranu" /></p>
<p>Aplikacja pozwala wyrysować w zasadzie dowolną funkcję jednej zmiennej, jeśli da się ją wyrazić w Pythonie. Projekt
uczelniany z potencjałem na naprawdę ciekawą i użyteczną aplikację.</p>
<p>W zasadzie już w tym momencie aplikacja spełnia swoje zadanie – przewidziana funkcjonalność działa całkowicie. Siła
programu tkwi w fakcie iż wzory podawanych funkcji należy wyrażać w skryptowym języku Python. Język ten udostępnia
pewien mechanizm, dzięki któremu można obliczać wartość wyrażeń w Pythonie podczas działania programu. W tradycyjnych
językach kompilowanych (np. C), aby osiągnąć identyczny efekt (podawanie funkcji w C), należałoby wbudować w program
kompilator. Python dzięki swej skryptowej naturze udostępnia nam taki mechanizm na „dzień dobry”.</p>
<h1 id="opisywanie-funkcji--podstawy">Opisywanie funkcji – podstawy</h1>
<p>I tak na przykład proste funkcje matematyczne typu <em>f(x) = 2x + 8</em> w programie należy podać w identyczny sposób,
pamiętając jednak o niejawnym mnożeniu 2 i x (Python nie zna takiego naturalnego zapisu – trzeba mu jasno podać, że tam
jest mnożenie). A więc będzie to</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2*x + 8
</code></pre></div></div>
<p>Mamy również dostęp do pełnej biblioteki matematycznej „math”, która zawiera chociażby funkcje trygonometryczne. Ciekawą
opcją jaką dostajemy dzięki Pythonowi jest umieszczanie we wzorze funkcji instrukcji warunkowych czy też prostych pętli.
Instrukcje warunkowe pozwalają nam na określenie <em>przedziałami</em> jak wygląda dana funkcja, a więc przykładowo funkcja
pokazana na powyższym zrzucie ekranu w kolorze czerwonym jest opisana za pomocą kodu</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sin(x) if x < 0 else (x if x < 3 else 3)
</code></pre></div></div>
<p>Na pierwszy rzut oka ciężko się połapać co się dzieje ponieważ temu zapisowi daleko do zapisu matematycznego typu
<em>„funkcja1 gdy x należy do przedziału1, funkcja2 gdy x należy do przedziału 2”</em> itd.. Należy się przyzwyczaić do
nietypowej wersji instrukcji warunkowej, która wygląda tak: co_jeśli_prawda <em>if</em> warunek <em>else</em> co_jeśli_fałsz.</p>
<h1 id="poruszanie-się-po-wykresie">Poruszanie się po wykresie</h1>
<ul>
<li><strong>poruszanie kursorem przy wciśniętym lewym klawiszu myszki</strong> – zmiana zakresu wyświetlanych wartości na obu osiach,
czyli po prostu intuicyjne przemieszczanie się w poziomie i w pionie wykresu,</li>
<li><strong>rolka myszki</strong> – przybliżanie i oddalanie jednocześnie obu osi,</li>
<li><strong>rolka myszki przy przytrzymanym lewym klawiszu myszki</strong> – przybliżanie i oddalanie na osi Y,</li>
<li><strong>rolka myszki przy przytrzymanym prawym klawiszu myszki</strong> – przybliżanie i oddalanie na osi X.</li>
</ul>
<p>Program ma naprawdę ogromne możliwości, a wiele z nich zawdzięcza Pythonowi. Jeżeli chcesz go wypróbować lub pomóc przy
rozwijaniu, zapraszam do repozytorium:</p>
<p><a href="https://github.com/krzema12/Neon-Plot">https://github.com/krzema12/Neon-Plot</a></p>Enova Minisumo2014-12-26T10:00:00+00:002014-12-26T10:00:00+00:00/2014/12/26/enova-minisumo<p><img src="/assets/enova-1024x768.png" alt="Enova" /></p>
<p>Wyczerpujący opis robota turniejowego, którego zbudowałem wraz z kolegami z Magnat Cyber Forge Team, czyli z mechanikiem
Mateuszem Piotrzkowskim i elektronikiem Szymonem Zagórnikiem. Moja działka to oprogramowanie.</p>
<h1 id="koncepcja-i-napęd-robota">Koncepcja i napęd robota</h1>
<p>Panujący obecnie w robotach sumo trend skłania do wyboru konstrukcji z dwoma kołami napędowymi. Roboty o takiej
strukturze napędu są tanie w budowie, a przy tym zapewniają dobre przyleganie krawędzi tnącej ostrza do podłoża.
Problemem w ich przypadku jest nieoptymalne przeniesienie ciężaru robota na podłoże oraz duży moment bezwładności
robota.</p>
<p>Konstrukcja z czterema kołami napędowymi jest mało popularna lecz rozwiązuje wiele problemów robotów wyposażonych tylko
w dwa koła. Pierwszą zaletą jest możliwość zapewnienia przeniesienia prawie całego ciężaru robota przez opony. Kolejną
zaletą jest przesunięcie środka obrotu robota do przodu oraz łatwość wpadania w poślizg robotem. Zalety te są
nieznaczące w obliczu problemów z zamocowanym nieruchomo ostrzem. W przypadku gdy koła stanowią trzy niezbędne punkty
podparcia bardzo trudno jest zamocować ostrze z taką dokładnością aby przylegało do podłoża.</p>
<p>Zdecydowaliśmy się zaryzykować. Wybór padł na konstrukcję z czterema kołami oraz ruchome mocowanie ostrza – tak aby
połączyć zalety struktur napędu z dwoma i czterema kołami.</p>
<p>Szukając silników napędu kół robota wybór ograniczyliśmy do 3 firm oferujących jakościowo najlepsze mikrosilniki
elektryczne na świecie – firm Maxon, Faulhaber i Portescap. Głównym ograniczeniem determinującym wybór silników do
robota minisumo jest ich maksymalna długość. Zdecydowaliśmy że każde z kół będzie napędzane niezależnie, więc długość
silnika wraz z przekładnią i enkoderem nie mogła przekroczyć 50 mm. Po przejrzeniu ofert wymienionych firm okazało się
że najmocniejszą konfiguracją o wymaganych wymiarach są silniki Faulhaber 1717 006 SR wraz z przekładnią 16/7 14:1 oraz
enkoderami IE2. Silniki te są marginalnie mocniejsze od popularnie stosowanych mikrosilników firmy Pololu, lecz mają
wielokrotnie większą żywotność. Zdarzały nam się sytuacje całkowitego zatrzymania wszystkich 4 silników na regulaminowe
3 minuty walki a silniki dalej pracują jak nowe.</p>
<h1 id="mechanika">Mechanika</h1>
<p>Konstrukcja robota składa się z 11 elementów. Siedem z nich zostało zoptymalizowanych pod kątem wykonania metodami
skrawania z aluminium, stali oraz węglika wolframu. Pozostałe 4 elementy zostały wydrukowane w technologii PolyJet.</p>
<p>Głównym elementem konstrukcyjnym jest płyta centralna. Przykręcone do niej są: tulejki mocujące silniki, element
mocujący ostrze, mocowania czujników robota przeciwnika oraz płytka drukowana sterująca robotem. Poniżej znajduje się
jeden z siedmiu rysunków wykonawczych tego elementu.</p>
<p><img src="/assets/EnovaPlytka.png" alt="Enova płytka" /></p>
<p>Element mocujący ostrze wykonano ze stali 40 HM utwardzonej do wartości 50 HRC. Dzięki temu wypolerowana powierzchnia
trudno się rysuje, a przeciwnicy gładko prześlizgują się na zamocowane wyżej rogi. Element ten posiada oś obrotu oraz
jest dociskany dwoma sprężynami – niezależnie z każdej strony. Sprawia to że ostrze dociśnięte jest równomiernie do
podłoża.</p>
<p>Ostrza które stosujemy są wykonane dla nas na zamówienie z węglika wolframu. Poniżej zdjęcie porównawcze tego ostrza ze
starą wersją zintegrowaną z mocowaniem do płyty centralnej.</p>
<p><img src="/assets/EnovaOstrze.jpg" alt="Enova ostrze" /></p>
<p>Felgi robota mają średnicę 24 mm. Posiadamy kilka kompletów z poliamidu i kilka z aluminium. Nie zauważyliśmy większej
różnicy w działaniu robota na różnych kompletach. Opony mają zewnętrzną średnicę 30 mm co daje grubość opon równą 3mm.</p>
<p>Przetestowaliśmy wiele materiałów na opony od firmy Smooth-On: Mold Star 15, Mold Star 30, Mold Max 20, Vyta Flex 10,
Vyta Flex 30, Vyta Flex 20. Ten ostatni wykazał najlepsze własności mechaniczne i jest przez nas aktualnie stosowany. Do
mieszanki dodajemy czarny barwnik, co zwiększa nieco nieco lepkość opon.</p>
<p>Waga robota waha się w zależności od zastosowanych felg i baterii od 460 do 495 gramów.</p>
<h1 id="elektronika">Elektronika</h1>
<p>Płyta sterowania robota to laminat FR4 o grubości 0.8mm. By spełnić wymagania związane z fizycznym rozmieszczeniem
układów na płytce, wykorzystaliśmy technologię produkcyjną umożliwiającą nam użycie ścieżek o szerokości 0.2mm oraz
rastrze podobnej szerokości. Znajdujące się na płytce układy zapewniają prawidłową pracę robota w trybie domyślnym tj.
walka na ringu (bez opcji wybierania taktyki i różnych trybów). Program robota wykonywany jest przez wcześniej
wspomniany 32-bitowy mikrokontroler ST32F107R8T6. Został on wybrany ze względu na aż cztery dostępne timery, które są
niezbędne do obsługi sygnałów z enkoderów silników. Na płycie sterowania znajdują sie również cztery mostki H, złącza od
czujników przeciwnika sześć transoptorów i dwa stabilizatory napięcia na 3.3V i 5V.</p>
<p><img src="/assets/EnovaPCB.png" alt="Enova PCB" /></p>
<p>Moduł interakcji użytkownika z robotem stanowi płytka drukowana umieszczona pod górną pokrywą robota. Jest ona w
znacznym stopniu mniej skomplikowana od płytki sterującej, niemiej jednak zawiera ona oddzielny mikroprocesor
STM32F103CVT. Obsługuje on wyświetlacz OLED o rozdzielczości 128×64 piksele poprzez interfejs SPI. Wykrywa on również
sygnał z zmieszczonego na płytce odbiornika podczerwieni oraz czterech przycisków stykowych. Dzięki przyciskom lub
bezprzewodowo z pomocą pilota RC5 użytkownik jest w stanie włączyć robota i wybrać algorytm pracy robota wyświetlany na
wyświetlaczu OLED. Komunikacja między górnym i dolnym mikroprocesorem odbywa się za pomocą interfejsu UART. Obie płytki
drukowane są połączone ze sobą taśmą FFC.</p>
<h1 id="zasilanie">Zasilanie</h1>
<p>Zastosowaliśmy dwukomorową baterię litowo-polimerową, która przy maksymalnym naładowaniu daje 8.4V. Nie wyróżnia się ona niczym szczególnym poza rozmiarem i kształtem, który jest idealnie dopasowany do konstrukcji robota i wewnętrznego rozmieszczenia elementów. Pojemność baterii to 900 mAh.</p>
<h1 id="czujniki">Czujniki</h1>
<p>Sensorami umożliwiającymi wykrywanie przeciwnika są popularne Sharpy GP2Y0D340K. Są to czujniki IR o zasięgu do 40 cm. Są cyfrowe, tj. wskazują pojawienie się obiektu lub jego brak. W środku sensora umieszczony jest układ cyfrowy kondycjonujący otrzymaną wiązkę podczerwieni oraz emitujący cyfrowy sygnał wykrycia do mikrokontrolera. Zasilany jest wyłącznie 5V więc sygnał Vout również jest na tym poziomie. Fakt ten nie komplikuje układu, gdyż użyty mikrokontroler ma wejścia kompatybilne z 5V mimo, że sam jest zasilany na 3.3V. W celu skutecznego wykrywania przeciwnika umieszczono aż 6 sensorów ułożonych w konfiguracji: 2 patrzące do przodu, 2 pod skosem 45 stopni oraz 2 patrzące na boki robota.</p>
<h1 id="jednostki-obliczeniowe">Jednostki obliczeniowe</h1>
<p>Dolna płytka zawiera główny procesor STM32F107 taktowany zegarem o częstotliwości 72 MHz. Zajmuje się przetwarzaniem informacji z czujników linii oraz przeciwnika, a także wysterowuje silniki korzystając z wbudowanych fabrycznie enkoderów magnetycznych i regulatora PID. Na górnej płytce znajduje się drugi procesor STM32F103 (również 72 MHz) zajmujący się obsługą wejścia/wyjścia czyli przycisków, wyświetlacza i wbudowanego odbiornika podczerwieni. Taki podział zadań pomiędzy dwa procesory wydaje się zbędny/przesadzony, lecz jest to pozostałość z pierwszych wersji robota.</p>
<h1 id="programowanie">Programowanie</h1>
<p>Do komunikacji z robotem użyto dwóch interfejsów: SWD (Serial Wire Debug) – szeregowa odmiana popularnego interfejsu JTAG. Umożliwia on programowanie oraz debugowanie mikrokontrolera sterującego. Do komunikacji między dwoma modułami (mikroprocesorami) oraz komunikacji komputer – mikroprocesor użyto interfejsu UART. Fizyczne połączenie robota z komputerem stanowi złącze MicroHDMI. Zostało ono wybrane ze względu na liczbę dostępnych pinów oferowane przez standard HDMI, trwałość mechaniczną i dostępność. Medium łączące wymienione interfejsy i komputer jest przejściowa płytka drukowana z standardowymi złączami dla programatorów. Rysunek poniżej przedstawia omawianą „przejściówkę”.</p>
<p><img src="/assets/EnovaPrzejsciowka.png" alt="Enova przejściówka" /></p>
<h1 id="oprogramowanie">Oprogramowanie</h1>
<p>Program dla robota pisany jest w języku C, z użyciem <em>Standard Peripheral Library</em>. W newralgicznych miejscach, aby
przyśpieszyć kod, wykonywane są operacje bezpośrednio na rejestrach – dzięki temu został zachowany balans między
czytelnością a wydajnością kodu. Jeśli chodzi o IDE, początkowo wykorzystywane było TrueSTUDIO Lite, lecz ze względu na
swój limit wielkości programu wynikowego (32 kB?) byliśmy zmuszeni do przejścia na CoIDE.</p>
<p><strong>Silniki</strong> wysterowywane są regulatorem PID, lecz tak naprawdę tylko człon P jest aktywny. Zaimplementowany został
pełny regulator PID, lecz okazało się, że na członie P robot zachowuje się dobrze i nie ma potrzby uaktywniać
pozostałych współczynników. Magnetyczne enkodery wbudowane w silnik dostarczają aż 7168 impulsów na obrót, co zapewnia
wysoką dokładność. Został wykorzystany wbudowany w STM32F107 interfejs dla enkoderów, dzięki czemu zliczanie impulsów
sygnału kwadraturowego odbywa się niejako „w osobnym wątku” – nie są potrzebne przerwania, wystarczy odczytywać
położenie koła ze wskazanego rejestru.</p>
<p>Dzięki <strong>czterem czujnikom linii</strong> z przodu, możemy obliczyć w przybliżeniu kąt pod jakim podjeżdżamy do linii.
Wystarczy prosta trygonometria – znamy odległość między czujnikami, znamy też dystans jaki robot przejechał od momentu
zobaczenia linii zewnętrznymi czujnikami do momentu zauważenia jej czujnikami wewnętrznymi. Znając kąt pomiędzy osią
robota a linią, możemy odpowiednio wykonać manewr wycofania się ku środkowi planszy.</p>
<p>Odbiornik podczerwieni na górnej płytce służy nam głównie do odbierania sygnałów z pilotów sędziowskich. Zastosowaliśmy
własny odbiornik przede wszystkim aby zaoszczędzić na miejscu, lecz również aby móc odbierać niestandardowe komendy dla
robota, np. wskazówki dotyczące taktyki. Dzięki aplikacji
<a href="https://play.google.com/store/apps/details?id=eu.mcft.sumoremote&hl=en_US&gl=US">Sumo Remote</a> możemy wysyłać w zasadzie
dowolny kod do robota.</p>
<p>Monochromatyczny wyświetlacz OLED o rozdzielczości 128×64 umieszczony na górnej płytce umożliwia wybór taktyk, a także
wyświetlanie informacji testowych. Nie posiada on wbudowanej czcionki, więc konieczna była implementacja wyświetlania
własnych czcionek/obrazków. Aby zaoszczędzić miejsce w pamięci Flash procesora, obrazy kompresowane są algorytmem RLE za
pomocą konwertera w postaci aplikacji na PC, po czym na robocie dekompresowane są w locie. Dzięki temu możemy użyć
dużych i czytelnych czcionek, czy też schematycznych ikon obrazujących manewry robota. Krótkie demo działania
wyświetlacza: <a href="https://www.youtube.com/watch?v=ttC8FtYK7fY">https://www.youtube.com/watch?v=ttC8FtYK7fY</a> (muzyka
niestety nie jest odtwarzana z robota :D).</p>
<p>Po więcej szczegółów zapraszamy na naszą stronę:
<a href="http://mcft.eu/_portal/page/knowledge_base/cat/6/Enova_MiniSumo#art_Enova_MiniSumo">http://mcft.eu/_portal/page/knowledge_base/cat/6/Enova_MiniSumo#art_Enova_MiniSumo</a>.</p>
<h1 id="osiągnięcia">Osiągnięcia</h1>
<h2 id="sezon-20132014">Sezon 2013/2014</h2>
<ul>
<li>
<ol>
<li>miejsce na Roboxy 2014 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Trójmiejskim Turnieju Robotów 2014 w kategorii Minisumo Deathmatch</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Trójmiejskim Turnieju Robotów 2014 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Cyberbot 2014 w kategorii Minisumo Deathmatch</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Cyberbot 2014 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robot-SM 2014 w Göteborgu w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Ogólnopolskich Zawodach Robotów ROBOmotion 2014 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Ogólnopolskich Zawodach Robotów ROBOmotion 2014 w kategorii Minisumo Deathmatch</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robotic Tournament 2014 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robotic Tournament 2014 w kategorii Minisumo Deathmatch</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Copernicus Robots’ Tournament 2014 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Copernicus Robots’ Tournament 2014 w kategorii Minisumo Deathmatch</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robotic Arena 2013 w kategorii Minisumo Debel (z robotem Mirror Mateusza Paczyńskiego)</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robotic Arena 2013 w kategorii Minisumo Enhanced</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robotic Arena 2013 w kategorii Minisumo Classic</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Sumo Challenge 2013 w kategorii Minisumo+</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Sumo Challenge 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce w konkursie robotów Gdańskich Dni Elektryki Młodych 2013 w kategorii Minisumo</li>
</ol>
</li>
</ul>
<h2 id="sezon-20122013">Sezon 2012/2013</h2>
<ul>
<li>
<ol>
<li>miejsce na Leś-Tech 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Roboxy 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na CybAiRBot 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robocomp 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na ROBOmotion 2013 w kategorii Minisumo Deathmatch</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na ROBOmotion 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Copernicus Robots Tournament 2013 w kategorii Minisumo Deathmatch</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Copernicus Robots Tournament 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Trójmiejskim Turnieju Robotów 2013 w kategorii Sumo²</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Trójmiejskim Turnieju Robotów 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robotic Tournament 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na RobotChallenge 2013 w Wiedniu w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robomaticon 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na T-BOT 2013 w kategorii Minisumo</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robotic Arena 2012 w kategorii Minisumo Enhanced</li>
</ol>
</li>
<li>
<ol>
<li>miejsce na Robotic Arena 2012 w kategorii Minisumo</li>
</ol>
</li>
</ul>
<p>Poniższy film prezentuje walki Enovy na konkursie RobotChallenge 2013 w Wiedniu:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/QZK6KX8qj-A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>A tutaj kompilacja walk Enovy z konkursu Robocomp 2013 w Krakowie:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/uHw2QkmQ-qI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>myTuner – strojenie gitary na smartfonie2014-11-14T10:00:00+00:002014-11-14T10:00:00+00:00/2014/11/14/mytuner-strojenie-gitary-na-smartfonie<p><img src="/assets/myTuner.png" alt="Aplikacja myTuner" /></p>
<p>Jeden z projektów, które zrealizowałem podczas kilkuletniej przygody z iPhonem i iOS-em. Projekt porzuciłem w połowie
2012 roku, ale co pewien czas sobie o nim przypominam. Bardzo możliwe, że kiedyś go wznowię.</p>
<p>Przede wszystkim dzięki temu projektowi nauczyłem się trochę programować w Objective-C i iOS SDK. Poza światem Apple te
narzędzia nie są wykorzystywane, ale mimo to cieszę się z tej „przygody”. Dzięki tym umiejętnościom przez przypadek
dostałem fajną pracę jako programista iOS, czyli niespodziewanie zacząłem zarabiać dzięki umiejętnościom i doświadczeniu
zdobytym w ramach hobby :) Ale dobra, wracamy do projektu…</p>
<h1 id="algorytm">Algorytm</h1>
<p>Jakie są wymagania algorytmu rozpoznawania wysokości dźwięku?</p>
<ul>
<li>
<p><strong>wejście</strong>: fala dźwiękowa wyłapana przez mikrofon w urządzeniu. Częstotliwość próbkowania rzędu 20-40 kHz. Po
eksperymentach doszedłem do wniosku, że 22050 Hz było wystarczające. Co do ilości próbek – czym ich więcej tym
dokładniejszy wynik dostaniemy, ale też obliczenia trwają dłużej. W zastosowanym algorytmie nagranie musi mieć długość
co najmniej 2 okresów najniższego wykrywalnego dźwięku (przyjąłem 36 Hz, D1 w strojeniu Drop D), co narzuca długość
wejścia ok. 55 ms, czyli ok. 1225 próbek,</p>
</li>
<li>
<p><strong>wyjście</strong>: częstotliwość granej nuty – to się chyba profesjonalnie nazywa <em>częstotliwość bazowa</em> – w hercach, czym
dokładniej tym lepiej. Dobrze też jeżeli algorytm potrafi stwierdzić jak bardzo dana częstotliwość wyłania się z
szumu, czyli jeżeli nie jest grana żadna nuta, powinien to wykryć jako szum i zwrócić niski współczynnik czystości
dźwięku (ang. <em>clarity</em>).</p>
</li>
</ul>
<p>Jest naprawdę sporo algorytmów, które to realizują, ale można wyłonić przynajmniej dwa podejścia/nurty, na których te
algorytmy bazują:</p>
<ul>
<li>
<p><strong>analiza w dziedzinie częstotliwości</strong> – szybka transformata Fouriera (FFT). Myśląc o szukaniu częstotliwości
bazowej, jest to pewnie pierwszy algorytm, który przyjdzie nam do głowy. Traktujemy sygnał za pomocą FFT, szukamy
peaków (maksimów funkcji) i jakimś cudownym algorytmem wybieramy peak, który odpowiada szukanej częstotliwości
bazowej. Niestety, w tym podejściu bardzo łatwo jest o błąd typu <em>wrong octave</em> – algorytm może zwrócić największy
peak odpowiadający częstotliwości, która według naszego ucha wcale nie jest częstotliwością bazową. Kolejną wadą
algorytmu jest niska dokładność dla niskich tonów. Wymowny zrzut ekranu z autorskiego narzędzia pomocniczego,
prezentujący opisane sytuacje:</p>
<p><img src="/assets/MyTunerAnalysis.png" alt="Analiza" /></p>
</li>
<li>
<p><strong>analiza w dziedzinie czasu</strong>, czyli wszelkiej maści funkcje autokorelacji. Ich główną zaletą jest z kolei wysoka
dokładność dla niskich tonów, więc z tego punktu widzenia stanowią dobrą alternatywę dla FFT.</p>
</li>
</ul>
<p>Ostatecznie zaimplementowałem algorytm wykorzystujący oba te podejścia. Doskonale się dopełniają – eliminują nawzajem
swoje wady. W praktyce najwięcej problemów sprawiło wybieranie odpowiedniego peaku. W wyniku wielu eksperymentów udało
mi się uzyskać algorytm, który jakoś z tym sobie radzi, lecz mimo to sprawa wymagałaby solidnego dopracowania.</p>
<h1 id="interfejs-użytkownika">Interfejs użytkownika</h1>
<p><img src="/assets/MyTunerGUI.png" alt="GUI" /></p>
<p>W całości zaprojektowany i wykonany przeze mnie. Postawiłem na prostotę i intuicyjność, jednocześnie dostarczając
użytkownikowi sporo informacji w efektowny sposób. Całość ma przypominać sprzętowy tuner. Nie wzorowałem się na żadnym
konkretnym modelu – narysowałem to co mi siedziało w wyobraźni.</p>
<p>Obszar ze wskazówką, zajmujący najwięcej miejsca, wskazuje odchylenie od „czystej” nuty od -50 do 50 centów i ma
przypominać dawne woltomierze czy amperomierze (na przykład
<a href="http://upload.wikimedia.org/wikipedia/commons/e/e3/Woltomierz_lab.jpg">taki</a>). Pola wyświetlające wartości liczbowe
stylizowane są na wyświetlacze ciekłokrystaliczne. Pod wyświetlaczami znajduje się sporo wolnego miejsca – miała się tam
znajdować wizualizacja danej nuty na gryfie gitary.</p>
<h1 id="program-w-akcji">Program w akcji</h1>
<iframe width="560" height="315" src="https://www.youtube.com/embed/M8IWh8Z-SrM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<h1 id="co-dalej">Co dalej?</h1>
<p>Możliwe, że kiedyś wznowię projekt i przepiszę tuner na Androida. Mam już gotowe sporo elementów interfejsu oraz kwestii
backendowych (algorytmy), więc nie powinno to wymagać dużo pracy.</p>Mandelbrot Explorer, czyli fraktal na nVidia CUDA2014-10-15T10:00:00+00:002014-10-15T10:00:00+00:00/2014/10/15/mandelbrot-na-nvidia-cuda<p><img src="/assets/Whole-GPU.png" alt="Screenshot" /></p>
<p>Generowanie fraktali jest dość kosztowne obliczeniowo, przez co praktycznie nie da się ich przeglądać w czasie
rzeczywistym na zwykłym PC-cie z wykorzystaniem zwykłego CPU. Od czego mamy jednak karty graficzne, które ostatnimi
czasy zyskały drugie oblicze – wydajnej platformy do obliczeń równoległych.</p>
<h1 id="co-to-ten-cały-mandelbrot">Co to ten cały <em>Mandelbrot</em>?</h1>
<p>Na początku ciekawostka – po niemiecku oznacza to chleb migdałowy. Jednak w tym przypadku nazwa pochodzi od francuskiego
matematyka <a href="http://pl.wikipedia.org/wiki/Beno%C3%AEt_Mandelbrot">Benoît Mandelbrot</a>, który wpadł na to co o czym zaraz
dowiesz się więcej.</p>
<p>Mianowicie, pan Mandelbrot zajmował się fraktalami. Tak naprawdę to on wymyślił to słowo. Fraktal to pewien obiekt,
który w sensie geometrycznym jest samopodobny – jakaś jego część jest podobna do całości. Z takimi obiektami spotykamy
się w życiu codziennym, spójrzmy na przykład na drzewa:</p>
<p><img src="/assets/fractal-tree2.jpg" alt="Fraktal" /></p>
<p>W tym wpisie chcę jednak pokazać trochę inny typ fraktala – istnieje on tylko w świecie matematycznym. Mowa o…</p>
<h1 id="zbiór-mandelbrota">Zbiór Mandelbrota</h1>
<p>Najpierw zaprezentuję wzór, za pomocą którego ten zbiór jest opisany:</p>
<p><img src="/assets/MandelbrotFormula.png" alt="Wzór" /></p>
<p>a teraz spójrzmy jaki obraz powstanie gdy w odpowiedni sposób zastosujemy ten wzór – już pewnie widziałaś/eś to w miniaturce do tego wpisu:</p>
<p><img src="/assets/Mandelbrot.png" alt="Mandelbrot" /></p>
<p>Fajne, co nie? Taki prosty wzór, z którego wychodzi taki skomplikowany kształt? Co to za czary? W telegraficznym
skrócie, to arytmetyka liczb zespolonych :)</p>
<p>Komputery idealnie nadają się do wizualizacji takiego czegoś, bowiem wymaga to bardzo wielu obliczeń. Nawet dla
współczesnego komputera, wygenerowanie takiego obrazka może zająć kilka sekund. A co jeśli chcielibyśmy płynnie i
swobodnie poruszać się po fraktalu? Z pomocą przychodzi nam…</p>
<h1 id="nvidia-cuda">nVidia CUDA</h1>
<p>W dużym uproszczeniu, pozwalają one na wykorzystanie kart graficznych do dowolnych obliczeń, nie tylko tych związanych z
grafiką. Karty graficzne mają w sobie setki lub nawet tysiące rdzeni, w kontraście do zwykłych procesorów z kilkoma
(obecnie ok. 8) rdzeniami. Oznacza to, że jeśli na zwykłym procesorze w jednej chwili możemy liczyć 8 pikseli takiego
obrazka, to na karcie graficznej w tym samym czasie może być liczone kilkaset razy więcej porcji fraktala.</p>
<p>Już w liceum – gdy ta technologia weszła na rynek – chciałem się tym pobawić, ale jakoś nie miałem wystarczającej wiedzy
i motywacji. Ostatnio pojawiła się okazja aby się z tym zapoznać, w postaci przedmiotu na uczelni i projektu do
wykonania właśnie w technologii CUDA.</p>
<p>Powstała więc ta oto aplikacja. Króki film prezentujący większość funkcji programu:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/9vycPjCRT_8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>Program działa zarówno pod Windowsem, jak i Linuxem. Do działania wymaga jedynie zainstalowanej biblioteki GTK+ 3.0.
Jeżeli chcesz sprawdzić jak będzie działał u Ciebie, tu możesz pobrać wersję wykonywalną:</p>
<p><a href="https://github.com/krzema12/CUDA-Mandelbrot-Explorer/releases/download/v1.0/ManExWindows-2014-11-04.zip">https://github.com/krzema12/CUDA-Mandelbrot-Explorer/releases/download/v1.0/ManExWindows-2014-11-04.zip</a></p>
<p>a kod projektu można zobaczyć tu:</p>
<p><a href="https://github.com/krzema12/CUDA-Mandelbrot-Explorer">https://github.com/krzema12/CUDA-Mandelbrot-Explorer</a></p>
<p>Jeżeli masz pomysł na ulepszenie programu, zapraszam do współpracy :)</p>Oliwskie ZOO i krótki test teleobiektywu2014-09-16T10:00:00+00:002014-09-16T10:00:00+00:00/2014/09/16/oliwskie-zoo-i-krotki-test-teleobiektywu<p><img src="/assets/Zoo19.jpg" alt="Teleobiektyw demo" /></p>
<p>Raz na 15 lat można wybrać się do miejskiego zoo, co jest idealnym pretekstem by przetestować sprzęt foto :) W tym
przypadku chciałem zobaczyć jak spisze się teleobiektyw Sigma 70-300mm F4-5.6.</p>
<p>Krótko scharakteryzuję sceny, które fotografowałem. Był środek dnia więc na pewno było sporo światła dziennego. Obiekty
były raczej daleko, nawet do 150-200 m. Przeważnie nie były one zbyt ruchome, co też nie jest bez znaczenia, szczególnie
przy autofokusie.</p>
<p>Na wstępie zaznaczę, że obiektyw jest w wersji bez stabilizacji obrazu. Był o kilkaset złotych tańszy od swojego
„stabilniejszego” brata (400 zł vs. 1000 zł). Jako że to mój pierwszy teleobiektyw, nie chciałem się na niego zbytnio
wykosztowywać. Chodziło mi raczej o obycie się z tego typu sprzętem. Z perspektywy czasu twierdzę, że stabilizacja w
teleobiektywie jest po prostu konieczna. Mamy tu do czynienia z takimi ogniskowymi, że drobny ruch aparatu bardzo silnie
wpływa na obraz docierający do matrycy. Można sobie radzić ustawiając krótkie czasy migawki i są one do zaakceptowania
chociażby w takich warunkach w jakich robiłem te zdjęcia. Są jednak sytuacje gdzie jednak musimy ten czas trochę
wydłużyć i ten obiektyw nie spisze się wtedy zbyt dobrze.</p>
<p>Znalazłem jednak zastosowanie gdzie czas migawki nie jest aż taki znaczący (możemy go wydłużyć), mamy też kontrolę nad
światłem. Chodzi o zdjęcia makro wykonywane w domu. Sprzedawałem kiedyś telefon i postanowiłem zrobić zdjęcia tym
obiektywem w trybie makro. Swoją drogą śmiesznie się z niego korzysta: należy skorzystać z odpowiedniego przełącznika na
obiektywie, po czym mechanicznie są odblokowywane ogniskowe od 200 do 300 mm. Powoduje to, że punkt ostrości znajduje
się około metr od obiektywu, co jest trochę sprzeczne z wyobrażeniem pstrykania zdjęć makro (bycie bardzo blisko
fotografowanego obiektu). Taka ogniskowa ma jednak swoją zaletę: perspektywa jest zupełnie inna niż gdybyśmy byli blisko
obiektu. Rzut zaczyna przypominać <a href="http://en.wikipedia.org/wiki/Orthographic_projection">ortogonalny</a>. Widać to po
bocznych ściankach telefonu – są praktycznie równoległe względem siebie. Przykładowe zdjęcie wyszło tak:</p>
<p><img src="/assets/Makro.jpg" alt="Makro" /></p>
<p><strong>Autofokus</strong> – jest po prostu słaby. Przestrzela (ustawia ostrość kilka metrów za blisko lub za daleko) i jest wolny.
Mam jeszcze małe doświadczenie ze sprzętem foto więc nie mam porównania z wieloma innymi sprzętami, ale tu ewidentnie
widać, że mogli to zrobić lepiej. Na szczęście większość zwierząt w zoo nie należy do ruchliwych (dystans do aparatu
pozostaje stały), więc bez pośpiechu mogłem ustawiać ostrość manualnie. Skorzystałem z opcji podglądu na żywo na ekranie
i jednocześnie przybliżyłem dziesięciokrotnie obraz. Mogłem wtedy ręcznie ustawić ostrość z bardzo wysoką dokładnością,
za pomocą pierścienia. Na obronę tego obiektywu napiszę, że znajoma ma bardzo podobny – ze stabilizacją i warstwami
antyrefleksowymi (?) – i tam autofokus działa podobno dobrze. Być może stabilizacja jakoś wpływa na ten mechanizm?</p>
<p>Na pochwałę zasługuje na pewno jakość wykonania obudowy obiektywu. Daje poczucie jakbyśmy mieli do czynienia ze sprzętem
z wyższej półki. Jest to czarny, matowy plastik, bardzo przyjemny w dotyku. Elementy są dobrze spasowane.</p>
<p>Podsumowując, jest to dobry sprzęt dla początkujących, na pierwsze spotkanie z teleobiektywem. Na pewno oferuje spore
możliwości z racji samego faktu bycia tele, ale ma też sporo wad co wyklucza jego zastosowanie w wielu sytuacjach. W
kontrolowanych warunkach można jednak przeboleć jego niedogodności. Nie żałuję tego zakupu – dzięki niemu przekonałem
się co powinien mieć mój następny teleobiektyw, jednocześnie nie wydając majątku.</p>
<p><img src="/assets/Zoo1.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo2.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo3.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo4.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo5.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo6.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo7.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo8.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo9.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo10.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo11.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo12.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo13.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo14.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo15.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo16.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo17.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo18.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo19.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo20.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo21.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo22.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo23.jpg" alt="Zdjęcie" /></p>
<p><img src="/assets/Zoo24.jpg" alt="Zdjęcie" /></p>Sumo Remote – aplikacja-pilot do robotów sumo2014-04-19T10:00:00+00:002014-04-19T10:00:00+00:00/2014/04/19/sumo-remote-aplikacja-pilot-do-robotow-sumo<p><img src="/assets/SumoRemoteCover.png" alt="SumoRemote okładka" /></p>
<p>Jest to aplikacja na Androida wykorzystująca wbudowany w urządzenie nadajnik podczerwieni do wydawania poleceń robotom
typu sumo. W skrócie: jeśli mamy odpowiednie urządzenie, aplikacja pozwala zaoszczędzić kilkadziesiąt euro za gotowego
pilota.</p>
<h1 id="skąd-się-wzięły-takie-piloty">Skąd się wzięły takie piloty?</h1>
<p>Od samego początku istnienia konkurencji typu sumo istniał podstawowy problem: <strong>falstarty</strong>. Każdy z dwóch uczestników
danej walki stawiał robota na planszy i na znak sędziego operatorzy wciskali na robocie przycisk mówiący aby od tej
chwili robot czekał <strong>5 sekund zanim zacznie walkę</strong>. Od razu widzimy, że ogromną rolę odgrywa tu czynnik ludzki – jedni
z nas mają szybszą reakcję od innych. Taki sposób startu zdecydowanie ułatwiał też oszustwo. Nikt na konkursie nie
zagląda do kodów robotów i nie sprawdza czy rzeczywiście robot czeka 5 sekund od momentu wciśnięcia przycisku.</p>
<p>Aby temu zaradzić, kilka lat temu powstał system startowy składający się z dwóch elementów: modułu podłączanego do
robota oraz pilota wysyłającego odpowiednie komendy do modułu.</p>
<p><img src="/assets/StartModule.jpg" alt="Moduł startowy" /></p>
<p>Pewnie pomyślicie: gdzie tu przewaga nad zwykłym przyciskiem startującym? Oba roboty biorące udział w walce muszą być
wyposażone w taki moduł, więc <strong>dostaną sygnał startu jednocześnie</strong>*. Na poniższym filmiku w 3:34 widać jak sędzia
uruchamia oba roboty jednym wciśnięciem przycisku na pilocie:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/XLYTW651Gek" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>Dodatkowe funkcje pilota to możliwość zatrzymania obu robotów oraz możliwość wskazania, do której planszy mają być
wysłane komendy. Do wyboru jest ok. 30 adresów plansz. Przykład: załóżmy, że na konkursie mamy dwie plansze gdzie
jednocześnie odbywają się walki. Diody na podczerwień mają zasięg nawet rzędu kilkunastu metrów, więc ryzyko zakłócania
się nawzajem jest bardzo duże. Aby temu zapobiec, wystarczy ustalić adresy plansz na np. 1 i 2, dzięki czemu roboty
przypisane do planszy nr 1 będą odbierały komunikaty przeznaczone tylko dla niej, i na odwrót.</p>
<h1 id="jaki-problem-rozwiązuje-moja-aplikacja">Jaki problem rozwiązuje moja aplikacja?</h1>
<p>Przede wszystkim służy ona jako potencjalnie tańsza alternatywa dla tradycyjnych, sprzętowych pilotów. Gotowe układy
kosztują na konkursach od 10 do 15 euro, a własnoręczne wykonanie takiego pilota również kosztuje, pochłania też nasz
cenny czas. Z mojej darmowej aplikacji możesz korzystać jeśli masz telefon z wbudowanym nadajnikiem podczerwieni (w
praktyce, na tę chwilę: wszystkie Samsungi do Androida 4.3).</p>
<p><img src="/assets/SumoRemoteMainScreen.png" alt="SumoRemote - główny ekran" /></p>
<p>Aplikację możesz pobrać tu:</p>
<p><a href="https://play.google.com/store/apps/details?id=eu.mcft.sumoremote">https://play.google.com/store/apps/details?id=eu.mcft.sumoremote</a></p>
<p>Zapraszam też na fanpage gdzie na bieżąco informuję o postępach i ewentualnych problemach jakie napotykam. Jeśli masz
pomysł na ciekawą funkcję do aplikacji, też możesz śmiało o tym napisać na tablicy – będzie można wspólnie podyskutować:</p>
<p><a href="https://www.facebook.com/pages/Sumo-Remote/243607875842316">https://www.facebook.com/pages/Sumo-Remote/243607875842316</a></p>
<p>Szczegółowy przegląd funkcji aplikacji:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/k6_vpwcsh7s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>