Trzykołowiec: Różnice pomiędzy wersjami
(→Połączenia elektryczne) |
|||
Linia 223: | Linia 223: | ||
Diagram obok przedstawia sposób połączenia silnika, źródła zasilania, sterownika i Maliny. | Diagram obok przedstawia sposób połączenia silnika, źródła zasilania, sterownika i Maliny. | ||
− | Zwróćmy uwagę, że w naszym prostym projekcie nie używamy wszystkich wyjść sterownika. Na diagramie niektóre z używanych wyjść są podpisane kolorem czerwonym, a inne jasnozielonym. Chodzi o to, żeby wyraźnie pokazać, że choć tego nie widać sterownik rozdziela cały układ na dwa zupełnie różne światy: | + | Zwróćmy uwagę, że w naszym prostym projekcie nie używamy wszystkich wyjść sterownika. |
+ | |||
+ | Na diagramie niektóre z używanych wyjść są podpisane kolorem czerwonym, a inne jasnozielonym. Chodzi o to, żeby wyraźnie pokazać, że choć tego nie widać sterownik rozdziela cały układ na dwa zupełnie różne światy: | ||
* <span style="color:red">'''świat silnika''' — tutaj krążą duże prądy (takie, które mogą spokojnie odparować cieńsze przewody!), pojawiają się wyższe napięcia (rzędu kilkunastu woltów), układy pracują z dużą mocą (silnik potrafi być nawet gorący)</span> | * <span style="color:red">'''świat silnika''' — tutaj krążą duże prądy (takie, które mogą spokojnie odparować cieńsze przewody!), pojawiają się wyższe napięcia (rzędu kilkunastu woltów), układy pracują z dużą mocą (silnik potrafi być nawet gorący)</span> | ||
* <span style="color:lightgreen">'''świat cyfrowy''' — tutaj nie ma wielkiego znaczenia moc sygnału, a tylko czy ustawiony jest stan '''1''' (ok. 3 wolty) czy stan '''0''' (ok. zero woltów); wszystkie elementy z tego świata spodziewają się maksymalnie kilku woltów napięcia, nie zostały zaprojektowane do obsługiwania takich wielkich obciążeń jak silniki i cały ten podsystem mógłby być zasilany z małej zegarkowej bateryjki przez miesiące, na tyle jest "delikatny"</span> | * <span style="color:lightgreen">'''świat cyfrowy''' — tutaj nie ma wielkiego znaczenia moc sygnału, a tylko czy ustawiony jest stan '''1''' (ok. 3 wolty) czy stan '''0''' (ok. zero woltów); wszystkie elementy z tego świata spodziewają się maksymalnie kilku woltów napięcia, nie zostały zaprojektowane do obsługiwania takich wielkich obciążeń jak silniki i cały ten podsystem mógłby być zasilany z małej zegarkowej bateryjki przez miesiące, na tyle jest "delikatny"</span> | ||
Linia 236: | Linia 238: | ||
<br clear=all> | <br clear=all> | ||
+ | |||
== Oprogramowanie == | == Oprogramowanie == | ||
Żeby móc się skupić na programowaniu konkretnych tras do obsługi silników użyjemy gotowego, prostego modułu pythona. Jego kod należy skopiować i zapisać w pliku <code>silniki.py</code> w podkatalogu <code>silniki</code>. Moduł zawiera kilka prostych funkcji, dzięki którym można wykonać automatycznie inicjowanie portów maliny, włączać/wyłączać silniki, wykonywać pojedynczny krok w zadanym kierunku, a nawet całe sekwencje kroków. Z jego użyciem zaprogramowanie trasy przejazdu sprowadza się do instrukcji po prostu dokąd jechać. | Żeby móc się skupić na programowaniu konkretnych tras do obsługi silników użyjemy gotowego, prostego modułu pythona. Jego kod należy skopiować i zapisać w pliku <code>silniki.py</code> w podkatalogu <code>silniki</code>. Moduł zawiera kilka prostych funkcji, dzięki którym można wykonać automatycznie inicjowanie portów maliny, włączać/wyłączać silniki, wykonywać pojedynczny krok w zadanym kierunku, a nawet całe sekwencje kroków. Z jego użyciem zaprogramowanie trasy przejazdu sprowadza się do instrukcji po prostu dokąd jechać. |
Wersja z 21:57, 1 wrz 2016
Projekt pierwszego programowalnego robota.
Do czego zmierzamy
Chodzi o to, żeby względnie małym nakładem pracy uzyskać robota, którego można łatwo zaprogramować. Dzięki temu bez zbędnych komplikacji będzie można rozpocząć realną zabawę w całkiem poważną robotykę. Robot będzie się składał z dwóch, oddzielnie sterowanych silników napędowych wyposażonych w koła, oraz trzeciego podpierającego. Możliwość sterowania obrotami każdego z kół z osobna pozwala zaprogramować dowolny kierunek jazdy i tworzyć dowolne trasy przejazdu. Podstawowe możliwości, uniwersalność i przez to przydatność takiego robota pokazuje poniższy film, gdzie projektanci z firmy Microsoft użyli dokładnie takiej konstrukcji w swoich projektach. Co więcej, tak samo jak my użyli Maliny jako "mózgu" robota.
Konstrukcja
Silnik
Do napędu kół użyjemy silnika krokowego o następujących parametrach:
- rozmair NEMA 14, czyli boki 35x35 mm, ponadto nasz silnik będzie miał 34 mm długości i oś wystającą na 20mm o średnicy 5mm
- waga 180g
- maksymalny moment obrotowy 120 mN/m (milinewtonów na metr)
- żeby wykonać pełny obrót silnik potrzebuje 200 kroków
- pobór prądu 750mA(miliamperów) przy napięciu zasilającym 4.35V
Zasadę działania silnika krokowego przedstawia animacja poniżej. Jak widać na zdjęciu rozebranego realnego silnika, praktyczna realizacja jest trochę inna (np. widać 8 cewek elektromagnesów na obwodzie, a nie 4 jak na schemacie). Jednak zasada pozostaje ta sama: włączamy prąd w kolejnych uzwojeniach powodując obracanie się wirnika. Zależnie od tego w jakiej kolejności włączamy cewki, silnik będzie się kręcił w lewo lub prawo. Dużo więcej magii w tym nie ma ;)
Co oznaczają podane parametry silnika?
Wymiary i masa
Z rozmiarów silnika zgodnego z normą NEMA 14 i jego masy widzimy, że choć silnik nie jest jakoś przerażająco wielki, to jest jednak całkiem solidnym kawałkiem metalu. Same dwa silniki napędowe będą ważyły 360g, a więc dodając jeszcze powerbank, możemy się spodziewać, że cały robot będzie ważył około 1kg. To oszacowanie przyda się przy projektowaniu podwozia. Dzięki niemu wiemy jaką mniej więcej powinno mieć wytrzymałość: nie musi wytrzymać stojącego na nim człowieka (nawet całkiem małego), ale nie może też być tak miękkie jak choćby karta bankomatowa.
Moment obrotowy 120 mN/m
Gdyby przeczytać tą liczbę brzmiałaby "sto dwadzieścia miliniutonów na metr". Pierwsza część to niewielka siła (okolice ciężaru odtwarzacza mp3). Ale o jaki metr chodzi?
O taki, jak gdyby do osi silnika przymocować metrowy patyk pod kątem prostym do osi (tak jak szprycha w kole roweru). Kiedy silnik pracowałby z całej siły wówczas koniec takiego metrowego patyka naciskałby na rękę z podaną siłą, lub jak kto woli wystarczyłoby delikatnie trzymać jego koniec, żeby silnik nie mógł się obracać.
Łatwo wyczuć intuicyjnie, że gdyby patyk był krótszy, wówczas trzeba by było użyć większej siły, żeby powstrzymać silnik przed obracaniem się. Kto nie wierzy niech spróbuje przytrzymać koło roweru za szprychę najpierw chwytając blisko opony, a potem bliżej środka. O razu widać, że o ile trzymanie przy oponie jakoś wychodzi, to bliżej środka palce są za słabe. Fizycy mówią, że jeśli skracamy ramię na które działa pewien moment obrotowy, to siła na końcu ramienia rośnie proporcjonalnie.
I to jest bardzo dobra wiadomość!"' Gdybyśmy mieli silnik pchający robota do przodu z siłą tylko 120mN moglibyśmy zapomnieć o jeździe po czymkolwiek mniej gładkim niż stół, a i to wątpliwe... Jeśli jednak skrócimy wymyślony metrowy patyk do połowy, siła na końcu wzrośnie proporcjonalnie do 240mN. Nadal szału nie ma, ale jest postęp! Gdybyśmy skrócili go do 1/10 metra, wówczas otrzymamy 120mN * 10 = 1200mN. Przypomnę, że mili oznacza jedną tysięczną. Czyli 1200mN to już całkiem ładne 1.2N.
No dobrze, ale przecież nie będziemy używać patyków, tylko koła... To nic nie zmienia! Wystarczy sobie wyobrazić, że nakładamy na oś jeden patyk za drugim dookoła osi (znów, tak jak szprychy w kole roweru). Jeśli nawkładalibyśmy ich odpowiednio dużo powstanie w końcu koło. Na tym polega geniusz wynalazku koła, którego ludzkość bardzo długo nie znała. Dzięki odsunięciu osi, na której skupiony jest ciężar od podłoża, możemy przesuwać masy ze znacznie mniejszym wysiłkiem, bo cały czas stosujemy dźwignię o takiej długości jak promień koła.
Teraz możemy wrócić do naszej skali, bo oczywiście nikt nie zamierzał(?) używać kół o metrowym promieniu.
Jeśli wyobrazimy sobie, że ktoś założył na osi kółko o średnicy 2cm, wówczas promień będzie miał tylko 1cm, a więc 1/100 metra. Silnik pracujący z maksymalną mocą ciągnąłby pojazd na takich kołach z siłą 120 * 100 = 12000mN, czyli 12 N. Z taką siłą naciska na rękę trzymane w niej 1,2 kg. Jeśli ktoś założyłby kółka o średnicy dwa razy większej (4cm) wówczas siła spadnie do 6N (~600g), a dla kółek o średnicy 6cm do około 4N (~400g).
Czy to dużo czy mało? Możemy łatwo oszacować co to oznacza wyliczając możliwe przyśpieszenia robota. Dla ułatwienia przyjmijmy, że cały będzie ważył około 1kg.
Przyśpieszenie podaje zupełnie prosty wzór, sprzed ponad 300 lat, pana Izaaka Newtona (czytaj niuton):
a = F / m
gdzie:
- F to siła wyrażona w, a jakże, w N (niutonach)
- m to masa, u nas 1kg
- a to przyśpieszenie jakiego należy się spodziewać w m/s²
Podstawiając dane dla kół o średnicy 6cm, które dają siłę pchającą 4N na jeden silnik, przy włączonym napędzie na oba koła mamy:
a = 2*4[N] / 1 kg = 8 [m/s²]
Jeśli porównamy to z przyśpieszeniem ziemskim, wynoszącym 9,81 [m/s²] widzimy, że pojazd mógłby przyśpieszać prawie tak szybko jak szybko rzeczy spadają w polu grawitacji Ziemi. Inaczej mówiąc potrzebowałby niecałych 3 sekund "do setki" ! Oczywiście to tylko oszacowanie, które podaje maksymalne przyśpieszenie. W praktyce będzie ono mniejsze. Wystarczy choćby zdać sobie sprawę z tego, że policzyliśmy siłę z jaką pojazd będzie napędzany, ale nie uwzględniliśmy siły tarcia, która będzie go spowalniać. Nawet jednak gdybyśmy spadli w okolice połowy tego przyśpieszenia nadal taki napęd wydaje się sensowny.
200 kroków na obrót
Silniki krokowe działają trochę inaczej niż zwykłe. W zwykłym wystarczy włączyć prąd i silnik się obraca. Silnikiem krokowym steruje się inaczej: podaje się odpowiednie impulsy, które powodują, że oś silnika obraca się o pewien kąt. Jak daleko obraca się oś w jednym kroku definiuje właśnie liczba kroków potrzebnych do pełnego obrotu. W przypadku naszego silnika będziemy musieli podać 200 impulsów żeby koło napędowe wykonało jeden obrót. Dzięki takiej dokładności możliwe będzie bardzo precyzyjne sterowanie odległością jaką przemierza każde koło, a przez to będzie można precyzyjnie skręcać.
Parametry elektryczne
Jeśli chodzi o napięcie pracy silnika, wynoszące 4.35V, jest ono nieco mniejsze niż 5V, którego używają porty USB, powerbank i którym zasilana jest Malina (przy czym część cyfrowa Maliny działa przy napięciach 0 i 3.3V).
Możemy jednak przyjąć, że nieco wyższe napięcie zasilania jakiego użyjemy, nie będzie groźne dla uzwojeń silnika, a może poprawić prędkość z jaką silnik będzie wykonywał kolejne kroki. W normalnej sytuacji, kiedy silniki jest montowany w większej maszynie unikalibyśmy takiego "podkręcania", ale w naszym przypadku silnik będzie pracował w otwartej przestrzeni, i pewien nadmiar wydzielanego ciepła jest dopuszczalny.
Znaczenie poboru prądu wyjaśnimy przy okazji rozważań o baterii.
Bateria
Pobór prądu przez jeden silnik, który wynosi 750mA (miliamperów) oznacza, że gdybyśmy mieli baterię o pojemności 750mAh (miliamperogodzin) pojedynczy silnik mógłby działać przez godzinę. Ponieważ mamy dwa silniki i jeszcze Malinę, która również zużywa prąd, możemy oczekiwać zużycia na poziomie około 1800mAh.
Teoretycznie więc powerbank o takiej pojemności mógłby zasilać robota przez godzinę. W praktyce producenci obiecują gruszki na wierzbie, i lepiej przyjąć co najmniej 2500mA potrzebnej pojemności na godzinę pracy robota.
Powerbanki zwykle ładują się godzinami -- nie rzadko instrukcja podaje 8-10 godzin. Ponieważ byłoby niezbyt wygodnie po każdej godzinie testów czekać 8 godzin do kolejnego naładowania baterii, lepiej zastosować akumulator o większej pojemności niż tylko godzina użytkowania. Ostatecznie więc pobór prądu mówi nam tyle, że przydałby się akumulator o pojemności co najmniej 5000mAh.
Ponadto musimy uwzględnić maksymalne możliwe obciążenie prądowe. Cóż z tego, że mielibyśmy pełny basen wody, jeśli dałoby się z niego czerpać tylko po jednej kropli na godzinę? Musimy więc wybrać powerbank, który będzie miał też odpowiednią wydajność.
Dwa silniki zużywają 750mA * 2 = 1500mA. Do tego prądu trzeba dodać też Malinę, czyli co najmniej 500mA. Powerbank musi znieść obciążenie 2000mA, czyli 2A.
Projekt podwozia
Wykonanie podwozia jest zadaniem do wykonania samodzielnie. Wszystkie chwyty dozwolone! Jeśli masz natchnienie, żeby ulepić podwozie z taśmy klejącej i gumy do żucia proszę bardzo. Jest tylko jedno ograniczenie -- byłoby fajnie gdyby robot zbudowany w oparciu o dostarczone części i zaprojektowane podwozie jeździł! Żeby to ograniczenie dokładniej sprecyzować umówmy się, że:
Jeśli ktoś chciałby zaprojektować podwozie do wydruku na drukarce 3D (to jest możliwa opcja, nie wymaganie!) proponuję wykorzystanie programu FreeCAD. Dla ułatwienia poniżej plik wstępnie przygotowanego projektu robota. Zawiera podstawowe elementy zgodne z ich rozmiarami:
- płytkę Maliny
- silniki
- powerbank
Pozostaje tylko zająć się samym podwoziem i rozmieszczeniem wyżej wymienionych elementów na nim.
Przykładowe rozwiązanie mechanicznej części robota wykonanej na drukarce 3D przedstawiają zdjęcia poniżej.
Elektronika
Opis wyprowadzeń łącza 40 pinowego
Piny złącza 40 pinowego liczy się zaczynając od kwadratowego (numer 1), a dalej "zygzakiem". Poniżej zastosowane są następujące oznaczenia:
- pogrubiona czcionka — zwykłe piny elektryczne, nie działające w logice cyfrowej (masa, różne napięcia)
- zwykła czcionka — piny cyfrowe gdzie ustawienie 0 daje napięcie 0V, a wysłanie 1 daje napięcie nieco ponad 3V
- czerwona czcionka — napięcia 5V oraz 3.3V wyprowadzone na łączu mogą się przydać do zasilania drobnych urządzeń; jednocześnie napięcie 3.3V może również pełnić rolę sygnału wejściowego 1 ponieważ piny cyfrowe właśnie takiego napięcia spodziewają się jako logicznej jedynki; możliwe jest więc połączenie kablem wyjścia 3.3V z którymś pinem logicznym żeby zasymulować podanie sygnału 1; jednak napięcie 5V byłoby za wysokie i mogłoby uszkodzić procesor; właśnie dlatego jest zaznaczone na czerwono, żeby go nie używać do łączenia z pinami cyfrowymi
- jakiś opis — te piny mają ustawioną domyślną funkcję w Raspbianie; większość można przedefiniować, ale ze względu na pełnioną funkcję nie wiadomo jaką wartość będzie miał pin w czasie włączania maliny (Co jest ważne jeśli do pinu podpięte jest jakieś urządzenie i nie powinno otrzymywać przypadkowych sygnałów w trakcie wczytywania systemu!); ponadto próba zmiany działania pinu generuje ostrzeżenie i na przykład polecenie
gpio.setup(8, gpio.OUT)
wyświetli komunikat, że pin był już używany; - brak opisu — piny nie wykonują żadnej specjalnej funkcji w domyślnej konfiguracji maliny; po włączeniu są ustawione na 0; można ich dowolnie używać
napięcie 3.3V | 1 | 2 | napięcie 5V |
SDA (dane I²C) Rezystor podciągający 1.8k do 3.3V! | 3 | 4 | napięcie 5V |
SCL (taktowanie I²C) Rezystor podciągający 1.8k do 3.3V! | 5 | 6 | MASA |
GPCLK0 (sygnał zegara ogólnego przeznaczenia nr 0) | 7 | 8 | linia TXD (transmisji danych) łącza UART0 (na tym łączu działa konsola systemu Rasbian) |
MASA | 9 | 10 | linia RXD (odbioru danych) łącza UART0 (na tym łączu działa konsola systemu Rasbian) |
11 | 12 | PWM0/BCM18 (fala prostokątna o programowalnym wypełnieniu z generatora 0) | |
13 | 14 | MASA | |
15 | 16 | ||
napięcie 3.3V | 17 | 18 | |
MOSI/BCM10 (urządzenie nadrzędne do podrzędnego na łączu SPI) | 19 | 20 | MASA |
MISO (urządzenie podrzędne do nadrzędnego na łączu SPI) | 21 | 22 | |
SCLK/BCM11 (taktowanie łącza SPI) | 23 | 24 | CE0 (linia 0 wyboru chipu łącza SLI) |
MASA | 25 | 26 | CE1 (linia 1 wyboru chipu łącza SLI) |
ID_SC (dane łącza I²C do pamięci EEPROM) | 27 | 28 | ID_SC (taktowanie łącza I²C do pamięci EEPROM) |
29 | 30 | MASA | |
31 | 32 | PWM0/BCM12 | |
PWM1/BCM13 | 33 | 34 | MASA |
MISO (urządzenie podrzędne do nadrzędnego na łączu SPI) | 35 | 36 | |
37 | 38 | MOSI/BCM20 (urządzenie nadrzędne do podrzędnego na łączu SPI) | |
MASA | 39 | 40 | SCLK/BCM21 (taktowanie łącza SPI) |
Połączenia elektryczne
Diagram obok przedstawia sposób połączenia silnika, źródła zasilania, sterownika i Maliny.
Zwróćmy uwagę, że w naszym prostym projekcie nie używamy wszystkich wyjść sterownika.
Na diagramie niektóre z używanych wyjść są podpisane kolorem czerwonym, a inne jasnozielonym. Chodzi o to, żeby wyraźnie pokazać, że choć tego nie widać sterownik rozdziela cały układ na dwa zupełnie różne światy:
- świat silnika — tutaj krążą duże prądy (takie, które mogą spokojnie odparować cieńsze przewody!), pojawiają się wyższe napięcia (rzędu kilkunastu woltów), układy pracują z dużą mocą (silnik potrafi być nawet gorący)
- świat cyfrowy — tutaj nie ma wielkiego znaczenia moc sygnału, a tylko czy ustawiony jest stan 1 (ok. 3 wolty) czy stan 0 (ok. zero woltów); wszystkie elementy z tego świata spodziewają się maksymalnie kilku woltów napięcia, nie zostały zaprojektowane do obsługiwania takich wielkich obciążeń jak silniki i cały ten podsystem mógłby być zasilany z małej zegarkowej bateryjki przez miesiące, na tyle jest "delikatny"
Ważne jest, żeby rozróżniać te dwa światy! Jeśli ktoś spróbowałby podłączyć silnik do tego samego pinu, który jest połączony z Maliną prawdopodobnie spaliłby i sterownik i komputer (choć Malina ma pewne zabezpieczenia przed takim brutalnym traktowaniem i czasem zdąży się wyłączyć w porę).
Ale jest też odwrotnie. W sprzyjających warunkach "delikatna" część cyfrowa potrafi "zamordować" część dużych mocy sterującą silnikami. Jak może do tego dojść? W dokładnie taki sam sposób, jak delikatne, ale nieprzemyślane ruchy kierownicą mogą zniszczyć cały samochód. Chodzi o to, że część cyfrowa steruje systemem, który ma już jakąś niemałą energię (silnik, koła). W przypadku projektu z diodą, jeśli kod zawierał jakąś nie do końca przemyślaną instrukcję, najgorszym co mogło się stać był brak światła lub świecenie diody w nieoczekiwany sposób. Nic ponad to. Tymczasem tutaj robot może niespodziewanie ruszyć, skręcić, cofnąć się, i tylko aktualne otoczenie decyduje o tym jak to się skończy (coś do picia, klawiatura i szalony robot to całkiem skuteczny przepis na większe wydatki). Z tego powodu najlepiej na początku ustawić robota z kołami napędowymi w powietrzu (albo bez kół), żeby odebrać mu możliwość niekontrolowanego ruszania.
Trzeba też uwzględnić specyficzną cechę samego sterownika. Jego instrukcja mówi o tym, że nie wolno podłączać/odłączać przewodów silnika kiedy zasilanie silnika jest włączone (podany sygnał 1 na wyjściu SLP). Ponieważ sygnał na wyjściu SLP podaje Malina najprościej zapamiętać, że jeśli potrzebujemy odłączyć sterownik to zawsze najpierw odłączamy Malinę (czyli 8 punktową wtyczkę, która będzie po lewej stronie na diagramie), a potem silniki (czyli wtyczka po prawej, pin "masy" Maliny znajdujący się na dole tej wtyczki nie jest problemem). I w odwrotnej kolejności podłączamy sterownik, czyli najpierw silniki, potem Malinę. W ten sposób mamy zawsze pewność, że przewody silników będą wyłączane/włączane przy wyłączonym zasilaniu.
I jeszcze jedno wyjaśnienie dlaczego wyjście M0 jest podłączone do masy. Chodzi o to, że zastosowany sterownik obsługuje funkcję bardzo przydatną w bardziej precyzyjnych urządzeniach. Potrafi mianowicie wykonywać tylko ułamek kroku zamiast od razu cały. Typowy silnik krokowy (taki jak nasz) wykonuje 200 kroków na pełny obrót. Ten sterownik potrafi podzielić jeden krok nawet na 32 drobniejsze, co daje aż 6400 kroków na jeden pełny obrót! W bardziej precyzyjnych urządzeniach (np. drukarce 3D) ta opcja może być przydatna, ale nam nie jest potrzebna. O tym jak dzielony jest krok decydują piny M0 i M1 sterownika. Jeśli M1 pozostawimy niepodłączony, a na M0 podamy logiczne 0 (czyli zero woltów, a więc właśnie masę) wówczas sterownik nie będzie dzielił kroku i jeden impuls na wejściu STEP będzie powodował wykonanie 1/200 obrotu przez silnik. Dzięki temu wystarczy posłanie tylko 200 impulsów żeby obrócić koło jeden raz.
Oprogramowanie
Żeby móc się skupić na programowaniu konkretnych tras do obsługi silników użyjemy gotowego, prostego modułu pythona. Jego kod należy skopiować i zapisać w pliku silniki.py
w podkatalogu silniki
. Moduł zawiera kilka prostych funkcji, dzięki którym można wykonać automatycznie inicjowanie portów maliny, włączać/wyłączać silniki, wykonywać pojedynczny krok w zadanym kierunku, a nawet całe sekwencje kroków. Z jego użyciem zaprogramowanie trasy przejazdu sprowadza się do instrukcji po prostu dokąd jechać.
(tu będzie kod modułu i przykład użycia)