- PVSM.RU - https://www.pvsm.ru -
Как отмечалось на geektimes, микрокомпьютер BBC micro:bit ещё этой весной начали рассылать британским школьникам [1], а пару месяцев назад он поступил в свободную продажу [2] по цене от £13 за штуку.
Предположим, micro:bit приобретён; что с ним делать дальше? Я решил сделать из него часы, потому что мои наручные как раз сломались.
Инструкция по использованию micro:bit со старой версией mbed OS есть на сайте Ланкастерского университета [3]; но ARM две недели назад выпустила новую версию [4] mbed OS 5, и с этой новой версией библиотека поддержки microbit-dal «из коробки» не работает.
Насколько я понимаю, даже в самом ARM никто ещё не пытался использовать mbed OS 5 на micro:bit; мне хотелось стать первым.
Для начала работы нужно установить среду разработки mbed CLI. Она написана на Python (для работы требуется версия 2.7.6+), и распространяется посредством PyPI:
$ sudo pip install mbed-cli
Либо, если мы работаем на машине без прав root, и даже без pip
:
$ wget http://bootstrap.pypa.io/ez_setup.py
$ python ez_setup.py --user
$ ~/.local/bin/pip install virtualenv --user
$ ~/.local/bin/virtualenv venv
$ source venv/bin/activate
(venv) $ pip install mbed-cli
Кроме этого, нужно установить компилятор GNU ARM Embedded [5]. Если tarball с компилятором распакован в /work/gcc-arm-none-eabi-5_4-2016q2/
, то он регистрируется в mbed CLI командой
$ mbed config --global GCC_ARM_PATH /work/gcc-arm-none-eabi-5_4-2016q2/bin/
Теперь создаём для нашего проекта рабочее окружение:
$ mbed new mb_clock
$ cd mb_clock
$ mbed target NRF51_MICROBIT
$ mbed toolchain GCC_ARM
Если команда
mbed new
выполняется из-под root и/или внутри venv, то она сама доустановит в систему необходимые модули Python. В противном случае, она попросит выполнить$ sudo pip install -r mbed-os/requirements.txt
Следующий шаг — добавим в наше рабочее окружение библиотеки поддержки micro:bit:
$ mbed add https://github.com/lancaster-university/microbit # первая ланкастерская библиотека
$ mbed add https://github.com/tyomitch/microbit-dal # мой форк второй ланкастерской библиотеки
В составе ланкастерской библиотеки есть ассемблерный файл CortexContextSwitch.s
, который поставляется в двух вариантах: для GNU as и для armasm. Библиотека для mbed OS 3 включала файл CMakeLists.txt
, в котором был прописан автоматический выбор нужного варианта. Увы, mbed OS 5 игнорирует CMakeLists.txt
, так что вариант для GNU as придётся выбрать вручную:
$ cp microbit-dal/source/asm/CortexContextSwitch.s.gcc microbit-dal/source/asm/CortexContextSwitch.s
Кроме этого, с ланкастерской библиотекой есть ещё несколько проблем:
Первые две проблемы исправлены в моём форке ланкастерской библиотеки; для третьей предлагается следующий низкотехнологичный воркараунд:
$ rm mbed-os/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_MCU_NRF51822/source/nRF5xn.cpp
Последняя проблема решается настройками компиляции: чтобы кучи хватило для работы microbit-dal, системный стек должен быть размером 512 байт или меньше. (Обработчикам прерываний, которые им пользуются, хватает и половины этого.)
Теперь самое интересное — собственно реализация часов. В ней всего два нетривиальных момента:
#include "MicroBit.h"
MicroBit uBit;
const uint8_t digit_bits[10][10] = {
{ 0, 0,
0, 0,
0, 1,
0, 0,
0, 0 },
{ 0, 1,
0, 1,
0, 1,
0, 1,
0, 1 },
{ 1, 1,
0, 1,
1, 1,
1, 0,
1, 1 },
{ 1, 1,
0, 1,
1, 1,
0, 1,
1, 1 },
{ 0, 1,
1, 1,
1, 1,
0, 1,
0, 1 },
{ 1, 1,
1, 0,
1, 1,
0, 1,
1, 1 },
{ 0, 1,
1, 0,
1, 0,
1, 1,
1, 1 },
{ 1, 1,
0, 1,
0, 1,
1, 0,
1, 0 },
{ 0, 0,
0, 1,
0, 0,
0, 1,
0, 0 },
{ 1, 1,
1, 1,
0, 1,
0, 1,
1, 0 }
};
MicroBitImage digits[] = {
MicroBitImage(2,5,digit_bits[0]),
MicroBitImage(2,5,digit_bits[1]),
MicroBitImage(2,5,digit_bits[2]),
MicroBitImage(2,5,digit_bits[3]),
MicroBitImage(2,5,digit_bits[4]),
MicroBitImage(2,5,digit_bits[5]),
MicroBitImage(2,5,digit_bits[6]),
MicroBitImage(2,5,digit_bits[7]),
MicroBitImage(2,5,digit_bits[8]),
MicroBitImage(2,5,digit_bits[9])
};
int started_at = 18*60+53;
void onButtonAClick(MicroBitEvent evt)
{
started_at--;
}
void onButtonBClick(MicroBitEvent evt)
{
started_at++;
}
int main()
{
uBit.init();
uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonAClick);
uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_BUTTON_EVT_CLICK, onButtonBClick);
while(1) {
int cur_time = (started_at + uBit.systemTime() / 60000L) % (24*60);
int hours = cur_time / 60;
int minutes = cur_time % 60;
uBit.display.image.paste(digits[hours/10],0,0,0);
uBit.display.image.paste(digits[hours%10],3,0,0);
uBit.sleep(300);
uBit.display.image.paste(digits[minutes/10],0,0,0);
uBit.display.image.paste(digits[minutes%10],3,0,0);
uBit.sleep(300);
uBit.display.clear();
uBit.sleep(600);
}
}
Когда этот код сохранён (скажем, в файл mb_clock.cpp
), весь проект можно скомпилировать, и загрузить на устройство:
$ mbed compile -D __STACK_SIZE=512 -D ISR_STACK_SIZE=512 -D MICROBIT_BLE_ENABLED=0
$ cp ./.build/NRF51_MICROBIT/GCC_ARM/mb_clock.hex /media/MICROBIT
Готово!
При желании, для получившихся часов можно смастерить защитный корпус из баночки из-под витаминов и термоклея:
Автор: tyomitch
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie-mikrokontrollerov/176885
Ссылки в тексте:
[1] начали рассылать британским школьникам: https://geektimes.ru/post/273248/
[2] поступил в свободную продажу: https://geektimes.ru/post/276710/
[3] Ланкастерского университета: https://lancaster-university.github.io/microbit-docs/offline-toolchains/
[4] выпустила новую версию: https://developer.mbed.org/blog/entry/Introducing-mbed-OS-5/
[5] GNU ARM Embedded: https://launchpad.net/gcc-arm-embedded
[6] BLE: https://ru.wikipedia.org/wiki/Bluetooth_%D1%81_%D0%BD%D0%B8%D0%B7%D0%BA%D0%B8%D0%BC_%D1%8D%D0%BD%D0%B5%D1%80%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC
[7] арабских цифрах: https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Arab_cifry.gif
[8] Источник: https://habrahabr.ru/post/307806/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.