macsbug

Just another WordPress.com site

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