Arduino環境でAE-TYBLE16のピンファンクションを確かめる

目的

AE-TYBLE16こと太陽誘電製EYSGJNAWY-WX(SoCはNordic Semiconductor製nRF51822)のピンファンクションを確かめる.EYSGJNAWY-WXのデータシートのPin Descriptionでは,ディジタル入出力とUARTのみしか記載がないが,これは太陽誘電アプリケーションソフトウェア上でのつくりと思われる.SoftDeviceを書き込んだあとは,太陽誘電アプリケーションソフトウェアが載っていないので,EYSGJNZのデータシートのものと同等となるはずである.

  1. 事前にSoftDevice書込み等,Arduino IDEで作成したArduinoスケッチが書込みできる環境の整備:
    STM32 Nucleoを用いたnRF51向けのArduino開発環境をつくる
  2. GPIOやADC,シリアルインターフェースの機能確認(本記事)
  3. BLEの接続/非接続の確認:
    Arduino環境でAE-TYBLE16のBLEを始める(その1:接続/非接続)
  4. BLE経由のLチカ確認:
    Arduino環境でAE-TYBLE16のBLEを始める(その2:BLE経由のLチカ)
  5. 照度センサー明暗判定原理試作:
    Arduino環境でAE-TYBLE16のBLEペリフェラルデバイス~明暗判定編~
  6. リードスイッチドア開閉判定原理試作:
    Arduino環境でAE-TYBLE16のBLEペリフェラルデバイスを作る~ドア開閉判定編~

結論

下表のとおりで,アナログ入力のときはAIN#の番号ではなく,P0.#のディジタル入出力の番号を指定することに注意ある(ただし,後述のvariant.hを編集しない場合).

また,シリアルインターフェースについては,variant.hを編集することで任意のピンに機能を割り当てることができる.下表では,variant.hを編集していないデフォルトの場合を記載する.

AE-TYBLE# nRF51822# Arduino#
(Digital)
Arduino#
(Analog)
Arduino#
(Serial I/F)
備考
DIP1 P0.19 19 - *
DIP2 - - - - SWDIO
DIP3 - - - - SWDCLK
DIP4 P0.25 25 - SS デフォルトではSPIのSS
DIP5 P0.03
AIN4
3 3 *
DIP6 P0.01
AIN2
1 1 TX デフォルトではUARTのTX(AE-TYBLE16が送信)
DIP7 P0.02
AIN3
2 2 *
DIP8 P0.00 0 - RX デフォルトではUARTのRX(AE-TYBLE16が受信)
DIP9 P0.05
AIN6
5 5 *
DIP10 P0.06
AIN7
6 6 *
DIP11 P0.04
AIN5
4 4 *
DIP12 P0.21 21 - SCL デフォルトではI2CのSCL
DIP13 - - - - GND
DIP14 - - - - VCC(1.8~3.6[V])
DIP15 P0.23 23 - MOSI デフォルトではSPIのMOSI
DIP16 P0.17 17 - *

本記事で紹介するおもな環境は下表のとおり:

ハードウェア名称 規格 製造会社 備考
BLEモジュール AE-TYBLE16 秋月電子通商 購入時1,280JPY
太陽誘電製EYSGJNAWY-WX(SoCはNordic Semiconductor製nRF51822)
デバッガー NUCLEO-L053R8STSW-LINK009 2.0.2 STMicroelectronics タダ
201X年にSTの営業が会社に来たときのもの,ST-Link/V2-1として使用する
BLEモジュール用ソケット 2227P-16G-03 寬德 購入時100JPY
ハンダ不要でブレッドボード挿入に使える
ブレッドボード BB-801 万捷电子 ブレッドボードなら何でもよい
ジャンパーケーブル(オス・メス) DG01032-0024-RD-015など 協威亞洲 間違えないように色をわけたほうがよい
C-17228のほうが安い
USBケーブル(mini B) LDUC1011-1.5m EverU Electronics 充電専用でなければ何でもよい
黄緑色LED OSNG5113A,2.0[V],20[mA] OptoSupply 購入時500JPY
半固定ボリューム 3362P-1-103LF,10[kΩ],0.5[W] BOURNS 購入時50JPY
ホストPC マザーボードB450 AORUS M,CPU:Ryzen 7 3700X,メモリー:32[GB] -
IDE Arduino IDE 1.8.19 ARDUINO
nRF5ライブラリー Nordic Semiconductor nRF5 Boardsパッケージ Sandeep Mistry
Nordic SoftDevice S130 2.0.1 Nordic Semiconductor BLEプロトコルスタック
ホストPCのOS Windows 10 Pro 64ビット版 Microsoft 英語版(インターナショナル)

また,nRF5ライブラリーの設定は以下のとおり:

項目名 設定値 備考
ボード Generic nRF51
Chip 32kB RAM, 256kB flash (xxac) データシートよりEYSGJNZWYは32kB
SoftDevice S130
Low Frequency RC Oscillator データシートよりEYSGJNZWYは水晶振動子が未実装で内蔵RC発振回路で代替指示
ポート COMn 環境による
Programmer ST-Link V2-1 (ST-Link On-Board) ☞以前の私の記事参照

詳細

ディジタル出力の確認

黄緑色LEDには,電流制限抵抗100[Ω]程度を直列に挿入したほうがよいが,簡易的な確認のために省略した.

Arduinoで指定するpinMode関数やdigitalWrite関数の第1引数であるピン番号は,nRF51822のピン名称の数字を指定する.たとえば,AE-TYBLE16のDIP1はnRF51822のP0.19が対応しており,ArduinoではP0.19の19をピン番号に指定する.

AE-TYBLE16のDIP1~DIP16の順に黄緑色LEDを接続して,以下のArduinoスケッチにて順番に点滅することができた.ディジタル入力は,上記にてディジタル出力が確認できたため確認を省略する.

/* DIP1からDIP16へ順番に並べたピン番号 */
int led_nr[] = {19, 25, 3, 1, 2, 0, 5, 6, 4, 21, 23, 17};

void setup() {
  for (int i = 0; i < (int)sizeof(led_nr) / sizeof(led_nr[0]); i++)
  {
    pinMode(led_nr[i], OUTPUT);
  }
}

void loop() {
  for (int i = 0; i < (int)sizeof(led_nr) / sizeof(led_nr[0]); i++)
  {
    for (int j = 0; j < 2; j++)
    {
      digitalWrite(led_nr[i], 0 == (j % 2) ? HIGH : LOW);
      delay(100);
    }
  }
}

ディジタル出力確認回路(写真)

アナログ入力

黄緑色LEDには,電流制限抵抗100[Ω]程度を直列に挿入したほうがよいが,簡易的な確認のために省略した.

Arduinoで指定するpinMode関数やanalogRead関数の第1引数であるピン番号は,nRF51822のピン名称の数字を指定する.たとえば,AIN4の場合は4ではなくP0.03の3を指定することに注意.また,分解能の指定(analogReadResolution関数)の範囲は,データシートから8,9または10ビットであり,デフォルトが10ビットとなっている.

ADC input 4ピン

#include <math.h>

#define AD_CONV_RES (10)
#define AD_VAL_MAX (pow(2, AD_CONV_RES) - 1)

void setup() {
  pinMode(19, OUTPUT);                /* DIP1(P0.19) */
  pinMode(3, INPUT);                  /* DIP5(P0.03,AIN4) */
  analogReference(AR_DEFAULT);        /* 0~VDD[V]の範囲 */
  analogReadResolution(AD_CONV_RES);  /* 分解能10ビット(0~1023) */
}

void loop() {
  /* DIP5の電圧が2.0[V]を超えたらDIP1のLEDを点灯する */
  if ((int32_t)((2.0 * AD_VAL_MAX) / 3.3) <= analogRead(3))
  {
    digitalWrite(19, HIGH);
  }
  else
  {
    digitalWrite(19, LOW);
  }
  delay(100);
}

アナログ入力確認回路(写真)

また,本記事ではボードにGeneric nRF51を指定しているため,以下のファイルを編集することで,ピン名称A0A5にP0.#のディジタル入出力の番号を割り当てることでArduino系列のボードと同等に操作できる.

%USERPROFILE%\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0\variants\Generic\variant.h

以下は,修正前のデフォルトの値であるが,AE-TYBLE16とはひとつも適合していない(ADC_RESOLUTIONを除く).

/*
 * Analog pins
 */
#define PIN_A0               (1) // P0.01
#define PIN_A1               (2) // P0.02
#define PIN_A2               (3) // P0.03
#define PIN_A3               (4) // P0.04
#define PIN_A4               (5) // P0.05
#define PIN_A5               (6) // P0.06

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 ;
#if defined(NRF52_SERIES)
#define ADC_RESOLUTION    14
#else
#define ADC_RESOLUTION    10
#endif

参照電圧,分解能,ピン番号割当設定のソースコード

Nordic Semiconductor nRF5 Boardsパッケージの追加で導入される以下のディレクトリー以下にソースコードがある(今回はSoCがnRF51822であるため,nRF51関連のソースコードを追う).

%USERPROFILE%\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0\

参照電圧

参照電圧は,cores\nRF5\wiring_analog_nRF51.c内にあるanalogReference関数で設定する.

/*
 * Internal VBG Reference is 1.2 V.
 * External References AREF0 and AREF1 should be between 0.83 V - 1.3 V.
 *
 * Warning : ADC should not be exposed to > 2.4 V, calculated after prescaling.
 *           GPIO pins must not be exposed to higher voltage than VDD + 0.3 V.
 */
void analogReference( eAnalogReference ulMode )
{
  switch ( ulMode ) {
    case AR_VBG:
      // 1.2 Reference, 1/3 prescaler = 0 V - 3.6 V range
      // Minimum VDD for full range in safe operation = 3.3V
      adcReference = ADC_CONFIG_REFSEL_VBG;
      adcPrescaling = ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling;
      break;

    case AR_SUPPLY_ONE_HALF:
      // 1/2 VDD Reference, 2/3 prescaler = 0 V - 0.75VDD range
      adcReference = ADC_CONFIG_REFSEL_SupplyOneHalfPrescaling;
      adcPrescaling = ADC_CONFIG_INPSEL_AnalogInputTwoThirdsPrescaling;
      break;

    case AR_EXT0:
      // ARF0 reference, 2/3 prescaler = 0 V - 1.5 ARF0
      adcReference = ADC_CONFIG_REFSEL_External | (ADC_CONFIG_EXTREFSEL_AnalogReference0 << ADC_CONFIG_EXTREFSEL_Pos);
      adcPrescaling = ADC_CONFIG_INPSEL_AnalogInputTwoThirdsPrescaling;
      break;

    case AR_EXT1:
      // ARF1 reference, 2/3 prescaler = 0 V - 1.5 ARF1
      adcReference = (ADC_CONFIG_REFSEL_External | ADC_CONFIG_EXTREFSEL_AnalogReference1 << ADC_CONFIG_EXTREFSEL_Pos);
      adcPrescaling = ADC_CONFIG_INPSEL_AnalogInputTwoThirdsPrescaling;
      break;

    case AR_SUPPLY_ONE_THIRD:
    case AR_DEFAULT:
    default:
      // 1/3 VDD Reference, 1/3 prescaler = 0 V - VDD range
      adcReference = ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling;
      adcPrescaling = ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling;
      break;
  }
}

本記事ではデフォルトの範囲0~VDD(3.3)[V]の範囲となる設定AR_DEFAULTとした.

分解能

analogReadResolution関数自体は,cores\nRF5\wiring_analog_nRF51.c内に定義があり,初期値が10ビットを示す10となっている.

static uint32_t readResolution = 10;

void analogReadResolution( int res )
{
  readResolution = res;
}

実際にこの分解能の設定が読み込まれるのは,同ファイルcores\nRF5\wiring_analog_nRF51.c内のanalogRead関数で,以下のようになっている

uint32_t analogRead( uint32_t ulPin )
{
  uint32_t pin = ADC_CONFIG_PSEL_Disabled;
  uint32_t adcResolution;
  uint32_t resolution;
<<<略>>>
  if (readResolution <= 8) {
    resolution = 8;
    adcResolution = ADC_CONFIG_RES_8bit;
  } else if (readResolution <= 9) {
    resolution = 9;
    adcResolution = ADC_CONFIG_RES_9bit;
  } else {
    resolution = 10;
    adcResolution = ADC_CONFIG_RES_10bit;
  }
<<<略>>>
}

ピン番号割当

analogRead関数の引数で与えられたuint32_t ulPinを変換するswitch文がある.

uint32_t analogRead( uint32_t ulPin )
{
  uint32_t pin = ADC_CONFIG_PSEL_Disabled;
<<<略>>>
  if (ulPin >= PINS_COUNT) {
    return 0;
  }

  ulPin = g_ADigitalPinMap[ulPin];

  switch ( ulPin ) {
    case 26:
      pin = ADC_CONFIG_PSEL_AnalogInput0;
      break;

    case 27:
      pin = ADC_CONFIG_PSEL_AnalogInput1;
      break;

    case 1:
      pin = ADC_CONFIG_PSEL_AnalogInput2;
      break;

    case 2:
      pin = ADC_CONFIG_PSEL_AnalogInput3;
      break;

    case 3:
      pin = ADC_CONFIG_PSEL_AnalogInput4;
      break;

    case 4:
      pin = ADC_CONFIG_PSEL_AnalogInput5;
      break;

    case 5:
      pin = ADC_CONFIG_PSEL_AnalogInput6;
      break;

    case 6:
      pin = ADC_CONFIG_PSEL_AnalogInput7;
      break;

    default:
      return 0;
  }
<<<略>>>
}

なお,g_ADigitalPinMap配列はvariants\Generic\variant.cppに定義があり,単純に0から順番どおりに数字が並んでいる.

シリアルインターフェース

本記事ではボードにGeneric nRF51を指定しているため,以下のファイルを編集することで,任意のピンにUART(Serial interfaces),SPI(SPI Interfaces),I2C(Wire Interfaces)を割り当てできる.

%USERPROFILE%\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0\variants\Generic\variant.h

実際にArduinoスケッチ内で使用する指示をしない限りは,ポート番号が重複してしまっていても問題ない.以下は,修正前のデフォルトの値であるが,UARTのポートはデフォルトの値でもAE-TYBLE16で使用できるポート番号に割り当てられている.

/*
 * Serial interfaces
 */
// Serial
#define PIN_SERIAL_RX       (0) // P0.00
#define PIN_SERIAL_TX       (1) // P0.01

/*
 * SPI Interfaces
 */
#define SPI_INTERFACES_COUNT 1

#define PIN_SPI_MISO         (22) // P0.22
#define PIN_SPI_MOSI         (23) // P0.23
#define PIN_SPI_SCK          (24) // P0.24

static const uint8_t SS   = 25 ;  // P0.25
static const uint8_t MOSI = PIN_SPI_MOSI ;
static const uint8_t MISO = PIN_SPI_MISO ;
static const uint8_t SCK  = PIN_SPI_SCK ;

/*
 * Wire Interfaces
 */
#define WIRE_INTERFACES_COUNT 1

#define PIN_WIRE_SDA         (20u) // P0.20
#define PIN_WIRE_SCL         (21u) // P0.21

static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;

UART(Serial interfaces)の確認

UARTのTX(AE-TYBLE16が送信側)をデフォルトの値のポートP0.01で確認できた(RXは未確認).なお,UARTについてはST-Link/V2-1のCN3に接続できる.

結線写真 結線図
void setup() {
  Serial.begin(9600);
}

void loop() {
  static uint32_t cnt = 0;
  Serial.print(cnt++);Serial.println(": TEST MESSAGE");
  delay(1000);
}

UARTのTX動作確認

ポートを任意の番号に変更する場合は,variant.hのdefine定義値を変更するだけでよい(以下の箇所).

/*
 * Serial interfaces
 */
// Serial
#define PIN_SERIAL_RX       (0) // P0.00
#define PIN_SERIAL_TX       (1) // P0.01

SPI(SPI Interfaces)の確認

未実施だが,例は用意されている

Generic nRF51のSPIスケッチ例候補

I2C(Wire Interfaces)の確認

未実施だが,例は用意されている

Generic nRF51のWire(I2C)スケッチ例候補

改訂履歴

# 日付 内容
1 2023/01/03 Peripheral I/F→Serial I/F,ペリフェラルインターフェース→シリアルインターフェースに記載変更
UARTの動作確認を追記
章 目的に関連記事を追記

データシート等

  1. 太陽誘電TY-BLE EYSGJNAWY-WX BriefDataReport,第1.2版,2017/06/30発行
  2. 太陽誘電TY-BLE EYSGJNZ DataReport,第2.0版,2019/02/27発行
  3. 秋月電子通商AE-TYBLE16商品添付カード,2017/10/23発行
  4. Nordic Semiconductor:nRF51822 Product Specification,第3.4版,2021/04/02発行

参考サイト

  1. AE-TYBLE16をArduinoとしてLチカ - Qiita
  2. AE-TYBLE16をArduinoとしてBLE通信 - Qiita
  3. 秋月電子の BLE モジュール AE-TYBLE16 を Hack - Qiita

リンク先はすべて2023/01/03現在のもの