micro:bit v2 で遊ぶ

日本Androidの会秋葉原支部ロボット部 Advent Calendar 2020 12日目です。

#### はじめに

micro:bitのv2が出たので買いました。

<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/3ceb5b74-1d11-edf3-4436-a1f5faae2d25.png">


変更点についてはスイッチサイエンスのblogなどを見てもらうとして、v2ではnRF52833が使用されていてFlashやRAMのサイズ、スピーカやマイクの追加、Bluetooth 5などパワーアップしています。
スピーカやマイクの追加により声を使った作品もできるのではないでしょうか。

https://switch-education.com/2020/10/13/

micro:bitのプログラミングでは公式サイトのブラウザでプログラミングするのが一般的と思いますが、ちょうどArduinoのライブラリが対応したのを見たので今回はArduinoでやってみたいと思います。

https://github.com/sandeepmistry/arduino-nRF5

#### 準備

とりあえずArduinosIDEを開いて環境設定>ボートマネージャでURLを貼り付けます。

`https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json`

<img width="40%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/c5668f63-0a71-4dc1-e0d7-0abbbbe3830b.png">


URLを貼ったらツール>ボード>ボードマネージャを開いてnrfと打って検索すると `Nordic Semiconductor nrf5 Boards` が出てくるのでインストールします。
インストールしたらボードで `BBC micro:bit V2`が選択できるようになれば準備完了です。

<img width="40%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/c609aa72-0a67-1103-9d6f-e37739040ecb.png">

#### 遊んでみよう

adafruitの記事のスケッチをコピペしてとりあえずLED光らせてみます。

https://learn.adafruit.com/use-micro-bit-with-arduino/install-board-and-blink

```cpp:microbit_v1_blink.ino
const int COL1 = 3; 
const int LED = 26;

void setup() {  
  // because the LEDs are multiplexed, we must ground the opposite side of the LED
  pinMode(COL1, OUTPUT);
  digitalWrite(COL1, LOW); 
   
  pinMode(LED, OUTPUT);   
}

void loop(){
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
}
```

`You should see the top left LED blinking!`

左上のLEDが...付かないじゃん...orz
[公式サイト](https://tech.microbit.org/hardware/schematic/)を見てみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/ee126e30-81ec-a369-fc5d-f45a1b92aa3c.png)

micro:bit v1ではLED matrixの9x3だったけど、v2は5x5に仕様が変わったようです。 

v1とv2の変数定義を見てみると

https://github.com/sandeepmistry/arduino-nRF5/blob/master/variants/BBCmicrobit/variant.cpp#L56-L61

```c++:v1
const uint32_t g_ADigitalPinMap[] = {
  // 0 - 4
  3, // A0 - left pad
  2, // A1 - middle pad
  1, // A2 - right pad
  4, // A3 - COL1
  5, // A4 - COL2

  //省略

  // 17 + 18
  (uint32_t)-1, // 3.3V
  (uint32_t)-1, // 3.3V

  0,  // SCL
  30, // SDA

  25, // RX
  24, // TX

  7,  // COL4
  8,  // COL5
  9,  // COL6
  13, // ROW1
  14, // ROW2
  15, // ROW3
```

https://github.com/sandeepmistry/arduino-nRF5/blob/master/variants/BBCmicrobitV2/variant.cpp#L37-L42

```c++:v2
const uint32_t g_ADigitalPinMap[] = {
  // 0 - 4
  2,  // A0, LEFT PAD
  3,  // A1, MIDDLE PAD
  4,  // A2, RIGHT PAD
  31, // A3, COL3
  28, // A4, COL1

  // 21 - 25
  21, // ROW1
  22, // ROW2
  15, // ROW3
  24, // ROW4
  19, // ROW5
```

v1では `col=3, row=26` を選択すれば左上のLEDが付いたところをv2では`col=4, row=21`と選択すればLEDが付きそうです。
`col=4, row=21`にしてスケッチを書いてみるとLEDが点灯しました。

```c++:microbit_v2_blink.ino
const int COL1 = 4;    //←4にする！！！
const int LED = 21;    //←21にする！！！

void setup() {  
  // because the LEDs are multiplexed, we must ground the opposite side of the LED
  pinMode(COL1, OUTPUT);
  digitalWrite(COL1, LOW); 

  pinMode(LED, OUTPUT);   
}

void loop(){
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
}
```

<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/d14e2ec8-1a4e-d6e7-f992-3034ea1da302.png">

左上から右下まで１つずつ点滅させてみます。

```c++:c++:microbit_v2_blink.ino
const int cols[5] = {4, 7, 3, 6, 10};
const int rows[5] = {21, 22, 23, 24, 25};

void setup() {  
  // because the LEDs are multiplexed, we must ground the opposite side of the LED
  Serial.begin(115200);

  for(int i=0; i < 5; i++) {
    pinMode(cols[i], OUTPUT);
    
    if(i==0) {
      digitalWrite(cols[i], LOW);  
    } else {
      digitalWrite(cols[i], HIGH);
    }
    
    pinMode(rows[i], OUTPUT);
  }

}

void loop(){
  for(int i=0; i< 5; i++) {
    for(int j=0; j < 5; j++){
      digitalWrite(rows[i], HIGH);
      digitalWrite(cols[j], LOW);
      delay(200);
      digitalWrite(rows[i], LOW);
      digitalWrite(cols[j], HIGH);
      delay(200);
    }
  }
}
```

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/17c02358-e55d-ee9b-884a-784842bb6487.gif)

次はBluetoothで何かやりたいなーと思いましたが、ライブラリのほうでまだnrf52833は対応できておらずコンパイルエラーとなります。
現状、Arduino + micro:bit v2 + Bluetoothで遊ぶのは難しそうです...残念！😭😭😭

https://github.com/sandeepmistry/arduino-BLEPeripheral
https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/src/nRF51822.h

※nrf52832に対応するcommitもあったので対応してくれると思いたいですが、最近活動がなさげです...
https://github.com/sandeepmistry/arduino-BLEPeripheral/commit/1cea5d24a6218515f180811837784c1742e10e0c