拡張開発ボード

大体、本体側は出来たので拡張ボードを何か作ろうかと。特にアイデアがまだないので、思考中ですが、電流計測なんかあると面白いんじゃないかと思い、ACS712 あたりを入れたらどうかと。それか、汎用的にユニバーサルピッチと、8pin のIC とか乗せて、足だけつけるのもありかなぁと。

4

真ん中の余った部分には、各種パッケージのパターンを織り込んで、手半田で出来るサイズを作っておけばいいかも。

あると便利だなと思うのは、

・ロジック変換

・モータードライバ

・LCD 制御

・LED制御

あたりでしょうか? なんか、こういう製品があってもいいんじゃない? って思っています。

 

電流をセンシングする専用のICがあるようで、TIのINA226 とかそのシリーズがよさそうです。

INA226 パッケージは、10-Pin VSSOP で価格も5個で1000円ちょいのようですので候補です。

Free-shipping-5lot-pcs-INA226AIDGSR-INA226AIDGS-INA226-MSOP10-100-NEW こんなESP のプロジェクトがあるようで、参考にしてみたいです。

ESP8266-MQTT-battery-monitor-hw

https://github.com/hwstar/ESP8266-MQTT-battery-monitor-hw

I2C接続のデジタル電圧・電流センサIC で、接続も楽そうですし、ストロベリーリナックスさんも販売しているくらいですから、物は良さそうです。

 

どうやって使うかは、まだ不明ですが、シャント抵抗の精密なものがあるといいようです。はぁ、なんですかね、これは?

電圧と、電流を計測するものは、拡張ボードで作って、2つを個別に動作させて動かしてsleepmode の時の消費電力を計測する感じになりそうですね。

パワーセーブをESPでコントロール

配線の見直しを行いました。

TPS63000 のバックブーストのパワーセーブをESP13からコントロールすることにしました。オシロスコープとかは持っていないので、有効かどうかは、バッテリーの持ちで判断することになりそうです。

 

IC2からの配線と、左下LEDの配線を変更し、GPIO 5番でパワーセーブをコントロールすることにしました。

1

 

2

 

3

PGND と GND の処理

これがわからなくて1日消費しました。

何が、わからなかったかといいますと、PGND と GND をつなぐ方法です。2つのグランドが電源周りにあるのですが、オフィシャルの回路を見るとこのようになっています。

tps63000_pdf

GND が2つあって、PGND はパワー・スイッチ回路用グランドで、GNDは、コントロール/ロジック回路用グランドのようです。PGND は、熱処理するためにPowerPAD (部品中央に位置する)に接続し、PCB の銅箔面の面積を稼いで空冷させるようです。

1tps63000_pdf

 

しかし、Eagle は、複数の属性を持つ名前同士を(用語では、Name とか、クラス(Net Class)と言うそうです)接続できず、どれか1つの属性になります。以下の場合は、GND と PGND が別に接続されて、意図したように配線されません。

0

何かやり方があるのだろうと、いろいろ調べましたが結局わからず、手法として、以下のような解決策で実現しました。

5

2つのグランドを接続するためのパーツを回路図に入れて、そこにPGND と GND をくっつけました。ジョイントのような考え方ですが、回路図中にGND っぽい図が出るので、これを使いました。

3

こうすれば、2箇所の違うNet Class を1つのパーツに接続できるので目的が果たせました。

PCB 上ではジョイントを裏側に回し、べたアースとスルーホールをつけて熱を逃がします。

4

PGNDは、以下のように接続されています。

2

べたアースはググればすぐに出てくるので省略です。

1

とにかく、これで目的は果たせましたが、これが正当なやり方なのかは不明です。

 

そして、LEDの位置は、裏面のサイド寄りにつけることにしました。

6

ケースに組み込んだ時、この位置だったら光っているのがわかるかなと。

 

GND もべたアースを取ったほうがいいだろうなということで、以下のように。

 

pgnd

このべたアースを取るか取らないかで、何が変わるのだろう?

gnd

熱処理はこれでOK。

あ、ENピンを忘れているようです。最終確認の時にやりますか。

 

編集後記

データシートを見直してみると、レイアウトについての考察 の項がありました。PGND と GND を分ける理由は、引用すると以下です。

データシート P.15

レイアウトについての考察

::

コントロール・グランドを適切に配置するには、配線を短くし、さらに電源グランドの配線から分離することを推奨します。このことにより、電源グランドの電流とコントロール・グランドの電流の重なり合いにより起こり得るグランド・シフトの問題が避けられます。

::英文 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の動作が不安定になることを少なくすることができる。

A,2010-073951_000014_small

 

厳密にはGNDに落ちるときにも配線抵抗があるので、電位差が発生し、これをグランド・シフトというそうです。電源回路Aとロジック回路BのGNDへ影響を受けなくするため、GNDを分離するといいよということです。要するに良いGND とは、0V を常にキープすること。べたアースとか、音響設備でアースが大事だとか、そういう理由だったのですね。納得です。

 

参考

ストロベリーリナックスさんのサーモグラフィ画像

べたパターンの描画

パターン図作成のテクニック (8)

DGND, PGND, 1点アース : kzonoの日記

 

▼やるかどうか検討

・パワーセーブモードを有効、無効にするのをESP8266 からコントロール

・PIN7 の PS/SYNC がGND(0) だとパワーセーブ有効。PIN8 VINA(1) に接続で無効にできる

・負荷が10mA 以下だとパワーセーブのほうが省電力だそう

・deepspleep の時は、有効にして、起き上がったら無効にするようコントロール

・GPIOがHIGH で、PIN7 と PIN8 に接続するように、P-chan mosFET をつけるなど。

PIN7 が HIGH(1.2V 以上) になれば、無効なので、GPIO から抵抗をつけて HiGH にすればいい?

Resetボタン配置とLED2つ

リセットボタンと、WEB にアクセスしたときに光るLEDと、WiFiにアクセスしたときに光るLEDをつけたのですが、スペース的に工夫しないとちょっと配線がきつそうです。

 

2

1

表のレイヤーを出すと、こんな感じ。自動配線を継ぎ足していったので、レイアウトは要再考ですね。

3

パイロットランプ的な、パワーLEDは電力消費を抑えてつけず、動作がわかるようにWEBにデータを投げているときに付くLEDと、WiFiにアクセスしているときに付くLEDをつけようと思っています。

 

スペースはまだあるのでレイアウトさえ考えればいけそうな感じです。GPIOのどのピンから取るかで配置が決まりそうです。ESP12とWROOM-02のピン配列が載っているブログがありました。わかりやすいですね。

Imazeki’s workshop

ESP8266 へ ArduinoIDEからの書き込み

14 と 16 から取って、裏側のサイドにLED配置しても光は見えるかなぁ。どうしますかね。

迷うことがない値段だった・・・

土日にあれだけ、部品点数を減らすために試行したんですが、結局nodemcu と同じトランジスタ2つと抵抗2つを使う回路を採用することにしました。決定打は、トランジスタの価格。なんと、100個で138円だったのですよ。

 

222

 

RTSのピンは、仕方がないので手持ちのUART のを5VをカットしてRTS を接続するよう改造。そうすれば、ピンに挿せます。

111

トランジスタって高いイメージがあったんですが、1個1円以下ですか。心配になるくらい安いですが、ちゃんと動くかな?

S8050 (KOO CHIN ELECTRONICS)

spec

ISO9000 と設備もちゃんとしているから大丈夫なんでしょうね。トランジスタやダイオードの専門メーカーのようです。

100個入り買ってしまったあとに、気が付いたんですが、こんな小分けしたいろんな種類のを買っておいてもよかったかなぁと。

 

21valuex20=420pcs SMD SOT-23

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 パッケージのこんなのがよいですかね

Auto Program Circuit

さて、Eagle の勉強をかねて、ESP8266 でPCBを作っているのですが、だいぶできてきました。

現在のところ、以下のような感じになっています。前回と違うのは、CDS のセンサーに分圧抵抗を入れて、1V 化したものをADC で計測しています。当初半固定抵抗を入れようと思っていたのですが、個体差には目をつぶることにして、安さを追求しました。

9

 

CDS は計測してみると、強い光を当てると、抵抗値が150オームくらいから、真っ暗にすると5Mオームくらいまで変動します。

10

分圧抵抗は以下のサイトが便利でした。

 11 ちなみに、nodemcu の回路のADC は、以下のようになっています。220k と 100k で分圧して1Vを作って計測しているようです。

12

電圧と、抵抗値を入れると出てくるサイトもあって、上記は以下のように入れると出てきます。

13

いろいろあって便利ですね。電卓で計算するより便利なので活用しています。

 

さて、前置きが長くなりましたが、 UART を挿しておけば自動的にファームウェアを書きかえれるモードにする方法です。

nodemucu は、回路図があって参考になります。以下のような回路です。

NODEMCU_DEVKIT_SCH_png__2339×1653_

この回路は、RTS も使っているので、DTR のみというわけにはいきません。自分の持っているUART は RST は出ているんですが、ピンの横から出ていて直接挿すには、改造しないといけません。

DTR付のCP2102 をゲット

cp2102a cp2102b

安くて、便利に使っているので2つ持っています。DTR だけでやるには以下のようにやれば良さそうなのですが、具体的な抵抗値と、コンデンサの値が良くわかりません。トランジスタは、PNP 形であれば良さそうです。

issues22

CH_PD は ESP13 や WROOM-02でいえば、EN ピンで普段は10k くらいでプルアップしている抵抗です。なので、R1 と R3 は10K程度でよいということはわかるのですが、R2 が良くわかりません。また、C1 はどのくらいの容量が良いのかも不明です。

 

プログラムを書き込みモードにする原理は、起動時にGPIO0 PinがGND に落ちていればいいので、R2 は10K 程度でよいのではと考えています。CH_PD にコンデンサを挟む原理は、再起動させる働きがあると理解すればよいのでしょうか?

 

一番シンプルな回路として、以下があります。ダイオードとコンデンサだけで、構成された回路です。

 

setup-windows-compiler-esp8266__ESP8266_Support_WIKI_

これが動作するのであれば、今回採用したいと思っています。

で、試してみました。手持ちには、1uf と 0.01uf しかないので、1uf で試しました。どうやら、これで書き込みモードになるようです。1uf だと30回の内、11回が成功し19回は失敗しました。3分の1の成功率です。もう少し、精度があがればいいのですが。

0.1uf だとちゃんと動くのかどうかは不明です。

コンデンサの数を並列に2,3と増やすと100%成功しますが、シリアルからコンソールを開くと、100%Boot せず、リセットをかけてもだめです。動いているときにシリアルを開いてもシステムが止まります。

 

どっかに0.1uf ないか探してみます。

ありましたが、1uF が一番成績が良かったです。

Scan_16

成功するときは、以下のようになります。

esptool v0.4.5 - (c) 2014 Ch. Klippel <[email protected]>
    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 <[email protected]>
    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つ使いました。たぶん、かなりの年代モノでジャンク箱にあったものです。

Scan_17

抵抗は、手持ちの適当なもの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 <[email protected]>
    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とコンデンサを使ったものをなんとか成功させたいです。一度、組み込んだのですがうまく動作しなくて。もしかしたら、この設定が反映されてないかもしれないので、もう一度組み込んでみます。

 

やっぱりだめでした。うーん。作者が言っているやつなのになぁー。