ESP32で回路を追加せずを使って電源電圧を計測する

電源電圧の計測方法について調べてみたところ、ESP8266であればESP.getAcc関数で電源の電圧を取得できることがわかりましたが、ESP32では使えないことがわかり代替の方法は無いか調べてみました。

結果としては、公式に公開されているAPIはないがrom_phy_get_vdd33関数をWIFIまたはBLEがオンのときに実行すると取得可能という情報を見つけて検証してみたところ、使えなくもなさそうだということがわかりました。

検証の目的としては電池駆動の際にしきい値より小さくなったら通知を送って電池交換を促す用途に使えないかを確認したかったというところです。

今回の検証には、開発ボードESPr Developer32を使用しました。

ESPr® Developer 32 – スイッチサイエンス
Wi-Fi + Bluetoothモジュール、ESP-WROOM-32とUSB-シリアル変換ICを搭載した開発ボードです。別売りのピンソケットを実装すれば、ESPr® Developer用に開発した拡張ボードをESPr Developer 32でもそのままお使いいただけます。

www.switch-science.com

No Image

以下、rom_phy_get_vdd33()の呼び出し方についてと計測した値をambientに送ってグラフ化してみた結果について解説しています。

rom_phy_get_vdd33()を使って計測

getVoltage関数はrom_phy_get_vdd33()を呼び出して電源電圧を取得します。

extern "C" int rom_phy_get_vdd33();
#define ADJUST 1.00f
float getVoltage() {
  int v = 0;
  btStart();
  for (int i = 0; i < 100; i++) { 
    int vdd = rom_phy_get_vdd33();
    if (vdd > 1000) {
      v = vdd;
      break;
    }
    delay(200);
  }
  btStop();
  const float vdd =  (0.0005045f * v + 0.3368f) * ADJUST;
  return vdd;
}

rom_phy_get_vdd33()はWIFIまたはBluetoothが起動していときのみ実行可能らしいです。
WIFIに接続する場合は、btStart()、btStop()は不要です。

また、rom_phy_get_vdd33の呼び出しは残念ながらかなりの確率で値の取得に失敗します。
そこで、ループして値が取得できたら抜けるようにしています。

取得した値を電圧に変換する計算式については、以下の記事を参考にさせていただきました。

電子ペーパーを使った情報表示装置

計測したデータをambientに送信してグラフ化

電池3本 (eneloop 1000mAh) をESPr Developer 32につないで起動します。
スケッチは以下のとおりです。

#include <WiFi.h>
#include <Ambient.h>

WiFiClient client;
const char *ssid="your ssid";          //  *** 書き換え必要 ***
const char *password="your password";  //  *** 書き換え必要(8文字以上)***

Ambient ambient;
unsigned int channelId = 11111;      //  *** ambient チャンネルID ***
const char* writeKey = "xxxxxxxxxx"; //  *** ambient チャンネルのライトキー ***

void setup() {
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("connecting");
  }
  Serial.println(WiFi.localIP());
  ambient.begin(channelId, writeKey, &client);
}

extern "C" int rom_phy_get_vdd33();
#define ADJUST 1.00f
// WIFIを使用するのでBLEの起動は不要
float getVoltage() {
  int v = 0;
  for (int i = 0; i < 100; i++) { 
    int vdd = rom_phy_get_vdd33();
    if (vdd > 1000) {
      v = vdd;
      break;
    }
    delay(200);
  }
  const float vdd =  (0.0005045f * v + 0.3368f) * ADJUST;
  return vdd;
}

// 30秒おきに電圧を測ってambientに送信
void loop() {
  float vdd = getVoltage();
  ambient.set(1, vdd);
  ambient.send();
  delay(30 * 1000);
}

エネルーブ3本で3.7v強あり。
時間が立つと急に電圧が下がっていくのがわかります。

最終的に3.1vあたりまで落ちたところでWIFIでデータが送信できなくなっているようです。

まとめ

以上、回路無しでESP32でも電源電圧を計測することができました。

一応、この方法は使えそうではありますが、読み取りが不安定なので特に間欠駆動する場合は無駄に起動時間が長くなってしまう問題があります。
やはり、正攻法としては分圧してADCで読み取るのが良さそうです。

そもそも、GithubのStability of rom_phy_get_vdd33 ??? #2612のやりとりでも信頼性もないので、分圧してADCで計測するべきと書いてあります。

Sorry, misread your issue. Unfortunately, rom_phy_get_vdd33 is an unsupported command. This is probably because it is unreliable. Set up a voltage divider and read your battery level on an adc pin.

次は改めて分圧してACDで計測する方法も確認しておこうかと思っています。

Laravel PassportでOAuthサーバーを実装、クライアントアプリでAPIアクセスを確認

OAuthサーバーをLaravel Passportで実装する手順について解説します。

仕事では、Laravelでサービスを運用しているわけではないですが、クラウド プラットフォームのOAuthクライアント機能を調べたりするときにOAuthサーバーがわでデバッグしたいときなどに、Laravel Passportは簡単に実装してサーバーを立てられるのでとても便利に使っています。

以下、Laravelプロジェクトを新規に作るところから、PassportでOAuthサーバーを実装し、クライアントアプリからPassportサーバーに認可コードフローでアクセストークンを取得し、それを使ってAPIからユーザ情報を取得するまで、実装して確認してみます。

Laravel Passportとは

Laravel Passportは、Laravelプロジェクト公式のOAuthサーバー実装です。
OAuthサーバーというとざっくりですが、APIへのアクセス認可とアクセストークンを発行を管理するサーバーのことという理解で良いかと思います。

Laravel Passport provides a full OAuth2 server implementation for your Laravel application in a matter of minutes. Passport is built on top of the League OAuth2 server that is maintained by Andy Millington and Simon Hamp.

ドキュメントに記載されていますが、SPAやモバイルアプリの認証とトークン発行への用途の場合は、Laravel Sanctumの仕様を推奨されています。
“Laravel PassportでOAuthサーバーを実装、クライアントアプリでAPIアクセスを確認” の続きを読む

obniz Board 1Yで自動水やりの屋外対応版を工作してみた

昨年から夏は庭で野菜をプランターで栽培してるので家を空けたときにも心配要らないように、obniz Board 1Yを使って自動水やり装置を作ってみました。

作ってみたものはこんな感じです。

やっていることは定期的にバケツの水をポンプで汲み上げるだけです。

基本的なところはobniz公式ブログの記事「obniz Board 1Yのスリープ機能を使った省電力な水やりデバイス」をベースにし、屋外に設置可能なようにobniz Boardと電池をケースに収めて風雨対策をしています。
また、使用した給水ポンプはobnizのブログで紹介されているものとは別のもので、obniz内臓のモータードライバでは動きませんでした。そこで電池から直に電源を供給するようにMOSFETをobnizで制御して給水ポンプをOn/Offしています。
“obniz Board 1Yで自動水やりの屋外対応版を工作してみた” の続きを読む

Apache Cordova Android Push通知の実装と確認手順まとめ

Apache CordovaでPush通知をAndroidで実装してみてのまとめです。

iOS版は以前の記事「Apache CordvaによるPush通知の実装 iOS版」でまとめてみましたが、2015年の時点からは使用するプラグインが変わっています。
また、Apache CordovaでAndroid用の開発環境をセットアップしてAndroidの実機で動作させるまでの手順については前回の記事「MacにApache Cordova Androidプラットフォーム環境構築する」にまとめていますのでこちらも参照ください。

Push通知実装の流れを確認

Push通知の流れは以下のとおりです。

  1. FMCにデバイスを登録
  2. サーバーのプログラムよりメッセージをFMC経由で送信 (Firebase Notification Composerを使用)
  3. メッセージをデバイスで受信
  4. 受信したメッセージで生成した通知をデバイスに表示
    “Apache Cordova Android Push通知の実装と確認手順まとめ” の続きを読む

MacにApache Cordova Android用の開発環境を構築

elchikaに投稿した記事「obniz Board 1Yと距離センサー VL53L0X 使用した鍵閉め忘れ通知アプリ」では、センサーから取得したデータからドアの鍵を開閉状態を表示、また開きっぱなしだったら通知するといった簡単なアプリをPWAで作ってみました。
しかし、PWAではiOS版ではPUSH通知が利用できないことがわかり、ステータスを表示する簡単なUIと通知を受け取るくらいのアプリをさっと作る方法を改めて考えています。

この内容だと、ネイティブで作っても難しくないアプリですが、XCodeはたまにしか使わないとどこに何があるのか調べるのが面倒ですし、iOS/Androidに対応していてVSCodeなどのエディタで開発できるものが自分としては良いです。とすると、2021年7月時点では選択肢は以下の2つくらいでしょうか

あとは、Xamarinなどもありますが最近はだいぶ目にしなくなりました、Cordovaもメンテされ続けるのか不安ですが、MicrosoftとIBMが多少頑張ってそうなのでもう少し大丈夫かもしれません。
“MacにApache Cordova Android用の開発環境を構築” の続きを読む

Firebase Cloud MessagingからPWAにPUSH通知 (Androidのみ)

先日obniz IoTコンテストに参加して「obniz Board 1Yと距離センサー VL53L0X 使用した鍵閉め忘れ通知アプリ」という作品を投稿したのですが、その中でFirebaseを利用してPWAへのPUSH通知を実装しました。
コンテストでは時間が限られていたので、通知をタップしてアプリのページを開くなど実装できなかった機能があったため改めて調べ直してまとめてみました。

ところで、2021年5月現在、PWAでPUSH通知を受けられるのはモバイルだとAndroidのみでiOSは残念ながらできません。iOS向けにPUSH通知をしたい場合はやはりアプリを提供する必要があります。
また、PWAはAndroidとデスクトップのChromeで若干実装が異なっているので注意が必要です。
“Firebase Cloud MessagingからPWAにPUSH通知 (Androidのみ)” の続きを読む

obnizでTTLシリアルJPEGカメラでハマって解消したメモ

だいぶ前にAdafruitのJpegカメラを秋月電子通商で購入してobnizで試したんですが「あれ全然撮れないぞ?」となって以来ずっとパーツを眠らせていたところ、先日のIoTLTでの発表資料を拝見させていただいて解決法が判ったので自分でも忘れないうちにメモしておくことにしました。

参考にした資料: ピンのピッチ幅で苦しんだ #obniz や #gwhack の話 #iotlt

パーツは発表の中でも出てきたobnizのパーツライブラリJpegSerialCamで紹介されている製品で、秋月電子通商の小型TTLシリアルJPEGカメラ(NTSCビデオ出力付)から購入できます。
“obnizでTTLシリアルJPEGカメラでハマって解消したメモ” の続きを読む

距離センサー VL53L0X の使い方 (Arduino、ESP32)

スイッチサイエンスで、PololuのVL53L0Xモジュールを購入してArduinoとESP32で試してみたメモです。

PololuのVL53L0Xモジュールのピンアサイン

Pololuのピンホールは7つあります。

シルク 説明
VDD 電源
VIN 主電源 (基本こちらを使う)
GND グランド
SDA I2Cのシリアルデータ
SCL I2Cのシリアルクロック
XSHOT ハードウェアスタンバイ
GP01 ???

“距離センサー VL53L0X の使い方 (Arduino、ESP32)” の続きを読む

Amazon FreeRTOS ESP32-DevKit-CでMQTT Hello World (Mac版)

Amazon FreeRTOSをESP32開発ボードESP32-DevKit-Cにセットアップして、マイコンからMQTTのメッセージを送信し、AWS IoTのコンソール上で確認するHello Worldサンプルを動かしてみたので手順をまとめてみました。

FreeRTOSのセットアップ手順は公式ドキュメントの「Espressif ESP32-DevKitC と ESP-WROVER-KIT の開始方法」を参考にしています。
このドキュメントではESP-IDF v3とESP-IDF v4を利用したセットアップ方法が記載されていますが、今回は「ESP-IDF v4」の手順を選択しました。
“Amazon FreeRTOS ESP32-DevKit-CでMQTT Hello World (Mac版)” の続きを読む

小型のMP3プレーヤーモジュールDFPLayerの使い方

コピペテックで技術書典Vol8向けに書いた「ESP32 と obnizOS で作る IoT 電子工作」で使ったMP3プレーヤーモジュールのDFPlayer Miniの使い方についてまとめてみました。

ピンアサインの確認

こちらは、DFPlayerのデータシートに記載されているピンのラベル付きの写真です。

本記事で使用するピンは以下の通りです。

ピン 用途 備考
VCC 電源電圧 動作電圧は3.2から5.0Vに対応
RX UARTの入力信号端子
TX UARTの出力信号端子
SPK_1 スピーカー端子+ 3W以下
GND グランド
SPK_2 スピーカー端子- 3W以下
IO1 トリガーポート1 短く押すと前の曲、長く押すとボリュームを下げる
IO2 トリガーポート2 短く押すと次の曲、長く押すとボリュームを上げる
BUSY 再生ステータス LOWのときに再生中

“小型のMP3プレーヤーモジュールDFPLayerの使い方” の続きを読む