目的
AE-TYBLE16こと太陽誘電製EYSGJNAWY-WX(SoCはNordic Semiconductor製nRF51822)のピンファンクションを確かめる.EYSGJNAWY-WXのデータシートのPin Descriptionでは,ディジタル入出力とUARTのみしか記載がないが,これは太陽誘電のアプリケーションソフトウェア上でのつくりと思われる.SoftDeviceを書き込んだあとは,太陽誘電のアプリケーションソフトウェアが載っていないので,EYSGJNZのデータシートのものと同等となるはずである.
- 事前にSoftDevice書込み等,Arduino IDEで作成したArduinoスケッチが書込みできる環境の整備:
☞STM32 Nucleoを用いたnRF51向けのArduino開発環境をつくる - GPIOやADC,シリアルインターフェースの機能確認(本記事)
- BLEの接続/非接続の確認:
☞Arduino環境でAE-TYBLE16のBLEを始める(その1:接続/非接続) - BLE経由のLチカ確認:
☞Arduino環境でAE-TYBLE16のBLEを始める(その2:BLE経由のLチカ) - 照度センサー明暗判定原理試作:
☞Arduino環境でAE-TYBLE16のBLEペリフェラルデバイス~明暗判定編~ - リードスイッチドア開閉判定原理試作:
☞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-L053R8(STSW-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); } } }
Lチカしました。めんどくさくて電流制限抵抗なし! pic.twitter.com/tTcbkNmKlm
— AKETO, Tomu (@so2akt) 2023年1月1日
アナログ入力
黄緑色LEDには,電流制限抵抗100[Ω]程度を直列に挿入したほうがよいが,簡易的な確認のために省略した.
Arduinoで指定するpinMode
関数やanalogRead
関数の第1引数であるピン番号は,nRF51822のピン名称の数字を指定する.たとえば,AIN4の場合は4ではなくP0.03の3を指定することに注意.また,分解能の指定(analogReadResolution
関数)の範囲は,データシートから8,9または10ビットであり,デフォルトが10ビットとなっている.
#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); }
ADC input 4で、AD変換できたぞ!! 半固定抵抗をひねって、2.0Vを超えるとLEDが点灯。 pic.twitter.com/AaAuA5R86g
— AKETO, Tomu (@so2akt) 2023年1月2日
また,本記事ではボードにGeneric nRF51を指定しているため,以下のファイルを編集することで,ピン名称A0
~A5
に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); }
ポートを任意の番号に変更する場合は,variant.h
のdefine定義値を変更するだけでよい(以下の箇所).
/* * Serial interfaces */ // Serial #define PIN_SERIAL_RX (0) // P0.00 #define PIN_SERIAL_TX (1) // P0.01
SPI(SPI Interfaces)の確認
未実施だが,例は用意されている
I2C(Wire Interfaces)の確認
未実施だが,例は用意されている
改訂履歴
# | 日付 | 内容 |
---|---|---|
1 | 2023/01/03 | Peripheral I/F→Serial I/F,ペリフェラルインターフェース→シリアルインターフェースに記載変更 |
↑ | ↑ | UARTの動作確認を追記 |
↑ | ↑ | 章 目的に関連記事を追記 |
データシート等
- 太陽誘電:TY-BLE EYSGJNAWY-WX BriefDataReport,第1.2版,2017/06/30発行
- 太陽誘電:TY-BLE EYSGJNZ DataReport,第2.0版,2019/02/27発行
- 秋月電子通商:AE-TYBLE16商品添付カード,2017/10/23発行
- Nordic Semiconductor:nRF51822 Product Specification,第3.4版,2021/04/02発行
参考サイト
- AE-TYBLE16をArduinoとしてLチカ - Qiita
- AE-TYBLE16をArduinoとしてBLE通信 - Qiita
- 秋月電子の BLE モジュール AE-TYBLE16 を Hack - Qiita
リンク先はすべて2023/01/03現在のもの