ブログ/こばさんの wakwak 山歩き Twitter

2017-02-28 ESP32 電池(NiMH×2)で動かすときは 40MHz でコンパイルせよ

ESP32 電池(NiMH×2)で動かすときは 40MHz でコンパイルせよ

| ESP32 電池(NiMH×2)で動かすときは 40MHz でコンパイルせよを含むブックマーク

 先に断っておきますが、今回の Tips は私の発見じゃなくて、Keynee さんから伝授して頂いた技 です。


 人様の手柄を自分のことのように書くのは忍びないのですが、ESP32 で遊ぼうとしている人、全員に知らしめないといけないという使命感が沸いてきましたため、公益!?のため恥を忍んで記事にさせて頂く次第であります。

※アフェリエイトなし、(今年になって)広告も排除したブログなので許してください!


 電池でテスト(最初の実験その続き)を通して、公称電源電圧 2.2V〜 は嘘くさい、みたいなニュアンス気味に書いてしまったのですが、それは使い方を極めていなかっただけでした。


http://dl.ftrans.etr.jp/?2812c4dbd5334af4924830d1be9fc9516b4eecf3.png


 電池2本で運用の方は、40MHz でコンパイルしましょう!


Keyneeさん曰く

自分のところでは、Flash Frequency=40MHzにすれば 2.05VまでSNTPサンプルが動きましたよ。

SPI FlashからのReadはこの電圧が下限っぽいです。

キャッシュ内で動作できるようなプログラムなら、2.05V以上で起動後1.55Vまで電圧落としてもHaltせずに動作し続けます。

 NiMH の終止電圧は 1V(2本で2V)ほどなので、1.55V まで搾り取る必要もなく、とりあえず 2V まで粘ることが出来れば文句の一つも出ないというものです!!


http://dl.ftrans.etr.jp/?04bda2d9249847bcbd273d3daa513985f8c4d8e0.png

 充電し切れていない NiMH×2 を使ってテストしてみた結果が左です。


 1.93V(就寝していて実測はしてないが、たぶん2.00〜2.05V くらいと思われ)付近からシリアル出力も怪しくなり、1.90V を割り込んだところでフリーズ


 1秒おきに電圧値を出力させていたのですが、2.00→1.93V の変化は1分もかかってません。


 成り行き任せに挙動不審のまま終わせると Deep Sleep が効かず大電流のままとなるので

 if(voltage < 2.00)    // 40MHz
  {
    Serial.println("good night!");
//  必要に応じて
//  esp_deep_sleep_enable_timer_wakeup(30 * 60 * 1000 * 1000);
    esp_deep_sleep_start();
  }

という風で、制御できるうちに hibernation mode を発動させて、4μAモードに移行させたほうが安心かと思います。


 80MHz と比較して低電圧域の粘りが凄い 40MHz ですが、普段の消費電力も下がるのか?と気になりますが、電測してシリアル出力するだけのショボいサンプルだからかもしれませんけど

40MHz80MHz
http://dl.ftrans.etr.jp/?40f7453ae17c42e2b534e52a6a7042c2468ded1e.jpghttp://dl.ftrans.etr.jp/?092279442be6433a97012f999bd9306e08dc9225.jpg

 有為な違いはなし、という結論になりました。

(どちらの場合でも数値は動くんですが、1分ほど眺めた感じでは、80MHz のほうが精々 +0.5mA までかな?って程度)


 このクロックは外付けメモリーとのバスクロックで、読み書きが遅くなるだけで処理速度に影響するわけじゃないと思うので、積極的に 40MHz を使っていっていいと思います。


 では次回こそ、「自発的な再起動を諦める」 ことで得られる 1μA に満たない究極の過放電防止策を。。


(追記)2017/03/02

 究極の過放電防止策を記事にしました。

 ESP32 電源電圧を自己測定して過放電防止 (後編) をどうぞ

keyneekeynee 2017/03/01 21:08 ブロガーじゃないんで人様のところでコメントしています。
検証してどんどん手柄にしちゃってくださいませw

ADCの非線形の問題はあちらでも認識しているようですので、そのうちソフト的に補正されるはずです。
確認してみましたが、アッテネータ11dBで入力2.6Vを超えると非線形ですね。それと0.15V程のオフセットもありました。

ところで、この程度のプログラムではSPI Flashからの読込は起動時だけですし、SPI Flash通信CLKの違いは消費電流にはまず影響しないですよ。現状 Dual SPI で動作しているものが Quad SPIで動作できるようになれば、これによるクロック数の減少により多少は影響ありそうな気はします。念を押します。気がするだけです。当然、CPU Clockを下げれば瞬間的な消費電流は下がります。

ついでに、今回の経緯を述べておきます。
SPI Flash は Gigadevice GD25Q32 とのことでデータシートを見ると動作電圧2.7V〜3.6Vなんです。
そうすると、ESP-WROOM-32の動作電圧は2.7V〜3.6Vと表記するのが本当は正しいのでは???

机上のデータだけで考えていると2.2Vで本当に動くの??? なんて疑問がわいてくるわけです。
単なる好奇心です。
esptool.py や make menuconfig によると SPI Flashの通信CLKを20MHz, 26MHz, 40MHz, 80MHzと指定できることがわかります。また、これらの情報はバイナリファイルのヘッダに記述されることがソースコードなどからわかります。
通信CLKを指定できる。。。ふむふむ。
規格外の低電圧なら通信CLKを下げれば動作マージン的には有利です。
蓋あけて中の端子をあたればいいんですけど、1個しか持っていないものを開けるわけにもいかず…。
幸い、SPI Flashに直結している信号が外にでています。SD2, SD3などの電圧からVDD_SDIOが推測できるので計測すると、電源電圧に従います。IO12をプルアップすると確かに1.8Vなのもわかります。
Dual SPIで動作しているので、SD0, SD1, CMD, CLKの4端子をロジアナで見れば色々見えてきます。
"flash read err, 1000" の理由なんかもわかります。bootloaderの読込に限ってはヘッダ情報に関わらず標準SPIの10MHzで動作しているなんてこともわかります。

それと、忘れないうちに連絡です。
esp_deep_sleep_pd_configでESP_PD_DOMAIN_MAXを指定していたかと思いますが、これは全く意味がありません。要素数を示すenum値だからです。

長々失礼しました。では。

2017-02-26 ESP32 電源電圧を自己測定して過放電防止 (前編)

ESP32 電源電圧を自己測定して過放電防止 (前編)

| ESP32 電源電圧を自己測定して過放電防止 (前編)を含むブックマーク

 届いてすぐに ESP32 を NiMH×2 で動かしてみました。(当時の記事)

 公称動作電圧 2.2V〜 とされる部分には少々異議ありながらも、概ね問題なく動作することを確認しました。

 ただし、動作下限電圧を下回ってフリーズしてもなお電池の消費は止まらず、電池に残る電気を吸い尽くそうとしていることが判明しましたので、過放電に弱い NiMH を保護してやらないと電池が何本あっても足りません。


 さくら IoT Platform 向けに作った シンプルなハイサイド動作な過放電防止回路 を改良して投入してもいいのですが、ESP32 には ADC がいっぱい載ってるし、わずか 4μA しか消費しない究極の Deep Sleep mode たる Hibernatioin mode も 2/23 から普通に使えるようになった ので、自身で電源電圧を測定してフリーズする前に Hibernatioin mode に移行して過放電を食い止める、という技が使えそうです。

(NiMHの自然な自己放電と同程度のオーダーぽいので、自然分と合わせて自己放電が2倍速になる程度、ってイメージ)


http://dl.ftrans.etr.jp/?975860e4519842e0afd027d644b9f14908f561b7.png


 緑の枠線の部分が今回の追加分です。

 IO34 を ADC として使います。


 最初は IO34 を 3V3 に直結して試してみたのですが、電源電圧に関わらず常にフル電圧(12ビット時で4095に近い数値)が出力されてしまいました。

 どれくらい差がないといけないのか(電源電圧に対して、計れる上限は何ボルト下なのか)仕様書に書かれているべきと思うんですが見つけれず。。


 要分圧ということで、10kΩ+30kΩで 3/4 に分圧して ADC させたところ、概ね近い数字になったので、そうしてあります。

 分圧せざるを得ないのは仕方ないとして、なんで 3V3 じゃなくて IO21 から分圧してるの?って思われた方、お目が高い!


 3V3 と GND の間で分圧させたほうが簡単なんですが、10kΩ+30kΩ・2.0V時で計算すると 2.0V÷40000Ω=0.00005A=0.05mA=50μA も食ってしまうんですよ! 停止後もずっと。

 せっかく 4μA まで落とせる Hibernation mode を使うことが出来るというのに、分圧抵抗がその10倍を消費し続けては本末転倒なんです。

(それを思うと、ESP32 の 4μA という値がいかに驚異的かおわかり頂けると思います。)


 低電圧を検知して Hibernation mode に移行する際に、IO21 を落とせば 50μA の消費を抑制することができます。

(説明用にソースでは LOW に落とすよう書いてますが、実際には Hibernation mode になるとオープンになる気がする)


※なぜ IO21 なのか?という疑問ですが、単に IO34 の真向かいにあったから、という理由のみです。


#include "esp_deep_sleep.h"
#include "driver/adc.h"

const int RA = 10000;   // 10k ohm
const int RB = 30000;   // 30k ohm

void setup() {
  // put your setup code here, to run once: 
  Serial.begin(115200, SERIAL_8N1);
  
  pinMode(21, OUTPUT);
  digitalWrite(21, HIGH);

  // ADC 関係の ardino-esp32 が出来てないぽい気がするので core を利用
  adc1_config_width(ADC_WIDTH_12Bit);
  adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_11db);  // IO34

  // DeepSleep の準備
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF);
}

void loop() {
  // put your main code here, to run repeatedly:
  static int seq = 0;
  
  float value = adc1_get_voltage(ADC1_CHANNEL_6);
  float voltage = value / 4095 * 3.6 * (RA + RB) / RB;

  Serial.print("SEQ:"); Serial.print((String)seq++);
  Serial.print("  VALUE:"); Serial.print((String)value);
  Serial.print("  VOLTAGE:"); Serial.print((String)voltage);
  Serial.println("");

  if(voltage < 2.30)
  {
    Serial.println("good night!");
    digitalWrite(21, LOW);                // なくていい
    esp_deep_sleep_start();
  }
  
  delay(1000);
}

※このサンプルだと、一瞬でも 2.30V を切ると過放電防止モードに突入します


 IO34 を ADC で用いるときは ADC1_CHANNEL_6 と呼ぶそうです。

 いっぱい ADC が付いてますが、SENSOR_VP/SENSOR_VN のほうが精度が良いらしいものの、電測ごときに精度は要らんだろ、ってことで(精度が落ちるらしい) IO34 のほうを使ってます。


 弄っていて気がついた点としては、テスターの実測値と比較して ADC の結果が割と非線形な気が・・・

 電測くらいの目的では特に問題ないですが、ちゃんと ADC したい人は SENSOR_VP/SENSOR_VN のほうを試すとか、校正する手段(スプライン補正とか)を用意するとか、なにがしか対策が必要な気がします。


http://dl.ftrans.etr.jp/?d596b346c11e4c80ae1ac610bb4f8f2a21b41434.jpg http://dl.ftrans.etr.jp/?291088083d144e56ab6f4175b68d5c1a202e71f5.jpg

拙作ブレークアウトボード を使った実験の様子(装着した3端子を無効化するため基板を切断してます)


 今回の例では、最初に電圧測定用の IO21 を ON にして、ずっと放置させてますが

  1. 普段は OFF
  2. 電測直前に ON
  3. 僅かに delay させた後に電測
  4. OFF に戻す

ってやると、さらに省エネになりますね。

 各自でアレンジしてみてくださいませ〜



※前編と銘打ってますが、更に究極なものを用意してます。(たったいま実機でテスト中)

 本稿は 4μA もの超低電力モードながらも RTC だけは生きていて、指定時間後に再起動ということはできる状態です。

    esp_deep_sleep_enable_timer_wakeup(30 * 60 * 1000 * 1000);
    esp_deep_sleep_start();

とすると、Hibernation mode に移行するものの、30分後に再起動がかかります。


 後編では、「指定時間後に再起動」を切り捨てる前提で、再起動させるには外部からのアクション(タクトスイッチ等)が必要とはなりますものの、4μA よりも更に低電力なモードに移行させ、究極の過放電防止を実現する予定です。


(追記)2017/02/28

 コメントのやりとりをまとめて、別記事にしました。

 ESP32 電池(NiMH×2)で動かすときは 40MHz でコンパイルせよ をどうぞ


(追記)2017/03/02

 RTC をも停止させ、実測 0.2〜0.3μA で過放電の進行を防止する究極の回路例を記事にしました。

 後編 をどうぞ

keyneekeynee 2017/02/27 20:26 こばさん、こんばんは。

rtc.hのコメントを見ますと、
ADC @0dB のフルスケール電圧は 1.1V です。
ADC @2.5dB では 1.5V , ADC @6dBでは 2.2V , ADC @11dBでは 3.9V です。
また、コメントの注意書きには @11dB のときの最大電圧はVDD_Aで制限されるとのことです。

データシートよりはオープンソースのコメントを読んだ方が色々詳しく書いてあったりします。
オープンソースのコメントを読んでいると、これは明らかにESP32内蔵のROM (ESP-WROOM-32のSPI Flashではなく)のFWで対策すべき内容があったりします。SPI FlashがDeep sleep直後に読込できない問題が特定のSPI Flash Chip にあるらしく、sdkconfig でCONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAYを設定できるようになっています。まさに私のところのチップはこれを設定してあげて libesp32.a を更新してあげる必要がありました。

keyneekeynee 2017/02/27 20:31 先の訂正
誤) rtc.h -> 正) adc.h
です。

こばさんこばさん 2017/02/27 21:56 いつもいつもありがとうございます。
あまりにお詳しいので中の人なのかと思っていたんですが(笑)
ソースのコメントにもヒントがいっぱいあるんですね。

> ADC @11dBでは 3.9V です。
> @11dB のときの最大電圧はVDD_Aで制限されるとのことです。

いちお
http://esp-idf.readthedocs.io/en/latest/api/peripherals/adc.html
は読みました。

>ADC_ATTEN_11db = 3
> The input voltage of ADC will be reduced to about 1/3.6
> 11dB attenuation (ADC_ATTEN_11db) gives full-scale voltage 3.9V
>
>Note
> The full-scale voltage is the voltage corresponding to a maximum reading
> (depending on ADC1 configured bit width, this value is: 4095 for 12-bits,
> 2047 for 11-bits, 1023 for 10-bits, 511 for 9 bits.)
>Note
> At 11dB attenuation the maximum voltage is limited by VDD_A,
> not the full scale voltage.

「フルスケールは 3.9V だが、11db時は VDD_A までに制限される」
この部分はヨシとして「reduced to about 1/3.9」じゃなくて「reduced to about 1/3.6」なんですよね。
3.9V-3.6V の差 0.3V は どこへ!?って


私の誤解力では行間が読めないのですが、ESP-WROOM-32 の場合は、内部で VDD_A が 3V3 に繋がってるので、読み替えると

・入力させてよいのは 3V3 まで。(壊れるから、3V3 は超えないでね)
・測定できるのは、3V3 - 0.3V まで。(3V3 が 3V だったら 2.7V まで測れる)

って風なのでしょうか。

keyneekeynee 2017/02/27 23:24 アッテネータで11dB減衰させますので10^(11/20)=3.548
つまり1/3.6なわけです。
リファレンス電圧が1.1Vなのでフルスケールは3.6*1.1=3.9Vですね。

データシートにははてななところが処々あります。
こばさんは気をつけてらっしゃると思いますが、電源電圧を超過した電圧をポートに入力しないようご注意くださいませ。入力トレラントではないと思われ。
特にUART RXとUSBシリアルTXの電圧は同じにするか、電圧変換するなどしてあげた方が安全です。

こばさんこばさん 2017/02/28 07:32 そういう計算でしたか。なるほど。。
(よく分かってなかったかもしれない)

手持ちUSBシリアルでは RXD/TXD は常に 3.3V らしいので、低電圧下では確かに仕様オーバーですね・・・
絶対定格の 3.6V を超えさえしなければ早々壊れまいと油断してました。。
(今のところ大丈夫な模様ですが)

何はともあれ、ありがとうございます。

keyneekeynee 2017/02/28 20:02 そうそう、analogRead(34)でも読めますね。

それと2.2V動作が厳しいとのことですが、小ネタを提供しますね。
Flash Frequency=80MHz では確かに厳しかったです。
自分のところでは、Flash Frequency=40MHzにすれば 2.05VまでSNTPサンプルが動きましたよ。
SPI FlashからのReadはこの電圧が下限っぽいです。
キャッシュ内で動作できるようなプログラムなら、2.05V以上で起動後1.55Vまで電圧落としてもHaltせずに動作し続けます。

こばさんこばさん 2017/03/01 00:18 こんばんは。
analogRead、最初に軽く試して NG だった気がしたもんで、adc1_get_voltage 使っちゃいましたが、いまはもう使えるんですか。
とはいえ、もし、adc1_config_width と adc1_config_channel_atten の Arduino 風な記述方法がないんなら、analogRead じゃなくて adc1_get_voltage 使った方が見通しはいいですね。

> Flash Frequency=40MHzにすれば 2.05VまでSNTPサンプルが動きましたよ。

なんとクロックダウンですか。
それは Arduino IDE のボード情報、80MHz/40MHz のトコを切り替えるだけでいいんですか?って質問しようとする前に試してみたら、確かに低電圧の粘りが大幅にアップ!

上のサンプルのとおりの変換で、2.3V以下(実測は2.4Vくらい)で落とさないと Halt 連発していたのに、そこの閾値を緩めた上で今 2.27V(実測で2.38Vくらい) という過去にない電圧で動いてます!!!(感動)

公称値2.2V〜ってのは 40MHz時 の条件と思えば間違えてもいないのか。
NiMH×2を前提にするときは、40MHz にしといたほうが良さそうですね!


ところで SNTP ってことは WiFi 経由ですよね
(多少は飛距離が縮むのかもしれないものの) 2.05V で電波が飛ぶなんて、ほんとに驚異的!!

むしろLチカのほうが大変な世界になろうとは・・・(笑)

2017-02-25 ESP32 WiFi 死亡 2つ目

ESP32 WiFi 死亡 2つ目

| ESP32 WiFi 死亡 2つ目を含むブックマーク

 今回 WiFi 機能を失った3号機(1号機に次いで2つ目)


http://dl.ftrans.etr.jp/?0b40f7005e114f11bff7f9f236d7c6ef1d51eea3.jpg


 1号機が WiFi.h を include した途端に CPU Halted になるのに対して、本3号機は少し挙動が違います。


void setup() {
  // put your setup code here, to run once: 
  Serial.begin(115200, SERIAL_8N1);

  Serial.print("WiFi connecting to ");
  Serial.print(ssid);
  WiFi.mode(WIFI_STA); 
  WiFi.begin(ssid, pass);
  
  while (1) {
    int status = WiFi.status();
    Serial.println((String)status);
    if(status == WL_CONNECTED) break;
    delay(100);
  }

  Serial.println("");
  Serial.print("WiFi connected");
  Serial.print(" IP:");
  Serial.println(WiFi.localIP());
}

 こんな風で WiFi.status() の値を出力させておくと、6(WL_DISCONNECTED)が連打されたのちに停止。

 恐らくは内部的に 3(WL_CONNECTED)に変化した瞬間だと思うんですね、フリーズするのは。

→ただし「3」は出力されず「6」のままフリーズ


 この3号機は撮影用に組み立てたうえで、Deep Sleep(Hibernation mode)の消費電流を測定するために、ほんの軽ーく使っただけなんで、1号機ほどヘビーなことやってないのに。


 使用開始した3つのうち既に2つ死亡というのは、いったいどういうことだい。


 ちなみに全く同じスケッチを2号機に焼くと全く問題なく動作するので、2/23 に降ってきた最新版 arduino-esp32 の不具合でもなさそう。


  • なにをすると壊れるのか分からない
  • どうすると治るのかも分からない
  • 壊れるときは決まって WiFi 周り
  • ハード的に壊れるんじゃなくてソフト的な不整合が原因な気がする

 完全に工場出荷時に戻すツールを提供してくれ


 壊れた3号機はブレークアウトボードに直貼りしてしまいましたが、原因と対策が確立するまでは脱着可能なピンヘッダバージョンにしておこうと強く心に誓うのでした。

(ブレークアウトボードが足りなくなるため)

2017-02-22 ESP32 オリジナル・ブレークアウトボードが届いた

ESP32 オリジナル・ブレークアウトボードが届いた

| ESP32 オリジナル・ブレークアウトボードが届いたを含むブックマーク

 あり合わせの材料で作ったブレークアウトボード 1号機 2号機 ともに使い勝手がイマイチだったため、オリジナルなブレークアウトボードを作図し中華基板屋に作ってもらいました。


http://dl.ftrans.etr.jp/?7fe11f89141f4294b92c08cdac94e3a82bfa8b89.jpg


 効果があるかどうか分かりませんが、アンテナ部分を開口構造としました。


 最終的な回路図は以下のとおり。

 水魚堂さんの BSch3V のシンボルのほうが好きなので普段はそちらなんですが、今回は Eagle のほうのを。


http://dl.ftrans.etr.jp/?23f87fbef34c469e8fd517c217ae9915342afc3a.png

http://dl.ftrans.etr.jp/?77543ff033d54bf9b1d011dc5376a7167546c1a1.png


 3端子のある付近(黒い線のように見えるとこで区切った左側)はオプションで、必要ないときは邪魔な基板を切り外せるようホール連打したまでは良かったものの、基板厚がデフォルト 1.6mm だったため、そう簡単には折れません(笑)

 L型ピンヘッダ を装着したうえで、別の基板に立てる用途を考えてのことでしたので、そうじゃなければ無理に折る必要はないと思います・・・汗


 3端子至近のダイオードは3端子の保護用です。

 実験が進んでいくと、USBシリアル(こういうの)からの 5V じゃなくて、NiMH×2を電源にして・・・みたいな段階に進むと思いますが、入力ピンの電圧<出力ピンの電圧 になると3端子が壊れるので、ついうっかり壊してしまわないようにするためのものです。


 ほとんどの配線は 16mil(0.4mm) ですが、電源ラインだけは 32mil(0.8mm) の太さにしてあります。

 1mm@35μm で 1A より 800mA くらいまで許容すると思います。

 GND は裏面ほぼ全てベタです。


 ESP32(厳密には ESP-WROOM-32 だが ESP32 と略) は、直貼り/ピンヘッダ の双方に対応しました。

 まずは ブレークアウトボード 1号機 2号機 のときの向きでピンヘッダ化した ESP32 を装着する前提の実装例を。


http://dl.ftrans.etr.jp/?4824c040033e4f4b90cba629bc4853f671246ab1.jpg http://dl.ftrans.etr.jp/?6507cb15820d4e9281762e323617884820da9c8c.jpg http://dl.ftrans.etr.jp/?9147b8cc14b042dda07d0c077cf2a0704f91b1cd.jpg

※裏返して撮影してます。


 ESP32 のシルク印字が見えるような向きにピンヘッダを取り付けた場合は、本ボードの裏側にピンソケットを装着します。

 シルク印字が見えない向きにピンヘッダを取り付けた場合には、ボードの表側です。


 ちょっと意味が伝わらないですね・・・

 ボードの裏/表のいずれに配置する場合であっても、銀色のシールド部が表(手前)に向くようにする、と言ったほうがいいかもしれません。


http://dl.ftrans.etr.jp/?31b133adc9ab4f63a5ce815061beb05705fedf2f.jpg


 次は ESP32 直貼りの実装例を

 直貼り時に半田ゴテを当てやすいようランドは長丸にしてあります。


http://dl.ftrans.etr.jp/?13f59e52d58e403085e4234767c7e4cdf8687b10.jpg

※「3」というサインペンの字は、こばさん管理番号で皆様には意味ありません。

※ENピンのプルアップ抵抗を付けずジャンパー線で代用してますが、違う目的で実験するため付けてないだけです


 「つまむと広がるピンセット」か何かで ESP32 を固定しておいて、長丸ランドのところを狙ってコテで暖めつつ半田線をヒョイと近づけると半田が吸い込まれていき、ESP32 のピンにもひっつくという寸法です。

(理想的には3秒くらいのうちに、最大タイムリミットは10秒、超えそうになったら冷ましてやり直し)


 3端子の部分ですが、「別電源を用意するから3端子類が必要ない」ってときは、こんな風に取り付けなくて大丈夫です。


 ピンヘッダ版のときの実装例のように、保護ダイオードさえ配置しけば別電源を使う場合であっても3端子を載せておいても大丈夫なんですが、3端子が3端子としての仕事をしてない状態であっても電気を食うため、消費電力の面で無駄ですので、決して3端子の世話にはならんぞ、とか、消費電流を測定するから、って場合には取り付けないほうがいいです。


 表貼り・脱着(ピンヘッダ)式


http://dl.ftrans.etr.jp/?923c67ca4b34401ea818ce9fa3f996fd02556aa3.jpg http://dl.ftrans.etr.jp/?dba840b7ba05421b8db3669a202741c03f93f3d5.jpg

 普通にハンダ付けしようとするよりも、立てて側面からハンダ付けしたほうがラクチンでした。


部品表

 各自でご用意いただきたい部品です。


基本的な部品

無線モジュールESP-WROOM-32700円
電解コンデンサ100μF程度10円なくても動作する
セラミックコンデンサ0.1μF程度×210個で100円なくても動作する
抵抗10k〜100kΩ程度100本で100円
分割ピンソケット2×192×42で100円用途によってはピンヘッダに変更
タクトスイッチ2個10円×2あると便利
スペーサー3個8個で100円お好みに応じて

電源部(必要な方のみ)

3.3V 三端子レギュレータTA48M033F100円真ん中のピンが GND なものなら何でも可
電解コンデンサ1000μF程度20円0.1μ程度でも動くぽいんだが
USBシリアルケーブルの電源が貧弱なため
セラミックコンデンサ0.1μF程度10個で100円
ダイオード1N4148等50本で100円保護が必要な場合のみ
ピンヘッダ1×41×40で35円USBシリアルケーブル接続用
分割ピンソケット2×32×42で100円用途によってはピンヘッダに変更

ESP32を脱着可能にしたい方

1.27ミリ ピンヘッダ38ピン分40ピンで90円
1.27ミリ ピンソケット38ピン分25ピンで50円×2分割ソケットじゃないため、
1ピン分を犠牲にして切断する

組み立て説明

 シルク印字のとおりに配置する・・・って済ませていいですか?


 強いて言うと、直貼り/ピンヘッダ の両方を意識したランドのため、やや直貼りしにくいです。

 オフセットさせたほうがハンダ付けしやすい気がしたのでそうしたのですが、普通の長丸のほうが良かったかも・・

 ピンソケットのために開けてある穴をハンダで埋めてしまう勢いでやっちゃってください。


 ESP32 を脱着可にしたい人は

  1. 基板にピンソケットをハンダ付け(垂直に注意)
  2. ピンソケットにピンヘッダだけ差し込む
  3. ESP32を載せて合わせる
  4. ピンヘッダとESP32とをハンダ付け

という順番にやったほうがラクです。

 上のほうでも書きましたが、くれぐれも向きに注意してください。

 表貼り・裏貼り いずれの場合であっても、シールドは表側を向くように、です。


 最後に直貼りの人のみですが、ちょっと作図にミスっているものの放熱ランドの部分をスルーホールにしてあります。

 決して剥がすことはないという強い信念をお持ちの方は、ハンダで埋めてやると放熱と GND 能力がアップします。

 ただし、30W くらいじゃ歯が立たないと思いますので、60W クラスのコテを使って一気にやっちゃう必要があり。

 ピンだけならチマチマ半田吸い取りやってれば何とかならなくもないですが、ここをハンダ付けすると、まず剥がすことは不可能になると思うので、くれぐれも信念のある方のみ。


注意(判明してる問題点)

 R1 C1 ・・・という部品記号のシルク印字指定、またしてもポカりまして印字できてません。

 最初の写真のとおり部品の形は印字できてるので、それ診てもらえば宜しいかと・・・


 スペーサー用に3つ穴を開けました。

 すべて φ3.2mm 指定ですので、φ3mm が刺さりますが、周辺に余裕がありません。

 秋月扱いのスペーサー はジャストミートしますが、他の物を使うときはナットサイズに注意して下さい。

 また、ナットがランドに接触するので、金属製は不可、プラスチック製のみです。


 リセットボタンのほうは頻繁に押されるため安定性を考えて2つ穴としましたが、反対側はケチって1つ穴にしてます。

 USBシリアルケーブルの抜き差しは、そう頻繁にやらないとは思いますが、基板に手を添えて抜き差ししないとダメです。

 あと、私の手持ちケーブルが

5V
TXD相手機器のRXDピンに接続する用
RXD相手機器のTXDピンに接続する用
GND

だったので、それを意識して補助的に GREEN とか WHITE とかシルク印字しましたが、物によっては反対のものもあると思うんで注意してください。

(5V/GNDの逆挿しは絶対NGですが、RXD/TXDの逆挿しくらいは壊れないので過剰な心配は無用)


頒布について

 つたない基板ですが、欲しいって方がおられたら @200円+郵便100円 でお分けします。

(ほぼ原価ではあるものの厳密には10円単位の差益が出ますが、封筒代・手間賃として頂戴させてくださいませ)


 お分けできるのは8枚で、お一人2枚までに限定させて下さい。

1枚欲しい方・・・200円×1+100円=300円

2枚欲しい方・・・200円×2+100円=500円

 メール(アドレスは右側のプロフィール欄を参照)で送り先をお知らせ下さい。

 郵便なので電話番号は不要です。


 お手元に基板が届いてから、割れたりしてないことを確認いただき、問題なさそうでしたら、アマゾンギフトで御送金ください、って風にしたいです。


(2016/03/04)完売御礼しました

 気になった箇所を手直しした第2段を作図中です。(まだ発注には進めていない)

 無事に出来上がったら、自分用に数枚を差し引いた上で余りをお分けしようと思ってます。

2017-02-19 ESP32 Deep Sleep のテスト (Hibernation mode)

ESP32 Deep Sleep のテスト (Hibernation mode)

| ESP32 Deep Sleep のテスト (Hibernation mode)を含むブックマーク

 ESP32 の Deep Sleep が 27μA までしか落とせない・・・って 嘆いていた ところ、keynee さんから貴重なコメント を賜りました。

 結果として無事に 4μA@3.3V な Hibernation mode に突入させることに成功しましたので、他の方への参考になるよう記事に残します。

#include "esp_deep_sleep.h"
#include "soc/rtc_cntl_reg.h"
#include "soc/dport_reg.h"
#include "soc/i2s_reg.h"
#include "soc/sens_reg.h"
#include "soc/syscon_reg.h"

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200, SERIAL_8N1);
  Serial.println("Start");  

  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF); 
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
  Serial.println("good night!");

  SET_PERI_REG_BITS(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_DTEST_RTC, 0, RTC_CNTL_DTEST_RTC_S);
  CLEAR_PERI_REG_MASK(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_ENT_RTC);
  CLEAR_PERI_REG_MASK(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_FORCE_PU);

  esp_deep_sleep_enable_timer_wakeup(10 * 1000 * 1000);  // wakeup(restart) after 10secs
  esp_deep_sleep_start();

  Serial.println("zzz");  // ここは実行されない
}

 keynee さん直伝の秘技

  SET_PERI_REG_BITS(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_DTEST_RTC, 0, RTC_CNTL_DTEST_RTC_S);
  CLEAR_PERI_REG_MASK(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_ENT_RTC);
  CLEAR_PERI_REG_MASK(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_FORCE_PU);

の3連投をしたのちに esp_deep_sleep_start() させてやることで、見事に Hibernation mode に移行♪


4.0μA@3.3V3.8μA@3.0V
http://dl.ftrans.etr.jp/?07f969c2ac6043bdb700ca4d4e71a6a1e81781cd.jpghttp://dl.ftrans.etr.jp/?1bc2d1d65645481281eadd00608bb96d815487e3.jpg

 ほぼ全停止状態ではありますが RTC は生きてるので「指定時間後に再起動」だけは出来ます。

(上のサンプルだと10秒後に再起動)

 ESP8266 のときには、Deep Sleep から抜けて再起動させるときには、IO16 を RST ピンに繋いでおく必要がありましたが、ESP32 ではそーいう作法は必要なく、普通に再起動かかるようです。


 ESP8266 の Deep Sleep 10μA でも凄いのに、その半分以下の 4μA とは驚きですねー


(追記)2017/02/23

 Arduino-esp32 が更新され、特別な操作なく普通に deep sleep が活用できるようになった模様です。

#include "esp_deep_sleep.h"

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200, SERIAL_8N1);
  Serial.println("Start");  

  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF); 
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
  Serial.println("good night!");

  esp_deep_sleep_enable_timer_wakeup(10 * 1000 * 1000);  // wakeup(restart) after 10secs
  esp_deep_sleep_start();

  Serial.println("zzz");  // ここは実行されない
}

 TrueRMS テスターを使って、4.0μA@3.3V、3.8μA@3.0V を確認しました。



(追記)2017/02/26

 内蔵 ADC で電源電圧を測定し、低電圧をトリガーにして自発的に Hibernation mode(過放電防止モード)に移行する方法について記事にしました。

 詳しくは こちら をどうぞ

keyneekeynee 2017/02/20 08:43 検証ご苦労様です。
bootloaderでbootloader_random_disableしてからアプリが起動されますので、スケッチの中ではbootloader_random_disableはおそらく無くていいと思いますよ。

こばさんこばさん 2017/02/20 11:08 おはようございます。
色々とありがとうございました。
4μAなら電池駆動の希望が見えてきますよね♪

>スケッチの中ではbootloader_random_disableはおそらく無くていいと思いますよ

秘技3連投のみでも大丈夫かも?ってことですね
仕事から帰宅したら続きを試してみようと思います!!

こばさんこばさん 2017/02/20 23:26 確認しましたら、bootloader_random_disable を削除しても消費電流は変わりませんでした。
何から何までありがとうございました。

ESP32 で Hibernation mode をしたくてこのページに訪問された方が混乱しないよう、記事の内容もまとめ直しました。

また宜しくお願い致します〜

keyneekeynee 2017/02/21 13:05 どうもです。
本家さんも同じ結論になったようですね。
/* Disable pull supply voltage to SAR ADC */
CLEAR_PERI_REG_MASK(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_ENT_RTC);
SET_PERI_REG_BITS(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_DTEST_RTC, 0, RTC_CNTL_DTEST_RTC_S);
だそうです。
近いうちにcommitされるはずですので、最新版では本処理は不要となります。

しかしながら、RTC_CNTL_CK8M_FORCE_PU のクリアの必要性は不明。

keyneekeynee 2017/02/22 19:10 esp-idf のmasterが更新されました。
これにより最新版では本問題は修正され、余計なことをしなくてもHibernation modeになります。
RTC_CNTL_CK8M_FORCE_PUビットのクリアも不要です。RTC_CNTL_CK8M_FORCE_PUビットのクリアは芳しくないのかもしれません。
修正版では以下の処理がesp_deep_sleep_startで追加されています。

// Shut down parts of RTC which may have been left enabled by the wireless drivers
CLEAR_PERI_REG_MASK(RTC_CNTL_ANA_CONF_REG,
RTC_CNTL_CKGEN_I2C_PU | RTC_CNTL_PLL_I2C_PU |
RTC_CNTL_RFRX_PBUS_PU | RTC_CNTL_TXRF_I2C_PU);

SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_SAR_M, 0, SENS_FORCE_XPD_SAR_S);

こばさんこばさん 2017/02/22 19:37 こんばんは。まだ会社ですが、

https://github.com/espressif/esp-idf/blob/d3fde5188e3df788764edf7317b10034a7c724d1/components/esp32/deep_sleep.c

ですね。
帰宅したら実際に試してみます♪

こばさんこばさん 2017/02/23 00:59 こんばんは。帰宅して続きやってます。
esp-idf のほうは改善されたみたいですが、Arduino-esp32 のほうは、未だ更新されてませんでした。

ご本尊は libesp32.a みたいですが、まだリポジトリに反映されてないみたい。
反映されるまでは、上記のとおり手動でレジスタ操作する方法で回避ですな。

ずっとWiFiが死んだ1号機で試してましたが、今度は 「flash read err, 1000」が出るようになり本格的に死んでしまいました。
http://make.kosakalab.com/esp8266/esp32-flash_read_err_10002/ の方と同じ現象と思いますが、この方も改善できていないみたい。

手荒に扱ってるものの、書き込み中にリセットまではやってないのですけどねぇ・・・
とにかく壊れやすい気がしたので、本業でもないのに追加で10個ポチってしまいましたよ。

こばさんこばさん 2017/02/23 13:51 Arduino-esp32のリポジトリに更新きたー
「Major IDF and Arduino Update」とのことなので、きっと deep sleep の件も一緒に対策されたんじゃないかなと思います。

keyneekeynee 2017/02/23 18:56 Arduino-esp32 でも deep sleepの件は対策されています。確認しました。
なお、先のコメントでRTC_CNTL_CK8M_FORCE_PUビットのクリアは芳しくないかもと書きましたが、どうやらオープンソースでない librtc.a で本ビットがクリアされているようです。
deep sleep の件は一件落着と言っていいでしょう。

flash read err, 1000 ですが、ESP32につながっているSPI Flash の電圧(VDD_SDIO)が関係していませんか?
IO12 (MTDI)がプルアップされていると VDD_SDIO = 1.8V となり、SPI Flashは動作不能です。(TinyBASICが起動するなんて素敵ですけど...)
電源立ち上がり時のVDD_SDIOの挙動はわかりませんが、VDD_SDIOが立ち上がる前にSPI Flashにアクセスしようとしてエラーになっているとか? また、供給側の電源が関係しているとか? その他要因は色々考えられそうです。

2017-02-16 ESP32 Deep Sleep のテスト

ESP32 Deep Sleep のテスト

| ESP32 Deep Sleep のテストを含むブックマーク

 ESP8266 に比べて Bluetooth など様々なペリフェラルに対応している ESP32 ですが、そーいう表面的なところのほか、実は Sleep と Wakeup の付近も極めて充実しています。

 RTC Slow Memory と呼ばれる遅いけど電気を食わないメモリ空間があって、そこにプログラムを配置しておくと Deep Sleep からの復帰時にリセットでなく、所定の処理を走らせることができたり・・・そんな風ぽい感じです。


 そーいう深いゾーンはおいおいとして、とりあえず Deep Sleep がちゃんと作動するのか試してみます。


#include "esp_deep_sleep.h"

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200, SERIAL_8N1);
  Serial.println("Start");  

  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("good night!");
  delay(500);
  esp_deep_sleep_start();
  delay(500);
  Serial.println("now sleeping");  // ここは実行されない
}

 Deep Sleep 時の挙動を決める esp_deep_sleep_pd_config という関数があるものの、具体的にどう使うべきなのか資料が見つけられてないんですけど、引数に使える選択肢の全てを ESP_PD_OPTION_OFF にしてみましたが。


http://dl.ftrans.etr.jp/?2ad69e7acfb84bf692324cbd66a23c6d3b0b5e04.jpg


 手持ちテスターにて 27μA。

 2980円で買った安物テスターなので、μAオーダーの測定が正しく行えているのか疑問は残りますが、公式には 5μA まで落とせるらしいので頑張りが足りないですかねー


http://dl.ftrans.etr.jp/?0490bd90fcc8415a9ad151fac33f864f8ad3aef6.png


 テスターの計測が概ね合ってるとしたら「Deep-sleep mode ULP sensor-monitored pattern」という状態か?

 esp_deep_sleep_pd_config で RTC Memories も全て OFF にさせたつもりなんですが、何が足りないんでしょ

 一桁μA に出来た方おられたら、是非ともコメントくださーい!


(追記)

 TrueRMS なテスター を使って再測定してみました。

3.3V時3.0V時
http://dl.ftrans.etr.jp/?baff1c70959546f08422861cca1a0a23aa95390c.jpghttp://dl.ftrans.etr.jp/?1f04140bf2394c49aa3dad8471f7d154158b711a.jpg
2.7V時2.5V時2.2V時
http://dl.ftrans.etr.jp/?9f30b4e48d444e77a553a6490b0910e692408204.jpghttp://dl.ftrans.etr.jp/?b724a2d783944f9ea0498fc0ccf246c5fa07e5aa.jpghttp://dl.ftrans.etr.jp/?4c2bcb5a79e8471cba3a5046d461137d2fde7f86.jpg

 2980円のテスターで27μAを測定したときは約3Vでしたので、ほとんど誤差なかったみたいです。


(追記)2017/02/19

 keynee さんの貴重なコメントで、無事に Hibernation mode に移行させることに成功しました。

 消費電流は僅か 3.8〜4.0μA という次元です。


 サンプルソースも貼りましたので、こちら からどうぞ

keyneekeynee 2017/02/17 20:19 初めまして通りすがりの者です。
少々調べてみました。
bootloader_start.c のコミットID=3922ce47 あたりで挙動が変わったようです。
とりあえず、Deep-sleep mode の電流がどの程度か確認したいのであれば、bootloader_random_enable(); をコメントアウトして、bootloaderをmakeすれば 9μA 程度にはなります。
以下のURLが参考になりました。
https://www.esp32.com/viewtopic.php?t=1133
本家も解析しているようですので、時が来ればFixするでしょう。
それと、調査していてわかったのですが、RTC_CNTL_CLK_CONF_REG の bit26 (RTC_CNTL_CK8M_FORCE_PU)をクリアしてあげると、4μA 程度になりますが、これをすることによる弊害はわかりません。

こばさんこばさん 2017/02/18 00:19 こんばんは。
とても有益な情報に感謝します!!
とてつもなく深そうな部分ですねー

教えて頂いた bootloader_random_enable のソースを漁ってたら、対義ぽい感じの bootloader_random_disable ってものもあるみたいですね。


>RTC_CNTL_CLK_CONF_REG の bit26 (RTC_CNTL_CK8M_FORCE_PU)をクリア

ESP32 Datasheet に

> Hibernation mode: The internal 8MHz oscillator and ULP-coprocessor are disabled.
> The RTC recovery memory are power-down.
> Only one RTC timer on the slow clock and some RTC GPIOs are active.
> The RTC timer or the RTC GPIOs can wake up the chip from the Hibernation mode.

で記載のある、8MHzのオシレータ を停止させるレジスタぽい感じですかね
自力で復帰させる予定がなければ(リセットで復帰させるならば)、使っちゃって平気な気がしてきました。

自分も週末にチャレンジしてみようと思います。

keyneekeynee 2017/02/18 10:56 おはようございます。

bootloader_random_disable() で完全に初期状態に戻せてないようですね。
TEST回路が繋がったままでそこから電流リークしている?

bootloader_random.c の booloader_random_disable()関数に以下を追加すればよさげです。

SET_PERI_REG_BITS(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_DTEST_RTC, 0, RTC_CNTL_DTEST_RTC_S);
CLEAR_PERI_REG_MASK(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_ENT_RTC);

こばさんこばさん 2017/02/19 14:57 >TEST回路が繋がったままでそこから電流リークしている?

消費電流が電圧依存してるので、50kΩ相当?な内蔵プルダウンか何かが生きてるぽいですね。
そこら辺のレジスタを弄ったら無事に 3.8〜4μV になりました!

bootloader を弄る方法だと ESP-IDF の環境が要りますが、bootloader を弄らないで Arduino 環境から Hibernation mode に移行させることに成功しましたので、2/19 付けでまとめました。
http://d.hatena.ne.jp/wakwak_koba/20170219

>RTC_CNTL_CLK_CONF_REG の bit26 (RTC_CNTL_CK8M_FORCE_PU)をクリア

をやることによる消費電流への寄与は -5μA ほどみたいなんですが、それでも RTC は生きてるぽく、Hibernation からタイマー起動できました。

2017-02-15 押し紙は新品未開封のまま梱包資材として生まれ変わるぽい

押し紙は新品未開封のまま梱包資材として生まれ変わるぽい

押し紙は新品未開封のまま梱包資材として生まれ変わるぽいを含むブックマーク

 廃品回収で集まった新聞紙ではなく、新品な新聞紙を惜しげもなく梱包材として使用してました。


http://dl.ftrans.etr.jp/?05a53c77e68d4c4a8d895076d72af26807ec30d8.jpg http://dl.ftrans.etr.jp/?4eefb76f37484ac2b78d1289ba0ae8d11479ecbe.jpg


 消費され減ってますが、もともと透明の袋には、100部もの新品新聞紙が入ってた模様です。

 コンビニなどで1部130円くらいで売られていると思うので、この梱包材の末端価格は1袋で13000円!


 くどいようですが、廃品回収で集まったような古紙じゃなくて、未開封・新品の新聞紙の束ですよ?

 贅沢な話なので、「コンビニで売られてるよりも安いと思うんですけど、いくらで買ってるんですか?」って聞くじゃないですか。


 するとなんと、最寄りの新聞販売店から 好きなだけタダでもらえる と。


 販売店の言い分としては、処分するにも金がかかるから梱包材として貰ってくれるのは大歓迎、という風らしいけど、こーいう風に、梱包材としてタダでもらってるところは、ここ1軒だけじゃないはず

 きっと半端ない部数の新聞紙が未開封のまま、100世帯分のロットで梱包資材に生まれ変わってる・・・


 さすがにチラシは入ってなかったですけれど、広告を出稿してるスポンサーは、梱包資材になってること(梱包資材に広告を打ってること)を知ってるんでしょうか?


 え?梱包資材となって流通して、最終的に誰かの手元に届いて、そこで広げて広告に目を通す人がいるかもしれない!

 きっと新聞屋は、そう反論しそうですけどね。


 チラシは入ってなかったと言いましたが、チラシの主から新聞の枚数に合わせてチラシ代を取ってたりしてませんよねぇ〜?

 新聞販売店からみたら、タダで配ってるとは言え廃棄じゃないのだから、「配布してる」と強弁できなくもありません。


 もし「0円で配布」してる分も配布部数としてチラシの出稿代金にカウントしていたら・・・


 チラシの印刷すらしないで済むのだから、配布部数を基準にチラシ代を受け取っていたら丸儲けですよ、これ?

 しかも未明に戸別配達する手間もなく、未開封1袋100部の単位で適当な時間に「配達」したらいいという・・・


 新聞は戸別配達するよりも、梱包資材として「配達」したほうが明らかに儲かる!


 なんか触れてはいけない社会の闇を見てしまった気がします。

2017-02-12 ESP32 ブレークアウトボード2号機

ESP32 ブレークアウトボード2号機

| ESP32 ブレークアウトボード2号機を含むブックマーク

 届いた当日に作ったブレークアウトボード、とりあえず動かすにはいいのですが、いざピンを使って遊んでいこうとすると使い勝手がイマイチ。。

 ということでボード2号機を作りました。


 材料はほぼ一緒なのですが、画期的なアイデアがひらめいたもので・・・


http://dl.ftrans.etr.jp/?4cb520e7c82a44ae8875766caecc77687b8b486e.jpg


 部品表

1.27ミリ ユニバーサル基板100円1つ
1.27ミリ ピンヘッダ40ピンで90円1つ
1.27ミリ ピンソケット25ピンで50円2つ
2.54ミリ 分割ピンソケット40ピンで80円1つ1×5を2つ、1×7を4つ、でも可

 2.54ミリピッチのピンソケットをずらして配置するという方法です。

 ちなみに裏側で行う配線は以下のとおり。


[http://dl.ftrans.etr.jp/?aa65e48e7a3b4af38602e71418fb161f8ec6f6a3.jpg


 UEW線なりスズメッキ線なり抵抗の足なり、根気強く配線すればできあがり。

 これで不自由なくジャンパー線が刺せます!!


http://dl.ftrans.etr.jp/?0195f758128d4465a324f7147aea799002988759.jpg

※隣接するピンソケット同士は半田ブリッジで、離れてるところは 極細 UEW で配線してる途中


 半田ごての小手先が 1.27mm ピッチに不相応な太さなため美しさには欠けてますが、ショートしてなきゃいいんです!

 とはいえ、あまりにアレなので、ちゃんとしたのを中華基板屋さんに作ってもらいましょうか♪


http://dl.ftrans.etr.jp/?bf44b758966d4a2d8e381736a2090949f83c3a6b.png


 ESP-WROOM-32 はピンヘッダ化したものでも、そのままベタ付けする場合でも、その両方ともで使えるよう、そういうサイズぽいランドを選択してみたつもりです。


 さらに、スペースを余らせると勿体ないので、USBシリアルケーブル(こういうの)を繋ぐ前提で、3端子を載せる配線も施しておき、かつ余地に、よく使うであろう 3V3 と GND のビアを連打。

 ところどころある意図不明と思われるビアは、考えてることが成功したら御披露目するということで今のところ NDA(笑)


 これと 汎用ガイガー検波ユニット(の改良版) を各10枚ずつ計20枚、OCS/ANA Express($13.23)指定し合計で4000円弱。


(追記)

 中華基板屋さんの工程が PCB Processing に移行してしまったので、もうガーバーファイルの差し替えは NG ですが、現時点までに発覚したミス(自分の備忘のため書き残す)

  • 3端子の下の電解コンデンサ(C4)、お気に入りの 1000μF 20円 のサイズじゃなかった
  • 右上付近のシルク印字が重なっていたぽい

 パターンカットを要するような致命的なミスは(今のところ)ない模様。


(追記)2017/02/13

 注文時にファイルをアップロードしないと注文自体が通らないはずなのですが、基板屋さんから「ガーバーファイルが届いてないぞ!」ってメールを頂いたので、その原因はともかく個人的にはラッキーな展開。

 これ幸いとばかりに、これまでに気づいたミスを校正したバージョンを送ってやりました♪


(追記)2017/02/22

 佐川キター。

 今回は Elecrow でしたが、12枚入ってました〜♪

(シルクの印字品質は相変わらずで、そこは Fusion のほうが良い気がする)


 秋月の ESP32 がブラックだったので、こちらもブラック指定


http://dl.ftrans.etr.jp/?7fe11f89141f4294b92c08cdac94e3a82bfa8b89.jpg


 3端子付近が不要な用途で切り外せるように、ハーフカット代わりのホール連打したものの、1.6mm厚は失敗だった・・・

(手でバキってやると、隣のピンヘッダ/ピンソケット用の穴まで巻き込みそう・・・)


 あと、ESP32の裏側の放熱パッドに合わせたつもりの部分が、ちょっと変か。

 大きな実害はない気がするけど。


 さらに毎度ながらシルク印字の指定がイマイチだったらしく色々と抜けてやがる。

 とはいえ最も重要な38ピン/4ピンの信号名は刻印に成功してるのでヨシとしよう。。


 12枚も要らないので欲しいという奇特な方がおられたら、軽くテストした後にお分けしようと思ってます。

 ガイガー検波ユニットの時みたく、ほぼ原価で送料込み 2枚500円 くらいかなぁ

2017-02-11 低電圧で遊んでたら ESP32 の WiFi が死亡

低電圧で遊んでたら ESP32 の WiFi が死亡

| 低電圧で遊んでたら ESP32 の WiFi が死亡を含むブックマーク

 乾電池2本で動くことを確認した ものの、電気を搾り取るらしく、NiMH 充電池と組み合わせるにあたり過放電防止が必要と分かったので、どの程度のカットオフ電圧にしたら良いか低電圧域で動作実験をしていました。

 その過程で不幸が。。。


 仕様的には 2.2V〜 というはずなのですが、どうも 2.2V に達するより以前にフリーズするぽいことを突き止めました。

 可変電源を使って 電池編で使ったサンプルソース を動かしつつ色々試してみたところ

  • 起動時には 2.7V くらいないと起動できない(ただちに Halt)
  • 2.4V 前後を下回るとフリーズ
  • 2.2V〜 ってのは無線を使わない場合のみ限定?

という風。(WiFiを使う前提)


 法則が分かってきたところで、今度は再起しないようになっちまった。

 3.3V を投入しても起動せず。


 シリアルには 115,200bps で以下のとおり

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0008,len:8
load:0x3fff0010,len:1760
load:0x40078000,len:6668
load:0x40080000,len:252
entry 0x40080034
abort() was called at PC 0x401006be
Guru Meditation Error: Core  0 panic'ed (abort)

Backtrace: 0x4000beb4:0x3ffc96c0 0x400835f7:0x3ffc96e0 0x400f6c63:0x3ffc9700 0x400f7858:0x3ffc9720 0x400f7932:0x3ffc9790 0x400f7fe8:0x3ffc97f0 0x400f681c:0x3ffc9850 0x400f64da:0x3ffc98a0 0x400f6526:0x3ffc98c0 0x400d21bf:0x3ffc98e0 0x400d1086:0x3ffc9900 0x400d224c:0x3ffc9930 0x40100722:0x3ffc9950 0x400d9c0d:0x3ffc9980

CPU halted.

 完璧に壊れた?と思いきや、そうでもないみたい。


 動くソース

void setup() {
  Serial.begin(115200, SERIAL_8N1);
}

void loop() {
  static int SEQ = 0;
  Serial.println(SEQ++);
}

 CPU halted になるソース

#include <WiFi.h>

void setup() {
  Serial.begin(115200, SERIAL_8N1);
}

void loop() {
  static int SEQ = 0;
  Serial.println(SEQ++);
}

 WiFi.h を include するだけで、漏れなく halt してしまう ESP32 に成り果ててしまいました(涙)

 やったことは、2.2〜2.8V 付近の電圧で起動と停止を繰り返しただけ。(それぞれ数秒ずつ置いて)


 電源の逆接とかハード的なミスならば自業自得で諦めますが、仕様範囲内の電圧で起動しなくなるってのはどうよ。

 動作中に電圧を弄ったとは言え、Δ0.1V/秒 くらいの、超ゆっくりな操作だったのに。

(ハードな試験をしていたわけでもなく、実運用中にも起きえる程度の動作条件下で壊れた)


 とりあえず試してみたこと

  • 0x00001000〜 bootloader.bin
  • 0x00008000〜 partitions_singleapp.bin
  • 0x3FF90000〜 rom1.bin
  • 0x40000000〜 rom.bin

を焼き直してみたものの全く変化なし。

 ファーム的なところじゃなくて、WiFiのパラメータが壊れた?

(動作中に、どこか書き換えていて、そのタイミング悪いところでフリーズして不整合発生?)


 「動作中に書き換わる部分」を含めて、完全に工場出荷時に戻す方法はないものかい

 仕方ないので予備を開封するか


(追記)

 自分の備忘

#include "esp_wifi.h"

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200, SERIAL_8N1);

  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  Serial.println((String)cfg.rx_buf_num);
  Serial.println((String)esp_wifi_init(&cfg));
}

 esp_wifi_init() が 0x1101 で失敗のステータス。

 esp_err.h 内には 0x1101 に該当するエラーがないが、0x101 ESP_ERR_NO_MEM の派生か?と思いきや、壊れていない別の ESP32 でも 0x1101 を吐く模様


(追記)2017/02/25

 この1号機とは状態が違うのですが、3号機と呼んでる個体も WiFi が死亡しました。

 ハード的な故障ではなくソフト的な不整合が原因ぽい部分は一緒なのですが、ほんと壊れやすい気がします。

 愚痴しか書いてませんが、続くは こちら をどうぞ


(追記)2017/02/28

 NiMH×2 程度の低電圧で動かすときには、40MHz でコンパイルしたほうがいいみたいです。

(「したほうがいい」というよりも「するべし」と言い換えた方が良いレベルで)


 ESP32に対してSPIで繋がっている外部フラッシュメモリが、そのチップの仕様を超えた低電圧で無理矢理に動作させられているぽく、40MHz にクロックダウンさせることで低電圧の粘りが増して2.2Vでもフリーズしなくなりました。

(相次いで無線が死んだのは、デフォルトのまま80MHzで低電圧駆動させていたことが原因かもしれない)


 詳しくは こちら からどうぞ

2017-02-08 手放しで喜べない携帯電話会社の IPv6 導入

手放しで喜べない携帯電話会社の IPv6 導入

| 手放しで喜べない携帯電話会社の IPv6 導入を含むブックマーク

日本国内携帯3社、2017年度中にIPv6導入


IPv6導入が世界中に進んでいますが、日本国内では2017年中にIPv6導入が一気に加速しそうです。


NTTドコモは2017年4月頃からIPv6導入


昨日、NTTドコモ端末でのIPv6利用が2017年4月頃より開始されることがTwitterで発表されました。


続きは こちら

 アドレス空間の枯渇が懸念されていた IPv4(約43億アドレス分)の後継として、以前からIPv6(1844京の1844京倍=340澗アドレス分≒ほぼ無限)が検討されてきたものの、なかなか普及しませんでしたが、いよいよ導入されてしまいそうです。


 なんで「されてしまいそう」ってネガティブな単語を使ってるのかって??

 技術面では歓迎すべきことだとは思うんですが、個人的には(私が利用する端末に限っては)、なるべく使いたくありません。

 IPv4 のままがいいんですよ。


 なぜ、こばさん は IPv6 を使いたくないか


 前述通り、IPv4 はアドレス空間が狭いため、少ないアドレスを多人数で共有して利用する手法が確立していました。

 企業を中心に固定アドレス(43億アドレスのうちの幾つを占有する)の利用もありましたが、大部分は接続のたびに「空いてるアドレス」が貸し出される可変アドレスです。

 携帯電話など、特に端末数が莫大な場合は「貸し出される可変アドレス」でも足りず、1つのアドレスを何百人(最大で約6万人)もで同時利用できる機器が導入され、少ないアドレスを有効に使って枯渇を先延ばしする仕組みが構築されていました。


 アクセス先のサイトではアクセスログを記録していることがほとんどですが、そのときに記録されるアドレスは「共有されているアドレス」です。


 今回、IPv6 で無限のアドレス空間が利用できるようになると、地球人口が100億人になっても、1人あたり3穰個のアドレスが利用できるほどに膨大なアドレス空間ですから、「何百人もが1つのアドレスを共用できるようにする機器」なんてものは必要なくなります。


 アドレスを共用するなどという貧乏くさいことをやらないで良くなります。


 ドコモの場合、240a:6b::/32 というアドレス空間が割り当てられたそうです。

 「::」は途中の 0000 を省略する意味ですが、これだと実感が沸かないので、省略せずにアドレス空間を表記すると

240a:006b:0000:0000:0000:0000:0000:0000 〜 240a:006b:ffff:ffff:ffff:ffff:ffff:ffff

で、アドレス数は 79,228,162,514,264,337,593,543,950,336 個にもなります。

 ドコモの割当枠だけで考えても無限と言って良いですから、共用なんて貧乏くさいことをやる必要がないでしょ。


 あとはドコモが、どういう運用をするかに依りますが、そこは開示されていないので、以下は憶測全開で話を進めます。


 たとえば私がドコモのスマホを契約したとします。

 ドコモは無限と言っていい莫大なアドレス枠を持ってますから、当然にして複数の利用者でアドレスを共有するなんてことはやりません。

 「アドレスの空き」から振り出すなんてこともやる必要ありません。


 いちいち面倒くさいので最初から「こばさんには 240a:6b::1234/96 をあげる」みたいな運用をしてしまうかもしれません。

240a:006b:0000:0000:0000:1234:0000:0000

   〜 240a:006b:0000:0000:0000:1234:ffff:ffff (43億アドレス分)

 こばさん に43億アドレス分も!!??って驚く人が大半だと思いますが、1人の個人に43億アドレス分ずつ割り当てたってドコモは 1844京人分の枠を持ってますから、/96(43億アドレス分)で割り当ててもビクともしません。


 こばさん は割り当てられた 43億アドレスのうち、どのアドレスも自由に使うことが出来ます。

 43億アドレスのうちの具体的にどれを使うかは、スマホの中のソフトがテキトーに決めるとは思いますが、IPv6 とはこういう途方もない次元なのです。


 どのアドレスでも自由に使えるとは言いましたが、アドレスの先頭は常に 240a:6b::1234/96(240a:006b:0000:0000:0000:1234)で始まるので、アクセスログを記録しているアクセス先のサイト主が見ると「ああ、また 240a:6b::1234/96 が来たか」という風になります。


 この時点だけでは個人の特定までは出来ませんが、そのサイトが通販サイトだったりして、以前に注文したことがあれば、ログインしてなくても 240a:6b::1234/96 = こばさん が来た、という風に個人を完璧に特定することができます。


 また「240a:6b::1234/96 = こばさん」という情報が違うところに渡れば、個人情報を入力したことのない他のサイトであっても「ああ、こばさん来た」って風になりますし、時間軸が反対であっても「ああ、こばさんが来てたのか」と話は一緒です。


 そこまで行くと匿名掲示板なんて怖くて近づけないですね。

 なにを閲覧したか(との分野に興味を持ってるか)まで、すべて特定されちゃいます。


 クッキーを削除しようが端末を初期化しようが買い換えようが、通信回線に紐付いている IPv6 アドレスが変わらなければ、ずっと「240a:6b::1234/96 = こばさん」のままです。


 運用次第では マイナンバーよりも遙かに恐ろしい


 それが IPv6 です。

 グーグルは大喜びですし、その他の中小ストーカーはもちろん、政権批判を監視したい政府関係者たちも大歓迎でしょう。

 さて、みなさんは導入を歓迎しますか?


 携帯電話会社が契約者に対して IPv6 の枠を振り出すにあたり、第三者から類推されることのない全く独立したアドレス空間を毎回ランダムに振り出すのかどうか、運用方針を見極めてからでないと怖すぎて使えたもんじゃありません。

(ストーカー被害の防止のためにも、利用者から固定化の要求がない限り、可変処理(匿名化)を義務づけるべきと思う)


 導入以前に、先に法整備が必要と感じるほどに重要なことだと思うんですが、なんでスルーなんでしょう。

 マスゴミは馬鹿だから理解できないまま踊ってると思うけど、総務省の官僚たちは遙かに利口だから、すべてわかったうえで黙ってる気がしますけどねぇ

まーくんまーくん 2017/07/05 00:14 移動体の場合は、場所が変わるとドンドンIPv6アドレスが変わるようです。(もしくは携帯端末の電源を入れ直すと再割り当てする)
もし主張されている心配事なら、よっぽど固定系のフレッツ光などのIPv6化の方を心配すべきでは無いでしょうか?

こばさんこばさん 2017/07/05 16:34  こんにちは。
 固定網か移動網かに関係なく、利用者のプライバシー保護のため、デフォルトで類推不能なランダムなアドレスを落としてきてもらいたいもんです。

2017-02-07 Visual Studio で ESP32 プログラミング

Visual Studio で ESP32 プログラミング

| Visual Studio で ESP32 プログラミングを含むブックマーク

 BT Stack 作りは外人さんが頑張ってるぽい のですけど、どうも BLE(いわゆる BT4.0)をターゲットにしてるような雰囲気でして、いわゆる Classic BT を使いたいと思ってる自分としては、(できるかどうかは別にして)https://github.com/bluekitchen/btstack の移植にチャレンジしないといけないなぁと思っております。

→ESP32 Core の BT.h を見る限り、ベースは 2.0/4.0 の両方に対応してそうな気がする


 プログラミングは、Arduino IDE でもいいのですがディープな作業をするにあたっては、お世辞にも使い勝手が良いとはいえません。エディタにコンパイル機能が付属しただけくらいですからね。

 特に私のように、Arduino 歴が短く、メソッド名が頭に入ってない身には非常に厳しいものがあります。


 そこで! Microsoft の Visual Studio を IDE に使ってみようと思います。

 ネットを探すと ESP8266 で使われた形跡はいくつか見つけましたが、ESP32 の例は見つけられず。

 Arduino 繋がりだしきっと使えるはず・・・で試してみたら、ばっちり使えてしまったのでメモ残します。




 まず、Arduino IDE をインストールして、それで開発が出来る状態にします。

(わからない方は 準備編 をどうぞ。実験するための回路図も載せてます)


 次に Visual Studio を準備します。

 バージョンは 2012〜2017(2017 は現時点で RC 状態だが)に対応しているみたいで、バージョン番号が大きくなるにつれて高機能にはなりますが動きも格段に重くなっていきます。

 C# や VB.NET の開発をするならともかく、Arduino の開発に使う分には「高機能」の恩恵には預かれず、私の工作机に常置しているパソコンが LIVA(+秋月 IGZO パネル)と低スペックなため、VS2012 を選択しました。


 低スペック機にとっては重いですが、VS2015 は Pro相当の Community Edition が無償公開されているので、これを使ってみる手もあります。

(趣味で使う程度なら無償だが、無償には条件があるので商用利用を予定される方は注意)


 Visual Studio のインストール時に C++ が選択されていることを確認します。

 古いバージョンだとデフォルトでオプションてんこ盛りで不要なものを外したほうがいいくらいですが、VS2015 だと C++ のチェックは外れているので「カスタム」を選択したうえで手動でチェック入れる必要あります。


http://dl.ftrans.etr.jp/?9720dccf0f6b409b84401dbf58bb9323a3f7832a.png http://dl.ftrans.etr.jp/?279cbf2019f442ee9ac973273900238008768aa4.png


 インストールが終わったら、Visual Studio を起動し「ツール」の中の「拡張機能と更新プログラム」をクリック、左側が「オンライン」になってる状態で右側の検索ボックスに「Arduino」と入れて検索してやると「Arduino IDE for Visual Studio」が出現するので、こいつをダウンロードし実行します。


http://dl.ftrans.etr.jp/?e51e16f6ee394f44814eb2d41824456b3c610aff.png http://dl.ftrans.etr.jp/?5419d08e5a69412b9cd50a66272cedfb62a597b0.png

http://dl.ftrans.etr.jp/?ecf2e4cb2ad5440a899cdbb0c1c1495602757214.png http://dl.ftrans.etr.jp/?43c71ddb9c7d4342b220d3d21ed3d164e1364daf.png


 指示されるとおり Visual Studio の再起動をかけると初回に設定画面が現れますが、ESP32 で遊ぶだけならばデフォルトのまま(下2つは空白のまま)で大丈夫なようです。

 先に作った Arduino IDE 環境のを自動的に引っ張ってきているのもしれません。


http://dl.ftrans.etr.jp/?d2b25fc3463d4be48f745f4a65d459a7873623e7.png http://dl.ftrans.etr.jp/?b08d0c9ea0af4f438b22093def601c6fe4e9f617.png


 「新しいプロジェクト」や「開く」に Arduino Project が選択できるようになってます。

 あとは細かいところをゴチョゴチョするだけ


ボードは ESP32 Dev Module を選択書き込み COMポート を選択シリアルモニタ COMポート の選択
http://dl.ftrans.etr.jp/?a192322a3454482690dc118b1cbd50036c91d5c1.pnghttp://dl.ftrans.etr.jp/?4fcc1cc6150a4d08b046dbd7a9c8972d50149979.pnghttp://dl.ftrans.etr.jp/?1eb8255e5c434f38bac922ab083b44eabb19599b.png

 ここまでは説明用に VS2015 でスクショ撮り直して掲載してます。

 以下は実機の VS2012 環境なので、画面が僅かに違います。

 インテリセンスは感涙もので、一度でも使い始めたら止められないと思いますよ〜

 副作用として、なかなかメソッド名が覚えられなくなりますが・・・


http://dl.ftrans.etr.jp/?551b2e1816384d2ab5e5c4155f54a5b4f8df5720.png http://dl.ftrans.etr.jp/?005f895036ca44c3bde07bff0bf452d808fae239.png


 ヘッダーファイルの中身は簡単に見えるし、定義の実体を参照したり飛んだり、およそ必要な機能は全て備わってると言って過言じゃありません。

 とにかく、ここぞというところで右クリしまくってみてくださいな。


 書き込み&実行もバッチリ

 スイッチ押しながらON(またはリセット)という ESP32 側で必要な作法は Arduino IDE と一緒です。


http://dl.ftrans.etr.jp/?1da19ee639de46b59957de19ee00cb4dd72655b8.png


 開発元に「お布施」するとデバッグ機能が強化されるみたいですが、私は本職じゃないので Serial.printf で十分(笑)

 なんとか BT-SPP だけでも実現したいですねー

(目下 HCI・ACL のプロトコルを勉強中)

2017-02-06 やや濃い雨を観測していました

やや濃い雨を観測していました

| やや濃い雨を観測していましたを含むブックマーク

 昨夜から日付の変わる時間帯に、「やや濃い雨」と分類している 700cpm 前後の雨が降りました。


http://dl.ftrans.etr.jp/?0f22597cba274fa09ec408f16d0826eec7bbf980.png


 年に両手で数えられるほどしか降らない「濃い雨」は、どういうメカニズムで降るのか。


 フクイチの2号機で見つかった「穴」の放射線量が運転中の原子炉の中と同じだった・・・ってシレって報道されているようですが、停止中の原子炉じゃなくて「運転中の」って枕詞を添えているということは、穴の中で今もなお「運転中(核分裂反応が持続中)」ってことを意味するんですよね?


 個人的にはトランプ氏に対して、報道されているほどのネガティブな印象を持っていないのですが、彼のご機嫌を取るためだけに 51兆 もの年金を差し出してる場合じゃないと思うんですが。

(どうせ、サブプライムローンと一緒で焦げ付いて回収不能になるのは分かりきってる)

 発言は極めてストレートだけど、アメリカ大統領は遙か昔から、ずっとアメリカの国益が第一だった。

 アメリカが自国の国益を他国に譲ったことなど、アメリカ建国以来一度もない。(昔も今も変わってない)


 メディアに華を持たせることなく、直接「選挙民」にツィートしてしまうもんだから、限られた報道陣だけが入室を許される従来どおりの記者会見を続けたいメディアたちが、その存在の危機感から必要以上に叩いているだけではないか?(メディアの機嫌取りに腐心する安倍の正反対)


 費用の負担問題はともかく、麻薬の密輸根絶のため国境に壁を作りたいとする気持ちはわかる。

 むしろ、海という「壁」に囲まれた日本人からみたら、国境が往来自由であった点に驚きを隠せない。


 労働者の雇用創出のため、アメリカ国内に工場を置く企業を優遇したいのもわかる。

 メキシコに工場展開しようとした米国籍のフォードを批判したように、外国籍の企業を狙い撃ちしているわけではない。雇用を減らそうとする企業を国籍を問わず批判しているだけである。


 国外に生産拠点を移し続け、傘下の系列企業をも巻き込んで国内雇用を減らす一方のトヨタ(や同業他社)を、日本発祥で日本に本社があるという理由だけで過分に擁護し続ける日本政府のほうが、少なくともトランプよりは遙かに馬鹿で愚かだと思う。


 国内雇用を喪失させる企業へは厳しく対応しないと日本経済は決して上向かない。

(そんな企業の法人税を減らしている場合ではない)

 おっと脱線・・

2017-02-05 さくら IoT Platform を ESP32 で使えるようにする

さくら IoT Platform を ESP32 で使えるようにする

| さくら IoT Platform を ESP32 で使えるようにするを含むブックマーク

 軽い気持ちで Bluetooth で遊んでみようと思ったのも束の間、公式には BT Stack ライブラリがないぽく、かなり低レベルなところから自作しないといけないことが 昨日判明

 最終的に https://github.com/bluekitchen/btstack を ESP32(Arduino) 向けに移植するのが最もベターな気がする という結論に達しましたが、Arduino でライブラリをデバッグするコツが掴めず。

 今頃、外人さんがコード書いてるところ だろうから、もうちょっと待ってみるか、って気持ちに傾きつつある軟弱者です。。

(外人さんの間では WiFi と BT とが排他利用になるみたいな話題になってますが)


 そこで表題


 LTE通信が簡単に出来る さくら IoT Platform というものを 11月に入手し、GPS で位置情報のほか、周辺 WiFi 情報を無断で収集しまくるだけでは飽き足らず、ESSID が非公開設定になっていようが Broadcast されている BSSID は全てブッコ抜いて、リアルタイムにクラウドへ送信してしまうという、まさに グーグルがやってるようなストーカーソフトをサンプルで作った 次第ですが、今回の ESP32 を使えば、(公開設定で放置されてる)周辺の Bluetooth アドレスまでも収集できるぞ、ってことで、たぶん前述の BT Stack が解決したら試してみようと思ってますけれど、それ以前に ESP32 で使えそうなんか?って思い実験することにしました。


 最初に書いたような方法 で、「スケッチの例」から「Sakura IoT」→「Standard」を選びます。

 先にボードを ESP32 Dev Module とかにしてあると「互換性なし」の中に「Sakura IoT」が移動してるので、見つからなかったら「互換性なし」の括りを探しましょう。


 ESP8266 のときは、なにも弄らずコンパイルできたのですが、同じようにコンパイルしてみるとエラー!


 SakuraIO_SPI.cpp の中で使ってる digitalWrite が見えないぞと怒ってます。

 そういや初版から更新してないぜって思い、最新版を GitHub から取ってきます。


 んで再コンパイルしてやると、先ほどのエラーはそのままで、かつエラーが増えるじゃありませんか!

 仕方ないのでソースを確認。


SakuraIOArduino-master\src\SakuraIO_SPI.cpp

#include <SPI.h>
#include "SakuraIO.h"
#include "SakuraIO/debug.h"

#if SPI_HAS_TRANSACTION
static SPISettings settings;
#endif

void SakuraIO_SPI::begin(){
#if SPI_HAS_TRANSACTION
  SPI.beginTransaction(settings);
#endif
  dbgln("CS=0");
  digitalWrite(cs, LOW);
}

以下略

 ESP32 では SPI.h の中で Arduino.h が include されていないみたいですね。

 まぁこれは文化の問題だから仕方ないとして

#if SPI_HAS_TRANSACTION

 こいつは 0/1 じゃなくて、defined/undefined だと思うので、明らかに NG な気がしますが。

(しかも #if の次は定数でなく条件式を書くべき)


 以下の通り謹んで修正させて頂きます。。

#include <SPI.h>
#include <Arduino.h>				// added by wakwak_koba
#include "SakuraIO.h"
#include "SakuraIO/debug.h"

#ifdef SPI_HAS_TRANSACTION			// changed by wakwak_koba
static SPISettings settings;
#endif

void SakuraIO_SPI::begin(){
#ifdef SPI_HAS_TRANSACTION			// changed by wakwak_koba
  SPI.beginTransaction(settings);
#endif
  dbgln("CS=0");
  digitalWrite(cs, LOW);
}

void SakuraIO_SPI::end(){
  dbgln("CS=1");
  digitalWrite(cs, HIGH);
#ifdef SPI_HAS_TRANSACTION			// changed by wakwak_koba
  SPI.endTransaction();
#endif
  delayMicroseconds(20);
}

void SakuraIO_SPI::sendByte(uint8_t data){
  delayMicroseconds(20);
  dbg("Send=");
  dbgln(data, HEX);
  SPI.transfer(data);
}


uint8_t SakuraIO_SPI::receiveByte(bool stop){
  return receiveByte();
}

uint8_t SakuraIO_SPI::receiveByte(){
  uint8_t ret;
  delayMicroseconds(20);
  ret = SPI.transfer(0x00);
  dbg("Recv=");
  dbgln(ret, HEX);
  return ret;
}

SakuraIO_SPI::SakuraIO_SPI(int _cs){
  cs = _cs;
  SPI.begin();
#ifdef SPI_HAS_TRANSACTION			// changed by wakwak_koba
  settings = SPISettings(4000000, MSBFIRST, SPI_MODE0); // 4MHz, MSB First, SPI mode 0
#endif
  pinMode(cs, OUTPUT);
  digitalWrite(cs, HIGH);
}

 これでコンパイル&リンク通るようになるので、お困りの方は修正いただけると良いかなと思います。

2017-02-04 ESP32 用の BT Stack ライブラリが見つからない

ESP32 用の BT Stack ライブラリが見つからない

ESP32 用の BT Stack  ライブラリが見つからないを含むブックマーク

 ESP32 の Bluetooth で、まずは SPP で Hello〜 やってみようと思ったんですが、BT Stack に関するライブラリが見つけられず・・・


 bt.h は見つけられてコンパイルは通ったので使えそうなのですが、これはかなり低レベルなAPIで、HCI周りを自力で書かないといけないぽい。(書けばできそうだが)

void esp_bt_controller_init(void)

bool esp_vhci_host_check_send_available(void)

void esp_vhci_host_send_packet(uint8_t *data, uint16_t len)

void esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callback) 

 この辺がキーワードな気がする(備忘のため書き残す)

 もうちょっと努力しますが、本職ならともかくも、趣味で弄るだけの身としては敷居が高いなぁ


 Android 4.3未満を切り捨てるなら LE(GATT) もありかもしれないが、201HW を繋げたい・・・


(追記)2017/02/05

 ESP32 を弄り始めた人で、かつ さくら IoT Platform を繋げようとしてる方は僅かだと思いますが、デフォルトだとコンパイルが通りません。

 一部ソースを弄らないといけないです、ってことを記事にしましたので、どうぞ

2017-02-03 ESP-WROOM-32 (ESP32) 電池編

ESP-WROOM-32 (ESP32) 電池

| ESP-WROOM-32 (ESP32) 電池を含むブックマーク

 注目仕様のひとつに、電源電圧 2.2V〜 という項があります。

 最大電圧が 〜3.6V なのでリチウムイオン電池との相性は悪く、誰が見ても「どうぞ乾電池2つで遊んで下さいませ」っていう設計者の強い意図を感じずにはいられません。


 その意図を汲み取ったうえで究極の回路図を。


http://dl.ftrans.etr.jp/?c11da1a40d8745f4a1a28904f878cc937b1232b2.png

※これではプログラム書き込めません。書き込み済みの ESP32 を動かす前提です

※書き込むときの回路図例は 準備編 をどうぞ


 ESP8266 と違って、必須抵抗類が内蔵されているからね

 リセットボタンが必要なければ、ここまで簡略化させることができます。

(複数ある GND は内部で繋がっているようで、結線は省略できるぽい)


http://dl.ftrans.etr.jp/?efcfaad7a3324ddb816d8478c4dd218dd5db7d91.jpg


 秋月の 単3NiMH充電池 2本で試したところ、バッチリ動いちゃいました!

 それも、ただ通電させている状態じゃなくて。

#include <WiFi.h> 

const char *ssid = "<Set Your SSID>";
const char *pass = "<Set Your Password>";
const char *sendWriteKey = "<Set Your WriteKey>";

const char *sendServer = "api.logoole.etr.jp";

void send() {
    WiFiClient  client;
    Serial.print("connecting to ");
    Serial.println(sendServer);
    
    if(client.connect(sendServer, 80))  {
      static int SEQ = 0;
      String postData = "SEQ=" + (String)SEQ;

      String postMethod;
      postMethod.concat("POST /");
      postMethod.concat(sendWriteKey);
      postMethod.concat(".post HTTP/1.1\n");
      postMethod.concat("Host: ");
      postMethod.concat(sendServer);
      postMethod.concat("\n");
      postMethod.concat("Content-Type: application/x-www-form-urlencoded");
      postMethod.concat("\n");
      postMethod.concat("Content-Length: ");
      postMethod.concat(postData.length());
      postMethod.concat("\n\n");

      postMethod.concat(postData);
      postMethod.concat("\n\n");

      client.print(postMethod);
      Serial.print(" ");
      Serial.println(postData);
      
      SEQ++;
    }
}

void setup() {
  // put your setup code here, to run once: 
  Serial.begin(9600, SERIAL_8N1);

  Serial.print("WiFi connecting to ");
  Serial.print(ssid);
  WiFi.begin(ssid, pass);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected");
  Serial.print(" IP:");
  Serial.println(WiFi.localIP());
}

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

 起動直後に WiFi 接続したうえで、1秒おきに HTTP POST(TCP送信) し続けるという、実運用では考えにくい過酷な条件を強いてみましたが、途中でリセットかかることなく安定して動作し続けております。


 昨日は夜遅く(というか今日の未明)まで弄っていて睡眠不足で、もう限界なので今日は寝ます。

 計算上は明日の未明まで動き続けると思うんですが動かしっぱなしで寝るので、気になる方は私の代わりに ログールの DataTable を見て 確認してくださいな。


 それでは、おすみなさい〜


(追記)2017/02/04 08:00

 おはようございます。

 昨夜からの、まだ動いてますね。


(追記)2017/02/04 09:30

 いま見たら9時頃に息絶えていたみたいです。

 37961回(0スタートなのでSEQの最大値に+1してる) POST できたみたいなので10時間30分くらい。


 電池電圧は監視してませんでしたが、取り外しての開放電圧は 2.38V くらい。

 負荷を取り外して電圧が復元しただけで実容量は殆ど残ってないと思いますが、NiMH電池の寿命に影響するほどの「電気の搾り取り」はやってない予感がします。

(後悔:取り外す前にも電圧測定しておくべきだった)


 あえて外部で過放電防止する必要が要らないかも!


 Bluetooth を使う予定なくても、乾電池2本で直結運用できるという利点だけで ESP8266 じゃなく ESP32 を選択する価値もあるように思います。


 これから 散髪 and/or 献血 に行ってきますが、帰ってきたら Bluetooth で遊んでみようかな

 また続き書きますねー


(追記)2017/02/04 14:00

 送信が途絶えたときの、負荷を切り離す前の電圧(NiMHから電気を搾り取りすぎてないか)を測り損ねたため 違う API キーを取得して 再測定をすることにしました。

http://api.logoole.etr.jp/CmeyBttxh0WAJzqOhgJuQw/datatable.html


(追記)2017/02/04 23:00

 気がつかなかったのですが、2017/02/04 19:06:35 に WiFi が切れたか何かで送信が停止してました。

 最後の SEQ は 17648 で、OFF/ON し直したら、また動き始めました。

 送信エラーのチェック(エラー時の再接続処理とか)してないし、きっと私がテキトーに作ったサンプルのせいでしょう。

 POST は失敗してましたが、通電状態を維持していたので電気は食ってます。

 よって SEQ の値(持続時間)には意味がなくなりました。


(追記)2017/02/05 08:30

 当然にして止まっていたので、取り外す前に電圧測定してみましたら、なんと 1.46V!

 1本あたりじゃなくて、2直列で1.46V!!

(もっと放置しておいたら、もっと下がると思われ)


 だめですやん


 NiMH 充電池を使うならば

 外部で過放電防止しないとあかん!!


 以上で電池を使った実験は終了としまーす。


(追記)2017/02/11

 それほどハードなことはやってないのですが、実運用中にあり得る程度の「低電圧実験」中に WiFi が死亡しました。

 2.2V〜 を謳っているものの、WiFi 使用中はもう少し高い電圧が必要で、電圧が下がると漏れなくフリーズするぽいことを発見したのですが、我々が触れられないところで動いている内部のファームウェアが動作中にバックグラウンドで WiFi 関係の何かをどっかに書き込んでいるぽく、フリーズのタイミング次第で不整合が起きて壊れた気がします。

(すべて憶測ではありますがハード的な故障ではなく、ソフト的な原因での故障状態と思う)


 そこら辺の顛末を 低電圧で遊んでたら ESP32 の WiFi が死亡 で記事にしました。


(追記)2017/02/26

 電源電圧を自己測定し、ソフト的に過放電を防止する仕組みについて記事を書きました。

 わずか 4μA しか消費しない Hibernation mode と呼ばれる Deep Sleep の究極モードを使って過放電を最小限に抑えます。

 

 詳しくは こちら をどうぞ


(追記)2017/02/28

 2.2V 付近で動かないと嘆きましたが、それはデフォルトのまま 80MHz でコンパイルしたせいで、40MHz 指定でコンパイルし直すと 2.0V 近くでもシッキリ動いてくれました。

 電池で運用する人は、40MHz でコンパイルせよ をどうぞ。

sakahoshisakahoshi 2018/04/12 23:59 こばさん

ESP32を電池で動かす方法を探していた所、こちらの記事で接続の仕方が分かりました。
電子工作を始めたばかりで、回路図が少し分かる程度なのですが、ボタン電池で同様の事ができずに困っております。
コンビニで市販されているCR2032(3V)を使用したのですが、通電はしているもののwifi接続などが機能しておりません。
単3電池を直列に繋いだ際の動作は確認しているため、電源が原因と考えています。

調べて見た所、以下の質問と同様の事象だと考えているのですが、対応方法をご存じでしたらご教示いただけないでしょうか。
https://esp32.com/viewtopic.php?t=975

よろしくお願いいたします。

こばさんこばさん 2018/04/13 07:45 おはようございます。
CR2012で駆動させようとは酔狂ですねぇ・・・
ところで何個かパラるんじゃなくて1個ですよね?

あれは内部抵抗が10Ωちょっとあって、0.1A を引いただけでも電圧降下が 1V 超えます。
規格上の標準電流は 0.2mA でして、無理させて10倍引いたところで 2mA が精々
とてもじゃないですが、単体では ESP32 が要求する 100〜200mA は賄えません。

スーパーキャパシタと呼ばれる巨大なコンデンサを CR2012 との間に付けて、かつキャパシタの充電が完了するまでは起動しないよう EN ピンを遅延させれば、なんとか起動&短時間の動作は可能でしょうけど、さっさと処理を終えてディープスリープに入らないとキャパシタの電池が尽きてしまいます。

常用は逆立ちしても不可能で、精々できても間欠動作までですけど・・

sakahoshisakahoshi 2018/04/13 09:11 早速のご回答ありがとうございます。
同じ3Vでも電池の種類で耐えられる負荷が違うんですね。。。

ご想像の通り1個で動かすつもりでした。
落し物タグのようなものを作ろうとしており、
ボタン・抵抗・電池・ESP32のみで部品数・体積・値段を最小にしたいと考えています。

乾電池相当の出力のボタン電池など、乾電池2個よりも体積を小さくする方法はないでしょうか。
よろしくお願いいたします。

こばさんこばさん 2018/04/14 10:28 なんか手段と目的が入れ替わっちゃってる気がしないでもないですが、ESP32 は超オーバースペックすぎる気がします。
落とし物タグと称するものが、どういう使われ方をするのか分かりませんが、ESP32だったら単4×2でも1日もたないし・・・

BLE系なタグとか、RFIDとか、そっち系を探された方がいいと思います。

sakahoshisakahoshi 2018/04/15 03:11 なるほど、そうなんですね。。。

素人質問にも丁寧に回答くださりありがとうございます。
基礎知識の勉強もしつつ、アドバイス通りに別の方向で探してみたいと思います。

改めてありがとうございます。

2017-02-02 ESP-WROOM-32 (ESP32) 準備編

ESP-WROOM-32 (ESP32) 準備

| ESP-WROOM-32 (ESP32) 準備を含むブックマーク

 昨日お伝えした ESP-WROOM-32 (ESP32) が秋月から届きましたので早速。


 公式データシートの13ページ に参考回路図が載ってますが、ほとんど ESP8266 と一緒 です。

 ESP8266 のときには何個か外部に抵抗が必要でしたが、主要な必須プルアップ/ダウンは内蔵され、ENピン(リセットを兼ねる)に1つプルアップを置くだけで良いみたい。


 パソコンから USBシリアル(こういうの)で接続する前提での回路例です。

 三端子の周辺は各自の電源事情に応じてアレンジしてください。

 入力側の 1000μF は 20円 と安いため好んで使ってるだけで、そんなに容量いらないと思います。


http://dl.ftrans.etr.jp/?457ce88484ea41319da3700cdb8320602869758a.png

※GND はモジュール内で繋がってるぽいので、外部で3つを結線しなくても、とりあえずは動きます。

 (勝手な予想ですが)pin.1 の GNDライン が最も太いと思うんで、まずはここだけ押さえておけば良いかと。


 もういっそ、ENピンにもプルアップ内蔵しといてくれ、って感じですよねぇ。

 んで、これを 1.27ミリユニバーサル基板 に配置することにします。


http://dl.ftrans.etr.jp/?7736efe59a1c4283b86f8b8b95a331a0699eeabd.jpg http://dl.ftrans.etr.jp/?f7f9876aa9364b938594c502c90d58f65eb62b6c.jpg


 あれ?って思った方、お目が高い。

 ピンソケットピンヘッダ で着脱可にしたうえで、裏返しに配置しました。


 だって、裏側にピンアサインのシルク印字があるんですから、隠してしまうのはもったいない。。

 私のように裏返しにして実装する場合は、最初の回路図のピンアサインが半田面から眺めた配置となりますので要注意。


 更に注意となりますが、誠に残念なことながらこのモジュール、縦横ともに 1.27mm ピッチに対して半ピッチくらいズレてるみたいで、ピンソケット・ヘッダの付近を僅かにハの字にする必要あります。

(意味が伝わらないかもしれないが、ユニバーサル基板の上に置いてみると気がつくと思う)

 秋月さんのことだから、きっと専用の変換基板を準備中だと思いますから、ちょっとの間の辛抱ですね。


 で次が Arduino の環境構築


 基本的には Github の資料通り(Windowsの場合の詳細手順は こちら)ですが、ひとつ嵌ったのが、

Target Directory: C:/Users/[YOUR_USER_NAME]/Documents/Arduino/hardware/espressif/esp32

という箇所。

 最初この通りにやったら、うまく出来たぽく見えるものの、Arduino のボードリストの中に ESP32 が出現せず・・・


 試行錯誤の結果、私がスケッチを置く場所をデフォルトから変更していたことが原因だったらしく。

 デフォルトの人はいいですが、なにか弄った覚えのある人は念のため Arduino の環境設定で確認したほうがいいです。


http://dl.ftrans.etr.jp/?c2c1ea42f6524307bddcf4736f86fe522dd457c6.png


 私は E:\ownCloud\Documents\Arduino に移動させてたので、E:\ownCloud\Documents\Arduino\hardware\espressif\esp32 を指定しないといけなかったのでした。


 手順どおりやると、Arduino のボードリストの中に ESP32 Dev Module が現れるので、それを選んで後は ESP8266 のときと同じ要領で COM番号 を指定したり、と。


http://dl.ftrans.etr.jp/?ea1fa96d6ba345d5863966dedf71330b1daa11c6.png


 ESP8266 のときと同じで、IO0 のスイッチを押しながら POWER ON(または RESET ボタンプッシュ)するとダウンロードモード(書き込みモード)になりますが、書き込み後に勝手には再起動しないみたいで、手動で RESET する必要があるぽいです。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600, SERIAL_8N1);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Hello ESP32");
  delay(1000);
}

 スクショは省略しますがバッチリ動作♪


 しっかり無線で遊べるうえに、マイコンとしても、ほぼフルスペックの性能なのに、これでたったの700円

 ほんと 凄い を通り越して 凄まじい としか言い表せません。


 次は 3G/LTE 搭載ですかね。

 ワクワクします。


 週末もうちょっと遊んでみて、その結果を記事にしますねー


(追記)2017/02/03

 乾電池(単3NiMH電池×2直列)で動いてしまいました。

 しかも無線送信もバッチリ。

 詳しくは こちら をどうぞ。


(追記)2017/02/07

 Arduino IDE でもいいのですが、Microsoft が提供している強力な開発ツール Visual Studio を使っても、ESP32 のプログラミングが出来ました。

 手順をまとめましたので、インテリセンス でラクしたい方はご参考くださいませ。

http://d.hatena.ne.jp/wakwak_koba/20170207


(追記)2017/02/12

 ブレークアウトボードの使い勝手がイマイチなので、2号機を作りました。

 これから準備する人はこっちのほうが良いかと。。

 興味ある方は こちら からどうぞ♪

cypriscypris 2018/05/26 14:54 初めまして。
私もESP32について学んでるものです。
こちらの記事の最後に3Gを搭載するとのことですが、その記事はもう書かれたのでしょうか?

こばさんこばさん 2018/05/26 22:26 こんばんは。
3G/LTE 云々の件ですが私が作るという話じゃありません。

WiFi、BT と来たら次は 3G/LTE だよね? ってニュアンスで espressif へエールを送った、って風です。
文章力が欠如してまして誠に申し訳ありませんでした。

2017-02-01 ESP-WROOM-32 (ESP32) 秋月に登場!

ESP-WROOM-32 (ESP32) 秋月に登場!

ESP-WROOM-32 (ESP32) 秋月に登場!を含むブックマーク


 ESP8266 に Bluetooth が載ったモデルが秋月に登場。

 今回も WiFi が 5GHz帯 に対応していない点だけ残念ですが、データシート によると Bluetooth のプロファイルは A2DP/AVRCP/SPP/HSP/HFP/RFCOMM と、今どきに必要なものを一通り網羅しているようです。


 それ以外にも

・電源電圧:2.2V〜3.6V

 乾電池2本で動くかも!?

・I2S:x2

 I2CじゃなくてI2S、つまりオーディオ関連のインターフェースです。

・DAC:x2

 これも喜ばれそう

(分解能は8bitだそうです)

・SDIO:マスター/スレーブ

 SDカードにもなれるし、SDカードリーダーにもなれる、という解釈で合ってるかな?


 こんだけテンコ盛りで 700円 は超破格値です。

 しばらく待つと変換基板も出てくると思いますが、1.27mmピッチなので十分に手半田で行けますね。


 週末に遊ぼうという人は今のうちにポチっておきましょう〜♪

(私のところへは明日届くはず)


(追記)2017/02/02

 ブツが届きまして、Hello 出力させるところまで出来ました。

 記事はこちら