PR 記事には広告が含まれています
スポンサーリンク
Translate

電池2,3本で動作するESP32-DevKitC互換機のNewバージョンを作りました

スポンサーリンク

PCBWayに発注していた基板が届いたので、Newバージョンの「電池2,3本で動作するESP32-DevKitC互換機」を組み立てました。

「電池2,3本で動作するESP32-DevKitC互換機」は、昇降圧型のDCDCコンバータを搭載することによって、電源電圧が2.5V程度から5.5Vで動作するESP32-DevKitC互換機です。3V以下でも動作するので、乾電池2本や充電電池3本でも動作させることができます。

今回のバージョンについて詳しくはこちらをご覧ください。

スポンサーリンク

基板をチェック

PCBWayから基板とメタルマスクが届きました。

面付けされた基板は、注文時に「X-Outを許容しない」(全てのサブ基板に製造不良が無い)設定を選んで注文したので、全てのサブ基板が良品となっています。この設定は中国の基板屋さんではPCBWay以外で見かけないので、面付けしたサブ基板全てに一切不良が無い基板を作りたい場合には、PCBWayに注文するのがいいかなと思っています。

新しいバージョンの基板は、端面スルーホールのメッキ部分の面積を広くしました。上の基板が初期ロット、下の基板が今回のロットです。

端面スルーホールの面積が広がって、基板に直接実装する際に、はんだ付けしやすくなりました。

スポンサーリンク

組み立て

はんだペーストの印刷

ダンボールの中央に、ターゲットとなる基板を置き、その両サイドに同じ厚みの不要になった基板を配置して、ターゲットとなる基板を挟んで固定します。

メタルマスクを重ねて、画鋲で固定します。

画鋲を使うことで、基板とメタルマスクの位置合わせが完璧に行えます。このためのデータの設計方法はこちらを参照してください。

メタルマスクの奥側にはんだペーストを載せます。私は、低温で溶ける低融点鉛フリーはんだペーストを使っています。

プラスチック製の会員証やクレジットカードをスキージ代わりに、はんだペーストを奥から手前に引き寄せながら、はんだペーストを印刷していきます。

画鋲で固定しているため、印刷中にメタルマスクがずれることもなく、綺麗に印刷ができます。

完璧な位置にはんだペーストが印刷できました。

この作業を繰り返し、基板にはんだペーストを印刷します。何度も印刷していると、メタルマスクの開口部から裏側へはんだペースト漏れて裏側に付着してしまいます。こうなると、きれいに印刷できなくなってしまうので、無水エタノールを使ってメタルマスクに付着したはんだペーストをクリーニングしています。

部品の実装

部品の実装にはピンセットは使わず、電動バキュームピック 吸着ピンセット HAKKO 394を使っています。

電動バキュームピックで、テープから部品を吸着させると、部品の向きが必ず一定の方向を向きます。

上の写真は、テープから電源ICを吸着しています。テープ内のICの右上が1番ピンです。このため、右上が1番ピンとなるように吸着されます。

実装する基板も、ICの1番ピンが右上になるように配置しておきます。こうするとこで、吸着したICの向きを変えることなく基板に実装することができます。

毎回ICの向きを毎回確認したり、向きを合わせたりする必要がないので、同じ基板を何枚も実装する場合には、とても時間の節約になります。

こちらはテープに入ったICです。テープに入った状態で、左下が1番ピンになっています。バキュームピックで吸着すると、左下が1番ピンの向きに吸着されます。

基板も左下が1番ピンになる向きに配置しておけば、吸着したICの向きを変えることなく、同じ向きで実装することができます。

「部品をテープから取り出した状態でピンセットを使って実装する場合」と、「電動バキュームピックを使ってテープから部品を吸着して実装する場合」を比較してみましょう。

●部品をテープから取り出した状態でピンセットを使って実装する場合

1.裏向きになった部品をひっくり返す
2.部品を回転させてピンセットでつまめる向きにする
3.ピンセットでつまむ
4.実装する位置まで移動する
5-1.部品を放して実装する
5-2.部品を放すとピンセットが隣の部品に当たり隣の部品がずれる
5-3.力加減を間違えて部品がどこかに飛んでいく

●電動バキュームピックを使ってテープから部品を吸着して実装する場合

1.テープから部品を吸着する
2.実装する位置まで移動する
3.そのままの向きで実装する

このように、ピンセットでは5つのステップと不慮の事故が発生する場合がありますが、電動バキュームピックでは3つのステップで実装が完了します。

面付けされた基板である場合、3つのステップを淡々と繰り返すだけで、どんどん部品が実装されて行きます。テープから直接吸着させる方法は、実装がとても捗るのでかなりおすすめです。

ノズルにはこれを使っています。

バキュームピック用ノズル3種類セット | kohacraftのshop
電動バキュームピックHAKKO394の純正よりも使いやすいノズルのセットです

純正品も売っていますが、ノズルが長くて部品の位置合わせや、部品をはんだペーストに押し込む力加減が難しいです。上の商品はノズルが短いので純正よりも楽です。またノズルの太さが少し太いタイプも入っていて、吸着力がよく実装が捗ります。

小さな部品は全て実装が終わりました。後はESP32と電解コンデンサです。

ESP32もピンセットでは挟めませんが、バキュームピックでは余裕で吸着して実装することができます。

全ての部品が実装できました。

リフロー

熱風で庫内を均一に加熱できる、コンベクションオーブン テスコム TSF601を使ってリフローしています。

コンベクションオーブンは様々なメーカーから販売されていますが、テスコムTSF601は加熱の途中でも設定温度を変更することができます。メーカーによっては一旦OFFしないと温度設定を変更できないオーブンもあるので、購入の際にはこの点を確認してください。

庫内が期待している温度になっているか、K型熱電対温度計を使ってモニターしておきます。

つまみの設定温度と、庫内の温度が違う場合があるので、この温度計を見ながら設定温度を調整します。

こちらが、使っている低融点鉛フリーはんだペーストの温度プロファイルです。

大まかに90度→130度→140度→165度→オフして冷却と温度を変化させて行きます。

温度プロファイルに沿って、つまみを調節しながらリフローして行きます。ESP32は温まりにくいので、140度のはんだが溶ける状態を少し長めに保ちました。

リフローが終わり扇風機で冷却します。

1回に2枚の基板しかリフローできないので、4回繰り返して全てのリフローが完了しました。

目視チェック

狭いピッチの部品がありますが、きれいにリフローされています。ブリッジしている場合もあるので、よく確認して、ブリッジしていれば修正します。

動作チェック

DCDCコンバータが正常に動作するか、2.5Vを印加してESP32に供給される電圧を確認します。正常に3.3Vが生成されています。

実際にプログラムを書き込んでみて、動作するかチェックします。

プログラムが書き込めました。

プログラムも正常に動作しています。

こうしてモジュールの動作テストを行なって、全て正常に動作することが確認できました。

スポンサーリンク

低電圧テスト

昇降圧DCDCコンバータを搭載しているので、3V以下でもESP32を動作させることができます。どこまで低い電圧まで動作させられるのか実験してみます。

ESP32はWiFiを起動する際に、とても大きな電流を必要とします。このため、WiFiを起動しても動作が継続できるかどうか、実験してみます。

//DeepSleep
#include <rom/rtc.h>
#include <esp_sleep.h>
#include "soc/rtc_cntl_reg.h"

//WiFi
#include <WiFi.h>

const char* WifiSSID = "WiFiTest";
const char* WifiPassword = "1234567890";

const int LED_PIN = 23;

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("Hello World");

  //Show Reset Reason
  Serial.print("CPU0 reset reason:");
  verbose_print_reset_reason(rtc_get_reset_reason(0));

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);
  delay(500);
  connectWiFi();

  digitalWrite(LED_PIN, LOW);
  delay(1000);

  Serial.println("zzz...");
  esp_deep_sleep(1 * 1000 * 1000);
}

void loop() {
  // put your main code here, to run repeatedly:
}

//connect WiFi
bool connectWiFi()
{
  Serial.println("connecting WiFi");

  //10 times trials
  for ( int i = 0 ; i < 10 ; i++ )
  {
    Serial.print("Try");
    Serial.print(i + 1);

    WiFi.disconnect();
    delay(100);
    WiFi.mode(WIFI_STA);
    delay(100);
    WiFi.begin(WifiSSID, WifiPassword);

    for ( int j = 0 ; j < 300 ; j++ )
    {
      if ( j % 10 == 0)
      {
        Serial.print("*");
      }
      delay(100);
      print_wifi_status(WiFi.status());
      if (WiFi.status() == WL_CONNECTED)
      {
        break;
      }
    }

    if (WiFi.status() == WL_CONNECTED)
    {
      break;
    }

    WiFi.disconnect();
    WiFi.mode(WIFI_OFF);
    delay(5000);  //wait 5 sec
  }

  Serial.print(" WiFi connected.\nIP address: ");
  Serial.println(WiFi.localIP());
  return (WiFi.status() == WL_CONNECTED);
}

//Reset要因
void verbose_print_reset_reason(RESET_REASON reason)
{
  switch ( reason)
  {
    case 1  : Serial.println ("Vbat power on reset"); break;
    case 3  : Serial.println ("Software reset digital core"); break;
    case 4  : Serial.println ("Legacy watch dog reset digital core"); break;
    case 5  : Serial.println ("Deep Sleep reset digital core"); break;
    case 6  : Serial.println ("Reset by SLC module, reset digital core"); break;
    case 7  : Serial.println ("Timer Group0 Watch dog reset digital core"); break;
    case 8  : Serial.println ("Timer Group1 Watch dog reset digital core"); break;
    case 9  : Serial.println ("RTC Watch dog Reset digital core"); break;
    case 10 : Serial.println ("Instrusion tested to reset CPU"); break;
    case 11 : Serial.println ("Time Group reset CPU"); break;
    case 12 : Serial.println ("Software reset CPU"); break;
    case 13 : Serial.println ("RTC Watch dog Reset CPU"); break;
    case 14 : Serial.println ("for APP CPU, reseted by PRO CPU"); break;
    case 15 : Serial.println ("Reset when the vdd voltage is not stable"); break;
    case 16 : Serial.println ("RTC Watch dog reset digital core and rtc module"); break;
    default : Serial.println ("NO_MEAN");
  }
}

//WiFi.status
void print_wifi_status(wl_status_t wl_status)
{
  switch ( wl_status )
  {
    case 0 : Serial.println ("WL_IDLE_STATUS"); break;
    case 1 : Serial.println ("WL_NO_SSID_AVAIL"); break;
    case 2 : Serial.println ("WL_SCAN_COMPLETED"); break;
    case 3 : Serial.println ("WL_CONNECTED"); break;
    case 4 : Serial.println ("WL_CONNECT_FAILED"); break;
    case 5 : Serial.println ("WL_CONNECTION_LOST"); break;
    case 6 : Serial.println ("WL_DISCONNECTED"); break;
    default : Serial.println ("NO_MEAN");
  }
}

プログラムは、

  • ブートしたらWiFiを起動してアクセスポイントに接続
  • 接続できたら1秒後にDeepSleepに入る
  • 1秒後DeepSleepが終了しリブートする

これを繰り返します。

電源電圧2.4V

オシロスコープの黄色はESP32の電源電圧、水色はWiFiがONしたらHiになる信号です。

WiFiがONしても、電源電圧が変動することなく、動作しています。

電源電圧2.2V

電源電圧を2.2Vにすると、ESP32の電源電圧にディップが発生しました。しかしそのまま動作を継続しています。

電源電圧2.1V

2.1Vまで下げると、ESP32の電源電圧のディップが大きくなり、ブラウンアウトリセット(低電圧検知リセット)が発生してしまっています。そのため、リブートを繰り返してしまいました。

今回の実験で、このモジュールは2.2Vまでは動作することがわかりました。

しかしながらどの電圧まで動作できるかは、使用する電源のインピーダンスに影響されます。今回利用した電源では2.2Vまで動作しましたが、電池や充電電池、使用する配線の太さなどによって、電源電圧のディップの大きさが異なり、2.2Vよりも高い電圧でもリセットがかかってしまうかもしれません。

実際に使われる環境で、試してみる必要があります。

スポンサーリンク

待機電流

DeepSleep中の消費電流を調べてみました。供給する電圧が3.3Vの時、40〜70uA程度でした。消費電流が少なく優れたDCDCコンバータですね。

初期ロットの「電池2,3本で動作するESP32-DevKitC互換機」を、小さな太陽電池とエネループ3本を電源に、郵便受けに郵便が届いたかどうかを確認してメールを送信する装置を運用していますが、ここ半年不都合なく安定して動作しています。

この装置は、30秒に1回重さを測って、重くなっていたらメールで郵便が届いたことを通知してくれます。ほとんどの時間DeepSleepしているので、小さな太陽電池でも十分なエネルギーが供給され、これまで充電が切れたことがありません。

バッテリーで動作させる装置には、「電池2,3本で動作するESP32-DevKitC互換機」おすすめです。

「電池2,3本で動作するESP32-DevKitC互換機」はこちら👇👇👇で購入することができます。