配線の見直しを行いました。
TPS63000 のバックブーストのパワーセーブをESP13からコントロールすることにしました。オシロスコープとかは持っていないので、有効かどうかは、バッテリーの持ちで判断することになりそうです。
IC2からの配線と、左下LEDの配線を変更し、GPIO 5番でパワーセーブをコントロールすることにしました。
配線の見直しを行いました。
TPS63000 のバックブーストのパワーセーブをESP13からコントロールすることにしました。オシロスコープとかは持っていないので、有効かどうかは、バッテリーの持ちで判断することになりそうです。
IC2からの配線と、左下LEDの配線を変更し、GPIO 5番でパワーセーブをコントロールすることにしました。
これがわからなくて1日消費しました。
何が、わからなかったかといいますと、PGND と GND をつなぐ方法です。2つのグランドが電源周りにあるのですが、オフィシャルの回路を見るとこのようになっています。
GND が2つあって、PGND はパワー・スイッチ回路用グランドで、GNDは、コントロール/ロジック回路用グランドのようです。PGND は、熱処理するためにPowerPAD (部品中央に位置する)に接続し、PCB の銅箔面の面積を稼いで空冷させるようです。
しかし、Eagle は、複数の属性を持つ名前同士を(用語では、Name とか、クラス(Net Class)と言うそうです)接続できず、どれか1つの属性になります。以下の場合は、GND と PGND が別に接続されて、意図したように配線されません。
何かやり方があるのだろうと、いろいろ調べましたが結局わからず、手法として、以下のような解決策で実現しました。
2つのグランドを接続するためのパーツを回路図に入れて、そこにPGND と GND をくっつけました。ジョイントのような考え方ですが、回路図中にGND っぽい図が出るので、これを使いました。
こうすれば、2箇所の違うNet Class を1つのパーツに接続できるので目的が果たせました。
PCB 上ではジョイントを裏側に回し、べたアースとスルーホールをつけて熱を逃がします。
PGNDは、以下のように接続されています。
べたアースはググればすぐに出てくるので省略です。
とにかく、これで目的は果たせましたが、これが正当なやり方なのかは不明です。
そして、LEDの位置は、裏面のサイド寄りにつけることにしました。
ケースに組み込んだ時、この位置だったら光っているのがわかるかなと。
GND もべたアースを取ったほうがいいだろうなということで、以下のように。
このべたアースを取るか取らないかで、何が変わるのだろう?
熱処理はこれでOK。
あ、ENピンを忘れているようです。最終確認の時にやりますか。
編集後記
データシートを見直してみると、レイアウトについての考察 の項がありました。PGND と GND を分ける理由は、引用すると以下です。
レイアウトについての考察
::
コントロール・グランドを適切に配置するには、配線を短くし、さらに電源グランドの配線から分離することを推奨します。このことにより、電源グランドの電流とコントロール・グランドの電流の重なり合いにより起こり得るグランド・シフトの問題が避けられます。
::英文 P.16
To lay out the control ground, it is recommended to use short traces as well, separated from the power ground traces. This avoids ground shift problems, which can occur due to superimposition of power ground current and control ground current.
この「グランド・シフトの問題」というのは、おそらく「グランドGNDの電位が浮き上がる」事かと。
以下の特許の資料が詳しいです。
ルネサス エレクトロニクス株式会社
【公開番号】特開2010-73951(P2010-73951A)
::
【0142】
図12は、レギュレータ回路Reg、内部回路circ1-1および内部回路circ1-2が、金属配線metalVと金属配線metalGとにそれぞれ接続されている詳細を示す図である。内部回路circ1-1および内部回路circ1-2は、図1に示す内部回路circ1が複数設けられていることを意味する。
【0143】
図12(a)は、レギュレータ回路Reg、内部回路circ1-1および内部回路circ1-2が、それぞれパッドGに共通に接続されていることを示す図である。図12(b)は、レギュレータ回路Regが接続されているパッドGと、内部回路circ1-1および内部回路circ1-2が接続されているパッドGとが分けて設けられていることを示す図である。
【0144】
図12(a)に示すように、レギュレータ回路Reg、内部回路circ1-1および内部回路circ1-2は、パッケージPKGの外部より外部電源電圧extVccを供給されるパッドVと金属配線metalVにより接続されている。
【0145】
さらに、レギュレータ回路Reg、内部回路circ1-1および内部回路circ1-2は、パッケージPKGの外部より接地電圧(グランド)GNDが与えられるパッドGと金属配線metalGにより接続されている。
【0146】
内部回路circ1-1および内部回路circ1-2が、内部回路circ2と信号の送受信を行うと、金属配線metalGに各回路から電流iが流れる。金属配線metalGは、配線抵抗Rを有しており、ここに2回路から電流が流れるため、2iR(=V)の電圧が発生する。
【0147】
このとき、発生した2iR(=V)によってグランドGNDの電位が浮き上がる(グランドシフトが発生する)場合がある。そして、同じパッドGに接続されているレギュレータ回路RegのグランドGNDも電位が浮き上がることにより、動作が不安定になる場合がある。
【0148】
このようなレギュレータ回路Regの不安定動作を避けるためには、図12(b)に示すように、レギュレータ回路Regが接続されるパッドGと、内部回路circ1-1および内部回路circ1-2が接続されるパッドGとを分けて設けるとよい。
【0149】
つまり、電源領域PowAreaのパッドGと、信号領域SigAreaのパッドGは、分けて設けるとよい。
【0150】
パッドGを分けて設けることにより、図12(b)に示すように内部回路circ1-1および内部回路circ1-2が、内部回路circ2と信号の送受信を行っても、レギュレータ回路RegのグランドGNDに電流が流れ込まず、グランドGNDの電位の浮き上がりもなくなるので、レギュレータ回路Regの動作が不安定になることを少なくすることができる。
厳密にはGNDに落ちるときにも配線抵抗があるので、電位差が発生し、これをグランド・シフトというそうです。電源回路Aとロジック回路BのGNDへ影響を受けなくするため、GNDを分離するといいよということです。要するに良いGND とは、0V を常にキープすること。べたアースとか、音響設備でアースが大事だとか、そういう理由だったのですね。納得です。
参考
▼やるかどうか検討
・パワーセーブモードを有効、無効にするのをESP8266 からコントロール
・PIN7 の PS/SYNC がGND(0) だとパワーセーブ有効。PIN8 VINA(1) に接続で無効にできる
・負荷が10mA 以下だとパワーセーブのほうが省電力だそう。
・deepspleep の時は、有効にして、起き上がったら無効にするようコントロール
・GPIOがHIGH で、PIN7 と PIN8 に接続するように、P-chan mosFET をつけるなど。
PIN7 が HIGH(1.2V 以上) になれば、無効なので、GPIO から抵抗をつけて HiGH にすればいい?
リセットボタンと、WEB にアクセスしたときに光るLEDと、WiFiにアクセスしたときに光るLEDをつけたのですが、スペース的に工夫しないとちょっと配線がきつそうです。
表のレイヤーを出すと、こんな感じ。自動配線を継ぎ足していったので、レイアウトは要再考ですね。
パイロットランプ的な、パワーLEDは電力消費を抑えてつけず、動作がわかるようにWEBにデータを投げているときに付くLEDと、WiFiにアクセスしているときに付くLEDをつけようと思っています。
スペースはまだあるのでレイアウトさえ考えればいけそうな感じです。GPIOのどのピンから取るかで配置が決まりそうです。ESP12とWROOM-02のピン配列が載っているブログがありました。わかりやすいですね。
Imazeki’s workshop
14 と 16 から取って、裏側のサイドにLED配置しても光は見えるかなぁ。どうしますかね。
土日にあれだけ、部品点数を減らすために試行したんですが、結局nodemcu と同じトランジスタ2つと抵抗2つを使う回路を採用することにしました。決定打は、トランジスタの価格。なんと、100個で138円だったのですよ。
RTSのピンは、仕方がないので手持ちのUART のを5VをカットしてRTS を接続するよう改造。そうすれば、ピンに挿せます。
トランジスタって高いイメージがあったんですが、1個1円以下ですか。心配になるくらい安いですが、ちゃんと動くかな?
S8050 (KOO CHIN ELECTRONICS)
ISO9000 と設備もちゃんとしているから大丈夫なんでしょうね。トランジスタやダイオードの専門メーカーのようです。
100個入り買ってしまったあとに、気が付いたんですが、こんな小分けしたいろんな種類のを買っておいてもよかったかなぁと。
SMD SOT-23 TYPE Package current Voltage datasheet
———- —- ——- ——- ——- ————————–
S9012 PNP SOT-23 http://www.hz-dz.net/UploadFiles/20095279561392.pdf
S9013 NPN http://www.hz-dz.net/UploadFiles/200952795741634.pdf
S9014 NPN http://www.hz-dz.net/UploadFiles/2009812164155938.pdf
S9015 PNP http://www.hz-dz.net/UploadFiles/200952795926434.pdf
S9018 NPN http://www.hz-dz.net/UploadFiles/200952710041892.pdf
S8050 NPN http://www.hz-dz.net/UploadFiles/2009527101530473.pdf
S8550 PNP http://www.hz-dz.net/UploadFiles/2009527101633635.pdf
C1815 NPN http://www.hz-dz.net/UploadFiles/2012924155134699.pdf
A1015 PNP http://www.hz-dz.net/UploadFiles/2009512174610585.pdf
TL431 Programmable Voltage Reference http://www.tij.co.jp/jp/lit/ds/symlink/tl431.pdf
MMBT3904 NPN http://www.hz-dz.net/UploadFiles/200952794252635.pdf
MMBT3906 PNP http://www.hz-dz.net/UploadFiles/200952794350480.pdf
MMBT2222A NPN http://www.nxp.com/documents/data_sheet/MMBT2222A.pdf
MMBTA44 NPN http://www.secosgmbh.com/datasheet/products/SSMPTransistor/SOT-23/MMBTA44.pdf
MMBTA42 NPN http://www.nxp.com/documents/data_sheet/MMBTA42.pdf
MMBTA92 PNP http://www.nxp.com/documents/data_sheet/MMBTA92.pdf
MMBT5401 PNP http://www.hz-dz.net/UploadFiles/200952794554658.pdf
MMBT5551 NPN https://www.fairchildsemi.com/datasheets/MM/MMBT5551.pdf
MMBT2907 PNP https://www.fairchildsemi.com/datasheets/MM/MMBT2907.pdf
2SC945 NPN http://www.kexin.com.cn/pdf/2SC945.pdf
A733 PNP http://vakits.com/sites/default/files/2SA733.pdf
まぁ、トランジスタはあんまり使わないので、まぁいいか。
買うなら、TO-92 パッケージのこんなのがよいですかね。
さて、Eagle の勉強をかねて、ESP8266 でPCBを作っているのですが、だいぶできてきました。
現在のところ、以下のような感じになっています。前回と違うのは、CDS のセンサーに分圧抵抗を入れて、1V 化したものをADC で計測しています。当初半固定抵抗を入れようと思っていたのですが、個体差には目をつぶることにして、安さを追求しました。
CDS は計測してみると、強い光を当てると、抵抗値が150オームくらいから、真っ暗にすると5Mオームくらいまで変動します。
分圧抵抗は以下のサイトが便利でした。
ちなみに、nodemcu の回路のADC は、以下のようになっています。220k と 100k で分圧して1Vを作って計測しているようです。
電圧と、抵抗値を入れると出てくるサイトもあって、上記は以下のように入れると出てきます。
いろいろあって便利ですね。電卓で計算するより便利なので活用しています。
さて、前置きが長くなりましたが、 UART を挿しておけば自動的にファームウェアを書きかえれるモードにする方法です。
nodemucu は、回路図があって参考になります。以下のような回路です。
この回路は、RTS も使っているので、DTR のみというわけにはいきません。自分の持っているUART は RST は出ているんですが、ピンの横から出ていて直接挿すには、改造しないといけません。
安くて、便利に使っているので2つ持っています。DTR だけでやるには以下のようにやれば良さそうなのですが、具体的な抵抗値と、コンデンサの値が良くわかりません。トランジスタは、PNP 形であれば良さそうです。
CH_PD は ESP13 や WROOM-02でいえば、EN ピンで普段は10k くらいでプルアップしている抵抗です。なので、R1 と R3 は10K程度でよいということはわかるのですが、R2 が良くわかりません。また、C1 はどのくらいの容量が良いのかも不明です。
プログラムを書き込みモードにする原理は、起動時にGPIO0 PinがGND に落ちていればいいので、R2 は10K 程度でよいのではと考えています。CH_PD にコンデンサを挟む原理は、再起動させる働きがあると理解すればよいのでしょうか?
一番シンプルな回路として、以下があります。ダイオードとコンデンサだけで、構成された回路です。
これが動作するのであれば、今回採用したいと思っています。
で、試してみました。手持ちには、1uf と 0.01uf しかないので、1uf で試しました。どうやら、これで書き込みモードになるようです。1uf だと30回の内、11回が成功し19回は失敗しました。3分の1の成功率です。もう少し、精度があがればいいのですが。
0.1uf だとちゃんと動くのかどうかは不明です。
コンデンサの数を並列に2,3と増やすと100%成功しますが、シリアルからコンソールを開くと、100%Boot せず、リセットをかけてもだめです。動いているときにシリアルを開いてもシステムが止まります。
どっかに0.1uf ないか探してみます。
ありましたが、1uF が一番成績が良かったです。
成功するときは、以下のようになります。
esptool v0.4.5 - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> setting board to ck setting baudrate from 115200 to 115200 setting port from /dev/tty.usbserial to /dev/cu.SLAB_USBtoUART setting address from 0x00000000 to 0x00000000 espcomm_upload_file stat /var/folders/9c/0bsgxjzx63s7xhc_zz12jyp40000gn/T/build8239373840747412004.tmp/sample_FSA3357_adc_Select.cpp.bin success opening port /dev/cu.SLAB_USBtoUART at 115200 tcgetattr tcsetattr serial open opening bootloader resetting board trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_open Uploading 297360 bytes from /var/folders/9c/0bsgxjzx63s7xhc_zz12jyp40000gn/T/build8239373840747412004.tmp/sample_FSA3357_adc_Select.cpp.bin to flash at 0x00000000 erasing flash size: 048990 address: 000000 first_sector_index: 0 total_sector_count: 73 head_sector_count: 16 adjusted_sector_count: 57 adjusted_size: 039000 espcomm_send_command: sending command header espcomm_send_command: sending command payload setting timeout 10000 setting character timeout 100 done setting timeout 1 setting character timeout 1 done espcomm_send_command: receiving 2 bytes of data writing flash ................................................................................................................................................................................................................................................................................................... starting app without reboot espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data closing bootloader
失敗するときは、以下のよう。
esptool v0.4.5 - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> setting board to ck setting baudrate from 115200 to 115200 setting port from /dev/tty.usbserial to /dev/cu.SLAB_USBtoUART setting address from 0x00000000 to 0x00000000 espcomm_upload_file stat /var/folders/9c/0bsgxjzx63s7xhc_zz12jyp40000gn/T/build8239373840747412004.tmp/sample_FSA3357_adc_Select.cpp.bin success opening port /dev/cu.SLAB_USBtoUART at 115200 tcgetattr tcsetattr serial open opening bootloader resetting board trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload resetting board trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload serialport_receive_C0: 3E instead of C0 trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload resetting board trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload trying to connect setting character timeout 0 done setting character timeout 1 done espcomm_send_command: sending command header espcomm_send_command: sending command payload serialport_receive_C0: 41 instead of C0 warning: espcomm_sync failed error: espcomm_open failed
違う方法を模索しますか。まず、nodemcu でも採用されているNPNトランジスタを2つと抵抗2つを使ったもの。
自分のUART には、RTS があるのですがピンから出して配線。NPN トランジスタは、以下の左から2番目の2SC945を2つ使いました。たぶん、かなりの年代モノでジャンク箱にあったものです。
抵抗は、手持ちの適当なもの5.5k と 6.7k をつけました。当初、IDE (arduino に ESP8266 を組み込んだもの)からは、反応がなく「うーん、これもだめなの?」と思っていましたが、設定を以下のようにいじったら問題なくいけました。
---- esp8266/hardware/esp8266/1.6.5-947-*****/boards.txt ############################################################## generic.name=Generic ESP8266 Module generic.upload.tool=esptool generic.upload.speed=115200 generic.upload.resetmethod=nodemcu generic.upload.maximum_size=434160 generic.upload.maximum_data_size=81920 generic.upload.wait_for_upload_port=true generic.serial.disableDTR=false generic.serial.disableRTS=false ::
アプリケーションを再起動しないと駄目なようです。設定しても反映されないというなぜに陥りました。
設定が反映されているかどうかは、書き込み時の冒頭の赤い部分に出る以下で見分けがつきます。
esptool v0.4.6 - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> setting board to nodemcu★ setting baudrate from 115200 to 115200 setting port from /dev/tty.usbserial to /dev/cu.SLAB_USBtoUART setting address from 0x00000000 to 0x00000000 espcomm_upload_file stat /var/folders/9c/0bsgxjzx63s7xhc_zz12jyp40000gn/T/build6222680945723527651.tmp/sample_FSA3357_adc_Select.cpp.bin success opening port /dev/cu.SLAB_USBtoUART at 115200 tcgetattr tcsetattr serial open
esptool-ck は現時点で最新の0.4.6に入れ替えておきました。
とにかく、これでリセットボタンや、GPIO0 をGND に落としたり、スイッチをつけている場合はそれを押さなくてもよいよいになります。
今回の組み込みには、RTS を使わないDTRだけを使ったものにしたいと思いますので、PNPとコンデンサを使ったものをなんとか成功させたいです。一度、組み込んだのですがうまく動作しなくて。もしかしたら、この設定が反映されてないかもしれないので、もう一度組み込んでみます。
やっぱりだめでした。うーん。作者が言っているやつなのになぁー。
外部のADCを利用せず、スイッチをつけて内部のADCを利用するというアプローチが以下にありました。
TINKERING WITH TECHNOLOGY
WHEN YOU NEED MULTIPLE ANALOG INPUTS FOR YOUR ESP8266 APPLICATION
なるほどーです。FSA3157 というスイッチをつけて、GPIO ピンからデジタルでHigh Low させることによりスイッチを動作させるものです。なんか日本語変ですが。上記ブログと、データシート見たほうがわかりやすいです。
FarChild Semiconductor FSA3157
datasheet
これで、ADCのソースを2つから選べるようになるということですね。
3つのソースを2つのGPIOで制御する場合は、以下のICを。
FSA3357
価格的には、どちらも安いので候補ですね。ハードの世界はいろいろなICがあって、面白いですね。
配置した感じでは、大きさがほとんど変わらないので、8pin の 3チャンネル切り替えられる FSA3357 を導入することに。前回検討していた、ダイオードを挟む方法は、正確に抵抗値を読みたいので、適しませんでした。
AliExpress にて、10個1083円なり。1個110円くらいです。
これを組み込んで、電源電圧他、2つのアナログ値を取れるようにして、1つはCDSの照度に使い、あと1つはPINを出しておく形にしておきます。
抵抗分圧して、3.3v をいったん、0.5VにしてADC で値を読ませた後に、元の値に戻しています。wifi eink のコードにあったやつです。まだ、ものがないのでS1,S2 の切り替えコードは書いていませんが、抵抗分圧して、内臓のADC で1V 以上の抵抗を読めるようにテストしてみました。
/* ADC Read Sample Arduino IDE 1.6.5 Hourly Build 2015/06/12 03:13 esp8266 by ESP8266 Community version 1.6.5 Hourly Build 2015/06/12 JunkHack 2015.10.10 --- ex Serial output. Blink Count: 40 ADC mv: 3319 ADC mv: 3313 Blink Count: 41 ADC mv: 3319 ADC mv: 3313 :: */ #include <ESP8266WiFi.h> int ledState = LOW; unsigned long previousMillis = 0; const long interval = 1000; void setup() { pinMode(BUILTIN_LED, OUTPUT); Serial.begin(115200); delay(10); } int value = 0; int count = 0; int adc = 0; int batteryMeasMv = -1; void loop() { delay(interval); ++value; unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if (ledState == LOW){ ledState = HIGH; // Note that this switches the LED *off* } else { ledState = LOW; // Note that this switches the LED *on* digitalWrite(BUILTIN_LED, ledState); delay(1); count += 1; Serial.print("Blink Count: "); Serial.println(count); } } //Battery voltage is divided by an 5.6K/1K resistor divider. //ADC: 1024 = 1V adc = analogRead(A0); batteryMeasMv=(adc*10020*6.6)/10000; // ^^^^^To correct an error in the resistance value Serial.print("ADC mv: "); delay(1); Serial.println(batteryMeasMv); }
テスターで実測値に近くなるよう係数を補正しています。
自分自身の電圧をグラフに投げて、長期DeepSpeel の電圧降下具合を記録できそうです。
手抜きですが、以下のようなコードになる感じですかね。
/* ADC Read Sample. Fairchild Semiconductor FSA3357 adc Select. Arduino IDE 1.6.5 Hourly Build 2015/06/12 03:13 esp8266 by ESP8266 Community version 1.6.5 Hourly Build 2015/06/12 JunkHack 2015.10.10 --- ex Serial output. Blink Count: 1 >adc1(B0) ADC mv: 3280 >adc2(B1) ADC mv: 3273 >adc3(B2) ADC mv: 3293 >adc off :: */ #include <ESP8266WiFi.h> int ledState = LOW; unsigned long previousMillis = 0; const long interval = 1000; //1sec /****************************************************** * Fairchild Semiconductor FSA3357 adc Select. * 0 = No Connection * 1 = B0 to A * 2 = B1 to A * 3 = B2 to A */ const int S1 = 14; // S1 to GPIO Pin const int S2 = 16; // S2 to GPIO Pin void adcset(int port) { pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); switch (port){ case 1: digitalWrite(S1, HIGH); digitalWrite(S2, LOW); Serial.println(">adc1(B0)"); break; case 2: digitalWrite(S1, LOW); digitalWrite(S2, HIGH); Serial.println(">adc2(B1)"); break; case 3: digitalWrite(S1, HIGH); digitalWrite(S2, HIGH); Serial.println(">adc3(B2)"); break; case 0: digitalWrite(S1, LOW); digitalWrite(S2, LOW); Serial.println(">adc off"); break; } } /****************************************************** * */ void setup() { pinMode(BUILTIN_LED, OUTPUT); Serial.begin(115200); delay(10); } int value = 0; int count = 0; int adc = 0; int batteryMeasMv = -1; /****************************************************** * */ void loop() { adcset(0); delay(4000); delay(interval); ++value; unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if (ledState == LOW){ ledState = HIGH; // Note that this switches the LED *off* } else { ledState = LOW; // Note that this switches the LED *on* digitalWrite(BUILTIN_LED, ledState); delay(1); count += 1; Serial.print("Blink Count: "); Serial.println(count); } } // Select ADC source. adcset(1); delay(5000); //Battery voltage is divided by an 5.6K/1K resistor divider. //ADC: 1024 = 1V adc = analogRead(A0); batteryMeasMv=(adc*10020*6.6)/10000; // ^^^^^To correct an error in the resistance value Serial.print("ADC mv: "); delay(1); Serial.println(batteryMeasMv); adcset(2); delay(5000); adc = analogRead(A0); batteryMeasMv=(adc*10020*6.6)/10000; Serial.print("ADC mv: "); delay(1); Serial.println(batteryMeasMv); adcset(3); delay(5000); adc = analogRead(A0); batteryMeasMv=(adc*10020*6.6)/10000; Serial.print("ADC mv: "); delay(1); Serial.println(batteryMeasMv); }
さて、ぼちぼちと回路図書いてみます。
書いて、PCB上に配置してみました。あと、温度湿度センサーを載せればOKとします。
リチウムの電池からの電圧と、バックブーストで作られた後の電圧を計測して、あとは照度センサーからのADCを計測したら3チャンネル使い切りました。
で、最後にDHT-22 を裏側に乗せました。前回作ったやつと同じように、ESP8266 の上に載る感じ。
UART のPIN配列は、ブレッドボードに挿したときに上からLEDが見えるに配列を逆にしました。あと、UART からの信号のDTRを一工夫して、リセットを押さなくても、書き込みモードになるように回路を組んでおしまいです。
他、何か忘れているような気もしますが、最後の点検でチェックしていきます。
現時点で、忘れているもの。
・メインスイッチ
・CDS の調整用、半固定抵抗
・WEB アクセスのLEDと、WiFi アクセスのLED (をつけるかどうか)
・EN Pin の配線
最後に少し、プログラムを改良したのをメモ。まれに、ADC値が変なので、10回の平均値を出しています。ESP12でテストしているので、ESP13 だとどういう動きになるかは、実際にモノが着てからテスト。
/* ADC Read Sample2. Fairchild Semiconductor FSA3357 adc Select. Arduino IDE 1.6.5 Hourly Build 2015/06/12 03:13 esp8266 by ESP8266 Community version 1.6.5 Hourly Build 2015/06/12 JunkHack 2015.10.11 --- ex Serial output. >adc3(B2) ADC3 mv/10: 0 : 476 1 : 475 2 : 474 3 : 474 4 : 474 5 : 474 6 : 474 7 : 474 8 : 474 9 : 474 3139 >adc off :: */ #include <ESP8266WiFi.h> int ledState = LOW; unsigned long previousMillis = 0; const long interval = 200; //1sec /****************************************************** * */ void setup() { pinMode(BUILTIN_LED, OUTPUT); Serial.begin(115200); delay(10); } int value = 0; int count = 0; /****************************************************** * */ void loop() { // Select ADC source off. adcset(0); delay(interval); ++value; unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if (ledState == LOW){ ledState = HIGH; // Note that this switches the LED *off* } else { ledState = LOW; // Note that this switches the LED *on* digitalWrite(BUILTIN_LED, ledState); delay(1); count += 1; Serial.print("Blink Count: "); Serial.println(count); } } // Select ADC source. adcset(1); delay(interval); Serial.print("ADC1 mv/10: "); Serial.println(getMv()); adcset(2); delay(interval); Serial.print("ADC2 mv/10: "); Serial.println(getMv()); adcset(3); delay(interval); Serial.print("ADC3 mv/10: "); Serial.println(getMv()); } /****************************************************** * Fairchild Semiconductor FSA3357 adc Select. * 0 = No Connection * 1 = B0 to A * 2 = B1 to A * 3 = B2 to A */ const int S1 = 14; // S1 to GPIO Pin const int S2 = 16; // S2 to GPIO Pin void adcset(int port) { pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); switch (port){ case 1: digitalWrite(S1, HIGH); delay(10); digitalWrite(S2, LOW); Serial.println(">adc1(B0)"); break; case 2: digitalWrite(S1, LOW); delay(10); digitalWrite(S2, HIGH); Serial.println(">adc2(B1)"); break; case 3: digitalWrite(S1, HIGH); delay(10); digitalWrite(S2, HIGH); Serial.println(">adc3(B2)"); break; case 0: digitalWrite(S1, LOW); delay(10); digitalWrite(S2, LOW); Serial.println(">adc off"); break; } } /****************************************************** * It reads the 10 times of the average value. */ int getMv(){ // correct an error in the resistance value. const int CORRECT = 10030; int mv = -1; int i; int adc = 0; for (i = 0; i<10; i++ ){ adc = 0; //Battery voltage is divided by an 5.6K/1K resistor divider. //ADC: 1024 = 1V adc = analogRead(A0); //delay(10); // Serial.print(i); // Serial.print(" : "); // Serial.println(adc); mv += (adc*CORRECT*6.6)/10000; // ^^^^^To correct an error in the resistance value } mv = mv / 10; return mv; }
|
|