Arduino開発環境には無線が使用できるマイコン基板にESP32があります。
今回技適付きNodeMCUを使ってDACの制御、無線通信のBluetoothマウス、Bluetooth通信を行います。
紹介するもの
NODE MCU ESP-32S
WifiまたはBT(Bluetooth)を使ったHIDデバイスの開発や、BTのシリアル通信ができる。
値段は手ごろなのに、CPUの処理速度もかなり高い。
情報も多いのですが、派生品や廉価版の種類が多すぎてややこしいのが難。
接続 | Micro B |
CPU | ESP32-WROOM-32 Xtensa 32bit LX6 240MHz |
フラッシュMemory | 4MB |
ADC | 16(12bit 0 ~ 4095) |
ADC | 2 |
GPIO | 32 |
PWM | 22 (8bit 0 ~ 255)同時に16本まで使用可能 |
DAC | 2 (8bit 0 ~ 255) 0 ~ 3.3V |
UART | 3 |
I2C | 1 |
SPI | 2 |
ピン配置
外観
400穴ブレッドボードでは、左右1列使用できます。
準備
ライブラリ
ボードライブラリ
Arduino IDEのボードマネージャからESP32用のライブラリのインストールとボードの選択をします。
ボードマネージャのURL | https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json |
検索 | ESP |
ボードライブラリ | esp32 by Espressif Systems バージョン x.x.x※ |
選択するボード | esp32 > ESP32 Dev Module |
その他のライブラリ
BLEマウス、BLEキーボードを使用する場合、以下のライブラリを利用させていただいてます。
スケッチの書き込み方
スケッチの書き込み方法①
ESPのスケッチの書き込みを行うために、図の通りGPIO0とGNDをショートさせてから電源を投入します。
書き込みが終わったらショートを解消して電源の再投入(リセットボタンがあればリセット)します。
スケッチの書き込み方法②
コンデンサを使ってショートさせることで、スケッチの書き込み方法①の作業をしなくても書き込むことができます。
理屈が説明できないので紹介だけになります。
ENとGNDを100uF~300uFのコンデンサでショートさせます。
これでも書き込みに失敗することがあるので、その時はスケッチの書き込み方法①が確実です。
BTペアリング
BT通信をする場合こちらの作業が必要になります。
ノートPC、スマートフォン、タブレットまた、BTレシーバを準備してください。
ペアリングの方法については一般のBT製品と同じですので詳細は省略します。
個々のマニュアルを参照してください。
今回当方の確認方法としてAndroidスマートフォンでのペアリングを掲載します。
1.スケッチを書き込み、マイコンボードを起動させます。
※GPIO0とGNDをショートさせている場合は、ショートを解除してから再起動します。
2.BT設定画面から周囲のBT機器を検索します。
今回のサンプルでは [NODE MCU ESP32]という名前で見つかります。
3.シリアル通信をする場合、シリアル通信用のアプリケーションをインストールします。
参考として当方が利用している「Serial Bluetooth Terminal」を紹介します。
基本スケッチ
ボタンLED
説明
ボタンの状態が押下状態(High)ならLEDを点灯、離した状態(Low)ならLEDを消灯させます。
NODEMCU ESP32SのDigitalReadには PULLUPとPULLDOWNがあります。
INPUTのみのピン(34~39)は回路上でPULLDOWNしないと謎の周期信号が入ってきました。
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
NODE MCU ESP32S で利用できます。
【スケッチの説明】
プルダウンしたピンの状態がHighならLEDを点灯、LowならLEDを消灯させます。
【ライブラリ】
esp32 > ESP32 Dev Module
【準備】
LEDピン(GPIO13) -> 保護抵抗(約200Ω) -> LED Anode, LED Cathode -> GND
3.3V -> ボタンピン(GPIO23)
【バージョン情報】
2022/11/23 : 新規
**********************************************************************/
//NODEMCU ESP32S
// 15, 2, 0, 4, 16, 17, 5, 18, 19, 21, 3, 1, 22, 23, 13, 12, 14, 27, 26, 25, 33, 32 //digitalWrite
// 15, 2, 4, 16, 17, 5, 18, 19, 21, 22, 23, 13, 12, 14, 27, 26, 25, 33, 32, 35, 34, 39, 36 // digitalRead
//(34, 35, 36, 39はINPUT_PULLDOWNしててもPULLDOWN回路を作らないと不明な信号が入る)
#define LED 13 //LED
#define BUTTON 23 //タクトスイッチ
void setup()
{
pinMode(LED, OUTPUT); //ピン出力設定
pinMode(BUTTON, INPUT_PULLDOWN); //プルダウンで入力
}
void loop()
{
int iStat = digitalRead(BUTTON);
digitalWrite(LED, iStat); //ボタンの状態をLEDに出力
}
結果
ボタンを押下するとLEDが点灯しました。
ボタンを離すとLEDが消灯しました。
DAC
配線
LEDホタルにて動作を確認します。
サンプルスケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence
【スケッチの説明】
NODE MCU ESP32 基板で使用できます。
ESP32 WROOM で使用できると思いますが、NODE MCU ESP32のみ動作確認をしています。
アナログ出力制御によりLEDホタルを行います。
PWM制御とDAC制御を行います。
【ライブラリ】
esp32 > ESP32 Dev Module
(Ver 2.0.2)
【準備】
NODE MCU ESP32 LED
GPIO33 Anode -> Cathode -> 保護抵抗200Ω -> GND
GPIO25 Anode -> Cathode -> 保護抵抗200Ω -> GND
【バージョン情報】
2022/8/8 : 新規
**********************************************************************/
#define LED_DAC 25 //DAC出力ピン (25か26)
#define LED_PWM 33 //PWM出力ピン
void setup()
{
pinMode(LED_DAC, OUTPUT); //出力設定は同じ
pinMode(LED_PWM, OUTPUT);
}
void loop()
{
int i;
//出力諧調 0 - 255
for (i = 0; i < 256; i ++)
{
dacWrite(LED_DAC, i); //DAC出力関数(DACピンでも、analogWriteを使うとPWM制御になります)
analogWrite(LED_PWM, i); //PWM出力関数
delay(5);
}
for (i = 0; i < 256; i ++)
{
dacWrite(LED_DAC, 255 - i); //DAC出力関数
analogWrite(LED_PWM, 255 - i); //PWM出力関数
delay(5);
}
}
スケッチの説明
比較としてPWMでのアナログ出力と、DACでのアナログ出力をしています。
出力の関数が違いますが、設定値はどちらにも同じ値を設定します。
結果
PWMでの明るさは変化が一定に見えるのに対し、DACでの明るさは突然点いて消えるように見えます。
オシロスコープで信号を確認すると、黄色(DAC出力)は0Vから3Vくらいまで上下しています。
消灯してしまうのは電圧不足により発光しないものと思います。
青色(PWM出力)はHighとLoの時間比に応じて光量が変化しているのがわかります。
I2C
説明
I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。
そのほか描画サンプルは
Adafruitサンプルスケッチを参考にしてください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c
配線
NODEMCU ESP-32S | 配線 | SSD1306(0.96inch) |
---|---|---|
3.3V | 赤 | VCC |
GND | 黒 | GND |
GP21(SDA) | 白 | SDA |
GP22(SCL) | 紫 | SCL |
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
NODEMCU ESP-32S 基板で利用できます。
【スケッチの説明】
SSD1306 OLEDの制御をします。
【ライブラリ】
esp32 > ESP32 Dev Module
Adafruit SSD1306 by Adafruit
Adafruit GFX Library by Adafruit
【準備】
マイコン基板 <-> SSD1306
3V3 <-> VCC
GND <-> GND
GPIO21(SDA) <-> SDA
GPIO22(SCL) <-> SCL
【バージョン情報】
2022/11/26 : 新規
**********************************************************************/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64 //SCREEN_HEIGHTは 32 に設定することができます。
#define OLED_RESET -1 //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C //I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//表示制御にはAdafruit製 SSD1306を使用する。
void setup()
{
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
for(;;);
}
display.clearDisplay(); //何か表示されている場合に備えて表示クリア
display.setTextSize(2); //フォントサイズは2(番目に小さい)
display.setTextColor(SSD1306_WHITE); //色指定はできないが必要
display.setCursor(20, 5); //テキストの表示開始位置
display.print(F("TAMANEGI")); //表示文字列
display.setCursor(25, 25);
display.print(F("NODEMCU"));
display.setCursor(25, 45);
display.print(F("ESP-32S"));
display.display(); //バッファ転送(表示)
}
void loop()
{
}
結果
SSD1306に表示ができました。
SPI(ST7735)
説明
SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。
そのほか描画サンプルは
Adafruitサンプルスケッチを参考にしてください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest
NODEMCU ESP-32SではVSPIとHSPIの2系統が使用できます。
どちらのピンア配置もサンプルに掲載されているので用途に応じてコメントを解除してください。
下記サンプルではVSPIで動作します。
配線
VSPIを使用する場合の配線
NODEMCU ESP-32S | 配線 | ST7735(1.8inch) |
---|---|---|
3.3V | 赤 | VCC |
3.3V | 赤 | LED |
GND | 黒 | GND |
GPIO5(VSPI CS) | 黄 | CS |
GP27 | 青 | Reset |
GP26 | 橙 | AO(DC) |
GP23(VSPI MOSI) | 緑 | SDA |
GP18(VSPI SCK) | 紫 | SCK |
HSPIを使用する場合の配線
NODEMCU ESP-32S | 配線 | ST7735(1.8inch) |
---|---|---|
3.3V | 赤 | VCC |
3.3V | 赤 | LED |
GND | 黒 | GND |
GPIO15(HSPI CS) | 黄 | CS |
GP27 | 青 | Reset |
GP26 | 橙 | AO(DC) |
GP13(VSPI MOSI) | 緑 | SDA |
GP14(VSPI SCK) | 紫 | SCK |
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
NODEMCU-ESP32S で利用できます。
【スケッチの説明】
ST7735 LCDの表示制御します。
NODEMCU-ESP32S にはH/W SPIが2系統あります。(VSPI, HSPI)
H/W SPI(VSPI, HSPI)を使用するための方法についてサンプル記載します。
【ライブラリ】
esp32 > ESP32 Dev Module
【準備】
VSPIを使用する場合
マイコン基板 <-> ST7735
3V3 <-> VCC
GND <-> GND
GPIO5(CS) <-> CS
GPIO27(Reset) <-> Reset
GPIO26(DC) <-> AO
GPIO13(MOSI) <-> SDA
GPIO14(SCK) <-> SCK
VSPIを使用する場合
マイコン基板 <-> ST7735
3V3 <-> VCC
GND <-> GND
GPIO15(CS) <-> CS
GPIO27(Reset) <-> Reset
GPIO26(DC) <-> AO
GPIO13(MOSI) <-> SDA
GPIO14(SCK) <-> SCK
【バージョン情報】
2022/11/21 : 新規
**********************************************************************/
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
//HSPIを使用する場合、この#defineをコメントアウトする。
#define SPI_VSPI
//ピン番号設定
//VSPIを使用する場合
#ifdef SPI_VSPI
#define TFT_CS 5 // CS
#define TFT_RST 27 // Reset
#define TFT_DC 26 // DC
#define TFT_MOSI 23 // MOSI
#define TFT_SCK 18 // Clock
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#else
//HSPIを使用する場合
#define TFT_CS 15 // CS
#define TFT_RST 27 // Reset
#define TFT_DC 26 // DC
#define TFT_MOSI 13 // MOSI
#define TFT_SCK 14 // Clock
SPIClass hspi(HSPI);
Adafruit_ST7735 tft = Adafruit_ST7735(&hspi, TFT_CS, TFT_DC, TFT_RST);
#endif
//S/W SPIはこちら。遅いが任意のピンを使用できる。
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST);
void setup(void)
{
tft.initR(INITR_BLACKTAB); //Init ST7735S初期化
tft.fillScreen(ST77XX_BLACK); //背景の塗りつぶし
//テキスト表示
tft.setRotation(3); //画面回転
tft.setTextSize(3); //サイズ
tft.setCursor(0, 20); //カーソル位置
tft.setTextColor(ST77XX_RED); //赤
tft.printf("TAMANEGI\n");
tft.setTextColor(ST77XX_GREEN); //緑
tft.printf("TAMANEGI\n");
tft.setTextColor(ST77XX_BLUE); //青
tft.printf("TAMANEGI\n");
tft.setTextColor(ST77XX_YELLOW); //黄
tft.printf("TAMANEGI\n");
}
void loop()
{
}
結果
ST7735のサンプルスケッチが動作しました。
特別な機能スケッチ
BLE-HID(マウス)
サンプルスケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【スケッチの説明】
NODE MCU ESP32 基板で使用できます。
BLE マウスとして動作します。
時計周りでマウスカーソルを矩形移動させます。
【ライブラリ】
esp32 > ESP32 Dev Module
T-vk / ESP32-BLE-Mouse
【準備】
スケッチ書き込み後、BLEレシーバ機器にてペアリングを実施します。
新しいデバイスとペア設定する際には 「SP32 Bluetooth Mouse」 と表示されます。
【バージョン情報】
2022/8/9 : 新規
**********************************************************************/
#include <BleMouse.h>
#define WAIT 10 //カーソルの動作周期(ms)
BleMouse bleMouse; //BLEでマウス動作させるオブジェクト
void setup()
{
bleMouse.begin();
}
void loop()
{
int i = 0;
if(bleMouse.isConnected() == true)
{
for (i = 0; i < 200; i ++) //右へ200カウント
{
bleMouse.move(1, 0, 0);
delay(WAIT);
}
for (i = 0; i < 200; i ++) //下へ200カウント
{
bleMouse.move(0, 1, 0);
delay(WAIT);
}
for (i = 0; i < 200; i ++) //左へ200カウント
{
bleMouse.move(-1, 0, 0);
delay(WAIT);
}
for (i = 0; i < 200; i ++) //上へ200カウント
{
bleMouse.move(0, -1, 0);
delay(WAIT);
}
}
}
スケッチの説明
BLEマウスとしての動作をします。
マウスカーソルを時計回りに矩形の動作をします。
※このスケッチを書いたESPを起動するたびにマウスカーソルがコントロールされてしまいます。
作業に困る場合は、GPIO0とGNDをショートさせた状態で書き込み起動し、空のスケッチを書き込んでください。
結果
マウスカーソルが移動しています。
スマホにBLEマウスをペアリングさせると撮影ができなくなるのでパソコンの画面をスマホで撮影しています。
ジョイスティックを使った入力装置を作ったり、プログラムのGUI動作確認の自動ロボットテストに利用できそうです。
BT(MACアドレスの読み取り)
サンプルスケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【スケッチの説明】
NODE MCU ESP32 基板で使用できます。
ESP32 WROOM で使用できると思いますが、NODE MCU ESP32のみ動作確認をしています。
自分のBLE MAC アドレスを読み取りシリアルコンソールに表示します。
【ライブラリ】
esp32 > ESP32 Dev Module
(Ver 2.0.2)
【準備】
【バージョン情報】
2022/8/2 : 新規
**********************************************************************/
//BluetoothSerial SerialBT;
void setup()
{
Serial.begin(115200); //シリアル出力用
uint8_t MACAddress[6]; //MACアドレス保存バッファ
esp_read_mac(MACAddress, ESP_MAC_BT); //MACアドレス読み取り
Serial.printf("MAC Address = %02X:%02X:%02X:%02X:%02X:%02X\n"
, MACAddress[0], MACAddress[1], MACAddress[2], MACAddress[3], MACAddress[4], MACAddress[5]);
}
void loop()
{
}
スケッチの説明
BT機器には固有のMACアドレスが割り当てられています。
MACアドレスは通信相手のBLE機器を特定するために使用されます。
本スケッチでは、自分のMACアドレスを読み出します。
結果
MACアドレスの読み取りができました。
別のサンプルでは、この読み出したMACアドレスを使ってESP32同士のBT通信を行います。
BT(Serial受信)
サンプルスケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【スケッチの説明】
NODE MCU ESP32 基板で使用できます。
ESP32 WROOM で使用できると思いますが、NODE MCU ESP32のみ動作確認をしています。
BT機器からのシリアルデータを受信し、シリアルコンソールに表示します。
【ライブラリ】
esp32 > ESP32 Dev Module
(Ver 2.0.2)
【準備】
【バージョン情報】
2022/8/2 : 新規
**********************************************************************/
#include "BluetoothSerial.h"
BluetoothSerial SerialBT; //BLEオブジェクト
void setup()
{
Serial.begin(115200); //コンソール出力用
SerialBT.begin("NODE MCU ESP32"); //NODE MCU ESP32 という名前でBLE通信開始
//スマートフォンなどでBLE機器の検索をすると、この名前が表示される
}
void loop()
{
char BTReceive = 0;
if (SerialBT.available() != 0) //受信があるかを確認
{
BTReceive = SerialBT.read(); //BTから読み取る
Serial.print(BTReceive); //読み取ったデータをコンソール表示
}
}
スケッチの説明
スマートフォンからBTシリアル通信を行います。
データを受け取ったら、シリアルコンソールへ表示します。
結果
スマートフォンからBT接続を行いました。
一例として掲載します。
スマートフォンからの送信文字[tamanegi]は、Teraterm上で受信できたことが確認できました。
コメント