番外編 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.h | micro:bit PXX | NRF52833 P0.XX |
A0(LEFT PAD) | 0 | 2 |
A1(MIDDLE PAD) | 1 | 3 |
A2(RIGHT PAD) | 2 | 4 |
A3(COL3) | 3 | 31 |
A4(COL1) | 4 | 28 |
PIN_BUTTON_A | 5 | 14 |
(COL4) | 6 | 37(P1.05) |
(COL2) | 7 | 11 |
(NFC2) | 8 | 10 |
(NFC1) | 9 | 9 |
A5(COL5) | 10 | 30 |
PIN_BUTTON_B | 11 | 23 |
| 12 | |
LED_BUILTIN | 13 | |
PIN_SPI_SCK | 13 | 17 |
PIN_SPI_MISO | 14 | 1 |
PIN_SPI_MOSI | 15 | 13 |
| 16 | 34(PI.02) |
3.3V | 17 | |
3.3V | 18 | |
PIN_WIRE_SCL | 19 | 26 |
PIN_WIRE_SDA | 20 | 32 |
(ROW1) | 21 | 21 |
(ROW2) | 22 | 22 |
(ROW3) | 23 | 15 |
(ROW4) | 24 | 24 |
(ROW5) | 25 | 19 |
(LOGO) | 26 | 36 |
(SPEAKER) | 27 | 0 |
(RUN_MIC) | 28 | 20 |
A6(MIC_IN) | 29 | 5 |
PIN_WIRE1_SDA(I2C_INT_SDA) | 30 | 16 |
PIN_WIRE1_SCL(I2C_INT_SCL) | 31 | 8 |
(COMBINED_SENSOR_INT) | 32 | 25 |
PIN_SERIAL_RX(RX) | 33 | 40(P1.08) |
PIN_SERIAL_TX(TX) | 34 | 6 |
カードエッジには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.
MODEL | HC-02 Slave |
Work band | 2.4G |
Communication interface | UART3.3V TTL |
Working voltage | 3.0~3.6V |
Baud rate | 1200~115200bps |
Communication level | 3.3V |
Communication current | 30mA |
The transmitting power | 6dBm (maximum) |
Reference distance | 10m |
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プロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/
・設計から実装までを系統的に説明するモデルベース開発/
・Arduinoを用いた実際の開発例
最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/
・コマンド・スクリプトの例が豊富で、動かして学べる!/
・超基本から解説。これから使いはじめる人にぴったり!/
・全編フルカラー、スクリーンショットも豊富!
Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/
2.ネットワークを構築する/
3.サーバーを構築する/
4.Webサーバーソフトをインストールする/
5.HTTPの動きを確認する/
6.プライベートサブネットを構築する/
7.NATを構築する/
8.DBを用いたブログシステムの構築/
9.TCP/IPによる通信の仕組みを理解する
C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。
本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。
1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説
・最新の技術が身につく! 今のJavaScriptの書き方・使い方
・絶対に知っておきたい! アニメーションとイベントの知識
・プログラミングの基本から実装方法まですべて学べる
図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。
これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。
C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。
Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/
第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/
第3部 配布プリント基板で体験!マイコンで動くフィルタ作り
日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現!
【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう
【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう
【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化
ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。
地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる!
地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開
Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。
ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。
ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。
Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。
専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。
攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc.
世界のトップはなぜプログラマーなのか?
ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場!
高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。
DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。
作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。
Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。
この本では,ベイズ統計学のきほんをやさしく紹介していきます。
白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81
無水エタノールP 500mlx2個パック(掃除)
ケイバ(KEIBA) マイクロニッパー MN-A04
サンハヤト SAD-101 ニューブレッドボード
白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02
[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠
|