micro:ビットが取得されたとします。 次に何をする? 腕時計が壊れたので、私はそれから時計を作ることにしました。

古いバージョンのmbed OSでmicro:bitを使用する手順は、ランカスター大学の Webサイトにあります。 しかし、ARMは2週間前に mbed OS 5の 新しいバージョンをリリースしましたが、この新しいバージョンでは「 すぐに使える 」 マイクロビットダルサポートライブラリは機能しません。
私の知る限り、ARM自体でも、micro:bitでmbed OS 5を使用しようとした人はいません。 私は最初になりたかった。
開始するには、 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コンパイラをインストールする必要があります。 コンパイラーを含むtarballが
/work/gcc-arm-none-eabi-5_4-2016q2/
に
/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 #
Lancasterライブラリには、アセンブラファイル
CortexContextSwitch.s
が含まれています。これには、 GNU asとarmasmの 2つのバージョンがあります。 mbed OS 3のライブラリには、必要なオプションの自動選択が登録された
CMakeLists.txt
ファイルが含まれてい
CMakeLists.txt
。
CMakeLists.txt
、mbed OS 5は
CMakeLists.txt
無視するため、GNUのオプションを手動で選択する必要があります。
$ cp microbit-dal/source/asm/CortexContextSwitch.s.gcc microbit-dal/source/asm/CortexContextSwitch.s
さらに、ランカスターライブラリにはさらにいくつかの問題があります。
- mbed OS 5はマルチスレッドのサポートを含むため、mbed OSの以前のバージョンのように、「システム」(MSP)ではなく、「ユーザー」スタック(PSP)でマイクロビットdalコードが実行されるようになりました。
- mbed OS 5でBLEを操作するためのシステムAPIが変更されました。
- mbed OS 5のBLEサポートは大量のメモリを消費し、micro:16 KB RAMのビットに収まりません。
- デフォルトのスタックサイズ(2 KB)は大きすぎます。このようなスタックでは、システムに動的割り当て(「ヒープ」)用の空きメモリがありません。
最初の2つの問題は、Lancasterライブラリのフォークで修正されています。 3つ目は、次のローワークワークラウンドが提案されています。
$ rm mbed-os/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_MCU_NRF51822/source/nRF5xn.cpp
最後の問題は、コンパイル設定によって解決されます。マイクロビットdalが機能するにはヒープが十分であるために、システムスタックは512バイト以下でなければなりません。 (それを使用する割り込みハンドラは、その半分に十分です。)
今、最も興味深いのは、時計の実際の実装です。 そこには2つの重要な瞬間しかありません。
- micro:ビットサイズの5x5 LEDを一度に2桁で表示するには、創造的にフォントを作成する必要がありました。 「2つのゼロが上下に並んでいる」という論理に従って、慣れ親しんだ真ん中にドットの形でゼロ( アラビア数字では似ている)、コロンの形に8つを作成することにしました。 他のすべての数字は問題なく認識されます。
- Micro:ビットには不揮発性の「リアルタイムクロック」がないため、時間は初期ロードからカウントされます。 最初に表示される値は、コンパイル時に設定されます。 開始後、2つのmicro:bitボタンを使用して、表示される時間を1方向に、1分単位で調整できます。
リスティング
#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
できた!
必要に応じて、結果の時計のために、ビタミンとホットグルーの瓶から保護ケースを作成できます:
