macsbug

Archive for 2月 2016

消えたボード

leave a comment »

ESP-12F WIFI Wireless Serial Ports ESP8266 Development Board が消える!! 2016.02.27
ebayやAliExpresで6百円台で販売されていたESP8266のボードが
どの販売業者からも突然なくなりました。


いくつか調べてみると「ENDED」と表示されていましたし、購入ボタンが無くなっていました。
おいおい、調査の為に注文しておいたものはどうなるんだろう?
そういえば届いていない!! という、声が聞こえそうです。


便利な点は、CDSセンサーとRGB LEDが付いていて、即 CDSやLEDの動作が試せる事。
回路図は公開されていない為、配線図を調べてみるとチョット疑問な配線がありました。
最低部品数でいかに安く作るかの工夫がされていました。
その中で4カ所、 ESPのポートへ 5V が加わり実測値は 4.4V〜4.9Vになっていました。
ま〜、それでも動いていました。
原因は、USBのCH340Gの電源に5Vを使用しその出力が 5V であった為です。
こういう使い方があるものなのかと思いながら 動いていました。
ちなみに、D1 mini も同様の CH340G を使用していますが、電源は 3.3V を使用しています。


その後、D1 mini が出現して D1 mini の構成の方が圧倒的に良い状態になりました。
つまり、2枚基板が1枚基板になり小型化、価格もほぼ同じ。

もうこれを買う要件はどこにも無い条件になりました。
ENDED表示だけですので理由は解りませんが いつまでも続く物ではないのですね。

他に、以下の画像があったが、これは一部の業者で販売の都合かと思えます。

Written by macsbug

2月 27, 2016 at 11:15 am

カテゴリー: ESP8266

ステップ10で組み上がる D1 mini 組み立て

with 3 comments

ESP8266 のレイアウト作りを D1 mini で 試してみました。                                          2016.02.21


ステップ10で 組み上がる D1 mini 簡単組み立て法。

装備は I2C OLED と I2C 温度、湿度、気圧センサー。


組み立て ステップ 組み立て ステップ
1.

8ピン
コネクタ
2個
取り付け

  2.

拡張基板裏
切れる基板
14 x 12
8P2個の
コネクタと
配線4本

 d3_s 3.

拡張基板表
切れる基板
14 x 12
4P,8P
コネクタと
配線4本

 d4_s 4.

1と2の
基板を
重ねます

 d5_s 5.

4ピン
コネクタと
線4本

細い線が
欲しい

d6_s 6.

OLEDの
カバー。
切れる基板
とテープ

 d7_s 7.

OLED

部品表面に
テープで
絶縁

d8_s 8.

段付き
ケース

お好きな
段を
どうぞ

  9.

OLEDと
BME280
を接続し
段に
差し込む

10.

はい
出来上がり

電源は
USBです

 


 

詳細:配線は拡張基板と接続コネクタのみ。後は部品を組み上げるだけ。

部品名称 内容 メモ 価格
——————— —————————————— ———————————- ———-
D1 mini USB,Auto Program,
LDO=RT9013
16個(3.3V,5V,GND)の端子
USBのCH340Gが残念。
AliExpress
449円
拡張基板 ハサミで切れる基板
2.54mm ピッチ。
14 x 12 で使用する
部品装着部は 8 x 12。
細工が簡単でArduino風に
重ねられる。秋月
70円
OLEDカバー ハサミで切れる基板 他のデザインも可。秋月 70円
コネクター 低メス シングルピンソケット 低い高さに出来る。秋月 40円
ピンヘッダー ピンヘッダ
(低オス)7.7mm
ピンヘッダ
(低オス)9.54mm等で
高さの調整が出来る。
秋月
40円
OLED接続
コネクター
ピンヘッダ
(低オス)7.7mm
コネクター付きで
柔らかい細い線が
欲しい。秋月
40円
I2C OLED 128×64 Blue ebay 又は AliExpress 632円
I2C BME280 温湿度,気圧センサー 秋月 1080円
I2C BME280 温湿度,気圧センサー ebayのは小型で便利 636円
ケース 3Dプリンターで作る。
段の横幅は 切れる基板が
ピッタリ入るサイズ。
裏蓋は未掲載
スライド式の段は
細かな細工ができる
ので何かと便利
総計  I2C SPI BME280(秋月)  ケースと雑費は除く  2381円
総計  I2C BME280(ebay)  ケースと雑費は除く  1937円

 

感想:
簡単を目指してレイアウトを考える。ケースのデザインが決まればこれから楽に作れる。
I2C は 配線が4本で凄く楽です。I2C センサーのみで構成するのも良いかと思います。
1つの基板に I2C 1個で 3段にすれば 3つのセンサーが動くとかできますね。
センサーによっては設置場所が重要で温湿度などは空気の流れの良い場所が必要です。
OLED接続のコネクター:コネクター付きで細い線のものが欲しいが見つからない。
_ 線が太いとテンションがかかって入れづらい事とOLEDや基板の邪魔になる。
_ 追記:2016.02.23 百均の「リール式LANケーブル」が4本で細く使いやすい。
_  
裏蓋作りは USBの穴 や 固定方法 が難しい。
費用:ケースと雑費代を除き BEM280(秋月)の場合=2381円。ebayの場合=1937円。
秋月さん、ESP-WROOM-02 の D1 mini と OLED を販売してほしい。
それと拡張基板も。


D1nimin Sheeld:


 

Written by macsbug

2月 21, 2016 at 9:56 am

カテゴリー: ESP8266

ESP8266 で 1MHz 50%duty を出力する

with 11 comments

ESP8266 で 1MHz 50%duty を出力する 命題を聞いて試してみました。                  2016.02.19

ESP8266 から 1MHzを出力するには 速度的に Direct Access Port 方式が必要です。
波形の確認は、Analog Discovery で測定しました。


結論:1MHz の目標に対し 1.000MHz を達成。
_  スペクトラムによるセンター周波数は 1.000MHz。
_  精度は 25KHz。
_  Duty比は 50.0%。(小数点2桁目はジッターの為 省略)



スケッチ:

_ PIN_13(GPIO13)の出力の後に PIN_13 と NOP の遅延を入れ時間を調整しました。
_ 最小単位の命令は、 nop命令で「 __asm__ __volatile__ (“nop”); 」を使用。
_ 「 __asm__(“nop\n\t”); 」でも使用可能でした。:7of9 さんのアドバイスに感謝。
_ この NOP命令は、1マシンサイクルで 1/80000000 second = 12.5 nsec です。
_ 12.5nsec は 50% duty で 25KHz。25KHz単位で変化させる事ができる訳です。
_ つまり 最小時間の NOP 命令で精度が 25KHz と言うことですね。
_ スケッチの for文は ちょっとダサイ感じがしますがお許しください。

_ 課題:for(;;){}、while(1);{} の無限ループは 一瞬途絶えます。
_  この時 GPIO0とGPIO2が一瞬 “0” になり同時にGPIO13の信号が途絶えます。
_ 修正:2016.02.20 :void setup に noInterrups(); を追加:
_  これにより for( int ,,, による、信号が一瞬途絶える不具合はなくなりました。
_  この件は 再び 7of9 さんのアドバイスによるもので 大変感謝致します。

#define PIN_OUT *(volatile uint32_t *)0x60000300
#define PIN_DIR *(volatile uint32_t *)0x6000030C
#define PIN_13  *(volatile uint32_t *)0x6000035C

void setup() {
  noInterrupts();
  PIN_OUT = (1<<13);
  PIN_DIR = (1<<13);
}

void loop() {
 for( int i=0; i<100000; i++){
    PIN_13 = 0;PIN_13 = 0;PIN_13 = 0;PIN_13 = 0;PIN_13 = 0;
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop"); 
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");

    PIN_13 = 1;PIN_13 = 1;PIN_13 = 1;PIN_13 = 1;PIN_13 = 1;
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
    __asm__ __volatile__ ("nop");
 }
}


 

参考:
ESP8266 Community Forum:DURATION NOP INSTRUCTION:NOPの記述方法。
collector {dt.:Sammler}:ESP8266 GPIO output performance:波形付きの詳細な内容
Arduino.CC:AVR Code:NOPの記述方法。__asm__(“nop\n\t”);
Let’s Make Robots:Arduino 101: Timers and Interrupts:noInterrupts();
sandeepmistry:esp8266_peri.h:Arduino環境の為のESP8266の中心部。Regの定義。
ESP8266 Community Forum:esp8266_peri.h:Registorの定義。追記:2016.07.11
alfredo / AgroSis:esp8266_peri.h:Registorの定義。追記:2016.07.11


 

感想:
_ アセンブラー:「__asm__ __volatile__ (“nop”); 」というアセンブラーがスケッチで
_  使えるとは勉強になりました。
_ 課題:信号が途絶える問題:for(;;){処理}、while(1);{処理} で起きる。
_  この件は、奥が深そうなので宿題として残しておきましょう。

_  他の信号:この時、何かの原因で GPIO0 と GPIO2 が一瞬 “0” になります。
_   これにより違うモードになり再度 スケッチが動作するように見受けられます。
_   青はGPIO0。GPIO2は表示していませんが同じ波形がでます。

追記及び修正:7of9 さんから 素晴らしいアドバイスを頂きました。
_ noInterrupts(); の件は 驚きましたね。ありがとうございました。

信号発生器:今回は 1MHz の方形波を出力するものですが、超低周波から 3.3MHz
_ 位までの信号をスケッチだけで出来る事が解りました。
_ そうなると、凄い物が作れる可能性を秘めていますね。

 


 

Analog Discovery :本題ではありませんが、Analog Discoveryのお話。、、本題より長い
電子工作では オシロスコープがあると回路動作を詳細に確認する事が出来ます。
信号を見る事は ありがちな「動作しない」「不安定」「ハマる」が少なくなり
確実に早く作る道具になります。理論と現実が一致すると楽しくなりますね。

性能は100MHz位が理想ですが価格が高いですから早々には買えないのが実状。
希望の性能と価格からいくとRIGOLに落ち着いて行きます。
以下の記事は納得できる判断になる訳です。
Rabibit Note:コスパ抜群のオシロスコープ Rigol DS1054Z の薦め:5万円。
使用した事のある、200MHzのオシロよりは劣りますがね。

一方、Analog Discovery というマック(ウィンも)にUSB接続して画面で観測できる
アナログ回路万能測定ツールがあります。デジタルも可能です。
帯域は5MHz。これは希望の100MHzとかけ離れる数値でかなり躊躇します。そう、かなりです。
「現実は見るに限る」で、使用している友人のものを見せていただきました。
それも何回かです。結果、Analog Discovery にしました。価格は3万6千円です。
ここ価格帯でのオシロは性能的に買わない範疇になります。

購入した結果、Analog Discovery が良かったです。ネットの記事も参考にしてください。

使用感:
コンピュター上で使えるので場所を取らない。オシロだと置き場所が必要です。
波形等の記録が直ぐ取れ、画面の大きさはデイスプレーのサイズまで大きく出来る。
27インチを使用していますが横いっぱいにするとデーターロガーみたいになります。凄い!
この点はオシロではできない機能。オシロは寂しい画面になると思います。
マウスでいろいろな設定ができる。オシロは操作したりコンピュターを見たり煩雑です。
DigilentのWaveformというソフトを使用し、この機能が凄いです。
Scope,Waveform,Supplies,Meter,Logic,patterns,StaticsIO,NetWork,Spectrum,Scriptが出来るのです。
Spectrumができる。今回の記事でSpectrumを使用し周波数の安定度が把握できました。
重要な機能に信号発生器があります。これは何か信号を必要とする場面でとても役に立ちます。
今回の記事で信号を発生させプローブできちんと受かるかの準備をしてから始めました。
仮想の装置を作れる訳で、いろいろなSGとか買う必要がなくなります。デジタルもできます。
結果、RIGOL等のオシロより凄い事が解り便利にしています。
使いこなせば使いこなすほど高性能の機能が出てきますね。

購入のきっかけになった秋葉原にいる友人のブログが参考になればよいかと思います。
この方は、アプリを良く使いこなしている事と、この装置を作った DIGILENT より
凄い周辺装置を作られています。最近 接続に重要なUSB ISOLATOR を製作,販売をしています。
アナログ回路のおもちゃ箱
http://designideas.cocolog-nifty.com

秋月電子通商:ANALOG DISCOVERY:36000円。ANALOG DISCOVERY 2:36800円
ストロベリー・リナックス:ANALOG DISCOVERY:36000円

Analog Discovery は iMac 27 inch Mountain Lion+VMWare+Windows で使用。
Analog Discovery 2 :新しく購入する場合はこれですね。、、、欲しい。
WaveForms2015(digilent.waveforms_v3.1.5) のアプリの機能が向上しました。
このアプリで初期のAnalog Discoveryも動きます。条件としてマックの場合
Marverics,Yosemite,EI Captain 英語版OSでのみ動作します。
ウインの場合は以前と同じ環境で動くとネットでは報告があります。

アカデミー版だと安く買える、、米国に友人とか、、どなたかかいないでしょうか?
値段を聞いて秋月で買うのを躊躇しました。

 


 

Written by macsbug

2月 19, 2016 at 10:43 am

カテゴリー: ESP8266

ESP8266 Direct Access Port で Lチカ

with 9 comments

ESP8266 の GPIO を直接操作して「Lチカ」をしてみました。    2016.02.18

「 Lチカ」は 電子工作の基本とでもいいましょうか 通常は digitalWrite 命令ですね。
Direct Access Port は digitalWrite を使用せず I/O をダイレクトに操作する方法です。
ちょっと上級者の気分になれるかも知れません。

digitalWrite 命令は 最高1MHzまでの信号を出力したり解析をする事ができます。
Direct Access Port 命令は 最高6MHzまで可能で 高速な処理をする場合に約に立つ
と思います。例えば32bit信号で25KHzの繰り返しの場合 Arduino UNO では性能
ぎりぎりですが ESP8266ならば かなり余裕が出てきます。

他にアナログデジタルコンバーター ADC 24bit になるとかなり高速な操作が必要で
ライブラリの中で高速処理を行っているようです。ライブラリーはある程度上級
者レベルですが スケッチレベルで高速処理ができる事になる訳です。


スケッチ:Arduino IDE にある、01.Basics の Blink ができます。

#define PIN_OUT *(volatile uint32_t *)0x60000300
#define PIN_DIR *(volatile uint32_t *)0x6000030C
#define PIN_13  *(volatile uint32_t *)0x6000035C

void setup() {
  PIN_OUT = (1 << 13);
  PIN_DIR = (1 << 13);
}

void loop() {
  PIN_13 = 0;
  delay(1000);
  PIN_13 = 1;
  delay(1000);
}

事例は 13番ピンの GPIO13 を出力に指定し “1” 又は “0” を出力するものです。
以下のGPIO Registers表 に基づいて ピンに応じた アドレス を使用すると
他の GPIO も入出力がコントロールできる訳です。
GPIO Resistor 表から参照して 他のポートも試してみてください。


追記:2016.02.19
最高速「Lチカ」:上記スケッチの delay を取り除き 不完全な無限ループ
_  ですが最高速の出力が得られます。
_  前回計測では 6.25MHz なのですが 実際には 5.764MHz でした。

void loop() {
  for(;;){
    PIN_13 = 0;
    PIN_13 = 1;
  }
}

宿題:無限ループはどのようにスケッチするか?
_  上記のスケッチは3秒に1度 0.25sec間 信号がでない場面があります。
_  while(1); でも同様です。goto文を使用するとしばらくして停止します。


詳細:
GPIOを直接操作するには GPIO のアドレス(Registor)の把握とそのアドレス
_ に #define で名前を定義します。
例:GPIO13(PIN_13)のアドレスは 「0x6000035C」です。
_ 名前の定義は、#define で行います。
_ #define PIN_13  *(volatile uint32_t *)0x6000035C   となります。
_ 使用する時は、
_ PIN_13 = 0;      // “0” を 13 bit ( 13番ピン) に出力する。
_ PIN_13 = 1 ;     // “1” を 13 bit ( 13番ピン) に出力する。


GPIO Registers(アドレス表):

GPIO ADDRESS GPIO NAME PIN
————- ———————– ———————————— —————————-
0x60000300 GPIO_OUT  PIN_OUT
0x60000304 GPIO_OUT_W1TS  PIN_OUT_SET:HIGH
0x60000308 GPIO_OUT_W1TC  PIN_OUT_CLEAR
0x6000030C GPIO_ENABLE  PIN_DIR:入出力
0x60000310 GPIO_ENABLE_W1TS  PIN_DIR_OUTPUT
0x60000314 GPIO_ENABLE_W1TC  PIN_DIR_INPUT
0x60000318 GPIO_IN  PIN_IN
0x6000031C GPIO_STATUS
0x60000320 GPIO_STATUS_W1TS
0x60000324 GPIO_STATUS_W1TC
 GPIO 0 0x60000328 GPIO_PIN0  GPIO0_U,PIN_0
0x6000032C GPIO_PIN1  U0TXD_U
 GPIO 2 0x60000330 GPIO_PIN2  GPIO2_U,PIN_2
0x60000334 GPIO_PIN3  U0RXD_U
 GPIO 4 0x60000338 GPIO_PIN4  GPIO4_U
 GPIO 5 0x6000033C GPIO_PIN5  GPIO5_U
0x60000340 GPIO_PIN6  SD_CLK_U
0x60000344 GPIO_PIN7  SD_DATA0_U
0x60000348 GPIO_PIN8  SD_DATA1_U
0x6000034C GPIO_PIN9  SD_DATA2_U
0x60000350 GPIO_PIN10  SD_DATA3_U
0x60000354 GPIO_PIN11  SD_CMD_U
 GPIO12 0x60000358 GPIO_PIN12  MTDI_U
 GPIO13 0x6000035C GPIO_PIN13  MTCK_U
 GPIO14 0x60000360 GPIO_PIN14  MTMS_U
 GPIO15 0x60000364 GPIO_PIN15  MTDO_U
0x60000368 GPIO_SIGMA_DELTA
0x6000036C GPIO_RTC_CALIB_SYNC
0x60000370 GPIO_RTC_CALIB_VALUE

 


リンカースクリプトに追加する方法と使用方法。
注:不可視ファイルの中の操作は危険ですので上級者向けかも知れません。

「Arduino15」ファイル内の「eagle.app.v6.ld」に追加をします。
例:PROVIDE(PIN_OUT = 0x60000300);
スケッチでの宣言:extern uint32_t PIN_OUT;
スケッチでの使用方法:PIN_OUT = 0x01;
PROVIDE(PIN_OUT = 0x60000300);
PROVIDE(PIN_OUT_SET = 0x60000304);
PROVIDE(PIN_OUT_CLEAR = 0x60000308);
PROVIDE(PIN_DIR = 0x6000030C);
PROVIDE(PIN_DIR_OUTPUT = 0x60000310);
PROVIDE(PIN_DIR_INPUT = 0x60000314);
PROVIDE(PIN_IN = 0x60000318);
PROVIDE(PIN_0 = 0x60000328);
PROVIDE(PIN_2 = 0x60000330);


初心のメモ:スケッチあれこれ。
PIN_DIR = (1<<0);                 // GPIO 0 の bit を “1” にする。HIGH
_               //      出力方向:”1”は出力。”0”は入力。
PIN_DIR = (1<<2);                // GPIO 2 の bit を “1” にする。 100 <- 001
PIN_DIR = 5;                         // GPIO 2と0の bit を”1” にする。 101
PIN_DIR = (1<<2 | 1<<0);    // GPIO 2と0の bit を”1” にする。 101
PIN_DIR = 0x05;                   // GPIO 2と0の bit を”1” にする。 101
PIN_DIR = 0b101;                 // GPIO 2と0の bit を”1” にする。 101
PIN_DIR = (1<<13);              // GPIO 13の bit を”1” にする。HIGH
PIN_13 = 0;                           // GPIO 13の bit を”0” にする。LOW
PIN_13 = 1;                           // GPIO 13の bit を”1” にする。HIGH
PIN_OUT (1<<13);                // GPIO 13の bit を”1” にする。HIGH

 


課題:
Direct Access Port を使いこなすには delayMicroseconds(us) に変わる
これ以下の delay が必要です。
命令のマシンサイクルが不明の為に マシンサイクルから算出したdelay
を使用する事ができない状態です。
Arduino UNOやDUEの場合は マシンサイクルが解っていいますので
ある命令は xx nsec delay として使うことが出来ました。


参考:
JACK’s LAB:ESP8266 Memory Map:詳細なメモリーマップ。これは必見です。
ESP8266 Community Forum:gpio registers
blog.naver.com:[ESP8266] GPIO Direct Access [1]
blog.naver.com:[ESP8266] GPIO Direct Access [2]
blog.naver.com:[ESP8266] GPIO Direct Access [3]
blog.naver.com:[ESP8266] GPIO 출력방식에 따른 비교 분석:6.665MHz(150ns)
ESP8266 Pins list function, register, strapping


感想:
JACK’s LABのESP8266 Memory Mapは大変参考になりました。アドレスを
理解すると様々なことが出来るかと思います。
[ESP8266] GPIO 출력방식에 따른 비교 분석には、6.665MHz(150ns) と
書かれており 私の測定値(6.25MHz,160nsec)とほぼ一致しています。


 

Written by macsbug

2月 18, 2016 at 11:26 am

カテゴリー: ESP8266

ESP8266 の GPIO 速度

with 7 comments

ESP8266 のGPIOの速度を調べてみました。              2016.02.16
_                            追記及び改訂 2016.02.17
ESP8266 (32bit 80MHz:ESP8266EX) は 単純計算で Arduino UNO より5倍(80/16)速い。
3D CUBE with ESP8266 and OLED では その差が見えました。
では、実際の GPIO の速度はどうなのか?


Lチカ等の速度を必要としないものは良いのですが、
周波数の高い信号の解析や信号を発生させる場合は 高速のGPIOを必要とします。
この為には、現在の速度の把握とGPIOへのダイレクト・アクセスが必要です。
注:測定器の性能が低い事と波形のひずみがある為に数値が不正確かも知れません。

ESP8266 は 32bit 80MHzに加えてWiFi 機能、D1 miniでの大きさは1/4。
ESP8266EXをArduinoに装着すれば 製品版の「WeMos D1」になる。
性能はArduinoより強力だが弱点はアナログ入力が1つである事。


結論:
digitalWrite 命令の速度。
_ ESP8266 は 最高 1MHz の周波数出力が可能である。
_ ESP8266 は Arduino UNO に比べ11倍の周波数を出力できる。
_ ESP8266 は Arduino DUE に比べ    5倍の周波数を出力できる。

Direct Access Port 命令の速度。
_ ESP8266 は 最高 6.2MHz の周波数出力が可能である。
_ ESP8266 は Arduino UNO に比べ12倍の周波数を出力できる。
_ ESP8266 は Arduino DUE に比べ 周波数は 約1/3倍である。



Arduino UNO:digitalWrite(13, HIGH); digitalWrite(13, LOW);
最小幅:5.06 usec。1周期:10.56 usec。周波数:94.65 KHz。

Arduino UNO:PORT操作:PORTB = B11111111; 上記と比較の為時間軸を同じ。
最小幅:4.00 usec。1周期:999 nsec。周波数:500.0 KHz。

Arduino UNO:PORT操作:PORTB = B11111111;
最小幅:4.00 usec。1周期:999 nsec。周波数:500.0 KHz。


DUE:digitalWrite(13, HIGH); digitalWrite(13, LOW);:この繰り返し
最小幅:2.47 usec。1周期:4.88 usec。周波数:204.8 KHz。

DUE:PORT操作:POUT(13,HIGH); POUT(13,LOW);:この繰り返し
最小幅:27.6 nsec。繰り返し幅:72.1 nsec。周波数:13.87 MHz。
注:測定器の精度により正しく測定されていません。


ESP8266:void loop() {digitalWrite(13, HIGH); digitalWrite(13, LOW);}
最小幅:0.410 usec。LOOPによる遅延:6.17 usec。


ESP8266:digitalWrite(13, HIGH); digitalWrite(13, LOW);:この繰り返し
最小幅:438 nsec。繰り返し幅:923 nsec。周波数:1.083 MHz。


追記:2016.02.17
再測定:測定器の性能が低く測定できない事と、DUEの出力波形が歪んでいる為
_ 測定方法は2つのポートの時間差を比較する事とした。

DUE:PORT操作:POUT(13,HIGH); POUT(12,LOW);delayMicroseconds(1);:13 と 12 の差
最小幅:28 nsec。繰り返し幅:56 nsec。周波数:17.85 MHz。

ESP8266:PORT操作:PIN_0 = 1;PIN_2 = 1;delayMicroseconds(1);:GPIO_0 と 2 の差。
最小幅:80 nsec。繰り返し幅:160 nsec。周波数:6.25 MHz。


詳細:
Arduinoでは以下に示す内容で高速アクセスが可能である。
Arduino UNO (8bit 16MHz:ATmega328P):ダイレクトにアクセスできる命令がある。
_ 例:DDRD = B11111110; PORTD = B10101000; 参照:Arduino:Port Registers
_ 例:PORTB =_BV(1)|_BV(2);  a = PINH & _BV(6) + _BV(5);
Arduino MEGA (8bit 16MHz:ATmega2560):例:UNOと同様。
Arduino DUE  (32bit 84MHz:Atmel SAM3X8E ARM Cortex-M3)
_ DUEはUNOのダイレクトアクセス命令は使用できないが以下で動作する。

//====================================================================
inline void POUT(int pin, boolean val){          // POUT:Port OUTPUT
  if(val) g_APinDescription[pin].pPort ->        // digitalWriteDirect
        PIO_SODR = g_APinDescription[pin].ulPin; //
  else    g_APinDescription[pin].pPort ->        //
        PIO_CODR = g_APinDescription[pin].ulPin; //
}                                                //
//====================================================================
inline int PIN(int pin){                         // PIN:Port INPUT
  return !!(g_APinDescription[pin].pPort ->      // digitalReadDirect
        PIO_PDSR & g_APinDescription[pin].ulPin);//
}                                                //
//====================================================================

POUT(13,HIGH);
a = PIN(13);

ESP8266では以下に示す内容で高速アクセスが可能である。
今回測定のスケッチ:(事前準備が必要:参考を参照の事)

extern uint32_t PIN_OUT;
extern uint32_t PIN_DIR;
extern uint32_t PIN_0;
extern uint32_t PIN_2;

void setup() {
  PIN_OUT = 0b101;
  PIN_DIR = 0b101;
}

void loop() {
  PIN_0 = 0;
  PIN_2 = 0;
  delayMicroseconds(1);
  PIN_0 = 1;
  PIN_2 = 1;
  delayMicroseconds(1);
}

参考:
ESP8266 DIRECT GPIO ACCESS:ネットでこの論議をしている場所。
_ 上記の内容で DIRECT GPIO ACCESS は可能です。
_ これには、「Arduino15」ファイル内の「eagle.app.v6.ld」リンカースクリプトに追加をします。
_ ユーザー/ライブラリーの不可視ファイルを開く必要があり、eagle.app.v6.ld の場所は、
_ ~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/tools/sdk/ld/ です。
_ eagle.app.v6.ld に上記に書かれている、PROVIDE(PIN_OUT = 0x60000300); から
_  PROVIDE(PIN_0 = 0x60000328); までを追加すると この命令が使えるようになります。
_ スケッチの定義は、extern uint32_t PIN_OUT; から extern uint32_t PIN_2; を記述します。
_ それにより、PIN_IN、PIN_0、PIN_2が使用できるようになります。
_ GPIO0とGPIO2 のみですが、他はアドレスとピンを追加すればよいかと思います。
_ :不可視ファイル内のリンカースクリプトを書き換える為、問題を起こす可能性があります。
_   この件は上記の論議の中でされています。
追記:2016.02.18:「eagle.app.v6.ld」を書き換えずにスケッチを記述する方法があります。
_  この件は、後日記事にする予定です。
Neil kolban:Kolban’s Book on ESP8266:GPIOの詳細が書かれています。
esp8266.ru:ESP8266 Pins list function, register, strapping:GPIOのアドレス。

ESP8266/ESP32で遊んでます。:ESP8266で高速GPIOアクセス: 2017.09.17 追記。


感想:
Arduino DUE の方法は、難しい表記ですが先人により実現しています。
追記:2016.02.17:FaceBookのESP8266環境向上委員会で永山氏からアドバイスを
_ いただき DIRECT GPIO ACCESSの方法が判明しました。永山氏に感謝。
_ DIRECT GPIO ACCESS では、DUE が ESP に比べ遥かに速く どういう事か疑問が起きる。
_ 特に ESP8266 の DIRECT GPIO ACCESS が想像よりも遅いのは残念です。
_ 測定を何度もしたがほぼ同じ結果。いくつか疑問がありますが今回はこれまでとしました。
_ 高速にアクセスできる事によりこれまで以上の事が出来るかも知れません。
_ ESP8266 の DIRECT GPIO ACCESS による Lチカが出来ました。

extern uint32_t PIN_OUT;
extern uint32_t PIN_DIR;
extern uint32_t PIN_0;

void setup() {
  PIN_OUT = 0x01;
  PIN_DIR = 0x01;
}

void loop() {
  PIN_0 = 0;
  delay(1000);
  PIN_0 = 1;
  delay(1000);
}

 

Written by macsbug

2月 15, 2016 at 11:01 pm

カテゴリー: ESP8266

ESP8266 FTDI Auto Program

with one comment

ESP8266 のスケッチを自動で書き込む方法。                            2016.02.13


ESP8266 の スケッチ書込みは PROG ボタンと RESET ボタンを手動で行います。
操作の手順は PROG -> PROG+RESET -> PROG -> OPEN と覚えるのが手間です。
Aruduino では 「マイコンボードに書き込む」だけで出来ていますね。


書込みの自動化:「マイコンボードに書き込む」だけで書き込める回路が幾つかあります。

ハード:従来の回路にFTDIのDTR信号を使用し自動化する回路。(Diode 2個,Capacitor 1個)
_   NodeMCUのボードは Auto Program 回路を内蔵している。(S8050 2個,抵抗2個)

ソフト:Arduio IDE:Generic ESP8266 に Reset Method として nodemcu が追加(左)。
_   ESP8266 Modulesには NodeMCU や WeMos D1 mini 等(右)が追加されました。
_   これは 「Boards Manager..」「ESP8266  ver 2.0.0 」で追加されました。

例:従来の回路に自動化回路(部品3個)を追加し USB FTDIでDTR端子があるものを接続。
_ Arduino IDE で Generic ESP8266 Module , Reset Method = “nodemcu” を選択し
_ 「マイコンボードに書き込む」を押すと Arduino の様に自動的に書き込まれます。

注:sparukfunの ESP8266 Thing ボードは この回路を採用しているがシリアルモニターを
_ 困難にさせるのでDTRジャンパーを設けている。


書込みの自動化回路:

hallard 氏が考案された回路。(同じですが2つ掲載します):hallard氏に感謝。


Sparkfunの回路


jayseeee氏の回路


NodeMCU の回路:DTR とRTS を使用している。


D1 mini の回路:NodeMCUと同等で抵抗値が10KΩ。


私の記事と回路:
AUTO UART Download Mode of ESP8266:部品3個で出来る自動化回路。
Diodeは秋月の 表面実装用ショットキーダイオード「SS2040FL」:20個入り300円。


Auto Program 回路が組み込まれた製品:

補足:本題から外れるが上記製品のお話を少し。
左側:NodeMCUは USBがCP2102とCH340Gの2種類がある。CH340Gは何かと
_ 問題がある為 CP2102 が良い。端子は3.3V、5Vも含め全てが出ている。
_ LDOはAMS1117-33 で 3.3v 800mA。回路図は公開されている。
_  ミニブレッドボードでは両方に1個の端子が可能。RST,Flashスイッチがある。

中央:このMINI nodemcu(ESP-12F)は配線図が公開されていない(当方で解析済)。
_ USBはCH340Gで電源はUSBの5Vを使用している。この為 ESP8266 の一部に
_ 5Vが供給され実測では4.5Vになっている。RGB LEDとCDSセンサー付きで
_ 直ぐ動く便利さ。ただしこのGPIOを使用する時は外す等の工夫が必要である。
_ LDOはAMS1117-33 で 3.3v 800mA。3.3Vは端子にはなく 5Vはある。
_ ESP8266とUSB側が分離できるので完成後はESP8266側だけで動作可能。
_ ミニブレッドボード使用時の端子は端まで使用する為に余裕はない。
_ USB側にFlash,Reset 及び ESP側にGPIO_04にスイッチがある。応用が出来る。
_ Arduino風にシールドを増設でき便利。価格は1個約$4。

右側:D1 miniは基板に「WeMos」と書かれた本家の物と無印の2種類がある。
_ 回路や部品配置は同じで回路図は公開されている。USBは裏にCH340Gを使用。
_ 電源のLDOは RT9013で 3.3V 500mA。Resetスイッチのみがある。
_ 端子に 3.3Vと5Vが出ているのでシールド(拡張基板)を使用するのに便利。
_ シールド(拡張基板)が販売されている事と新たなシールドが準備されている。
_ USB付き基板では最小構成と拡張性が大きい製品である。
_ ミニブレッドボードでは両方に1個ずつ端子が使用出来る。
_ IDEのModule選択は WeMos D1 を選択と思うが動作せず NodeMCUで可能。
_ 2016.02現在 WeMosでは 1個$4で2295個のオーダーがある。


参考:
ESPRESSIFの以下には基本が書かれています。
[Release Date 20160206] [Document list 0A-0D] ESP8266 Hardware Guide
ハードの基本は以下に書かれています。(19/27 Page:interface)
0B-ESP8266__System_Description__EN_V1.4_20160203.pdf

ESP8266 Reset and CH_PD pins for FTDI auto reset

Different circuit neeeded for automatic upload using CP210x:Automatic Uploadの話。

NodeMCU Schematic:NodeMCUの回路図。

SparkFun_ESP8266_Thing:Suparkfun の回路図。

sparukfun:ESP8266 Thing Hookup Guide:ESP8266 Thing Board の詳細な解説。
_ Auto prngram機能を搭載。シリアルモニターのデバックを困難にさせるので
_  基板にはジャンパーピンが設けられている。

sparukfun:ESP8266 Thing Hookup Guide:Using the Serial Monitor
_ DTR ジャンパーと シリアルモニターの件。

JCE’s Blog:Autoreset and flashing circuit for ESP8266 with FTDI interface

CHARLES’S BLOG:ESP8266 Reset and CH_PD pins for FTDI auto reset

WeMos.cc  D1 mini :mini D1 の回路図。他、詳細な説明がある。

ESP8266 Projects:Buttons, pushbuttons and debouncing story
_ スイッチのチャタリングと防止策。


感想:
2つのスイッチ操作とチャタリングという初期の書込み方法はとても手間でした。
自動書込みの体験をすると操作ミスやスイッチのチャタリングに惑わされる事がない。
自動化回路で手間がなくなり、なんと快適な事でしょうか。
2〜3個の部品で出来ますので、できれば最初から組んでいて欲しかった。
条件は、USB  FTDI ボードを使用する時は、出力に DTR 信号がある事。
(秋月の超小型USBシリアル変換モジュールは 便利だが ICに出力が無いので使えない)
USB接続無しで無線で書込みを行う ESP8266 の新バージョンは まだ見受けられない。

PROG+RST Switchの問題点:電子工作で完成後はケースに入れます。この場合
_ 分解したり蓋を開けたりしなければならず不便です。こういう点でも
_ 自動で書き込む方法は便利です。

理想的な基板と開発環境を考えてみた。
ESP-WROOM-02を使用した完成基板が欲しい。全体は D1 mini 風の形。
_ 構成:ESP8266 とUSBは一体基板である事。FDTIは FT232L 又は CP2102。
_    USBコネクターの取り付け位置は基板に垂直になる事。標準ケースもある事。
_    LDOはNJM2845DL1-33 + 導電性高分子アルミ固体電解コンデンサ(OS-CON)。
_    Auto Program回路内蔵。GPIOは全て抵抗付き。端子に 3.3Vと5Vがある事。
_    OLEDは標準装備。付属品は I2C拡張シールドとプロトタイピングシールド。
_    各種シールドのロードマップを計画する事。格安である事。
_    各シールドのサンプルプログラムを用意する事。
_    サイズは最終的に手のひらに乗る立方体。できればガチャポンで販売とか?
_ 以上、Arduino IDE に付けて直ぐ動く事。どなたか賛同者はおりませんでしょうか?


メモ:修正や新しい内容は随時追加する事とします。

Written by macsbug

2月 12, 2016 at 12:22 pm

カテゴリー: ESP8266

ESP8266 の Power-on Sequence と Power Reset

with one comment

ESP8266 の CH_PD(CHIP_EN) ピンへの正しい抵抗値はいくつか。  2016.02.13

結論: CH_PD端子には 1KΩ のプルアップ抵抗と 100nF のコンデンサーを付ける事。


ネットでは、10KΩプルアップ抵抗か電源への直付けが多く記載されています。
製品版でも殆どが 10KΩのプルアップ抵抗を使用しています。
通常は特に問題は起きないが多くの事を始めると問題が発生してくる事があります。

不具合例として、起動しないとか、不安定な動作をする。訳がわからない動作になる。
この現象は、起動時や送信時などの瞬間的な動作時に起こる現象と言えるでしょう。


ESP8266の基本:CHIP_EN ピンについて

ESPRESSIF の以下にはハードウエアーについて書かれています。
[Release Date 20160206] [Document list 0A-0D] ESP8266 Hardware Guide
この中の、0B-ESP8266__System_Description__EN_V1.4_20160203
には、CHIP_EN ピンの Power-on- Sequence について書かれています。
6/27 Page , 1.4.2 Power-on Sequence and Power Reset
要約すると、CHIP_EN ピンには、1KΩ  と 100nF を接続し電源投入時の
パワーオン シーケンスを確保する事が必要です。

CHIP_EN:1KΩと100nF

[Release Date 20160206] [Document list 0A-0D] ESP8266 Hardware Guide
この中の、0B-ESP8266__System_Description__EN_V1.4_20160203
19/27 Page:ESP8266EX development board の 2.2 Schematics 2.2.1 Interfaces
には、5KΩ となっています。


以下、他の事例。

RESET端子も処置が必要かと思われます。

WeMos.cc の D1 mini
RESET:10KΩと0.1uF

CH_PD :100Ω

GPIO15 :1KΩ

CH_PD :1KΩ

GPIO15 :1KΩ


参考:
ESPRESSIFの以下には基本が書かれています。
_ [Release Date 20160206] [Document list 0A-0D] ESP8266 Hardware Guide
_ Power-on Sequence and Power Reset(6/27 Page)は以下に書かれています。
_ 0B-ESP8266__System_Description__EN_V1.4_20160203.pdf(2016.01)

WeMos.cc の D1 mini は、ESP-12Fを使用し基板の下にUSB CH340Gを配置。
_ RST端子には100nF。RST,GPIO0はAuto programming。
_ USB Serialは750Ω直列。LDOはRICHTEKの5本足のRT9013 500mA。
_ 配線図やFrizingも全て公開で驚くほど親切。
_ Arduinoのように各種シールドが用意と予定(ロードマップ有り)がある。
_ 送料込価格はebayは625円。AliExpressは504円。

ESP WDT RESET and GPIO0 states on first run.pdf:詳しい波形の解説

Automatic reboot after wdt reset:リブートと WDT RESET について

以下、友人からの Power On Reset の補足を頂きました。
Power-On Reset:電源投入後ESP内部回路が落ち着く時間かけておいた方が良い。
_ 電源をOFFにしたときにPower-ON Reset回路のコンデンサにチャージされた
_ 電荷を放電させる為に抵抗と並列にダイオードを普通は入れます。
_ 今回の場合は0.1uFという小さな容量なので必要ないでしょう。
_ コンデンサ容量が大きい場合は電荷がたまった状態だと電源をOFF-ONに
_ したときにRESETがかからないという事も起こりえます。
_ リセットをかける時間はRCの時定数でコントロ−ル出来ます。
_ マニュアルによるとリセット・ピンは内部でPull-Upされているとあります。
_ 抵抗値は書いていませんがコンデンサだけつないでも良いかと思います。
_ その時は放電の為にダイオードが必要になるかもしれません。Reset Pinに
_ ちょいと精度の良い1uFのFilm Cap接続してReset PinをAnalog Discoveryで
_ 観測するとだいたいの抵抗値が予想可能と思います。
_ 多分に内臓Pull-Upは大きな値と推測します。


メモ:修正や新しい内容は随時追加する事とします。


Written by macsbug

2月 12, 2016 at 9:07 am

カテゴリー: ESP8266

ESP8266 の プルアップ抵抗

with 5 comments

ESP8266 の I2C プルアップ抵抗について。               2016.02.10

I2C のプルアップ抵抗はどのような意味があるのか 信号を観測しよう。
接続ピンは、SDA = GPIO_5 、SCL = GPIO_2 で調べました。

基本:ESP8266のI/OはOpenです。つまり外付けにプルアップ抵抗が必要です。
現実:抵抗無くとも動きますが、環境によって不安定 又は 動かなくなります。
_  手などを触れると 異常動作したり 動かなくなります。
理由:ESP8266にプルアップ抵抗を繋がなくとも動いていた理由は、
_  接続した I2C OLED( OLEDから供給) があるからナントカ動いていた。と言う訳。

特徴:I2Cは 電源,GND,SDA,SCLの4本で複数接続できるのが強みです。(カスケード接続)
_  ESP8266は使いこなしてくるとI/O数が少なくなる為、I2Cの利用が便利です。

 I/O の入出力はオープン。
FETがONしVbusが 0Voltになる。
外部に抵抗(Rp)を入れる事により
電流が流れる。
RpとCb(Bus Capacitance)に
より遅れが発生する。
 I/O の入出力はオープン。
FETがOFFしVbusに電圧がでる。
外部に抵抗(Rp)を入れる事により
電流が流れる。
RpとCb(Bus Capacitance)に
より遅れが発生する。

波形を見るとあきらかです。

 ❌
I/O 端子に
プルアップ抵抗無し(∞)。
立ち上がりの鈍りが大きい。
小さい波形はスレシュホルド値
より低いので動作しない。
 ❌
I/O 端子に
プルアップ抵抗無し。
OLEDを接続。
OLEDからの電力(抵抗)により
ナントカ動いている状態。
 ⭕
I/O 端子に
1KΩのプルアップ抵抗を接続。
OLEDを接続。
より安定した動作。
 上記の拡大波形。

スパイクは他の要素(L成分)がある。


基本と計算:

TIのI2C Bus Pillup resistor calculation によると
電源3.3Vでは、Rp(Minimum Pullup resistance)は、約1KΩ である。
Cb(Bus Capacitance)=200pFの時、Rpは、min=966.667Ω~max=1.77KΩ。
計算式:MAX=(300x10E^-9)/0.8473*200*10E^-12=1.77KΩ。
_   MIN=(3.3-0.4)/(3E^-3)=966.667Ω。

I2C接続の速度(100kps,400kbps)や容量(200pF,400pF,550pF)に依存した
「RC遅れ」を計算し速度と消費電力を考えましょう。


事例:

ESPRESSIFには基本が書かれています。
[Release Date 20160206] [Document list 0A-0D] ESP8266 Hardware Guide
I2Cの回路は以下に書かれて、I2Cのプルアップ抵抗は 2.2KΩ。
0B-ESP8266__System_Description__EN_V1.4_20160203
20/27 Page  Figure 2-2: ESP-LAUNCHER interface schematics


Sparkfun の事例は、2.2KΩ。
SparkFun ESP8266 Thing


hallard氏の事例は、4.7KΩ。WifInfo : Wifi Teleinfo server


参考:
pic KnowHow:I2Cモジュールの使い方:基本から解りやすく書かれています。
Texas Instrument:I2C 概要:カスケード接続。

趣味の電子工作の部屋byすん:I2Cバス仕様書:I2C規格の詳細。
ESPRESSIF:[Document list 8A-8Q] ESP 8266 Interface Reference
_ ESP8266 I2C User Guide:8C-ESP8266__Interface_I2C__EN_v1.0.pdf


メモ:
修正や新しい内容は随時追加する事とします。
ESP8266はI/O数が少ない為に、I2Cで構成するとシンプルになる。
_ I2C として基板に4本の I2C BUS をもうけた基板だと便利でしょうね。
_ ただし、I2C BUS なる物は配置が規格化されていない為に不便です。
_ 部品の方でも同じ配置になっていない物があります。
_ I2C の IC も出ていますので、これで構成すると全体がすっきりした物になるでしょう。
_ 例:I2C OLED, I2C Temp,Humi,Pressure IC,I2C ADC,I2c Timer, I2C EEROM,,,。


Written by macsbug

2月 8, 2016 at 5:47 pm

カテゴリー: ESP8266

iMac27インチの故障と復活

leave a comment »

iMac 27-inch Mid 2010 が故障し復帰するまでのお話。                                 2016.02.07


結論:約6000円で直りました。( 急ぎの輸送費は除く)

経過:購入して1年後くらいに中央からジリジリ音がし始める。
ある時電源コンセントを抜いて電源を入れると起動しない事が発生。
半日とか、かなり時間を置くと起動する事と様子見でそのまま過ごす。
ある時は、電源内の特殊そうなICの両端をショートすると起動したりもした。
目視ではキャパシターの劣化や破損はなし。部品の弛みや半田クラックは無し。
今回は今までの対応と日を起きましたが全く動かない為、ebayに電源を注文しました。

国内状況:国内を調べた所、国内調達は無理な事が判明。
_ 国内の修理業者は部品だけは販売していない。アマゾンでは2万円位であるが高い。
_ 場合によっては驚く値段もあり新品購入を考えてしまう。秋葉原の中古屋には無し。
以下、写真左が故障した電源ユニット。右が到着した電源ユニットで目視点検異常なし。


輸送:ebayへ2月3日に注文し、7日夕方着ですから4日で到着。
品名:APPLE 614-0446 Power Supply 310W A1312 27″ iMac Late 2009 mid 2010 PA-2311-02A
価格:合計9391円( 本体は 5869円 ですが至急送料代3522円を加える)
_  今回は「Free Sipping」でなく「Shipping service : Expedited Int’l Shipping」を選択。
_  事前に注文しておけば、5869円 で済みました。
_  尚、ebayでも価格が 15000円台のものもあります。この値段の差が不明。

以前から調子が良くない為に買っておこうと思っていたのですがついつい注文忘れ。
購入してから1年後くらいに出始めたジリジリ音も無くなり凄い静か。


電源を交換してパワーボタンを押す。しばらくすると、あの起動音が出て復帰しました。

 

交換前(左)と交換後(右):HDは SSD 512K2個に交換済み。RAID0 の 1.02TB にして高速化。


感想:
電源が入らない為に、電源回路の電圧を調べましたが、ある所から出ていない。
図面があればなんとか解るのだが図面が無いのでどうにも解らない。
特にコントロール回路が不明な為に信号の判定がつかない。ともかく出力が無いので電源と判断。
裏側にある電源ボタンの仕組みが知りたい所です。これが解れば単体で調べる事もできる。

ネットを調査したところでは、不具合の原因は電源が多い。次はハードディスクでしょうか。
ハードディスクなら外すか購入して交換すれば良否の判断がつく。
電源は、チェック用として常に1台用意しておいた方がいい。再度予備を検討中。
iMacの分解はもう10回以上は行っているのでコツや注意点は把握しているつもり。
小さなコネクタの根元を折ってしまった事もあるがなんとか直す事もあり。
故障の場合は、各自得意不得意があるのでこうした事を分担して行えば安く出来ますね。

直らなければ iMac 27inch Retina 5K SSD で30万くらいの予定でしたが出費せずに済みました。
又、新型の場合に困るのは最新のOSしか選択できず動かなくなるアプリがある事です。
SSDが安くなりましたので、選択によっては Fusion Driveより速くなりますね。


Blackmagic Disk Speed Test


Written by macsbug

2月 7, 2016 at 11:16 am

カテゴリー: Apple

i2C 16bit ADC 4ch ADS1115 in ESP8266

with 2 comments

i2C 16bit ADC ADS1115 を ESP8266 で動かす。                         2016.02.05
ADS1115 は、16-Bit ADC – 4 Channel with Programmable Gain Amplifier
特徴:広い電源電圧範囲:2.0V ~ 5.5V。低消費電流: 連続モード:150μA。
_ プログラマブルゲインアンプ内蔵。プログラミング可能なコンパレータ。
_ 4本のシングルエンド入力。2本の差動入力。I2Cインターフェイス。
_ 最小±256mVから電源電圧までの入力範囲に対応。
サンプルにcomparator、differential、single endedがあり直ぐ動作が可能。


準備:
ハード:ADS1115 Module:ebay=約339円。OLED:ebay=約600円。ESP8266。
ソフト:ライブラリー:Adafruit_ADS1X15-master
_ adafruit/Adafruit-GFX-Library
_ cmmakerclub/ESP_Adafruit_SSD1306

重要:ライブラリー Adafruit_ADS1015.cpp の修正。
修正内容:ADS1015_REG_CONFIG_DR_1600SPS を削除し
_    ADS1015_REG_CONFIG_DR_3300SPS を追加する。以下のリスト参照の事。
理由:delayMicroseconds() doesn’t work in ADS1115 library
_  ADS1015_REG_CONFIG_DR_1600SPS was changed to ADS1015_REG_CONFIG_DR_3300SPS
ライブラリー Adafruit_ADS1015.cpp の155行と207行を修正します。注:リスト中の右は時は表示の都合で省略。
修正前:2カ所あり。

// Start with default values
  uint16_t config = ADS1015_REG_CONFIG_CQUE_NONE
                    ADS1015_REG_CONFIG_CLAT_NONLAT
                    ADS1015_REG_CONFIG_CPOL_ACTVLOW
                    ADS1015_REG_CONFIG_CMODE_TRAD
                    ADS1015_REG_CONFIG_DR_1600SPS
                    ADS1015_REG_CONFIG_MODE_SINGLE;

修正後:2カ所あり。

// Start with default values
  uint16_t config = ADS1015_REG_CONFIG_CQUE_1CONV
                    ADS1015_REG_CONFIG_CLAT_LATCH
                    ADS1015_REG_CONFIG_CPOL_ACTVLOW
                    ADS1015_REG_CONFIG_CMODE_TRAD
                    //ADS1015_REG_CONFIG_DR_1600SPS
                    ADS1015_REG_CONFIG_DR_3300SPS
                    ADS1015_REG_CONFIG_MODE_CONTIN
                    ADS1015_REG_CONFIG_MODE_CONTIN;

配線:5本。
3.3V ————- OLED_Vcc —- ADS1115_Vcc (電源電圧:2.0~5.5V)
GND ————- OLED_GND — ADS1115_GND、ADS1115_ADDR(0x48)
ESP8266_4 —- OLED_SDA — ADS1115_SDA
ESP8266_5 —- OLED_SCL — ADS1115_SCL


Adafruit_ADS1X15 ライブラリー:以下3つのサンプルは参考になります。
_ comparator。differential。singleended。
_ README.mdには、動作報告が書かれています:ESP8266は OK。

GAIN設定:6種類の設定が可能。
_ 2/3x gain で +-6.144Vdcまで可能。今回は「GAIN_TWOTHIRDS」を選択。
_ 「GAIN_TWOTHIRDS」は、読み込み値の0.1875倍が電圧(mV)になります。
_ 最大電圧以上の測定は、抵抗分割で電圧を下げて測る事ができますね。
_ 16x gain の時は、入力は最大 +-0.256V までで、1bit は、0.0078125mV。

ads.setGain(GAIN_TWOTHIRDS); (default)
GAIN_TWOTHIRDS:2/3x gain +/- 6.144V 1 bit= 0.1875   mV
GAIN_ONE      :  1x gain +/- 4.096V 1 bit= 0.125    mV
GAIN_TWO      :  2x gain +/- 2.048V 1 bit= 0.0625   mV
GAIN_FOUR     :  4x gain +/- 1.024V 1 bit= 0.03125  mV
GAIN_EIGHT    :  8x gain +/- 0.512V 1 bit= 0.015625 mV
GAIN_SIXTEEN  : 16x gain +/- 0.256V 1 bit= 0.0078125mV

データー読み込み:読み込み値に、0.1875/1000 倍にし Vdc にします。
_ 例:float v0 = (ads.readADC_SingleEnded(0) * 0.1875/1000);


メモ:
読み込み速度:約8msec。
_ ライブラリーでは コマンド送信し 8msec 後に データーの読み込みを行っています。
_ よって、この速度以上にはならない為この速度に応じた装置にしましょう。
_ ADS1115 Moduleの価格:ebayでのAdafuruit製は2千円台です。
ADS1115 は、16 bit。ADS1015は、12 bit です。
安定度(精度):ADS1115のスペック(Page_8_Fig19)によるとTotal Error は
_ +-2.0Vdc inputで +-3.3mVdc。16 bit ですが以外と大きいものですね。
_ +2.50000Vdc input による実測では 10mV は安定しているが 1mVは変動しています。
_ よって精度は 10mV です。
入力電圧の注意:一般的にADCは 決められた入力電圧以上を接続すると壊れるそうです。
レイアウト:部品や配線のレイアウトは電源や信号が干渉しない様にする事。
安全策:ADCの電源は単独にLDOを使用した方が良い。


参考:
Texas Instruments:16-Bit Analog-to-Digital Converter with Internal Reference
Texas Instruments  ADS1115
Henry’s Bench:ARDUINO ADS1115 MODULE GETTING STARTED:アドレスの詳細。


感想:
i2Cで手軽に 16bit ADC が使えるのは楽ですね。
16bit の性能を引き出すには、基盤や電源、入力の工夫が必要かと思います。


スケッチ:

#include <Wire.h>
#include <Adafruit_ADS1015.h>               // ADS1015,1115
Adafruit_ADS1115 ads(0x48);                 // 16-bit version
#include <Adafruit_GFX.h>                   // OLED
#include <ESP_Adafruit_SSD1306.h>           // OLED 
Adafruit_SSD1306 display(4);                // OLED Reset

void setup(void) {
  //Serial.begin(115200);
  Wire.begin(4,5);                          // OLED:SDA,SCL
  display.begin(SSD1306_SWITCHCAPVCC,0x3c); // I2C ADDRESS=3c
  display.clearDisplay();                   // Clear the buffer
  display.setTextSize(4);                   // font size 4
  display.setTextColor(WHITE);              //
  display.setCursor(0,0);                   //
  ads.setGain(GAIN_TWOTHIRDS);              // 2/3x gain +/-6.144V
  ads.begin();                              // 1 bit=0.1875mV
}

void loop(void) {
  float v0 = (ads.readADC_SingleEnded(0) * 0.1875/1000); // A0 Read
  display.clearDisplay(); 
  display.setCursor(0,0);
  display.println(v0,3);
  display.display(); 
}

Written by macsbug

2月 4, 2016 at 11:35 pm

カテゴリー: ESP8266