BBC micro:bit v1.5

コンピュータ、組み込み

BBC の micro:bit v1.5を紹介します。
子供向けプログラム教育用に作られたマイコンで主にスクラッチでプログラムの記述を行いますが、Arduino環境でも使用することができます。
基本的な入出力や通信関連をArduino環境で使用してみます。

紹介するもの

BBC micro:bit v1.5

接続Micro B
CPUNordic nRF52840 64MHz
GPIO17
PWM17(8bit 0 – 255)
ADC6(10bit 0 – 1023, 3.3V)
I2C1
SPI1
そのほかリセットボタン
ユーザボタン A(GPIO5), B(GPIO11)
電源コネクタ
温度センサ
地磁気センサ
加速度センサ
加速度センサ
マトリクス(5×5)LED
照度センサ

ピン配置

外観

画像はピンクの柄ですが、購入時に何色が出てくるかはわからないようです。

ブレークアウト基板を使用することでピンをピンヘッダへ変換して使用することができます。

ブレッドボードに使用するとこのような状態になります。
当方の使用しているブレークアウト基板では立てた状態で使用します。

使ってみて

0, 1, 2 と 3V GNDはワニ口クリップでつまめますが、そのほかの端子はそのまま使用するのは難しいので、外観画像のようにブレークアウトボードからピンソケットに変換することで多くのIOを使用することができます。
ブレークアウトボードは種類がありますので、目的に合った基板を選んでください(通信(I2C, SPI)が使えるなど)

micro:bitはスクラッチではとても簡単に多くの機能を使用することができます。
Arduino環境は、スクラッチのように視覚的に関数機能の一覧からの選択やデバッグ機能がないため、同じ感覚で使用を考えているとなかなか手こずるものと思います。

micro:bitは多くのセンサーを搭載しているので準備ができましたら少しずつ記事の更新をしていきます。

準備

ライブラリ

ボードライブラリ

Arduino IDEのボードマネージャからAE-nRF52840用のライブラリのインストールとボードの選択をします。

ボードマネージャのURLhttps://sandeepmistry.github.io/arduino-RF5/package_nRF5_boards_index.json
検索micro:bit
ボードライブラリNordic Semiconductor nRF5 Boards by Sandeep Mistry バージョン x.x.x
選択するボードNordic Semiconductor nRF5 Boards > BBC micro:bit
※ 動作確認は0.7.0を使用しています[Jan/2023]

モジュールライブラリ

機能やモジュールを使用しない場合インストールの必要はありません。

機能/モジュールライブラリ名検索確認時のバージョン
SSD1306Adafruit SSD1306 by AdafruitSSD13062.5.1
ST7735Adafruit ST7735 and ST7789
Library by Adafruit
ST77351.9.3
関連
SSD1306
ST7735
Adafruit GFX Library by AdafruitGFX1.11.3

スケッチの書き込み方

パソコンとMicro:bitをUSBケーブルで接続します。
Arduino IDEから接続したCOMポート番号を選択し、プログラムを書き込むボタンを押下します。

小さなプロジェクトでのmicro:bitでのコンパイルとほかのSoc(ESP32やRP2040)と比べると書き込みはとても速いです。
出力画面には赤文字ですべての経過が表示されるのでErrorがあったかのように感じますが、メッセージをよく読んで判断してください。

基本スケッチ

ボタンLED

説明

ボタンが押下されている間LEDを点灯させます。
ボタンが離されている間LEDは消灯させます。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
BBC micro:bit

【スケッチの説明】
Bボタンが押されていたらLEDを点灯、離されていたらLEDを消灯します。

micro:bitでは Aボタンは GPIO5で PIN_BUTTON_A 定義
BボタンはGPIO11で PIN_BUTTON_B が定義されています。

実装ボタンはPULL UPして使用するので、LEDの点灯、消灯は状態反転します。

【ライブラリ】
Nordic Semiconductor nRF5 Boards > BBC micro:bit

【準備】
GPIO0 -> 保護抵抗(200Ω) -> LED -> GND

【バージョン情報】
2023/3/16 : 新規
**********************************************************************/

#define LED 0        //LED

void setup()
{
  pinMode(LED, OUTPUT);               //ピン出力設定
  pinMode(PIN_BUTTON_B, INPUT_PULLUP);    //プルダウンで入力
}

void loop()
{
  int iStat = !digitalRead(PIN_BUTTON_B);   //PULL UPしているので状態反転する
  digitalWrite(LED, iStat);           //ボタンの状態をLEDに出力
}
結果

ボタンを押下するとLEDが点灯しました。
ボタンを離すとLEDが消灯しました。

PWM

説明

PWMでLEDをゆっくり点灯しゆっくり消灯します。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
micro:bit

【スケッチの説明】
PWMを使ってLEDをゆっくり点灯、ゆっくり消灯を繰り返します。

【ライブラリ】
Nordic Semiconductor nRF5 Boards > BBC micro:bit

【準備】
GPIO0(OUTPUT) -> 保護抵抗(約200Ω) -> LED -> GND

LEDの保護抵抗は適値を求めて使用してください。
 
【バージョン情報】
2023/3/16 : 新規
**********************************************************************/

#define PWM 0

void setup()
{
  pinMode(PWM , OUTPUT);
}

void loop()
{
  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, i);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, 255 - i);
    delay(2);
  }
}
結果

LEDがゆっくり点灯し、ゆっくり消灯しました。

ADC

説明

ADCに入力された電圧を読み取りCOMに出力します。

電圧の入力にLOLIN32 Liteを使用します。
0~255(約3.3V) まで2msごとに1ずつ上昇し、255(約3.3V)~0までを2msごとに1ずつ下降する設定を繰り返します。

配線
micro:bit配線LOLIN32 Lite
GPIO14(ADC)GPIO26(DAC)
GNDGND
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
micro:bit

【スケッチの説明】
入力された電圧を読み取ります。

【ライブラリ】
Nordic Semiconductor nRF5 Boards > BBC micro:bit

【準備】
micro:bit <-> LOLIN32 Lite
GPIO0(ADC)        <-> GPIO26(DAC)
GND               <-> GND

【バージョン情報】
2023/3/17 : 新規
**********************************************************************/


#define ADC 0

void setup()
{
  Serial.begin(115200);
  pinMode(ADC, INPUT);
}

void loop()
{
  int iADC = 0;

  //外部から入力された電圧を読み取り、結果をCOMに出力します。
  iADC = analogRead(ADC);
  Serial.print("(ADC) =");
  Serial.println(iADC);
  delay(2);
}
結果

入力した電圧を読み取った結果をグラフにしました。
電圧の変化は0V -> 3.3Vまでを約500msで上昇し、3.3V -> 0Vまで約500msで下降します。

ADC読み取り値は低値から高値まで直線でキレイな波形になっています。

電圧と読み取り値の同期はできていませんが、参考程度に入力電圧を添付します。

COM通信

説明

micro:bitではUARTピンが標準で出ていないので、COM通信でのオウム返しをします。

配線

不要

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
micro:bit

【スケッチの説明】
COM通信のオウム返しをします。

【ライブラリ】
Nordic Semiconductor nRF5 Boards > BBC micro:bit

【準備】
不要

【バージョン情報】
2023/3/17 : 新規
**********************************************************************/

void setup()
{
  Serial.begin(115200);                  //SerialオブジェクトはUART0 (COM)

}

void loop()
{
  if(Serial.available() != 0)        //S/W uartにデータがあれば、読み取った内容をCOMに送信
  {
      Serial.write(Serial.read());
  }
}
結果

結果はTeratermを起動して確認します。
Teratermに入力された文字は、すぐにmicro:bitから戻ってくるので画面に表示されます。
ローカルエコーが有効の場合は、2文字ずつ表示される結果になります。

I2C(SSD1306)

説明

I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

配線
micro:bit配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GPIO20(SDA)SDA
GPIO19(SCL)SCL
/,.78
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
micro:bit

【スケッチの説明】
SSD1306 OLEDの制御をします。

【ライブラリ】
Nordic Semiconductor nRF5 Boards > BBC micro:bit
Adafruit SSD1306 by Adafruit
Adafruit GFX Library by Adafruit

【準備】
マイコン基板 <-> SSD1306
3V3         <-> VCC
GND         <-> GND
GPIO20(SDA) <-> SDA
GPIO19(SCL) <-> SCL

【バージョン情報】
2023/03/17 : 新規
**********************************************************************/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128                //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64                //SCREEN_HEIGHTは 32 に設定することができます。

#define OLED_RESET     -1               //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C             //I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        //表示制御にはAdafruit製 SSD1306を使用する。
                                        
void setup()
{
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();               //何か表示されている場合に備えて表示クリア

  display.setTextSize(2);               //フォントサイズは2(番目に小さい)
  display.setTextColor(SSD1306_WHITE);  //色指定はできないが必要
  display.setCursor(20, 0);            //テキストの表示開始位置
  display.print(F("TAMANEGI"));         //表示文字列
  display.setCursor(15, 25);
  display.print(F("OLED 0.96"));
  display.setCursor(25, 45);
  display.print(F("SSD1306"));

  display.display();                    //バッファ転送(表示)
}

void loop()
{
}
結果

SSD1306のサンプルスケッチが動作しました。

SPI(ST7735)

説明

SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest

配線
micro:bit配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO12CS
GPIO11Reset
GPIO10AO(DC)
GPIO15(SPI MOSI)SDA
GPIO13(SPI SCK)SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
micro:bit

【スケッチの説明】
ST7735 LCDの表示制御します。

【ライブラリ】
Nordic Semiconductor nRF5 Boards > BBC micro:bit
Adafruit ST7735 and ST7789 Library
Adafruit GFX Library

【準備】
マイコン基板 <-> ST7735
3V3              <-> VCC
GND              <-> GND
GPIO12           <-> CS
GPIO11           <-> Reset
GPIO10           <-> AO
GPIO13(SPI MOSI) <-> SDA
GPIO15(SPI SCK)  <-> SCK

【バージョン情報】
2023/3/17 : 新規
**********************************************************************/

#include <Adafruit_GFX.h> 
#include <Adafruit_ST7735.h>
#include <SPI.h>

#define TFT_CS    12
#define TFT_RST   11
#define TFT_DC    10
#define TFT_MOSI  15
#define TFT_SCK   13

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

//S/W SPIはこちら。遅いが任意のピンを使用できる。
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST);

void setup(void) 
{
  //SPI.setPins(-1, TFT_SCK, TFT_MOSI);         //デフォルトピンから変更する場合は、定義のピン番号を変更してコメントを外す。
  tft.initR(INITR_BLACKTAB);                  //Init ST7735S初期化
  
  tft.fillScreen(ST77XX_BLACK);               //背景の塗りつぶし

  //テキスト表示
  tft.setRotation(3);                         //画面回転
  tft.setTextSize(3);                         //サイズ

  tft.setCursor(0, 10);                       //カーソル位置                      
  tft.setTextColor(ST77XX_GREEN);             //緑
  tft.print("TAMANEGI\n");

  tft.setCursor(0, 50);                       //カーソル位置                      
  tft.setTextSize(2);                         //サイズ
  tft.setTextColor(ST77XX_RED);               //赤
  tft.print("1.8inch LCD\n");
  tft.setTextColor(ST77XX_YELLOW);            //黄
  tft.print("Res=128 x 160\n");
  tft.setTextColor(ST77XX_BLUE);              //青
  tft.print("ST7735\n");
}

void loop()
{
}
結果

ST7735のサンプルスケッチが動作しました。

特別な機能スケッチ

<準備中>

コメント

タイトルとURLをコピーしました