HOME | Raspberry Pi | ビジネス書籍紹介 | 2026-01-04 (Sun) Today's Access : 216 Total : 1260914. Since 10 Sep. 2019

番外編 mirco:bit 磁気・加速度センサ
2023.05.01

YouTube でも紹介しています。画像をクリックすると再生できます。

micro:bit v2.21は、Nordic Semiconductor (ノルディック・セミコンダクター) の nRF52833チップ を搭載し、 磁気・加速度センサも LSM 303AGR と実用的な仕様になっています。 micro:bit は学習用デバイスと思っていたのですが、コスパに優れており、nRF52833を搭載していることから、 Arduino IDE や PlatoformIOなどの開発環境を使って、Arduino言語(C言語)による開発が可能です。
今回は、micro:bitに実装されている磁気・加速度センサを使うと同時に環境整備も行ってみました。

●micro:bit v2.21
これから購入するのであれば、v2.21がお薦めです。 新型のv2.21では性能がかなり向上していて、なにより旧型のv1系とはピンの仕様が異なります。


マイクロビット (micro:bit) v2のデータシート

Features
●Upgraded processor (nRF52833)
 ○64MHz Arm Cortex-M4 + FPU (over 4 times faster!)
 ○512KB Flash storage on board
 ○128KB RAM
●MEMS Microphone with LED indicator and on-board speaker
●5x5 LED matrix display
●Touch sensitive logo "button"
●Accelerometer/compass (LSM303AGR)
●Light and temperature sensors
●Sleep/off mode for batteries powered projects (w/ LED indicator)
●Up to 200mA of current for external accessories
●Bluetooth 5.0 radio allowing micro:bits to talk to each other
●Notched edge connector (easier to connect things like crocodile clips and conductive thread)
●Dimensions: 52mm x 42mm x 11.7mm




●micro:bit breadboard breakout board by Kitronik
回路を組む際には、micro:bitの20ピンのエッジコネクタをそのままブレッドボード上に展開できる とてもシンプルなKitronikのmicro:bit breadboard breakout boardが便利です。


ソースコードのビルドには、PlatformIOを使用しています。
Arduino開発環境構築 PlatformIO

まずはボード情報を確認してみます。
$ pio boards micro:bit
Platform: nordicnrf51
=======================================================
ID          MCU      Frequency Flash RAM  Name
----------- -------- --------- ----- ---- -------------
bbcmicrobit NRF51822 16MHz     256KB 16KB BBC micro:bit

Platform: nordicnrf52
===============================================================
ID             MCU       Frequency Flash RAM   Name
-------------- --------  --------- ----- ----- ----------------
bbcmicrobit_v2 NRF52833  64MHz     512KB 128KB BBC micro:bit V2
初期設定を行います。
$ mkdir ~/microBitV2
$ cd ~/microBitV2
$ pio init -b bbcmicrobit_v2
$ cat platformio.ini
[env:bbcmicrobit_v2]
platform = nordicnrf52
board = bbcmicrobit_v2
framework = arduino

ボード情報を確認しておきます。
$ cat ~/.platformio/platforms/nordicnrf52/boards/bbcmicrobit_v2.json
{
  "build": {
    "arduino":{
      "ldscript": "nrf52833_xxaa.ld"
    },
    "core": "nRF5",
    "cpu": "cortex-m4",
    "extra_flags": "-DARDUINO_BBC_MICROBIT_V2 -DNRF52833_XXAA",
    "f_cpu": "64000000L",
    "mcu": "nrf52833",
    "variant": "BBCmicrobitV2",
    "zephyr": {
      "variant": "bbc_microbit_v2"
    }
  },
  "connectivity": [
    "bluetooth"
  ],
  "debug": {
    "onboard_tools": [
      "cmsis-dap"
    ],
    "svd_path": "nrf52.svd",
    "openocd_extra_args": [
      "-c",
      "transport select swd;"
    ],
{
  "build": {
    "arduino":{
      "ldscript": "nrf52833_xxaa.ld"
    },
    "core": "nRF5",
    "cpu": "cortex-m4",
    "extra_flags": "-DARDUINO_BBC_MICROBIT_V2 -DNRF52833_XXAA",
    "f_cpu": "64000000L",
    "mcu": "nrf52833",
    "variant": "BBCmicrobitV2",
    "zephyr": {
      "variant": "bbc_microbit_v2"
    }
  },
  "connectivity": [
    "bluetooth"
  ],
  "debug": {
    "onboard_tools": [
      "cmsis-dap"
    ],
    "svd_path": "nrf52.svd",

ピン定義をみてみます。
$ cat ~/.platformio/packages/framework-arduinonordicnrf5/variants/BBCmicrobitV2/variant.h
#ifndef _MICROBIT_V2_
#define _MICROBIT_V2_

// Master clock frequency

#define VARIANT_MCK (64000000ul)

#include "WVariant.h"

#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus

// Number of pins defined in PinDescription array

#define PINS_COUNT			(35)
#define NUM_DIGITAL_PINS	(35)
#define NUM_ANALOG_INPUTS	(7)
#define NUM_ANALOG_OUTPUTS	(0)

// LEDs

#define PIN_LED             (13)
#define LED_BUILTIN         PIN_LED

// Buttons

#define PIN_BUTTON_A		(5)
#define PIN_BUTTON_B		(11)

// Analog pins

#define PIN_A0				(0)
#define PIN_A1				(1)
#define PIN_A2				(2)
#define PIN_A3				(3)
#define PIN_A4				(4)
#define PIN_A5				(10)
#define PIN_A6				(29)

#define ADC_RESOLUTION 10
static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;

// Serial

#define PIN_SERIAL_RX		(33)
#define PIN_SERIAL_TX		(34)

// SPI

#define SPI_INTERFACES_COUNT 1

#define PIN_SPI_MISO		(14)
#define PIN_SPI_MOSI		(15)
#define PIN_SPI_SCK			(13)

// Wire Interfaces (external and internal)

#define WIRE_INTERFACES_COUNT 2

#define PIN_WIRE_SDA		(20)
#define PIN_WIRE_SCL		(19)

#define PIN_WIRE1_SDA       (30)
#define PIN_WIRE1_SCL       (31)

#ifdef __cplusplus
}
#endif // __cplusplus

#endif

nRF52833のピン番号 P0.xx も確認してみます。
$ cat ~/.platformio/packages/framework-arduinonordicnrf5/variants/BBCmicrobitV2/variant.cpp

micro:bitのピン番号とNRF52833のピンの対比は下記のようになっています。
micro:bit V2の場合

variant.hmicro:bit
PXX
NRF52833
P0.XX
A0(LEFT PAD)02
A1(MIDDLE PAD)13
A2(RIGHT PAD)24
A3(COL3)331
A4(COL1)428
PIN_BUTTON_A514
(COL4)637(P1.05)
(COL2)711
(NFC2)810
(NFC1)99
A5(COL5)1030
PIN_BUTTON_B1123
12
LED_BUILTIN13
PIN_SPI_SCK1317
PIN_SPI_MISO141
PIN_SPI_MOSI1513
1634(PI.02)
3.3V17
3.3V18
PIN_WIRE_SCL1926
PIN_WIRE_SDA2032
(ROW1)2121
(ROW2)2222
(ROW3)2315
(ROW4)2424
(ROW5)2519
(LOGO)2636
(SPEAKER)270
(RUN_MIC)2820
A6(MIC_IN)295
PIN_WIRE1_SDA(I2C_INT_SDA)3016
PIN_WIRE1_SCL(I2C_INT_SCL)318
(COMBINED_SENSOR_INT)3225
PIN_SERIAL_RX(RX)3340(P1.08)
PIN_SERIAL_TX(TX)346

カードエッジにはP0からP20までの信号が引き出されています。
シリアルピンは、(RX,TX) = (33,34) なので、USB端子以外からは接続することはできません。
★P0(ANALOG IN)/P1(ANALOG IN)/P2(ANALOG IN):ADC付きGPIO
アナログ‐デジタルコンバータ(ADC)付きGPIO(汎用デジタル入出力)
この3つの端子は全て同じ機能を持っています。汎用入出力と呼ばれ、いろいろなものに使うことができます。 アナログ‐デジタル変換器(ADC)と呼ばれるものを使ってアナログ電圧を読み取る機能も備えています。
★ADC (A0~A5)
analogRead() に使えるピンは以下の通りです。デフォルトで 10 bit (0~1023) の ADC です。
DAC に使えるピンはありません。
★3V:3ボルト電源入出力
電源出力:microbitがUSBまたはバッテリーで動いている場合、3Vピンを電源出力として使用して周辺機器に電源を供給することができます。
電源入力:microbitがUSBまたはバッテリーで電源供給されていない場合、電源入力として3Vの端子を使ってmicorbitに電源を供給することができます。


最初に軽く操作してみます。

■1.Bottun A, B
void setup() {
	Serial.begin(115200);
	while (!Serial);
	pinMode(PIN_BUTTON_A, INPUT_PULLUP);
	pinMode(PIN_BUTTON_B, INPUT_PULLUP);
}

void loop() {
	if (digitalRead(PIN_BUTTON_A) == LOW) {
		Serial.println("A Button!");
		delay(200);
	}
	if (digitalRead(PIN_BUTTON_B) == LOW) {
		Serial.println("B Button!");
		delay(200);
	}
}
$ pio device list
/dev/ttyACM0
------------
Hardware ID: USB VID:PID=0D28:0204 SER=XXXXXX LOCATION=1-1:1.1
Description: BBC micro:bit CMSIS-DAP - mbed Serial Port

/dev/ttyAMA0
------------
Hardware ID: 3f201000.serial
Description: ttyAMA0

$ pio device monitor -p /dev/ttyACM0 -b 115200
A Button!
B Button!

■2.LED MATRIX
5x5のLEDマトリクスはv1.x系にもv2にも存在します。 しかし、v1.x系はROW3端子、COLUMN9端子の非対称な構成で12端子を使って制御、v2系はROW5端子、COLUMN5端子の直交的な配置で10端子で制御です。
LED Matrix
const uint8_t cols[5] = {4, 7, 3, 6, 10};
const uint8_t rows[5] = {21, 22, 23, 24, 25};

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

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

adafruit/Adafruit_Microbit

■I2Cスキャニング
micro:bitは2系統のI2Cを実装していて、オンボードのISCを走査するにはWire1を、外部I2C接続にはWireを指定します。 Wire1のピン番号は (SDA,SCL) = (30,31) で、エッジコネクタには引き出されていません。
#include <Wire.h>

void setup()
{
  Wire1.begin();
  Wire1.setClock(400000);    // I2C fast mode, 400kHz

  Serial.begin(115200);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    Wire1.beginTransmission(address);
    error = Wire1.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);
}
$ pio device monitor -p /dev/ttyACM0 -b 115200
Scanning...
I2C device found at address 0x19 !
I2C device found at address 0x1E !
I2C device found at address 0x70 !
I2C device found at address 0x72 !
done

0x19 と 0x1E がオンボード磁気・加速度センサのI2Cアドレスです。

●磁気・加速度センサ LSM 303AGR

・I2C 7-bit addresses 0x19 & 0x1E
・±50 gauss magnetic dynamic range
・1.5 mGauss magnetic sensitivity
・Accelerometer ranges: ±2/±4/±8/±16 g
・As little as 1mg accelerometer sensitivity


stm32duino/LSM303AGR
gitHubには、LSM303など類似のソースコードがアップされていますが、LSM303AGRを使用しないと正常に動作しません。
srcディレクトリ配下のすべてのソースファイルとexamplesディレクトリのX_NUCLEO_IKS01A2_LSM303AGR_DataLog_Terminal.ino を PlatformIO の srcディレクトリにコピーしてビルド、micro:bit に書き込み、デバイスモニターで計測結果を表示します。

$ pio device monitor -p /dev/ttyACM0 -b 115200
| Acc[mg]: 12 -974 43 | Mag[mGauss]: -454 132 240 | Temp[C]: 23.00 |
| Acc[mg]: 12 -974 39 | Mag[mGauss]: -462 127 231 | Temp[C]: 22.75 |
| Acc[mg]: 16 -970 47 | Mag[mGauss]: -462 130 243 | Temp[C]: 23.00 |
| Acc[mg]: 12 -974 35 | Mag[mGauss]: -450 135 241 | Temp[C]: 22.75 |

■Calibration
磁気・加速度センサの補正を行うには、センサーをゆっくりと一回転させて、測定値の最大・最小値を求める必要があります。 その際に、micro:bitからUSBケーブルを介して測定値を表示するのは利便性が良くありません。
最初に、micro:bit搭載のBLEを使ってパソコンとペアリングしようとしましたが、BLEライブラリのビルドがうまくいきません。 次に、SoftwareSerialでBluetooth RFトランシーバに接続して、データを飛ばそうと考えましたが、SoftwareSerialもビルドできません。 最終的に、I2C・UARTブリッジを介して、Bluetooth RFトランシーバモジュールからパソコンへデータを飛ばします。
Calibration


まずは、I2C・UARTブリッジ SC16IS750 のテストを行います。

●SC16IS750 ブレイクアウト
SC16IS750を搭載した、I2Cをシリアルに変換するモジュールです。マイコンのI2Cバスに接続してシリアル通信ができます。 マイコンのシリアルポートが不足している場合などの拡張用に便利です
・Single full duplex UART
・Optional I 2 C bus or SPI interface
・Power supply: 3.3 V or 2.5 V
・Industrial temperature range: -40°C to +95°C
・Noise filter on SCL/SDA input
・2.2 SPI characteristics
・SC16IS750 supports 4 Mbit/s maximum SPI clock speed
・slave mode only
・SPI mode 0

SC16IS750には、14.7456Mhzのクリスタルと5V→3.3Vのレギュレータ (MIC5219-3.3YM5)が実装されています。
最大通信速度は14,745,600/16 = 921,600bpsですので、115,200bpsは余裕で行えます。

●Wireing for i2c

マイクロビットの場合は、SC16IS750(SCL,SDA)→micro:bit(19,20) になります。

i2c address selection


SC16IS750 ブレイクアウトをブレッドボードで使用しやすいように小さなユニバーサル基板にはんだ付けしています。

A0,A1,I2C/SPIを3.3Vに接続させて、I2Cアドレスを 0x48 (0x90>>1)に設定しています。


配線した様子です。Raspberry Pi のGPIOに余計な線が写っていますが、関係するのは、SC16IS750(GND,TX)→RasPi(GND,RX)です。

外部I2C(Wire)を走査してみます。
$ pio device monitor -p /dev/ttyACM0 -b 115200
Scanning...
I2C device found at address 0x48 !
done

次に、I2C・UARTブリッジにより。UART送信するプログラムを書きます。
SC16IS750データシートをみてソースコードを組み立てるのは面倒なので、下記の2つのサイトを参考にコードを編集しました。
Arduino のI2CをUARTに変換
andriyadi/UART_Bridge

i2cUartBridge.ino
#include <Wire.h>

const uint8_t slaveAddress = 0x48;

//General Registers
#define     SC16IS750_REG_RHR        (0x00)
#define     SC16IS750_REG_THR        (0X00)
#define     SC16IS750_REG_FCR        (0X02)
#define     SC16IS750_REG_LCR        (0X03)
#define     SC16IS750_REG_MCR        (0X04)
#define     SC16IS750_REG_LSR        (0X05)
#define     SC16IS750_REG_MSR        (0X06)
#define     SC16IS750_REG_TXLVL      (0X08)
#define     SC16IS750_REG_RXLVL      (0X09)

//Special Registers
#define     SC16IS750_REG_DLL        (0x00)
#define     SC16IS750_REG_DLH        (0X01)

//enhanced register set
const uint8_t EFR = (0x02<<3);

//Enhanced Registers
#define     SC16IS750_REG_EFR        (0X02)

//Application Related 
#define     SC16IS750_CRYSTCAL_FREQ (14745600UL) 

uint8_t mData[8];

void WriteRegister(uint8_t reg_addr, uint8_t val)
{
	Wire.beginTransmission(slaveAddress);
	Wire.write((reg_addr<<3));
	Wire.write(val);
	Wire.endTransmission(1);
}

uint8_t ReadRegister(uint8_t reg_addr)
{
	uint8_t result;
	Wire.beginTransmission(slaveAddress);
	Wire.write((reg_addr<<3));
	Wire.endTransmission(0);
	Wire.requestFrom(slaveAddress,(uint8_t)1);
	result = Wire.read();
	return result;
}

uint16_t SetBaudrate(uint32_t baudrate) //return error of baudrate parts per thousand
{
	uint16_t divisor;
	uint8_t prescaler;
	uint32_t actual_baudrate;
	int16_t error;
	uint8_t temp_lcr;
	if ( (ReadRegister(SC16IS750_REG_MCR)&0x80) == 0) { //if prescaler==1
		prescaler = 1;
	} else {
		prescaler = 4;
	}

	divisor = (SC16IS750_CRYSTCAL_FREQ/prescaler)/(baudrate*16);

	temp_lcr = ReadRegister(SC16IS750_REG_LCR);
	temp_lcr |= 0x80;
	WriteRegister(SC16IS750_REG_LCR,temp_lcr);
	//write to DLL
	WriteRegister(SC16IS750_REG_DLL,(uint8_t)divisor);
	//write to DLH
	WriteRegister(SC16IS750_REG_DLH,(uint8_t)(divisor>>8));
	temp_lcr &= 0x7F;
	WriteRegister(SC16IS750_REG_LCR,temp_lcr);

	actual_baudrate = (SC16IS750_CRYSTCAL_FREQ/prescaler)/(16*divisor);
	error = ((float)actual_baudrate-baudrate)*1000/baudrate;
	return error;
}

void setup()
{
	Serial.begin(115200);
	Wire.begin();

	//Initialize Device
	//divisor latch enabled
	WriteRegister(SC16IS750_REG_LCR, 0x83);

	//set Baud Rate 
	SetBaudrate(115200);

	//divisor latch disabled
	WriteRegister(SC16IS750_REG_LCR, 0x03);

	//reset TX and RX FIFO, enable the transmit and receive FIFO
	WriteRegister(SC16IS750_REG_FCR, 0x07);
}

void loop()
{
	uint8_t i, n, data; 

	if (Serial.available() > 0) {
		char c = Serial.read();
		Serial.print(c);
		WriteRegister(SC16IS750_REG_THR, c);
	}
	delay(1);
}

デバイスモニタを起動して、micro:bit に接続します。
$ pio device monitor -p /dev/ttyACM0 -b 115200
もう1つデバイスモニタを起動して、SC16IS750 に接続します。
$ pio device monitor -p /dev/ttyAMA0 -b 115200

micro:bit に 'Hello' と送信すると(上)、I2C・UARTブリッジを介して、'Hello' の文字が返されます(下)。


今度は、I2C・UARTブリッジの接続先を Bluetooth UART トランシーバに置き換えて、パソコンに接続してます。

●HC-02 Bluetooth Serial Port Module
Bluetooth 2.0 serial port module.
MODELHC-02 Slave
Work band2.4G
Communication interfaceUART3.3V TTL
Working voltage3.0~3.6V
Baud rate1200~115200bps
Communication level3.3V
Communication current30mA
The transmitting power6dBm (maximum)
Reference distance10m

HC-02は動作電圧がを3.0~3.6Vなので、5V電源につなぐと壊れます。5V系マイコンには、HC-05やHC-06を検討してください。

ATコマンドモードによるモジュールの設定
User Manual of HC-02 V1.1 Bluetooth Serial Port ...

ATコマンドモードに切り替えるには、KEYを3.3Vに接続します。
HC-02(RXD,TXD,GND,VCC,KEY)→RaspberryPi(TX,RX,GND,3V,3V)につなぎます。

通信速度の初期設定9600bpsとなっています。PlatformIOのデバイスモニタで接続します。
$ pio device monitor -p /dev/ttyAMA0 -b 9600
テスト接続します。
AT
OK

バージョンを確認します。
AT+VERSION
www.hc01.comV1.1
20171130

現在の設定を確認します。
AT+RX
OK+NAME=HC-02
OK+PIN=1234
OK+ADDR=XXXXXXXXXXXX
OK+BAUD=9600

ボーレートを変更します。
AT+BAUD8
OK115200

再接続しなおします。
$ pio device monitor -p /dev/ttyAMA0 -b 115200

Bluetooth名を変更します。
AT+NAMEhc_02_microbit
OKsetname

PIN番号を変更します。
AT+PIN5678
OKsetPIN

再度設定内容を確認します。
AT+RX
OK+NAME=hc_02_microbit
OK+PIN=5678
OK+ADDR=XXXXXXXXXXXX
OK+BAUD=115200

HCシリーズのATコマンド仕様は機種により異なるのでデータシートで確認してください。

設定が完了したところで、SC16IS750をつなぎます。

SC16IS750 の TX を HC-02 の RXD につないでいます。


WINDOWSパソコンから Bleutoothデバイスの追加を行ってみます。


ペアリングします。設定変更した、PINコードを入力します。


ペアリングが完了するとデバイスマネージャーのポート(COMとLPT)に仮想COMポートが追加されます。


TeraTermを起動して、COMポート経由で接続します。


先程のUART接続と同様の結果が得られます。


電池を取り付けて独立させて動かします。


なんとかブレッドボード1枚に収まっています。


正面から見た様子です。左が micro:bit v2.21 右が HC-02 です。


背面です。一番左が 3.3V降圧モジュール、隣が3.7Vリチウムポリマー電池。右端が SC16IS750 です。


再度、磁気・加速度センサ LSM 303AGR のソースコードをビルドして micro:bit に書き込みます。 3.3V降圧回路は最大100mAの設計ですが、単独で正常に起動しました。 TeraTermをCOMポート経由で接続して結果を表示しています。
exampleのソースコードは下記のように変更しています。
#include <Wire.h>
#include <stdarg.h>

const uint8_t slaveAddress = 0x48;

//General Registers
#define     SC16IS750_REG_RHR        (0x00)
#define     SC16IS750_REG_THR        (0X00)
#define     SC16IS750_REG_FCR        (0X02)
#define     SC16IS750_REG_LCR        (0X03)
#define     SC16IS750_REG_MCR        (0X04)
#define     SC16IS750_REG_LSR        (0X05)
#define     SC16IS750_REG_MSR        (0X06)
#define     SC16IS750_REG_TXLVL      (0X08)
#define     SC16IS750_REG_RXLVL      (0X09)

//Special Registers
#define     SC16IS750_REG_DLL        (0x00)
#define     SC16IS750_REG_DLH        (0X01)

//enhanced register set
const uint8_t EFR = (0x02<<3);

//Enhanced Registers
#define     SC16IS750_REG_EFR        (0X02)

//Application Related 
#define     SC16IS750_CRYSTCAL_FREQ (14745600UL) 

uint8_t mData[8];

void WriteRegister(uint8_t reg_addr, uint8_t val)
{
	Wire.beginTransmission(slaveAddress);
	Wire.write((reg_addr<<3));
	Wire.write(val);
	Wire.endTransmission(1);
}

uint8_t ReadRegister(uint8_t reg_addr)
{
    uint8_t result;
	Wire.beginTransmission(slaveAddress);
	Wire.write((reg_addr<<3));
	Wire.endTransmission(0);
	Wire.requestFrom(slaveAddress,(uint8_t)1);
	result = Wire.read();
	return result;
}

uint16_t SetBaudrate(uint32_t baudrate) //return error of baudrate parts per thousand
{
    uint16_t divisor;
    uint8_t prescaler;
    uint32_t actual_baudrate;
    int16_t error;
    uint8_t temp_lcr;
    if ( (ReadRegister(SC16IS750_REG_MCR)&0x80) == 0) { //if prescaler==1
        prescaler = 1;
    } else {
        prescaler = 4;
    }

    divisor = (SC16IS750_CRYSTCAL_FREQ/prescaler)/(baudrate*16);

    temp_lcr = ReadRegister(SC16IS750_REG_LCR);
    temp_lcr |= 0x80;
    WriteRegister(SC16IS750_REG_LCR,temp_lcr);
    //write to DLL
    WriteRegister(SC16IS750_REG_DLL,(uint8_t)divisor);
    //write to DLH
    WriteRegister(SC16IS750_REG_DLH,(uint8_t)(divisor>>8));
    temp_lcr &= 0x7F;
    WriteRegister(SC16IS750_REG_LCR,temp_lcr);

    actual_baudrate = (SC16IS750_CRYSTCAL_FREQ/prescaler)/(16*divisor);
    error = ((float)actual_baudrate-baudrate)*1000/baudrate;

    return error;

}

void SC16IS750_init()
{
	//Initialize Device
	//divisor latch enabled
	WriteRegister(SC16IS750_REG_LCR, 0x83);

	//set Baud Rate 
	SetBaudrate(115200);

	//divisor latch disabled
	WriteRegister(SC16IS750_REG_LCR, 0x03);

	//reset TX and RX FIFO, enable the transmit and receive FIFO
	WriteRegister(SC16IS750_REG_FCR, 0x07);
}

void debug_print(const char* format, ...)
{
	va_list args;
	char buf[256];

	va_start(args, format);
	vsprintf(buf,format,args);
	va_end(args);
//  Serial.print(buf);
	for (char *pt = buf; *pt != 0x0; pt++) {
		WriteRegister(SC16IS750_REG_THR, *pt);
	}
}

// Includes.
#include <LSM303AGR_ACC_Sensor.h>
#include <LSM303AGR_MAG_Sensor.h>

#define ARDUINO_SAM_DUE

#if defined(ARDUINO_SAM_DUE)
#define DEV_I2C Wire1   //Define which I2C bus is used. Wire1 for the Arduino Due
#define SerialPort Serial
#else
#define DEV_I2C Wire    //Or Wire
#define SerialPort Serial
#endif

// Components.
LSM303AGR_ACC_Sensor Acc(&DEV_I2C);
LSM303AGR_MAG_Sensor Mag(&DEV_I2C);

void setup() {
  // Led.
  pinMode(13, OUTPUT);

  // Initialize serial for output.
  SerialPort.begin(115200);
	Wire.begin();
  
  // Initialize I2C bus.
	DEV_I2C.begin();
	SC16IS750_init();

  // Initlialize components.
  Acc.begin();
  Acc.Enable();
  Acc.EnableTemperatureSensor();
  Mag.begin();
  Mag.Enable();
}

void loop() {
  // Led blinking.
  digitalWrite(13, HIGH);
  delay(250);
  digitalWrite(13, LOW);
  delay(250);

  // Read accelerometer LSM303AGR.
  int32_t accelerometer[3];
  Acc.GetAxes(accelerometer);

  // Read temperature LSM303AGR.
  float temperature;
  Acc.GetTemperature(&temperature);
  
  // Read magnetometer LSM303AGR.
  int32_t magnetometer[3];
  Mag.GetAxes(magnetometer);

  // Output data.
  debug_print("| Acc[mg]: %d %d %d ",accelerometer[0],accelerometer[1],accelerometer[2]);
  debug_print("| Mag[mGauss]: %d %d %d ",magnetometer[0],magnetometer[1],magnetometer[2]);
//debug_print("| Temp[C]: %4.2f |\r\n",temperature);
  int hdec = (int)temperature;
  int ldec = (int)(temperature*100 - hdec*100);
  debug_print("| Temp[C]: %d.%d |\r\n",hdec,ldec);
}

【補足:BLE SoftDevice S130】
micro:bit(マイクロビット)は、オンボードの2.4GHzトランシーバーが内臓されており、Bluetoothもそれによって機能します。
micro:bitでBLEアプリの開発環境の構築

PlatformIO開発環境にも BLE SoftDevice S130 が用意されています・
$ ls ~/.platformio/packages/framework-arduinonordicnrf5/cores/nRF5/SDK/components/softdevice/s130/hex
s130_nrf51_2.0.1_license-agreement.txt
s130_nrf51_2.0.1_softdevice.hex
しかしこれが nRF52833 で動作するかはわかりません。
s130_nRF51_201.zip

■参考文献
ATmega328でSC16IS750を使うi2cインタフェース
Arduinoを使いBluetooth通信をやってみる!HC-05/HC-06 Bluetoothモジュールの使い方!
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2022.05.27 まずはロボットカーでお勉強
2022.06.10 第1回テスト環境構築
2022.07.02 第2回テレメトリ通信
2023.05.01 番外編 micro:bit磁気加速度センサ
2024.06.23 第3回 機体制御 雑談
2024.07.23 第4回 慣性センサ
2025.02.22 第5回 自作シリアル・プロポ
2025.03.10 簡易二足歩行ロボット
2025.04.24 第6回 自作TELNET・プロポ
2025.10.23 M5STACK BugC

たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」 「一念発起して何かを始めても、いつも三日坊主で終わってしまう」 「色んなことを先延ばしにしたまま、時間だけが過ぎていく」 そこで本書では、そんな著者が独自に開発した、 まったく新しい目標達成メソッド「100日デザイン」について、 その知識と技術を、余すところなくご紹介します。

まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。 ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。

今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。

ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。 29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!

【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。 基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説! 500以上のサンプルを掲載。実行結果も確認。 全24章の包括的なチュートリアル。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。

Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード

電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)

Copyright © 2011-2027 Sarako Tsukiyono All rights reserved®.