microbit の覚え書き

初版作成  2017.3.29
最終更新  2024.04.01


◆◆ v1 と v2 の違い ◆◆


v2 は以下のメリットがある

(1) bluetooth でダウンロードできる
(2)「show console デバイス」が使える
  (シリアルモニタ機能を持つ)

(2) のメリットは絶大である。
教育用には v2 一択である。

v1 と v2 の見分け方

v2 は裏面に SPEAKER と書いてある


◆◆ プログラミング環境 ◆◆


ブラウザで開発する方法と、ネイティブアプリで開発する方法
の 2 通りがある。それぞれメリット、デメリットがある。

2022.11.24 の時点で
Chrome は bluetooth での通信に失敗する。
bluetooth を使いたい場合は Edge を使う。

Web プログラミング環境

- serial を取得できない  Teraterm などを別途起動必要
- bluetooth でダウンロード可能
- ファイルとしてダウンロードすると「ダウンロード」に入る

ネイティブプログラミング環境

- serial モニタ使用可能
- download 時にフォルダを指定可能
- bluetooth でダウンロード不可


◆◆ Web プログラミング環境 ◆◆


https://makecode.microbit.org/

プログラミング環境は 2 つある。

(1) ブロックエディタ
(2) python

(1) Block/JavaScript/Python
https://makecode.microbit.org

(2) python
https://python.microbit.org/v/1

python リファレンス
https://microbit-micropython.readthedocs.io/ja/latest/

ブロックエディタは JavaScript, Python としても
編集可能。こちらの方がよい。

ブロックエディタではブロックで組む限り
コードのエラーは発生しない。
python プログラム環境ではプログラムにエラーが混入しうる。
インタープリタ言語では、エラーは実行時に判明する。
micro:bit は画面を持たない。エラーメッセージは 5 x 5 の
LED をスクロールする。極めて見づらい。

画面を持たないデバイスのプログラミングを CUI で
行う場合、コンパイル言語のほうが良い。

◆◆ ネイティブプログラミング環境 ◆◆


microbit  ストアアプリ

で検索すると、apps.microsoft.com  の中に makecode の
ストアアプリが見つかる。「Microsoft store アプリの取得」
のボタンを押してインストールする。

起動すると

This apps is no longer supported.
For the letest updates, clock here to install our new app!

と表示される。
アップデートすると、新バージョンが使える。

旧バージョンは Windows 11 で動かしたときに、
シリアルコンソールが使えないように思われる。


◆◆ ピンのプルダウン抵抗 ◆◆


https://www.microbit.co.uk/device/pins

GND    Gnd
3V     3.3V
2      pin2  analog in
1      pin1  analog in
0      pin0  analog in

pin1, pin2 はデフォルトで 15k くらいの
プルダウン抵抗が入っているようだ (pin0 は未調査)。

デジタル端子から手動入力するときは、以下のように
配線すること。括弧内は暗黙の配線である。

3V --- SW --- pin1 (--- 15k --- Gnd )


◆◆ 拡張コネクタ(エッジコネクタ) ◆◆


エッジコネクタを接続すると全ての端子を使うことができる。

以下の製品を買ってみた。

Kitronik BBC micro:bit用エッジコネクタブレークアウトボード
Sparkfun Micro Bit Breakout

● Kitronic BBC micro

micro:bit が表(LED やボタンが見える)、
コネクタの端子が上を向いている状態で差し込む
メス−オスコネクタで引き出すことを想定している。

● Sparcfun の製品

micro:bit が表、
コネクタの端子が下を向いている状態で差し込む。
ブレッドボードに指すことを想定している。

データシートが以下にある。

https://media.digikey.com/pdf/Data%20Sheets/Sparkfun%20PDFs/microbit_Breakout_Board_HookupGuide_Web.pdf

GND GND 3V3 の端子以外に 0〜20 の番号が順番についている。
3V3 と書かれた端子からは 3.2 V が出ている。

0〜20 の端子はデータシートによると以下の通り

0 -- analog in -- Large pin 0
1 -- analog in -- Large pin 1
2 -- analog in -- Large pin 2
3 -- analog in -- LED Column 1
4 -- analog in -- LED Column 2
5 -- Button A (off: 3.2V   push: 0V)
6 -- LED Column 9
7 -- LED Column 8
8 -- Open GPIO
9 -- LED Column 7
10 -- analog in -- LED Column 3
11 -- Button B (off: 3.2V   push: 0V)
12 -- Open GPIO
13 -- SPI SCK
14 -- SPI MISO
15 -- SPI MOSI
16 -- Open GPIO
19 -- I2C SCL
20 -- I2C SDA

LED Column 1 2 3 7 8 9 を使うときは、ディスプレイを
無効にする必要がある。


◆◆ プロセス/スレッド ◆◆


micro:bit はマルチスレッドで動作する。
「ずっと」のブロックを複数配置すると、
複数のスレッドが並行に走る。
変数は共通で扱える。

「高度なブロック」の「制御」に

  バックグランドで実行する

があるが、使い方が分からない。
同じ場所に

  イベントを待つ

というのもあるが、使ったことはない。



◆◆ プログラム実行の方法 ◆◆


Web 版は
「ダウンロード」の右の「…」をクリックすると、
bluetooth でダウンロードできるようになる。

micro:bit を USB 接続すると
1 つのドライブとして認識される。

「download as file」をクリックすると、
hex ファイルがフォルダ「ダウンロード」に入る。
ネイティブ版の場合はフォルダを選択できるので
micro:bit のドライブを指定する。

hex ファイルは数字が羅列されたテキストファイルである。
その中にソースファイルも含まれていると思われる。

そのファイルを micro:bit のドライブにコピーする。
コピーしたファイルはブラックホールに吸い込まれたように、
見えなくなる。



◆◆ デバッグの方法 ◆◆


シリアルに数値を書き出して確認する

(1) 知りたい値を変数に格納する
(2)「高度なブロック」の「シリアル通信」の
  「名前と数値を書き出す」を数値の部分に変数を入れる

Teraterm で受ける場合はボーレートを 115200 に設定する。

ネイティブ版の Makecode はシリアルモニタがついている。
「コンソールを表示 デバイス」というメニューが
「コンソールを表示 シミュレータ」の下側にある。

クリックすると、変数の値を数値とグラフで見ることが
できる。

Teraterm のようなアプリがシリアルを握っていると
このメニューが表示されないので、シリアルを扱う
アプリは終了しておくこと。


◆◆ ブロックプログラミング環境(ファイルの保存) ◆◆


プログラムはクラウドに保存される。
ログインはしないので、クッキーを使って区別をしているようだ。

同じパソコンでも、ブラウザが変わると見えない。

そのときは、「ダウンロード」あるいは「フロッピーディスクアイコン」
でローカル HDD に hex ファイルを保存し、
「プロジェクト」---「ファイルを読み込む」を使う。

hex ファイルはバイナリのような拡張子だが、
コロンと16進数字を羅列したアスキーファイルである。
ソースコードを内包するようだ。


◆◆ ブロックプログラミング環境 ◆◆


「V 高度なブロック」を押すと拡張メニューが現れる

I2C, SPI, 全ての入出力端子, シリアル通信が扱える

・ループは 5 種類

(a) 回数を決めて繰り返し
(b) while ループ
(c) for ループ カウンタ変数は 0~x
(d) foreach a in list
(e) 決められた時間ごと (100 ms, 1 sec, 1 min, 1 hour,
  など好きな時間)

(e) はタイマ割り込みをしているようだ。
1 時間毎を 24 回繰り返すと時間が 1 日が計れると思われる

「ずっと」のブロックと「every xxx ms」のブロックは
併存する。「every xxx ms」は複数存在できる。

micro:bit はタイマが複数あるようだ

break, continue もある

・入出力

「入力」「入出力端子」が入出力関係のメニュー
ピン毎に「入力/出力」の設定は不要

丸に点アイコンは p0, p1, p2
二重丸に点アイコンは全ての端子

PWM 出力も可能

・条件分岐

この中に = < > などのブロックもある

・ディレイ

音楽アイコン(ヘッドホンマーク)の休符
1 拍は 500 ms
2 拍は 1000 ms

・拡張機能をインストールすると Grove が使える


◆◆ python プログラミング環境 ◆◆


Web でコーディングする。

   download (micro:bit にダウンロードする)
   save (ローカルな HDD にセーブする)
   load (ローカルな HDD から読み出す)

などのメニューがある。ローカルなエディタでコーディングして

   load ---> download

という方法もある。

コーディングした後、download でダウンロードした hex ファイルを
マイクロビットのドライブにコピーすると、プログラムがスタートする。

hex ファイルには python のインタープリタとソースファイルの
両方が入っているらしい。

micro:bit の中のインタープリタ上で、実行が開始される。
バグは実行されてから発覚する。エラー発生の場合、
5x5 の LED 上をエラーメッセージがスクロールするので、
非常に見づらい。エラーが発生した行番号を読み取る必要が
あるが、集中力が必要である。

◆◆ mu というエディタ ◆◆


https://codewith.mu/en/download

に mu というエディタがある。ローカル PC にインストールする。
micro:bit 用のエディタらしい。


◆◆ L チカ ◆◆


from microbit import *

while True:
    pin0.write_digital(1)
    sleep(500)
    pin0.write_digital(0)
    sleep(500)

◆◆ 入力 ◆◆


while True:
    a = pin2.read_analog()
    if a > 512:
        pin0.write_digital(0)
    else:
        pin0.write_digital(1)

while True:
    a = pin2.read_digital()
    if a == 1:
        pin0.write_digital(0)
    else:
        pin0.write_digital(1)

◆◆ 内蔵センサー ◆◆


タッチセンサー   button_a.is_pressed()
                 button_b.is_pressed()

加速度センサー   accerometer.get_x()

磁気センサー     angle = compass.heading()

温度センサー     a = temperature()

明るさセンサー   a = display.read_light_level()

while True:
    a = temperature()
    s = ":" + str(a)
    l = len(s)
    for i in range(0,l):
        display.show(s[i:i+1])
        sleep(1000)

◆◆ ピンの使い方 ◆◆


オブジェクト名  pin1, pin2, .....

入力

pin.read_digital()   0 or 1        プルダウン抵抗 (15k 程度) に注意!!!
pin.read_analog()    0 --- 1023

pin.is_touched()     boolian   人間の手が触れたか否か

出力

pin.write_ditigal(value)   0 or 1 or False or True
pin.write_analog(value)    0 --- 1023


◆◆ LED の使い方 ◆◆


display.clear()

display.show('A')

display.set_pixel(x,y,value)   value: 0--9
display.get_pixel(x,y)

display.show(image)

image = Image("90009:"
              "09090:"
              "00900:"
              "09090:"
              "90009")

image = Image.HEART

組み込み画像のリスト
https://microbit-micropython.readthedocs.io/ja/latest/microbit_micropython_api.html#images


◆◆ ディレイ ◆◆


sleep(2000)    [ms]