Menu Zamknij

Przycisk teleturniejowy

Cel

Zapoznanie z zewnętrznymi wyprowadzeniami złącza stykowego micro:bita, nauka wykorzystania wejść cyfrowych modułu.

Wymagania

  • moduł micro:bit z akcesoriami,
  • tektura, folia aluminiowa, klej, przewody zakończone krokodylkami lub:
  • gotowe przyciski monostabilne.

Złącze stykowe

Rysunek 1. Złącze stykowe micro:bita

Oprócz wykorzystywanych już poprzednio na stałe wbudowanych układów wejścia/wyjścia można podłączać zewnętrzne, dedykowane dla micro:bita moduły. Powstaje jednak problem, co zrobić z czujnikami, przyciskami, wyświetlaczami, serwomechanizmami itp. nieprzystosowanymi do złącza stykowego micro:bita. Tego typu dodatki mogą także być podłączane do micro:bita, z tą różnicą, że trzeba będzie dokonać takiego podłączenia samodzielnie. Micro:bit posiada, aż 19 wyprowadzonych na złącze wejść/wyjść ogólnego przeznaczenia (z ang. GPIO – General-Purpose Input/Output) oznaczonych P0 do P16 oraz P19 i P20 (rysunek 1). Brak wejścia/wyjścia P17 i P18 wynika z zachowania zgodności numeracji wejść z wyprowadzeniami fizycznymi, a na pinach 17 i 18 znajduje się napięcie zasilania układu +3,3 V. Niektóre piny złącza są szersze (0, 1, 2, 3V, GND) i wyposażone w otwór 4 mm. Przystosowane są tym samym do przyłączenia krokodylka lub wtyku bananowego. Przypięcie wprost do tak skonstruowanego złącza niesie ryzyko zwarcia z sąsiadującymi pinami, dlatego 3V i GND otoczone są identycznymi wyprowadzeniami, a 0, 1 i 2 są wysokorezystancyjne (objaśnienie dalej). Dostęp bezpośredni do innych pinów jest, ze względu na ich rozmiar, niemożliwy bez tak zwanych ekspanderów wyprowadzeń, to znaczy modułów rozszerzeń, których jedynym celem jest ułatwienie dostępu do wszystkich lub wybranych pinów. Tego typu dodatki nie wymagają wsparcia programowego.

Wszystkie GPIO mogą być cyfrowymi (włącz/wyłącz) wejściami lub wyjściami. Zależy to od ustaleń na poziomie pisanego programu. Sześć z nich – P0, P1, P2, P3, P4 i P10 – może także pełnić rolę wejść analogowych. Wbudowany przetwornik A/D ma rozdzielczość 10 bitów dla zakresu napięć 0 V – 3,3 V.

Ilość GPIO może wydawać się duża, ale tak naprawdę do wykorzystania, bez rezygnowania z wbudowanej funkcjonalności, są tylko P0, P1 i P2 na szerokich pinach oraz P8 i P16 na wąskich. Inne piny mają już wstępnie przypisane role w układzie i aby z nich skorzystać, należy mieć pełną świadomość konsekwencji podejmowanych działań.

Piny P3, P4, P6, P7, P9 i P10 są używane do sterowania wbudowaną matrycą LED 5 × 5. Jeżeli nie korzystamy z wyświetlacza, możemy używać tych pinów, mając jednak na uwadze, że fizycznie są obciążone diodami i ustalającymi prąd rezystorami. Podobnie jest z przyciskami A i B, którym przypisane są piny P5 i P11. Podczas używania tych wejść trzeba uwzględnić, że połączone są one rezystorami pull-up (opis w dalszej części) z dodatnim napięciem zasilania. Pin P12 jest specyficznym, wolnym pinem, którego używania należy unikać, ze względu na zamierzone, a nie zrealizowane przeznaczenie szeregowego transferu informacji o dostępności akcesoriów. Można natomiast korzystać z pinów P13, P14 i P15, o ile rezygnujemy z zewnętrznej komunikacji SPI, takiej z jakiej korzysta używany wcześniej wyświetlacz LCD. Nie można natomiast korzystać wprost z pinów P19 i P20, chyba że do komunikacji z urządzeniem, bo są one wyprowadzeniem wewnętrznej magistrali I2C. Do tej magistrali przyłączone są wewnętrzny akcelerometr i magnetometr.

Więcej informacji na temat złącza stykowego micro:bita można znaleźć na stronach projektu makecode.microbit.org/device/pins.

Do bezpośredniego korzystania z GPIO w języku Blocks służą bloki z grupy Advanced/Pins oraz, dla często wykorzystywanych wejść, P0, P1 i P2, z grupy Input.

Cyfrowe wyjścia

Wyjścia cyfrowe używane są do sterowania zewnętrznymi urządzeniami, które mogą znajdować się tylko w jednym z dwóch stanów – włączonym lub wyłączonym. Wyjście takie może programowo zostać ustawione w stan niski (L), któremu odpowiada napięcie bliskie 0 V, lub w stan wysoki (H) z napięciem około 3,3 V, czyli w przybliżeniu równym napięciu zasilającemu układ. W programie stan niski będzie reprezentowany przez liczbę 0, a wysoki 1. Do ustalenia stanu wyjścia pinów służy w MakeCode blok Advanced/Pins/digital write pin.

Listing 1

Na listingu 1 zamieszczono przykład zapisu stanów pinu P3, na zmianę, niskiego i wysokiego z przerwą pomiędzy nimi 0,2 s. Obserwację działania układu można zrealizować przez podłączenie odpowiedniego odbiornika do tego pinu, jednak w micro:bicie działanie uboczne, wynikające ze współdzielenia tego pinu z matrycą LED, uwidacznia się w miganiu diody na wyświetlaczu.

UWAGA: Obciążalność wyjść jest ograniczona. W przypadku mocnego obciążania, należy zastosować jakiś bufor, na przykład przekaźnik lub tranzystor. Maksymalny prąd, jakim można obciążyć GPIO micro:bita, wynosi tylko 5 mA.

Cyfrowe wejścia

Odczyt z odpowiedniego pinu, którego użycie zadeklarowaliśmy jako cyfrowe wejście, może dać w wyniku wartość 0, gdy napięcie wejściowe będzie bliskie 0 V lub 1, dla napięcia bliskiemu zasilaniu układu, czyli w przypadku micro:bita, 3,3 V. Do ustalania wartości napięć na wejściach cyfrowych można użyć wyprowadzonych na złącze stykowe micro:bita pinów 3V i GND.

UWAGA: Istnieje wiele technik wykonania układów cyfrowych i wiele standardów napięć odpowiadających stanom wysokiemu i niskiemu. Najbardziej popularne to L = 0 V, a H=+3,3V lub +5 V. Układów różnych standardów nie wolno między sobą łączyć. Grozi to uszkodzeniem urządzeń, a w zasadzie gwarantuje. Dlatego łącząc micro:bity pomiędzy sobą, używajmy wspólnego zasilania.

Rysunek 2. Dwa, prawidłowe sposoby podłączenia przycisku do wejścia cyfrowego

Zanim jednak rozpoczniemy sterowanie micro:bitem przy pomocy zewnętrznych sygnałów cyfrowych, trzeba uświadomić sobie, że używane wejście, niepodłączone do niczego, nie ma ustalonego stanu. Należy w takim przypadku wstępnie go wymusić odpowiednio dobranym rezystorem, tak zwanym rezystorem podciągającym (z ang. pull).

Na rysunku 2 pokazano, w jaki sposób podłączyć przycisk S do wejścia cyfrowego. Vcc jest w tym przypadku napięciem zasilającym układ. W obu układach rezystor zapewnia ustalenie napięcia na wejściu układu cyfrowego. W przypadku pull-up będzie to napięcie zasilania, a rezystor pull-down podłącza wejście do masy (0 V). Wciśnięcie przycisku wymusza na wejściu stan L w pierwszym przypadku i stan H w drugim.

Posługując się micro:bitem raczej nieczęsto będziemy zmuszeni do zastosowania zewnętrznego rezystora podciągającego. Dla wolnych pinów P8 i P16 możemy zadecydować na poziomie programu o rodzaju wstępnej polaryzacji wejścia przy pomocy bloku Advanced/Pins/more/set pull pin (listing 2).

Listing 2

Program z listingu 2, oprócz demonstracji użycia bloku set pull pin, pokazuje możliwość zmiany stanu na przeciwny. W bloku forever co sekundę odczytywana jest wartość pinu P8 i jej negacja zapisywana zostaje na wyjściu P3.

Inne piny są już obciążone i trzeba mieć tego świadomość podłączając do nich inne urządzenia. Przyciski A i B, na przykład, posiadają rezystor pull-up o wartości 10k1.

Specjalne przeznaczenie pinów P0, P1 i P2, powoduje, że one także pracują w układzie pull-up, to znaczy przy pozostawieniu ich w stanie niepodłączonym, przyjmują stan wysoki, z tym że wartości rezystorów podciągających są dosyć duże i wynoszą 10M. Takie rozwiązanie zwiększa podatność układu na zakłócenia, ale z drugiej strony daje możliwość sterowania tymi wejściami „rękoma”. Jeżeli jedną ręką dotkniemy do masy (GND) micro:bita, a drugą do któregoś z tych wejść, to spowodujemy przełączenie tego wejścia ze stanu wysokiego do niskiego. Można więc tworzyć układy czułe na dotyk. Dostęp do tych pinów, także w postaci reakcji na przerwanie, dają bloki znajdujące się w grupie Input.

Aluminiowy przycisk

Rysunek 3. Podłączenie kontaktów z folii aluminiowej do złącza micro:bita

Możliwość sterowania dotykowego pinów P0, P1 i P2, wyprowadzonych szerokimi konektorami na szynę micro:bita, pozwala na konstruowanie prostych przycisków. Wystarczy na podkładce tekturowej nakleić pola z aluminiowej folii i podłączyć przewodami zakończonymi krokodylkami – jak na rysunku 3. W przykładowym układzie czarny przewód podłączony jest do pinu GND, czerwony do P2, a zielony do P0. Zadziałanie przycisku jest możliwe, gdy jedną dłoń położymy na folii połączonej z GND, a drugą na folii przypiętej do wybranego wejścia. Program demonstrujący działanie przycisków przedstawiony jest na listingu 3.

Listing 3

W pętli forever wyświetlana jest wartość zmiennej Licznik, wstępnie ustawionej na 0 w bloku on start. Działania wywoływane przyciśnięciem P0 i P2 ograniczają się do zwiększenia o jeden wartości licznika oraz jego wyzerowania.

Kto pierwszy?

Naśladowanie zachowania przycisków, znanych z telewizyjnych teleturniejów, działających na zasadzie „kto pierwszy, ten lepszy” nie jest trudne, a zabawka taka może posłużyć do rywalizacji sprawdzającej refleks. Jeżeli nie dysponujemy profesjonalnymi łącznikami, możemy skonstruować zaprezentowane już przyciski aluminiowe.

Ogólna koncepcja programu opiera się na założeniu, że mamy dwa stany układu określone przy pomocy zmiennej logicznej Wyczekiwanie:

  1. stan ignorowania zdarzeń pochodzących z przycisków (Wyczekiwanie = false),
  2. stan wyczekiwania na naciśnięcie któregokolwiek przycisku (Wyczekiwanie = true).

Po naciśnięciu konkretnego przycisku przełącza on natychmiast układ do stanu 1, co powoduje, że żaden przycisk nie może już niczego zmienić, a następnie nadaje wartość uwspólnionej zmiennej przechowującej informację o zwycięzcy Kto_wygrał. Dostęp do tej zmiennej można uzyskać tylko w stanie 2, dlatego tylko jeden przycisk może dać dostęp do niej. Działający program, przedstawiony jest na listingu 4.

Pierwszą, nową rzeczą, jaka od razu rzuca się w oczy w kodzie, jest obsługa przycisków P1 i P2 inna niż P0, do jakiej zdążyliśmy się przyzwyczaić. Ponieważ w układzie sprawdzamy refleks zawodnika, musimy dokładnie zdefiniować, co rozumiemy pod terminem „przycisnąć”. Zazwyczaj stosowany blok Input/on X pressed wymaga wykonania wciśnięcia i szybkiego puszczenia przycisku. Można spróbować, jak zachowuje się ta metoda na napisanych wcześniej programach używających tego bloku. Do sprawdzania, kto szybciej zareagował, lepiej za wciśnięcie uznać już ruch przycisku w dół. Do ścisłego zdefiniowania, jaka reakcja jest wciśnięciem, służy blok Advanced/Control/on event from, a ściślej mówiąc, w jaki sposób uruchamiamy obsługę przerwania. Na listingu 4 widać, że przyciski P0 i P1 zareagują na wciśnięcie w dół (MICROBIT_BUTTON_EVT_DOWN).

Zanim program zacznie wykonywać jakiekolwiek instrukcje, w bloku on start zmiennej Wyczekiwanie zostaje nadana wartość false. Od tej chwili dzięki sprawdzaniu w blokach on event from jej wartości, program będzie ignorował przyciski, a ściślej mówiąc – nic nie robił podczas wywołania przerwania.

Listing 4


Zmianę Wyczekiwanie na true może wykonać jedynie blok on pin P0 press wywołany przyciśnięciem P0 przez prowadzącego teleturniej. Wystarczyłoby więc, aby blok on pin P0 press zawierał jedynie set Wyczekiwanie. Jednak ze względu na to, że używamy ekranu, zarówno do informowania o stanie układu, jak i do wyświetlania wyniku, wyposażyliśmy ten blok dodatkowo w kasowanie ekranu oraz znacznik gotowości w postaci jednej diody w centrum matrycy. Po naciśnięciu P0 dioda zapala się (plot) i świeci przez losowo wybrany czas wybrany z zakresu od jednej do trzech sekund, po czym gaśnie (unplot) i następuje przejście w stan 2, czyli wyczekiwania.

Na komentarz zasługuje też sprawdzanie warunku if w bloku on event from. We wcześniejszych programach sprawdzaliśmy zgodność zmiennej logicznej z oczekiwaną wartością, co lepiej odwzorowuje język mówiony, bowiem sprawdzenie „=” wprowadza do zdania czasownik „jest”, a tym samym, w połączeniu z „if” przyjmuje formę „jeżeli jest równe to”. Jednak zmienna Wyczekiwanie już ma wartość logiczną, sprawdzanie zatem, czy jest równa czy nie jakiejś stałej logicznej, jest nadmiarowe. W takim przypadku zdanie z „if” moglibyśmy wymawiać „jeżeli wyczekiwanie «jest prawdą» to”. Od tego momentu nie będziemy stosować jawnego porównania, na rzecz skróconego, nienadmiarowego zapisu.

Szybkie wyświetlanie

W bloku on pin P0 pressed użyliśmy do informowania użytkowników metod z grupy Led. Mogliśmy użyć bloku wyświetlającego którąś z predefiniowanych ikon. Przyglądając się jednak programowi „Migające serce” z rozdziału Podstawy programowania z BBC Micro Bit, można się zastanowić, przez jaki czas jest wyświetlana ikona albo ile czasu potrzeba na jej wywołanie? Nie można udzielić odpowiedzi na to pytanie, jedynie analizując program, ponieważ implementacja bloku Basic/show icon ukrywa przed użytkownikiem taką informację jako nieistotny szczegół, zaciemniający prostotę użycia tej funkcji. „Show”, czyli pokaż, oznacza wyświetl na tyle długo, aby dało się swobodnie zaobserwować. Wyświetlanie ikon wprowadza opóźnienia w wykonaniu programu, nie może być w takim wypadku używane do informowania graczy przy sprawdzaniu czasu ich reakcji. Stąd zastosowanie bloków Led/plot – włączającego bez opóźnień, wybraną diodę i Led/unplot – wyłączającego ją. Diody określone są współrzędnymi, gdzie dioda (0,0) znajduje się w lewym, górnym rogu.

Listing 5

Szybkość działania tych metod demonstruje przykład z listingu 5. Program ten włącza po kolei diody w pierwszym rzędzie, po czym po kolei je wyłącza. Wynik wykonania, jest jednak dosyć nieoczekiwany, wydaje się bowiem, że diody migają w sposób dość przypadkowy. W celu zaobserwowania oczekiwanego zachowania „płynącego światła” trzeba do programu wprowadzić opóźnienie (listing 6).

Listing 6

Punktacja

Rysunek 4. Wynik 3:2 dla zawodnika 1

Wprowadźmy do rywalizacji na refleks punktację. Będziemy grać na dwie osoby do pięciu zwycięstw. Jest wiele sposobów napisania takiego programu. My postaramy się go tak napisać, aby wprowadzić jak najmniej zmian do programu 4.

Punkty zdobyte przez zawodników przechowywane są w zmiennych Punkty_1 i Punkty_2. Każde zwycięstwo zawodnika, czyli szybsza reakcja przyciskiem P1 lub P2, zwiększa wartość odpowiedniej zmiennej o jeden i zapala diodę w słupku po stronie zawodnika (rysunek 4). Wszystko to dzieje się w bloku on event from.

Cały mecz rozpoczynamy przyciskiem P0, resetując przy tym wartość wszystkich zmiennych. Dodana pętla while pozwala, w bloku obsługi tego przerwania, na automatyczne wznawianie rozgrywki, aż do osiągnięcia przez któregoś z zawodników 5 punktów.

Kompletny program jest przedstawiony na listingu 7.

Listing 7

Modyfikacje

Naturalną modyfikacją, a przy tym bardzo prostą w realizacji programowej, jaką można wprowadzić do kodu z listingu 4, jest obsługa większej liczby zawodników. Dla trzech można wykorzystać pin P0, a jego rolę przekazać do przycisku A. Dla większej liczby zawodników nie obejdzie się bez ekspandera wyprowadzeń. Pojawi się też problem czułości na dotyk przy stosowaniu przycisków aluminiowych. Można wtedy użyć gotowych łączników lub zastosować rezystor podciągający o wartości 10M w dowolnym układzie z rysunku 2.

Dodatkowym ciekawym usprawnieniem w dwuosobowej rywalizacji może być kara za falstart, czyli naciśnięcie przycisku przed wejściem układu w stan wyczekiwania. Konieczne w takim przypadku będzie zastosowanie dodatkowej zmiennej logicznej.

Najtrudniejsze będzie jednak takie zmodyfikowanie programu, w którym większość operacji przeniesiemy do forever, zgodnie z ogólnymi zasadami obsługi przerwań. Chociaż język Blocks, przy programowaniu micro:bita, pozwala na umieszczanie w czasie obsługi przerwania na przykład instrukcji czasowej przerwy pause, to w innych systemach wbudowanych może to być w ogóle niemożliwe. Stąd warto poszczególne fazy programu definiować przy pomocy odpowiednich zmiennych, które decydują o przebiegu pętli forever, a w blokach obsługujących zdarzenia będą znajdowały się jedynie instrukcje modyfikujące te zmienne.

Przykłady programów 5 i 6 prezentują metody szybkiego sterowania diodami w matrycy LED micro:bita. Projektowanie pływających świateł czy innych efektów świetlnych może być dobrą zabawą. Całkowite panowanie nad matrycą jest możliwe dzięki zastosowania w odpowiednich pętlach: włączenia pojedynczej diody (Led/plot), wyłączenia (Led/unplot) lub przełączenia w stan przeciwny (Led/toggle). Ciekawe efekty można uzyskać, korzystając z liczb losowych Math/pick random. W grupie Led/more znajdują się ponadto bloki umożliwiające ustalenie jasności świecenia danej diody w skali od 0 do 255 oraz blok, istotny, gdy chcemy wykorzystać piny uwspólnione z diodami LED, wyłączenia matrycy led enable. Ciekawą funkcję udostępnia blok stop animation zatrzymujący natychmiastowo jakiekolwiek wyświetlanie, nawet wywołane blokami z innych grup.

Literatura

Powtórzenie zaprezentowanych projektów nie wymaga studiowania dodatkowej literatury. Dopiero wprowadzenie modyfikacji może wiązać się z koniecznością uzupełnienia wiedzy. Najlepszym źródłem informacji w przypadku jakiegoś konkretnego problemu jest internet. Książka pisana swoją wyższość ukazuje dopiero jako podręcznik czy przewodnik.

Informacje bibliograficzne dotyczące źródeł internetowych zamieściłem bezpośrednio w tekście, przy zagadnieniach, których dotyczą.

Do zapisu linków, tylko w tym spisie, wykorzystywana jest metoda skracania adresów (URL shortening). W tym skrypcie wybrano serwis TinyURL. Dostęp do wszystkich internetowych zasobów został przetestowany 27.02.2020.

Bibliografia zawiera tylko materiały pomocnicze do projektów, których dotyczą, a pominięto literaturę o charakterze ogólnoinformatycznym. Dobór materiałów do nauki kodowania, czy obsługi programów narzędziowych, pozostaje po stronie nauczyciela.

Literatury dotyczącej micro:bita jest niewiele, szczególnie w stosunku do najbardziej popularnych systemów wbudowanych. Nie można liczyć niestety na wiele informacji w języku polskim. Najbardziej godne polecenia, gromadzące także dużo społeczności są strony oficjalnego wsparcia:

Literatura uzupełniająca

W niektórych projektach nie wszystko da się podłączyć za pomocą pasujących do siebie wtyków i złącz. Należy wówczas wykonać takie podłączenia samodzielnie. Wymaga to nieco umiejętności majsterkowania i elektroniki. Bardzo ciekawą książką dla początkujących majsterkowiczów jest:

  • Roberts Dustyn, Wpraw to w ruch. Proste mechanizmy dla wynalazców, majsterkowiczów i artystów [e-book], tłum. Krzysztof Sawka, Helion, 2015.

Znajdziemy w niej oprócz podstaw elektroniki także dużo elementarnej mechaniki i materiałoznawstwa.

Majsterkowanie z użyciem systemów wbudowanych, tam gdzie nie wszystko pasuje do siebie za pomocą dedykowanych styków, wymaga elementarnej wiedzy z elektroniki. Niezmiennie najważniejszą książką na półce elektronika jest:

  • Horowitz Paul, Hill Winfield, Sztuka elektroniki, tłum. Bogusław Kalinowski, Grażyna Kalinowska, t. 1–2, wyd. 12 zmienione, WKŁ, Warszawa 2018.

Jednakże jest to pozycja dla wymagającego czytelnika. Podobnym standardem, ale skierowanym do początkujących jest:

  • Platt Charles, Elektronika. Od praktyki do teorii. Wydanie II [e-book], tłum. Konrad Matuk, Helion, 2016.

Na uwagę zasługuje ponadto, w moim przekonaniu bardzo dobra, książka polskiego autora:

  • Górecki Piotr, Wyprawy w świat elektroniki, t. 1, WKŁ, Warszawa 2006.
  • Górecki Piotr, Wyprawy w świat elektroniki. Wyższy stopień wtajemniczenia, t. 2, WKŁ, Warszawa 2011.

1 W elektronice można nie pisać jednostki, gdy jest ona oczywista, w szczególności dla rezystancji. Koniecznie natomiast należy napisać mnożnik/przedrostek, który zastępuje w takiej notacji przecinek. Np. 4,7 kΩ zapiszemy w skrócie 4k7. Gdy nie ma przedrostka, piszemy literę R. Inna skrótowa forma zapisu używa ostatniej cyfry jako mnożnika – wykładnika potęgi dziesiątki, czyli 103 to po prostu 10 kΩ.

2 komentarze

  1. Wyszukiwarka

    Treść jest klarowna, dobrze zorganizowana i pełna przydatnych wskazówek. Autor doskonale wyjaśnia kluczowe zagadnienia. Może warto by dodać więcej przykładów praktycznych. Pomimo tego, tekst jest niezwykle edukacyjny i inspirujący.

  2. Wyłączanie adblue Katowice

    To, co tutaj tworzysz, to prawdziwa oaza wiedzy i inspiracji! Każde zdanie jest jak drogocenna perła, a całość układa się w fascynujący naszyjnik mądrości. Jedyne, czego mi zabrakło, to nieco bardziej rozbudowane przykłady – byłoby wtedy absolutnie doskonałe!

Skomentuj Wyszukiwarka Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *