著者:Sparkfun Electronics
SparkFun提供
ALEX THE GIANT, ELL Cによるガイド
はじめに
超・低・パワー。IoTの世界では、これらの用語は間違いなく最高の3つの言葉です。SparkFunはARMおよびDialogと共同で、DA16200モジュールをベースにしたULP WiFi R3シールドを提供します。DA16200は、40MHz水晶発振器、32.768KHz RTCクロック、集中定数RFフィルタ、4MBフラッシュメモリおよびオンボードチップアンテナを備えた完全統合型のWiFiモジュールです。Qwiicコネクタ、複数のGPIOオプション、ディープダイブプログラミング用のJTAGコネクタが取り付けられており、R3レイアウトデバイスを次のIoTプロジェクトにセットアップするために必要なものがすべて揃っています。
SparkFunのQwiic WiFi Shieldは、0.2uA~3.5uAという低い消費電流を利用できる複数のスリープモードもあり、ドアロック、サーモスタット、センサ、ペットトラッカーおよびその他のホームIoTプロジェクトに理想的です。
さらに、DA16200モジュールは、IEEE802.11b/g/n、WiFi DirectおよびWPS機能のWiFiアライアンス認証を取得しており、複数の国で使用が認められていること、WiFiアライアンス移行ポリシー(transfer policy)により、それぞれのWiFi認証が再試験なしで移行可能であることを意味しています。
SparkFun Qwiic WiFi Shield - DA16200
必要な部材
このチュートリアルに沿って進めるには、以下の部材が必要です。ご自身のお手元にあるものによっては、すべてが必要でない場合もあります。カートに入れ、ガイドに目を通し、必要に応じてカートの商品を調節してください。
DialogのULP WiFi DA16200 R3シールド説明ガイドのウィッシュリスト(SparkFunのウィッシュリスト)
- ジャンパワイヤ プレミアム 12インチ オス/メス 100個入
- SparkFunのRedBoard - Arduinoによるプログラム
- SparkFunのQwiic WiFiシールド - DA16200
- LED - 抵抗器付き 5mm(20個入り)
- ブレッドボード - 自己接着性(白)
工具
はんだごて、はんだおよび一般的なはんだ付け用アクセサリが必要です。
参考資料
以下の概念に馴染みがない場合は、先にこれらのチュートリアルを確認することをお勧めします。
- Connectivity of the Internet of Things:モノのインターネット(IoT)ベースのプロジェクトの開発に使用できるさまざまなプロトコルの概要を説明します。
- Arduino Shields v2:従来のArduino Shieldsチュートリアルが更新されました!Arduino Shieldに関するあらゆること、シールドとは何か、どのように組み立てるのか、について記載しています。
ハードウェアの概要
このボードについて取り上げるべきことがたくさんあります。 さあ始めましょう!
DA16200
このボードは、DialogのDA16200が中心で、超低消費電力、40MHz水晶発振器、32.768KHz RTCクロック、集中定数RFフィルタ、4Mバイトフラッシュメモリおよびオンボードチップアンテナを備えた完全統合型のWiFi®モジュールです。このチップは機能が充実しています。詳細はデータシートをご覧ください。
電源
電源はシールドの複数のピンから供給されます。
注:このシールドのロジック電圧は3.3Vです。
ウェイクアップ
超低消費電力機能に不可欠なのが、ウェイクアップコントローラです。WAKE1またはWAKE2の立ち上がりまたは立ち下がりエッジを選択する外部信号により、DA16200をスリープ状態から起動させるためのものです。RTC_PWR_KEYは、RTCブロックのイネーブルと各種スリープモード間の切り替えに使用されます。詳しくはデータシートをご覧ください。
低電力モードでの消費電流
UART
DA16200 モジュールには、2 つのUARTインターフェースがあります。UART0はモジュールのファームウェアの更新に使用し、UART1はATコマンドの送信に使用します。
Dialogのモジュール用のUART0は、ボードの上部にあります。
UART1はATコマンドの送信に使用され、スイッチを介して、RX/TX用のハードウェアUARTピンD0/D1で、またはRX/TX用のD9/D8を介してソフトウェアUARTで通信するようにルーティングされています。
SPI
SPI機能は、基板右側のピン10~13にあります。もし、SPIピンをバイパスしてGPIOA0~GPIOA3のADCを使用したい場合は、ボード裏面にあるジャンパを使用することで実現できます。詳細は、下記のジャンパの項を参照してください。
DA16200 GPIO
Dialogモジュールの汎用IOピンは、ボードの上部に用意されています。
Qwiicコネクタ
Qwiicコネクタが提供されているため、Qwiicコネクタを搭載していない古いRedBoardでも、お望みのQwiicセンサを増設することが可能です。また、RedBoardの既存のQwiicコネクタとシールドのQwiicコネクタの両方を使用することも可能です。RedBoard自体がI2Cコントローラとして機能します。Qwiicセンサの選択についてお困りの場合は、Qwiic Ecosystemをご覧ください。
ピンA0~A5
これらのピンは基板上に存在しますが、シールド上の何かに配線されているわけではありません。
ボタン
基板左上にはゼネラルリセットボタンを配置しています。
GPIOA7を長押しすると、ファクトリリセットが実行され、モジュールに保存されている設定内容が消去されます。
ジャンパ
JP1
このジャンパをカットすると、基板前面のLEDの電源がオフになります。
JP2
SPIのCIPOは、このシールドのデフォルト機能です。このジャンパをカットし、GPIOA0-Header間のジャンパを接続すると、GPIO A0(Dialogチップ用A/Dコンバータ機能)が選択されます。
JP3
SPIのCOPIは、このシールドのデフォルト機能です。このジャンパをカットし、GPIOA1-Header間のジャンパを接続すると、GPIO A1(Dialogチップ用A/Dコンバータ機能)が選択されます。
JP4
SPIのCSは、このシールドのデフォルト機能です。このジャンパをカットし、GPIOA2-Header間のジャンパを接続すると、GPIO A2(Dialogチップ用A/Dコンバータ機能)が選択されます。
JP5
SPIのSCKは、このシールドのデフォルト機能です。このジャンパをカットし、GPIOA3-Header間のジャンパを接続すると、GPIO A3(Dialogチップ用A/Dコンバータ機能)が選択されます。
JP6
ArduinoへのSPI Interrupt(デフォルト)またはGPIOヘッダへのPWMを選択します。
電流測定用ジャンパ
電流計測を可能にし、電力を消費するデバイスを分離するために、NC(ノーマルクローズ)ジャンパを追加しています。基板裏面のジャンパをカットすることで、モジュールへのVDDからの配線が切断されます。この穴にオス型ジャンパやワイヤをはんだ付けすることで、電流計を挿入し、アプリケーションが消費する電流を正確に監視することができます。
I2Cジャンパ
このジャンパをカットすると、バス上のプルアップ抵抗が無効になります。
JTAG
ブレークポイントレベルのデバッグを必要とする上級ユーザーには、未実装のJTAGフットプリントが用意されています。対応するオス型ヘッダ、対応するJTAGプログラマやデバッガについては、JTAGセクションで確認することをお勧めします。
基板のアウトライン
ハードウェアの接続
DialogのULP Wifi DA16200シールドには、Arduinoの対向ピンにあらかじめはんだ付けされたヘッダが付属しています。これにより、当社の標準的なRedBoardのフットプリントを使用する場合、シールドはほとんどプラグアンドプレイとなります。ただし、DA16200やADCの基板端にあるピンを使用する場合は、そのメッキスルーホールにヘッダをはんだ付けする必要があります。
注:RedBoardを選択する場合、このシールドは3.3Vのみであることに留意してください。
シールドをRedBoardに差し込むには、ピンラベルを並べ、コネクタをそっと押し付け合わせてください。出来上がりです。
例1.ボーレートによる不具合
注意:このコードは、最新のArduino IDEバージョンで書かれ、テストされています。デスクトップ上のArduino IDEが最新の安定バージョンであることを確認してください。
初めてArduino IDE、ライブラリあるいはボードアドオンを使用する場合は、以下のチュートリアルを確認してください。
- Installing the Arduino IDE(Arduino IDEのインストール)
- Installing an Arduino Library(Arduinoライブラリのインストール)
- Installing Board Definitions in the Arduino IDE(Arduino IDEでのボード定義のインストール)
注:DA16200本体との通信は、主にATコマンドを使用します。ATコマンドに不慣れな方は、Dialog’s DA16200 AT Command User Manualを参照してください。
基本的事項がわかったところで、シールドの使用例をいくつか見てみましょう。
この最初の例では、シリアル通信を管理するためにボーレートを変更する方法を説明します。第2のハードウェアUARTが利用できるボードでは、デフォルトのボーレートで動作させることができます。ATmega328をベースにしたボード(RedBoard Qwiicなど)の場合、softwareSerialは高いボーレートで送られたデータを読むのが難しく、ATBコマンドでボーレートを9600まで下げ、softwareSerialのボーレートを115200から9600に変更することが推奨されています。この例では、その方法をご紹介します。
まず始めに、以下のコードを、新しいArduinoスケッチにコピー&ペーストしてください。
#include<SoftwareSerial.h>
#define RX1 8
#define TX1 9
#define RTC_PWR_KEY 4
#define SOFTWARE_SERIAL_BAUD 115200
//#define SOFTWARE_SERIAL_BAUD 9600
SoftwareSerial WiFiSerial(RX1,TX1); //Configure SoftwareSerial
void setup() {
Serial.begin(9600);
WiFiSerial.begin(SOFTWARE_SERIAL_BAUD); //Set SoftwareSerial baud
//Enable DA16200 Module RTC power block
pinMode(RTC_PWR_KEY,OUTPUT);
digitalWrite(RTC_PWR_KEY,HIGH);
Serial.println("DA16200 AT Command example sending/receiving commands\n");
//Listen for ready message ("%2BINIT:DONE")
byte count = 0;
String msg = "";
while(count<20)
{
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
}
if(msg.length() > 5) break;
count%2B%2B;
delay(100);
}
msg = msg.substring(3,msg.length());
if(msg.length()>5)
{
Serial.println("Expecting: \"INIT:DONE,(0 or 1)");
Serial.println("Received: " %2B msg);
}
else
{
Serial.println("Failed to receive initialization message\n");
Serial.println("Make sure the baud rate for WiFiSerial matches the baud rate\n" \
"saved to the DA16200. You can also perform a factory reset by\n" \
"pressing and holding the GPIOA7 button for ~5s, which will\n" \
"reset the baud rate back to 115200");
}
Serial.println("\nTry entering \"?\" or \"help\" to print out the list of AT commands\n" \
"\nIf the received text is unreadable, try changing the baud rate to\n" \
"9600 with the command \"ATB=9600\" in the terminal. Next, update the\n" \
"example code by setting SOFTWARE_SERIAL_BAUD to 9600 baud and trying again.\n");
}
void loop() {
while(Serial.available())
{
WiFiSerial.print(char(Serial.read()));
}
while(WiFiSerial.available())
{
Serial.print(char(WiFiSerial.read()));
}
}
Board and Serial Portを設定し、スケッチをArduinoにアップロードします。そして、シリアルモニタを開いてください。出力が見え始めます。
「?」または「help」と入力すると、すべてのATコマンドがプリントアウトされます。しかし、115200という高いボーレートでは、328ボードでは受信エラーが多発します。これを解決するには、9600のボーレートコマンド、つまり「ATB=9600」を送れば、「OK」の応答が返ってくるはずです。それが完了したら、スケッチに戻って #define SOFTWARE_SERIAL_BAUD 115200 をコメントアウトし、9600 のソフトウェア シリアル ボーを定義する下の行のコメントを外してから、スケッチを再アップロードします。
シリアルモニタのボーレートが9600に設定されていることを確認し、再度「? 」または「help」を入力してみてください。
注:ボーレート設定はモジュールに保存されますので、115200に戻したい場合は、115200でコマンドを再実行するか、ファクトリリセットを行う必要があります。
例2:GPIOとLED
この例では、搭載されているGPIOの使い方を紹介します。始める前に、ハードウェアをすべて接続しましょう。
まず始めに、DA16200のGPIOのPTHピンにヘッダをはんだ付けする必要があります。
注:この例で使用されているLEDは抵抗を内蔵しています。私たちが推奨するLED(または類似のもの)を使用しない場合は、以下の回路に適切な抵抗を追加してください!
シールドをSparkFunのRedBoard(3.3Vロジック!!)に接続し、LEDをこのように接続してください。
- 電流制限抵抗付きのLED1をGPIOC6に接続する
- 電流制限抵抗付きのLED2をGPIOC7に接続する
- 電流制限抵抗付きのLED3をGPIOC8に接続する
スイッチが「SW」の位置にあることを確認してください。接続を整理するためのFritzing画像はこちらです。
実際の配線はこんな感じです。
ボードをコンピュータに接続し、以下のコードを新しいArduinoスケッチにコピー&ペーストしてください。SOFTWARE_SERIAL_BAUDを定義している行を探し、適切なボーレートを含む行のコメントを外してください。
/******************************************************************************
Example_02 Basic Communication
Configure GPIOC6-8 as output pins, and toggle each LED individually.
Development environment specifics:
IDE: Arduino 1.8.13
Hardware Platform: SparkFun RedBoard Qwiic (3.3V LOGIC!!!!)
Hardware Connections:
- Connect the shield to a 3.3V logic Arduino R3 board
- Connect LED1 with current limiting resistor to GPIOC6
- Connect LED2 with current limiting resistor to GPIOC7
- Connect LED3 with current limiting resistor to GPIOC8
- Make sure switch is in the "SW" position
ARDUINO --> WiFi Shield --> External
8 --> RX1
9 --> TX1
4 --> RTC_PWR_KEY
- --> GPIOC6 --> LED1
- --> GPIOC7 --> LED2
- --> GPIOC8 --> LED3
3.3V --> 3.3V
GND --> GND --> GND
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
#include<SoftwareSerial.h>
#define RX1 8
#define TX1 9
#define RTC_PWR_KEY 4
//#define SOFTWARE_SERIAL_BAUD 115200
//#define SOFTWARE_SERIAL_BAUD 9600
SoftwareSerial WiFiSerial(RX1,TX1); //Configure SoftwareSerial
void setup() {
Serial.begin(9600);
WiFiSerial.begin(SOFTWARE_SERIAL_BAUD); //Set SoftwareSerial baud
//Enable DA16200 Module RTC power block
pinMode(RTC_PWR_KEY,OUTPUT);
digitalWrite(RTC_PWR_KEY,HIGH);
Serial.println("DA16200 AT Command Example: Controlling GPIO\n");
//Listen for ready message ("%2BINIT:DONE")
byte count = 0;
String msg = "";
while(count<20)
{
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
}
if(msg.length() > 5) break;
count%2B%2B;
delay(100);
}
msg = msg.substring(3,msg.length());
if(msg.length()>5)
{
Serial.println("Expecting: \"INIT:DONE,(0 or 1)");
Serial.println("Received: " %2B msg);
}
else
{
Serial.println("Failed to receive initialization message.\n" \
"Make sure you're using the correct baud rate.\n");
while(1); //Unable to communcation with module, so don't move forward
}
WiFiSerial.println("AT%2BGPIOSTART=2,1C0,1"); //Configure GPIOC6, GPIOC7, GPIOC8 as outputs
}
void loop() {
WiFiSerial.println("AT%2BGPIOWR=2,100,1"); //Set GPIOC8 high
WiFiSerial.println("AT%2BGPIOWR=2,0C0,0"); //Set GPIOC6, GPIOC7 low
delay(200);
WiFiSerial.println("AT%2BGPIOWR=2,080,1"); //Set GPIOC7 high
WiFiSerial.println("AT%2BGPIOWR=2,140,0"); //Set GPIOC6, GPIOC8 low
delay(200);
WiFiSerial.println("AT%2BGPIOWR=2,040,1"); //Set GPIOC6 high
WiFiSerial.println("AT%2BGPIOWR=2,180,0"); //Set GPIOC7, GPIOC8 low
delay(200);
}
Board and Serial Portを設定し、スケッチをArduinoにアップロードします。正しく接続されていれば、LEDが順番に点滅しているのがわかると思います!
例3:WiFiに接続する
時間をつかむために簡単な例で、WiFiをチェックしてみましょう。
以下のコードを新しいArduinoスケッチにコピー&ペーストしてください。SOFTWARE_SERIAL_BAUDを定義している行を探し、適切なボーレートを含む行のコメントを外してください。
/******************************************************************************
Example_03 WiFi Communcation
Connect WiFi using the provided network credentials
Talk to NTP server to set the current date/time
Update the time to the correct time zone
Print the current time approx. once every second
Development environment specifics:
IDE: Arduino 1.8.13
Hardware Platform: SparkFun RedBoard Qwiic (3.3V LOGIC!!!!)
Hardware Connections:
Connect the shield to a 3.3V logic Arduino R3 board
Make sure switch is in the "SW" position
ARDUINO --> WiFi Shield
8 --> RX1
9 --> TX1
4 --> RTC_PWR_KEY
3.3V --> 3.3V
GND --> GND
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
#include<SoftwareSerial.h>
#define RX1 8
#define TX1 9
#define RTC_PWR_KEY 4
//#define SOFTWARE_SERIAL_BAUD 115200
//#define SOFTWARE_SERIAL_BAUD 9600
String wifiSSID = "SSID";
String wifiPass = "PASSWORD";
int timezoneOffset = 0; //The hours offset from UTC (Mountain time is -6 for daylight savings, and -7 for standard)
SoftwareSerial WiFiSerial(RX1,TX1); //Configure SoftwareSerial
void setup() {
Serial.begin(9600);
WiFiSerial.begin(SOFTWARE_SERIAL_BAUD); //Set SoftwareSerial baud
//Enable DA16200 Module RTC power block
pinMode(RTC_PWR_KEY,OUTPUT);
digitalWrite(RTC_PWR_KEY,HIGH);
Serial.println("DA16200 AT Command Example: Connecting to WiFi\n");
//Listen for ready message ("%2BINIT:DONE")
byte count = 0;
String msg = "";
while(count<20)
{
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
}
if(msg.length() > 5) break;
count%2B%2B;
delay(100);
}
msg = msg.substring(3,msg.length()); //Remove NULL,CR,LF characters from response
if(msg.length()>5)
{
Serial.println("Expecting: \"INIT:DONE,(0 or 1)");
Serial.println("Received: " %2B msg);
}
else
{
Serial.println("Failed to receive initialization message.\n" \
"Make sure you're using the correct baud rate.\n");
while(1);
}
//Configure module for STA mode
Serial.println("Sending:AT%2BWFMODE=0");
WiFiSerial.println("AT%2BWFMODE=0");
//Wait for "OK" response
while(1)
{
msg = "";
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
delay(1);
}
Serial.print(msg);
if(msg.length() > 1) break;
}
//Apply a software reset to finish changing the mode
Serial.println("Sending:AT%2BRESTART");
WiFiSerial.println("AT%2BRESTART");
//Wait for "OK" response
while(1)
{
msg = "";
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
delay(1);
}
Serial.print(msg);
if(msg.length() > 1) break;
}
//Listen for ready message ("%2BINIT:DONE") after the reset is finished
count = 0;
msg = "";
while(count<20)
{
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
}
if(msg.length() > 5) break;
count%2B%2B;
delay(100);
}
Serial.println(count);
Serial.println(msg);
msg = msg.substring(3,msg.length()); //Remove NULL,CR,LF characters from response
if(msg.length()>5)
{
Serial.println("Expecting: \"INIT:DONE,(0 or 1)");
Serial.println("Received: " %2B msg);
}
else
{
Serial.println("Failed to receive initialization message.\n" \
"Continuing anyway...\n");
}
//Connect to WiFi using the provided credentials
Serial.println("Sending:AT%2BWFJAPA=" %2B wifiSSID %2B "," %2B wifiPass);
WiFiSerial.println("AT%2BWFJAPA=" %2B wifiSSID %2B "," %2B wifiPass);
Serial.println("Waiting for connection response...");
while(1)
{
msg = "";
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
delay(1);
}
if(msg.length() > 10)
{
Serial.print("Response:");
Serial.println(msg);
break;
}
}
msg = msg.substring(3,msg.length()); //Remove NULL,CR,LF characters from response
//If connection to AP is successful, response will be WFJAP:1,SSID,IP_ADDRESS, or WJAP:0 if failed
if(msg.startsWith("WFJAP:1"))
{
//Talk to NTP server to get the current time, along with how often to get time sync
Serial.println("Sending:AT%2BNWSNTP=1,pool.ntp.org,86400");
WiFiSerial.println("AT%2BNWSNTP=1,pool.ntp.org,86400");
//Wait for "OK" response
while(1)
{
String msg = "";
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
delay(1);
}
Serial.print(msg);
if(msg.length() > 1) break;
}
//Provides the correct UTC offset for the current time
Serial.println("Sending:AT%2BTZONE="%2BString(timezoneOffset*3600));
WiFiSerial.println("AT%2BTZONE="%2BString(timezoneOffset*3600));
//Wait for "OK" response
while(1)
{
String msg = "";
while(WiFiSerial.available())
{
msg %2B= char(WiFiSerial.read());
delay(1);
}
Serial.print(msg);
if(msg.length() > 1) break;
}
}
else
{
Serial.println("Connection unsucessful :(\n\n" \
"Make sure the WiFi credentials are correct, and the module is in the station mode");
while(1);
}
}
void loop() {
//Get the current time
Serial.println("Sending:AT%2BTIME");
WiFiSerial.println("AT%2BTIME");
while(WiFiSerial.available())
{
Serial.print(char(WiFiSerial.read()));
delay(1);
}
delay(1000);
}
Board and Serial Portを設定し、スケッチをArduinoにアップロードします。次に、シリアルモニタを開きます。ボーレートが9600に設定されていることを確認してください。出力が見え始めるでしょう。
トラブルシューティングについて
何かお困りですか?
製品が期待通りに動作しない場合、または技術的なサポートや情報が必要な場合は、まず最初にSparkFun Technical Assistanceページでトラブルシューティングを行ってください。
必要なものが見つからない場合は、SparkFunフォーラムで助言を求めることができます。初めてご利用になる場合は、フォーラムアカウントを作成し、製品フォーラムを検索して質問を投稿してください。
参考資料と次のステップ
WiFiシールドやDA16200の詳細については、以下の資料をご覧ください。
主要部品と構成要素
- 1568-WRL-18567-ND
- 1568-1715-ND
- 1568-1768-ND
- 1568-1599-ND
- 1568-1752-ND
- 2260-WBNCSAC31-35G-ND