Cel
Zapoznanie z możliwościami programowania modułu BBC Micro Bit w języku Python oraz C.
Wymagania
- moduł micro:bit
oraz opcjonalnie
- instalacja edytora MicroPythona Mu,
- instalacja kompilatorów skrośnych C/C++ na procesory ARM.
Wprowadzenie
Uwagi zamieszczone we wprowadzeniu do rozdziału Programowanie micro:bit w języku JavaScript pozostają nadal aktualne także dla tego rozdziału. Pod hasłem „inne metody” rozumiemy domyślnie wszystkie niegraficzno-blokowe języki programowania.
MicroPython

Oficjalne metody programowania wspierane przez projekt BBC Micro Bit pokrótce przedstawiono w rozdziale Podstawy programowania z BBC Micro Bit. Strona Let’s Code (rysunek 1) prowadzi nas do, znanego już nam, edytora MakeCode lub edytora online języka Python (rysunek 1) python.microbit.org/v/2.0. Właściwie jest to wersja języka Python3 przeznaczona dla mikrokontrolerów, dlatego jego pełna nazwa to MicroPython. Edytor ten jest całym środowiskiem programistycznym umożliwiającym także ładowanie programów do micro:bita. Posiada też wsparcie dla języka polskiego1.
Nie jest celem tego rozdziału wprowadzenie do języka Python. Decydując się na wykorzystanie go do programowania micro:bita, trzeba posiadać pewne podstawy tego języka. Pomimo jego wielu zalet, ogromnych możliwości, dzięki bardzo dużemu pakietowi standardowych bibliotek, i popularności, niewielu nauczycieli decyduje się na wprowadzenie Pythona jako pierwszego języka programowania (szkoda). Według rankingu Tiobe (stan na styczeń 2020) Python przeskoczył w popularności C++, oddając pole jedynie Javie i C.
Nie jest też celem tego rozdziału zachwalanie Pythona, ale jest to język, w którym twórcy założyli ścisłe zasady projektowania konstrukcji języka (tak zwane Zen Pythona), a które to zasady są bardzo ogólne i powinny przyświecać wszystkim twórcom języków programowania. Warto je przytoczyć bo są uniwersalne2:
- Piękne jest lepsze niż brzydkie.
- Jawne jest lepsze niż niejawne (ukryte).
- Proste jest lepsze niż złożone.
- Złożone jest lepsze niż skomplikowane.
- Płaskie jest lepsze niż zagnieżdżone.
- Rzadkie jest lepsze niż gęste.
- Czytelność się liczy.
- Przypadki wyjątkowe nie są wystarczająco wyjątkowe, aby łamać zasady.
- Jednakże praktyczność przewyższa czystość (konsekwencję).
- Błędy nigdy nie powinny przejść niezasygnalizowane.
- Chyba że są jawnie wyciszone (ukryte).
- W obliczu dwuznaczności odrzuć pokusę zgadywania.
- Powinien być jeden – i najlepiej tylko jeden – oczywisty sposób na zrobienie czegoś.
- Chociaż taki sposób może nie być oczywisty na początku, chyba że jesteś Holendrem.
- Teraz jest lepsze niż nigdy.
- Chociaż nigdy jest często lepsze niż *natychmiast*.
- Jeśli implementacja jest trudna do wyjaśnienia, to zły pomysł.
- Jeśli implementacja jest łatwa do wyjaśnienia, to może być dobry pomysł.
- Przestrzenie nazw to genialny pomysł – miejmy takich więcej!
Wykorzystanie MicroPythona w programowaniu modułu micro:bit ma jeszcze jedną zaletę. Potężny samouczek tego języka microbit-micropython.readthedocs.io/pl/latest/tutorials/introduction.html jest rozwijany także w języku polskim. Dobrym wprowadzeniem może być także artykuł Mały bit zamieszczony listopadowym numerze Linux Magazine w roku 2017.
Edytor Mu
Do tej pory wszystkie programy tworzyliśmy przy pomocy edytorów online. Ma to tę zaletę, że do tworzenia projektów wystarczy komputer z przeglądarką internetową, co jest standardowym wyposażeniem każdego desktopowego systemu operacyjnego. Zatem jest to metoda łatwa do realizacji w pracowni szkolnej, bo nie wymaga instalacji dodatkowego oprogramowania. Można także przeprowadzać zajęcia gościnnie i bez wcześniejszego planowania.

Taka metoda pracy ma też pewne wady. Efektywność pracy jest uzależniona od szybkości połączenia internetowego. Mogą także wystąpić problemy przy pracy z wieloma projektami naraz. Z pewnością każdy przekonał się, że niemożliwe jest pisanie różnych programów w MakeCode jednocześnie (na przykład odbiornika i nadajnika) na różnych zakładkach tego samego okna przeglądarki.
Z tego powodu warto mieć także możliwość pracy autonomicznej offline. W przypadku MicroPythona istnieje specjalny edytor Mu (rysunek 2), współtworzony przy udziale nauczycieli i uczniów. Ponieważ jest napisany w Pythonie, jest dostępny na wszystkie popularne platformy: Windows, macOS, Linux. Pominiemy opis instalacji tego edytora. Pliki instalacyjne można znaleźć na stronie codewith.mu/en/download. W przypadku systemu Linux, popularne dystrybucje, zawierają Mu w swoich repozytoriach oprogramowania, tak że proces instalacji jest bardzo prosty i nie wymaga wizyty na stronie projektu.

Edytor Mu ma możliwość bezpośredniej współpracy z micro:bitem. Dostosowanie środowiska do współpracy z konkretną platformą sprzętową (rysunek 3) następuje przy pierwszym uruchomieniu edytora lub po naciśnięciu przycisku Tryb. Napisane programy można przechowywać zarówno w formacie pythonowskim *.py lub micro:bitowym *.hex. Istnieje też możliwość załadowania programu do micro:bita jednym przyciśnięciem Fleszuj, z pominięciem zapisywania projektu.

Mu posiada także wiele funkcjonalności pomagających w pisaniu, na przykład automatykę wcięć, które w Pythonie mają znaczenie składniowe. Na rysunku 4 pokazano przykład podpowiedzi udzielanych przez edytor podczas pisania.
Migające serce
Program migające serce, będący odpowiednikiem „Hello, World!”, w języku MicroPython przedstawiony jest na listingu 1 i dla osób znających chociaż podstawy Pythona nie wymaga dłuższego komentarza.
Listing 1
from microbit import *
while True:
display.show(Image.HEART)
sleep(500)
display.clear()
sleep(500)
W linii pierwszej deklarujemy, że chcemy mieć dostęp do wszystkich funkcji modułu3 microbit. Sposób deklarowania tego modułu w pierwszej linii zdejmuje z piszącego konieczność używania nazwy microbit przed wszystkimi jego składnikami. Równoważny program z odmienną deklaracją import jest pokazany na listingu 2.
Listing 2
import microbit
while True:
microbit.display.show(microbit.Image.HEART)
microbit.sleep(500)
microbit.display.clear()
microbit.sleep(500)
Takie działanie wydaje się niewygodne, ale ma pewien walor czytelności. Widać, na przykład, że funkcja sleep nie jest wbudowaną metodą Pythona. Ponadto czasami takie działanie jest konieczne, gdy składniki różnych modułów mają taką samą nazwę.
Wszystko co napiszemy w programie 1 lub 2 wykona się jednorazowo, jak w bloku on start w MakeCode, dlatego w celu naśladowania zachowania bloku forever konieczne jest użycie nieskończonej pętli while True: (linia 3). Metoda show należąca do obiektu display jest podobna do znanej już z Blocks Basic/show icon, ale nie działa tak samo. Show icon zapewnia pewną dodatkową funkcjonalność, daje bowiem czas na „zobaczenie” ikony, który pozostaje poza kontrolą programisty. Funkcja show działa natychmiastowo i jeżeli nie użyjemy opóźnienia w programie przed następnym użyciem matrycy, to jej działanie tak samo szybko się zakończy, stąd użycie metody sleep, należącej do modułu microbit, wstrzymującej wykonanie programu na zadaną liczbę milisekund. Gdyby usunąć wiersze 5 i 7, musielibyśmy usunąć z nazwy programu słowo „migające”.
Wydaje się że takie działanie metody display.show jest bardziej kłopotliwe, ale daje większą kontrolę nad wykonywanym programem. Program 3 wyświetla ikonę serca, po czym na chwilę zmienia ją na małe serce, naśladując skurcz. Napisanie takiego programu w Blocks, aczkolwiek możliwe z wykorzystaniem grupy Leds, jest trudne.
Listing 3
from microbit import *
tempo = 800
def Przelicz_tempo(x):
if x >= 2000:
return 2000
elif x <= 200:
return 200
else:
return x
while True:
tempo = tempo - 50 * button_a.get_presses()
tempo = tempo + 50 * button_b.get_presses()
tempo = Przelicz_tempo(tempo)
display.show(Image.HEART)
sleep(tempo)
display.show(Image.HEART_SMALL)
sleep(tempo/5)
W programie 3 dodano także możliwość zmiany szybkości bicia serca przyciskami A i B. Ponieważ nie ma dla tych przycisków prostej obsługi przerwań w Pythonie, użyto metody get_presses(), która zwraca liczbę naciśnięć przycisku od startu programu lub ostatniego użycia tej funkcji, bowiem jej użycie kasuje licznik przyciśnięć. Program demonstruje także używanie funkcji w Pythonie. W programie zdefiniowaliśmy funkcję zabezpieczającą przed przekroczeniem wartości granicznych tempa bicia serca. Wiersze 14, 15 i 16 można zapisać w jednym wierszu, ale zgodnie z zasadą siódmą Zen – czytelność się liczy – w Pythonie nie stosujemy wierszy długich (umownie 80 znaków), bo zmniejszają przejrzystość kodu.
Pozostaje jeszcze wyjaśnienie podstawowej wątpliwości początkującego programisty – skąd wiedzieć, jakimi obiektami dysponujemy, jakie są ich nazwy, jakich metod używają, itp.? Trzeba mieć dostęp do dokumentacji, na przykład pełen opis pythonowskiego API micro:bita znajduje się na stronie microbit-micropython.readthedocs.io/pl/latest/microbit_micropython_api.html, ale znacznie lepiej uczyć się z tutoriali, takich jak ten wymieniony powyżej, a z surowych instrukcji korzystać, posiadając już pewne umiejętności. Internet, a przede wszystkim społeczność zgromadzona przy danym projekcie, jest obecnie najlepszą pomocą przeważnie znacząco przewyższającą wsparcie oficjalne.
Pozostaje jeszcze jedna ciekawa właściwość programowania micro:bita w języku Python. W rozdziale Podstawy programowania z BBC Micro Bit opisano zgłaszanie błędów w nieprawidłowo napisanym programie z użyciem kodów błędów. Używając MicroPythona, w przypadku błędu na wyświetlaczu przewijać się będzie słownie komunikat błędu, wraz z numerem linii kodu, w której napotkano błąd.
Język C i nie tylko
Języki Blocks, JavaScript i Pyhon wyczerpują listę oficjalnych metod programowania systemu BBC Micro Bit. Nie oznacza to jednak, że nie można programować w innych językach. Przecież świat systemów wbudowanych bez, królującego tam, języka C wydaje się niekompletny.
Tworzenie projektów dla micro:bita w różnych językach programowania wydaje się proste. Przecież wystarczy dysponować metodami przetwarzania kodu źródłowego na pliki hex, ale prostota jest tylko pozorna. Przetwarzanie poza urządzeniem na formę akceptowalną dla niego, może być trudne, a czasami, w przypadku rozwiązań zamkniętych, niemożliwe. Na szczęście świat wbudowany jest przeważnie otwarty. W przypadku micro:bita dodatkową trudność stanowi to, ze format hex nie jest jakimś rodzajem kodu maszynowego zrozumiałego dla swojego procesora, a pewnym rodzajem pośredniego formatu zawierającego także dodatkowe informacje.
Warstwę abstrakcji dla urządzenia (z ang. DAL Device Abstraction Layer) do programowania micro:bita w językach C i C++ rozwija Uniwersytet w Lancaster. Cała dokumentacja dostępna jest na stronie lancaster-university.github.io/microbit-docs/4. Tworzenie projektów w języku C na micro:bita należy rozpocząć od instalacji systemu budowania yotta, filozofią zbliżonego do make i cmake. Dość złożony proces instalacji yotta, zależny od systemu operacyjnego, jest opisany szczegółowo na stronie docs.yottabuild.org/#installing.
Jeżeli proces instalacji przebiegł prawidłowo, należy pobrać pliki z przykładami. W tym celu w linii poleceń wpisujemy:
$ git clone https://github.com/lancaster-university/microbit-samples
Znak $ na początku jest najczęstszym znakiem zachęty w systemach Linux informującym o posiadaniu uprawnień zwykłego użytkownika, w odróżnieniu od znaku # dla administratora (root). Tych znaków nie przepisujemy do linii poleceń. W przypadku braku systemu kontroli wersji git można wprost całe repozytorium pobrać (download) z serwisu github. Pobranie repozytorium z przykładami posłuży za framework (szkielet) do budowy własnego projektu. Takie działanie jest zalecane przez twórców micro:bit DAL.
Po pobraniu przykładów zmieniamy aktualny katalog:
$ cd microbit-samples
Nasz program napisany w C powinien znaleźć się w katalogu microbit-samples/source. Trzeba podmienić znajdujący się tam plik main.cpp na swój o dowolnej nazwie będący kodem źródłowym języka C lub C++. Program main.cpp, który usuwamy, jest programem „Hello, World!”, przewijającym ten napis jednorazowo przez matrycę LED. W tym katalogu znajduje się też podkatalog examples z różnymi przykładami.
Zwyczajowo napiszemy program „Migające serce” (listing 4), który w tym przypadku trudno nazwać elementarnym. Nie mamy do dyspozycji gotowych ikon, dlatego w wierszu 4 musieliśmy zdefiniować serce samodzielnie.
Listing 4
#include "MicroBit.h"
MicroBit uBit;
MicroBitImage Heart("0,255,0,255,0\n255,255,255,255,255\n 255,255,255,255,255\n0,255,255,255,0\n0,0,255,0,0\n");
int main()
{
uBit.init();
while(1) {
uBit.display.print(Heart);
uBit.sleep(500);
uBit.display.clear();
uBit.sleep(500);
}
}
Deklarując obiekt uBit, dostajemy przez niego dostęp do fizycznych komponentów micro:bit. Pełna dokumentacja składowych klasy MicroBit znajduje się pod adresem lancaster-university.github.io/microbit-docs/ubit/.
Teraz wystarczy w katalogu microbit-samples wydać polecenie
$ yotta build
i odszukać plik microbit-samples-combined.hex, który znajduje się w katalogu microbit-samples/build/bbc-microbit-classic-gcc/source, i przekopiować go do micro:bita, tak jak już nieraz robiliśmy z plikami w tym formacie.
Modyfikacje
Jak w rozdziale Programowanie micro:bit w języku JavaScript modyfikacje powinny polegać na próbie migracji któregoś z wcześniejszych projektów do preferowanego przez siebie języka programowania, niekoniecznie zaprezentowanego w tym skrypcie.
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:
- BBC Micro Bit Main Page [https://tinyurl.com/y36runae],
- Micro Bit Let’s Code [https://tinyurl.com/y57san4c],
- Microsoft MakeCode Editor for micro:bit [https://tinyurl.com/ybarrla5],
- micro:bit support [https://tinyurl.com/rmfkwbf].
Programowanie micro:bita w języku Python daje szansę na oficjalne wsparcie dla języka polskiego. Samouczek:
- BBC micro:bit MicroPython [https://tinyurl.com/sjexost]
dostępny na stronach projektu jest w dużej części przetłumaczony na język polski i ciągle rozwijany. Także w „Linux Magazine” ukazał się obszerny artykuł poświęcony micro:bitowi i microPythonowi:
- BBC micro:bit, „Linux Magazine” 2017, nr 11 (165). W największym polskim wydawnictwie poświęconym tematyce informatycznej – Helion – jest dostępna książka o microPythonie, niestety w języku angielskim i nieco wygórowanej cenie:1
- Tollervey Nicholas H., Programming with MicroPython. Embedded Programming with Microcontrollers and Python [e-book], O’Reilly Media, 2017.
Nad wsparciem programowania micro:bita w językach C i C++ pracuje Uniwersytet w Lancaster i na odpowiednich stronach można uzyskać pełną informację na ten temat:
- micro:bit runtime environment for C/C++ [https://tinyurl.com/yc7lrwyn].
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 Ucząc się programowania – lub nawet ogólniej mówiąc informatyki – powinniśmy unikać języka polskiego. Język angielski jest bowiem „urzędowym” językiem komputerów. Nawet pisząc kod, pomimo że robiliśmy tak wcześniej, powinniśmy unikać nazywania zmiennych czy pisania komentarzy po polsku. Pozwoli nam to w przyszłości rozwijać międzynarodowe projekty. Nietrudno sobie wyobrazić kłopoty w analizie kodu napisanego w Norwegii czy na Węgrzech z użyciem ojczystych naleciałości.
2 Tłumaczenie własne z języka angielskiego. Niestety nie ma oficjalnego tłumaczenia. Zen Pythona w oryginalnej wersji angielskiej można przeczytać po wpisaniu „import this” w trybie interaktywnym interpretera Pythona.
3 Modułami w Pyhonie nazywane są ładowalne biblioteki.
4 W instalacji przeprowadzonej przez autora, a przeprowadzonej zgodnie z instrukcją na stronie Uniwersytetu w Lancaster, brakowało narzędzi do cross-kompilacji do procesorów rodziny ARM arm-none-eabi-gcc, arm-none-eabi-g++ oraz arm-none-eabi-objcopy, dostępnych w linuksowych repozytoriach lub na przykład na stronie launchpad.net/gcc-arm-embedded/+download.
