工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

タグ:ESP-WROOM-32

概要

ESP-WROOM-32の公式開発フレームワークesp-idfを使って、開発環境を整えた。動作確認として、サンプルのHello world!プログラムを走らせた。


背景と目的

前回、Arduino環境(Arduino core for ESP32 WiFi chip)で、ESP-WROOM-32のLチカやiBeacon化をしてみたが、BLEデバイスとしての開発には、公式の開発環境(esp-idf)を使う必要があるらしい。(2017年5月2日現在)実際、私が見た限りArduinoのサンプルではかなりシンプルな例しかなくBLEデバイスを自由に開発するのは厳しそうだった。そこで、公式の開発フレームワークesp-idfを使ってHello world!プログラムが実行できる状態まで環境を整える。


詳細

0.方法を調べる

ESP-IDFの公式ドキュメントはこちら。開発環境をそろえるための大まかな手順は、

  • Toolchainのセットアップ
  • ESP-IDFのインストール
  • Eclipeのセットアップ
  • サンプルプログラムのビルドと書き込み
  • 動作確認

だが、3つ目のステップは今回はサンプルが動けばいいので省略する。なお、私の環境は、Windows10、開発ボードは秋月電子のESP32-DevKitC ESP-WROOM-32開発ボード


1.Toolchainのセットアップ

私の環境は、Windows10なので、こちらを参考に進める。

まず、Windows all-in-one toolchain & MSYSというzipファイルをダウンロード。これは、480MBと大きいのでちょっと時間かかる。DLが終わったら、C:\に解凍。そして、C:\msys32\mingw32.exeを実行してみると、以下の感じ。なお、公式ドキュメントにはカスタムセットアップの方法が書いてあるが、今回は理由がないのでやらない。

20170503120634

図1 Toolchainがインストールされたところ


2.ESP-IDFのインストール

2.1 ESP-IDFのダウンロードとインストール

以下の通り、gitでダウンロード。

cd C:\Users\MyName
mkdir esp
cd esp
git clone --recursive "https://github.com/espressif/esp-idf.git"

esp-idfからダウンロードして配置してもいいかもしれない。


2.2 環境変数のセットアップ

こちらに従い、C:\msys32\etc\profile.dに、export_idf_path.shというファイルを作成し、先ほどESP-IDFをインストールしたフォルダを記入。パスは、Windowsの場合バックスラッシュをスラッシュに直さなければいけないのを注意。

export IDF_PATH="C:/Users/MyName/esp/esp-idf"

そして、mingw32.exeを(再)起動し、

printenv IDF_PATH

をしたときに、設定したパスが表示されればOK。


3.サンプルプログラムのビルドと書き込み、実行

3.1 サンプルプロジェクトのコピー

公式ドキュメントに従い、hello_worldというサンプルを使ってみる。まず、esp-idf\examples\get-started\hello_worldというフォルダを適当なパスにコピー。今回は、C:Users\MyName\espとした。(パスにスペースが入ってはダメ)


3.2 ボードを接続

ここで、開発ボードをPCに接続し、シリアルポートを確認。今回はCOM3を使う。


3.3 プロジェクトの設定

C:\msys32\mingw32.exeを起動し、プロジェクトのディレクトに移動し、設定を行う。

cd C:Users/MyName/esp/hello_world
make menuconfig

Serial flasher config>Default serial portを選択し、COM3と記入し、saveして完了。


3.4 ビルドと書き込み

いよいよ、ビルドと書き込み。3.3同様に、C:\msys32\mingw32.exeで、プロジェクトのディレクトに移動し以下の1行を実行すれば、ビルドと書き込みをしてくれる。

make flash

正しく書き込めれば、以下のようになる。

20170503125617

図3.4 書き込み完了の状態

4.動作確認

シリアルターミナルで、表示を確認したところ、Hello worldと表示された!正しく動いている模様。これで、開発環境は整ったといえる。素晴らしい。

20170503125407

図4 動作確認

まとめ

ESP-IDFを使った開発環境を整え、Hello worldが走った。これから、どんどんプログラムが作れそうだ。

概要

ESP-WROOM-32のBLEを使って、iBeaconとして動かせるか試し、無事動かすことができた。

本内容は、記述から1年以上経っており、その間のarduino-esp32ライブラリ仕様変更により、もう動きません。(2018/07/25追記)。参考として、仕様変更後の2018/2/22頃にダウンロードしたarduino-esp32を使って新たに書き直したプログラムのリンクを付けます。ただし、私の手持ちのESP-WROOM-32 DevKitC開発ボードにて動作を確認したのみですので、その他の環境での動作は保証できません。


背景と目的

前回のESP-WROOM-32のLチカの後、ほったらかしだったので、BLEを使ってみることにした。手始めにiBeaconとして動かせるか試す。


詳細

1.方法

Web上で調べても、まとまった情報が見つからなかった、自力でどうにか考えることにした。

前回セットアップしたESP32 Dev Moduleのスケッチ例には、SimpleBLEというものがある。その例では、SimpleBLE.hというヘッダをインクルードしており、SimpleBLEというクラスが定義されている。iBeaconとして動かすには、BLEのアドバタイジングデータをiBeacon規格(参考)に則った内容にしてやればよいはずなので、SimpleBLEクラスの_ble_send_adv_dataというメソッドを少し変更してやればよさそうだ。ということで、方針は決まった。


2.実装

2.1 SimpleBLEライブラリをお手本にいじる

まず、ライブラリをそのままいじるのはよくないので、{ライブラリのインストール先}\espressif\esp32\libraries\SimpleBLEフォルダをコピーしてSimpleBeaconとし、SimpleBLE.hとSimpleBLE.cppをそれぞれ、SimpleBeacon.h、SimpleBeacon.cppと変更。(SimpleBLEクラスの派生クラスというのがまともなやり方だろうが、実験なのでどうでもよい)

2.2 SimpleBeacon.hの変更

次に、SimpleBeacon.hの中で、もともとSimpleBLEクラスが定義されているので、これもSimpleBeaconと変更。以下が31行目からの定義部を抜粋したモノ。

class SimpleBeacon {
    public:

        SimpleBeacon(void);
        ~SimpleBeacon(void);
:
2.3 SimpleBeacon.cppの変更

さらに、SimpleBeacon.cppで、SimpleBLEクラスのメソッドが実装されているので、名前を変える。(詳細は、省略。)

2.4 _ble_send_adv_dataメソッド

そして、いよいよ_ble_send_adv_dataメソッドを変更する。具体的には、以下のようにiBeacon規格に則った31バイトのデータを作成。16進を直接打ち込んでいる部分は、UUID="0000...65E3"、Major=0x7F、Minor=0x7Fという感じ。

void SimpleBeacon::_ble_send_adv_data(void)
{
	uint8_t adv_data_len = 31;
    uint8_t adv_data[HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1] = {
    	adv_data_len, BT_DATA_FLAGS, BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED, 26, 0xFF, 0x4C, 0x00, 0x02, 0x15,
    	0x00, 0x00, 0x00, 0x00, 0x1A, 0xE9, 0x10, 0x01, 0xB0, 0x00, 0x00, 0x1C, 0x4D, 0x64, 0x65, 0xE3,
    	0x00, 0x7F,
    	0x00, 0x7F,
    	0xA0
    };
    adv_data[0] = adv_data_len - 1;
    ble_send_cmd(HCI_BLE_WRITE_ADV_DATA, (uint8_t *)adv_data, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1);
}

2.5 メインのスケッチ

メインのスケッチは、SimpleBLEのサンプルほぼそのままだが、はじめにSimpleBLE.hではなく、SimpleBeacon.hをインクルードし、SimpleBeaconクラスの変数を定義。他は変更しない。(デバイス名が変更されるサンプルなのだが、デバイス名をアドバタイズする部分を削ってしまったので、実際は動作しない)

#include "SimpleBeacon.h"
SimpleBeacon ble;


3.動作確認

確認は、手元のAndroidスマホでBeaconScannerというアプリを使用してスキャン。その結果、以下の通り、検出された。iBeaconとして動作しているようだ。成功。

Screenshot_20170502-230034

図3 スマホで検出された様子


まとめ

ESP-WROOM-32をiBeaconとして動かすことができた。

ESP-WROOM-32のスペックからすると、iBeaconとして動かすのはもちろん勿体なさすぎるが、アプリケーションの1つとしてできて損はないだろう。

概要

ESP-WROOM-32をArduinoとして動かし、Lチカできることを確認した。


背景と目的

本日、ESP-WROOM-32の秋月版開発ボードを入手した。そこで、早速動かす。ESP-WROOM-02をArduino環境で動かしていたので、これも同様にやってみたい。


詳細

1.主な流れ

  • Arduino用開発ツールをインストール、セットアップ
  • Arduinoでコーディング

という感じで、サクサク行く。


2.Arduino用開発ツールをインストール、セットアップ

まず、秋月の商品ページに、Arduino-ESP32プロジェクトサイトというリンクがあったので、そこをざっと読んだところ、Using through Arduino IDEという項目があったので従う。(ただし、この開発プロジェクトでは2017/03/21現在、まだすべての機能について実装が完了していないらしい。)

20170321223817
図2.1 開発ステータス

 私のPCは、Windowsなのでこちらを参考にGitからクローニングした。クローニング先は、C:\Program Files (x86)\Arduino\hardware\espressif\esp32とした。

この場所は、Arduinoをアップデートしたときに削除対象になってしまうので良くない。他の場所にするか、アップデート前に切り取って、アップデート後に戻すととよい。(2017/03/27追記)

Arduino IDEのファイル>環境設定>スケッチブックの保存場所\hardware\espressif\esp32とした。この場所に置くことで、Arduino IDEのボードマネージャーに表示される。(2017/05/13追記)参考

20170321235916

図2.2 ボードマネージャー


3.コーディング

とりあえず、Lチカができればいいので、以下の簡単なコードを作成。LEDをIO12に接続し、1秒周期で点滅。

const int GPIO_LED = 12;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(GPIO_LED, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(GPIO_LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(GPIO_LED, LOW);    // turn the LED off by making the voltage LOW
  delay(500);                       // wait for a second
}


4.動作確認

以下のように、ちゃんと点滅できた!


まとめ

ESP-WROOM-32の開発ボードのArduino開発環境が整った。


このページのトップヘ