2017年05月14日

ESP32 でやってみたいこと

ESP32 でやってみたいことの覚書

1) bootloader - 起動の仕組みの理解 あるいは改造

ESP32 は、OTA -- Wifi からのプログラム書き換えができるらしいのだ。作ったボードは USB シリアルがないし、これを常用したいのだが、どういう仕組みなのか? 理解してないとなにもできない。

ちょっと調べただけだが、まず次のところに解説があった。
 ・ESP32 (4) – Flash, bootloader and FreeRTOS

ざっと説明すると、ROM 内の 1st stage ブートローダーが SPI FLASH から 2nd stage ブートローダーを読み込み実行する。2nd stage ブートローダー は、 factory app もしくは 2種類の OTA app から選択したものを読み込み起動する。OTA app が 2種類あるのは、書き込みが失敗したときの対策ができるということだろう。

2nd stage ブートローダー 0x1000
パーティションテーブル 0x8000
 nvs 0x9000 24k
 phy_init 0xf000 4k
factory app 0x10000 1M

基本はこんな配置らしいのだが、パーティション自体は別。app と data の2個のパーティションがあるらしい。

で、さらに調べると 2nd stage ブートローダー のソースコードが公開されていることが分かった。
 ・https://github.com/espressif/esp-idf/tree/master/components/bootloader/src/main

ソースコードがあるのなら、自分が使いやすいと思うブートローダーを作ることも可能だ。例えば、OTA で書き込んでそれを起動するようなものも作れそうだ。そこまでしなくとも、起動する app の 選択ロジックがどうなってるか調べるのにも役にたちそうだ。

    いきなり訂正。

    PART_TYPE_APP PART_SUBTYPE_FACTORY: factory app

    ということ。OTA も PART_SUBTYPE_OTA_FLAG/PART_SUBTYPE_OTA_MASK で 2 種類が認識される。

さて、

dram_seg (RW) : org = 0x3FFF0000, len = 0x10000
iram_pool_1_seg (RWX) : org = 0x40078000, len = 0x8000
iram_seg (RWX) : org = 0x40080000, len = 0x400

メモリ上は、このあたりを使うらしい。といっても、そもそもどこが RAM なのか知らなかった。

512KB の SRAM は、3つのユニットに分かれている。

dbus ibus
SRAM 0 192KB 0x4007_8000 ~ 0x4007_FFFF
SRAM 1 128KB 0x3FFE_0000 ~ 0x3FFF_FFFF 0x400A_0000 ~ 0x400B_FFFF reverse order (word-wise)
SRAM 2 200KB 0x3FFA_E000 ~ 0x3FFD_FFFF

なんだか複雑でよく分からない。慣れが必要そうだ。

さて、OTA だが、実際にどう使うのか?
 ・http://ht-deko.com/arduino/esp-wroom-32.html
 ・http://www.iotsharing.com/2017/05/how-to-update-firmware-ota-for-batch-esp32.html
ここに説明と具体例があった。

要するにライブラリはあるが、app から 呼び出してやらないといけない。動かないコードを作ってしまうと、USB シリアル使っていちからやりなおし。ブートローダーに OTA 書き込み機能を付けるか、2 つ目の OTA app を OTA 書き込み専用にするか。まぁ普通に考えるとリカバリ用を作るのが妥当なのだろう。

    ほぼなにもしないプログラム : 103362バイト(9% /1MB)グローバル変数 9432バイト(3% /294912)
    ほぼ OTA のみの プログラム : 448515バイト(42% /1MB)グローバル変数 37380バイト(12% /294912)

    448KB ! bootloader に組み込むなどとんでもなかった。OTA のコードなど知れているはずだから、FreeRTOS で 100KB , プロトコルスタックで +300KB ということなのだろうか? いずれにせよ、リカバリ用の OTA app を作って、bootloader では、どちらを起動するかのロジックをいじるってのが良さそう。

ちなみに ホスト側のアプリは用意する必要はなく、Arduino IDE から書き込めるようになっているらしい。そうであれば、環境さえ整えれば、USB シリアルレスで いけそうだ。




さて、実際になにをしたいか?

1) IP カメラ
まぁ取り立てて必要というわけではないが、車のバックカメラなんかは、あると良いかも知れない。

 ・https://github.com/igrr/esp32-cam-demo/blob/master/components/camera/ov7725.c

このサンプルコードを見ながら、いろいろやってみたいとは思う。

 ・Orange pi 用カメラ

ov7725 は fifo なしのを使う。だが割と高い。どうせなら、より高機能な ov2640 を使ったほうが良いかもしれない。幸いなことに Orange pi 用が割と安い --- 送料込み $8.28 (OPi を買うついでに set にしておくと $5 分ぐらい)。 実験用なら、やっすい ov7670 が良いかも知れない。ov7670 にもいろいろあって、24-pin フレキのタイプもある。互換性があるなら、ov2640 と入れ替えてテストするとかできるかも。

さて、aliexpress のカメラモジュールを見ているといろいろなタイプがある。ONVIF 対応の IP カメラが $10 ほどで買えたりする。さすがに、こういうのに対抗するのは難しいような。シリアルインターフェイスの jpeg 30fps のものもある。プロトコルは、vimicro VC0706 プロトコルというもの。先人が これを ESP8266 で IP camera にするようなことをしている。互換性があるものを作れたら良いのかも知れない。

    データシートを見ていたら、ov2640 は圧縮エンジンが付いている。JPEG stream がいけるとなると、ONVIF 対応も可能? やはりこちらが本命か。

    ov7670 の ピンアサイン は、aitendo のモジュールのデータシートに記載されているものが一般的なようだ。HDR というシルクがある ov7725 も同じ。そして、Orange pi カメラもおそらく同じ。ただし、電源回りは少し違うようだ。ov7670/ov7725 は、内蔵レギュレータがあり、レジスタの設定で ON/OFF できる。ov2640 もあるのだが物理的に配線が必要で、ON/OFF がレジスタではできない。もし配線されてなければ、core に 1.2v を供給しないといけない。
    1 NC
    2 NC
    3 D2
    4 D1
    5 D3
    6 D0
    7 D4
    8 PCLK
    9 D5
    10 GND
    11 D6
    12 MCLK
    13 D7
    14 VCC (2.8v)
    15 VCORE (1.8v - ov7670/ov7725, 1.2v - ov2640)
    16 HSYNC
    17 STBY_EN (PWDN)
    18 VSYNC
    19 RESET#
    20 SCK
    21 AVCC (2.8v)
    22 SDA
    23 AGND
    24 NC

ところで、これらカメラモジュールは 38mm 角のものが多い。なにか規格があるのだろうか? カメラ専用基板とか作りたくなっているので気になる。


    ELECROW が SALE をしているので、基板を作りたく。10cm x10cm 5枚だと、$4.9 + 送料 $6.42 の $11.32 で作成できる。で、ESP32 基板にカメラ用コネクタを追加したものを作成してみた。
     ・suzbrd_wroom32_v1.2-out.zip -- 提出ファイル
     ・suzbrd_wroom32_v1.2.zip -- eagle ソース
    カメラの信号の割り当て
    1 NC
    2 NC
    3 D2 IO14
    4 D1 IO12
    5 D3 IO13
    6 D0 IO15
    7 D4 IO16
    8 PCLK IO17
    9 D5 IO4
    10 GND
    11 D6 IO35
    12 MCLK IO5
    13 D7 IO18
    14 VCC (2.8v)
    15 VCORE (1.8v - ov7670/ov7725, 1.2v - ov2640)
    16 HSYNC IO19
    17 STBY_EN (PWDN) pull-down
    18 VSYNC IO21
    19 RESET# IO2
    20 SCK IO23
    21 AVCC (2.8v)
    22 SDA IO22
    23 AGND
    24 NC

    こんな割り当て、VCORE には 3端子レギュレーターを付けることが可能で、AVCC は LC フィルタを通して供給するようにした。それは良いのだが、余ってる I/O はかなり少ない。この形状にする必要はあったのか?少々疑問ではある。

    ところで、SOT23 のレギュレーターをパターンに入れたが、適合するのがあまりない。MCP1700 もしくは、AP2120N ぐらい。内部レギュレータがあるのに、必要なのか?という疑問があるのだが、OV2640 のモジュールは、普通レギュレータが 2つ 3つ載っている。3.3V → 2.8v とかがまずひとつ。2つあるってことは、3.3v → 1.2v なんだろう。3つあるやつは、AVCC かな。さて、OV7670 は内部レギュレータがあって ON/OFF できる。ちなみに、VOUT に高い電圧がかかった場合、なにも起きないはずなので、OV7670 に切り替えてテストする場合も1.2V レギュレータを付けておけば良いのだと思う。


ところで、サーボモータで制御するカメラ台というものがある。


このカメラをマウントする部分につめがあるが、どうも 10mm高 3cm x3cm のカメラモジュール用らしい。これに直接マウント可能なカメラ基板を作ってみたいような。サーボ制御用のコネクタも付けてしまえば、電源ケーブルだけのシンプルなものになる。だだ、そこまでやるなら、カメラをちゃんと動作できてソフト開発も完了してから。幸い最近木工を覚えた。多分、桐まないたの端材でマウンタを作れば上記の基板でもいけるだろう。

あと、サーボに SG90/MG90S は使えるようだが、どうもきっちり適合しない。ひょっとして ES08MA II が適合するのかも。(間違い)。MG90S や ES08MA II は問題ないのだが、SG90 は、静止に問題があるかも知れない。カメラ用としては致命的。できれば 避けたほうが良いのかも。

    2017/7/5 追記


    Orange pi i96 というボードが出た。価格 $8.8 + 送料、サイズ 60mm x 30mm 。Wifi+Bluetooth とカメラインターフェイス。おそらくだが、カメラインターフェイスは、今までの OPi シリーズと違って、上記のカメラモジュールが直接接続できる。今までは 電源を直接供給しておらず、変換ボードが必要だった。が、2G IOT から、2.8v と 1.8v を供給するようになった。i96 も 同じ SoC RDA 8810PL 採用なので、カメラについても同じだと思われる。


    2G IOT の回路図はこうなっている。1.8V / 2.8V は、RDA 8810PL が供給しているようだ。この 1.8V がプログラマブルならば、ov2640 も接続できるかも知れない。
    あと気になったところは、AVDD 。 10Ω + 10uF の RC LPF で済ませている。 設計した ESP32 は LC LPF を付けているが、時定数が適当だったので、見直してみたい。

    さて、このようなボードが出てくるとなると、作ろうと思っているカメラボードについて再考しないといけないかも知れない。というか OPi i96 がカメラボードそのものに見える --- これ使えば良いじゃないと思えて来てしまうのである。

2) bluetooth スピーカー あるいはイヤホン

bluetooth のデバイス作れるのだから当然やってみたい。このあたりは先人が既に作っているから、楽だろう。慣れるために手を付けたいわけなので、外部 DAC じゃなくて、内蔵 DAC もしくは、1bit シグマデルタでやりたい。シグマデルタは GPIO を叩くライブラリがあったはず。RMT を使ったものはまだないかも知れない。

 ・事:ESP32でBluetoothイヤホンを作ってみた – Qiita
 ・ESP32でI2S+DACを使う – Qiita

 ・https://github.com/espressif/esp-idf/tree/master/examples/bluetooth
このあたり。

3) bluetooth キーボード

キーボードというか HID デバイスを作りたい。自由に作れるようになれば、かなり応用が広がる。ゲームコントローラに仕込んで、なにか遠隔操作するとか。あるいは、Android を遠隔操作するものとか -- 赤外線ハンドルリモコンのブリッジとか。

 HOGP -- HID over GATT Profile を使うらしいのだが、あまり情報がない。誰かの実装まち。

4) その他 bluetooth デバイス

 bluetooth デバイス はまだまだある。USB シリアルの代替につかえる bluetooth シリアル とか。

 ・http://anoda.cocolog-nifty.com/mad/2017/06/esp-wroom-32blu.html
SPP が使用可能になったそうだ。

ところで、USB シリアルの代替ならば、Wifi でもいい。
 ・http://www.eterlogic.com/Products.VSPE.html
Virtual Serial Ports Emulator なるソフトは、Windows から COM ポートとして接続してくれるので、既存のソフトが使えるようになる。例えば 中華CNCのコントローラは、Arduino だったりするので、代替できるものが作れるかも知れない。

    というか、もし中華CNCを買うなら、代替コントローラ作ってみたい。まずは、無線化した同等機能。できれば、モータの回転数をモニタして、過負荷を検出 -- 動かす速度を落とす...みたいな機能とか。あとは、原点を検出するような機能とか。さらに言うと材料との位置合わせのためのなにか?

    ググってみると、原点検出は標準的な機能らしい。透過型フォトセンサなどを取り付けている人がいた。Z軸はより容易なようだ。テーブルの精度(高低)を測定したりも可能。自機で削って公正している例もあった。また材料との位置合わせのためにUSBスコープを取り付けてる例もあった。モータの回転数も測定してる人はいた。これをフィードバックして制御するような例だけ見つからなかった。

    顕微鏡まで付けるとなると ... 1台のESP32 では荷が重い。じゃぁ2台? CNC が既にある前提なら 顕微鏡すら自作できるかも知れないし。

5) lowspeed USB HOST/device

ESP8266 でも ソフトUSB ができるそうだが、ESP32 でもたぶんできるのだろう。そのためには、CPU を1つ占有してブン回さないと。

 ・https://techtutorialsx.com/2017/05/09/esp32-running-code-on-a-specific-core/

とりあえず、コア指定でタスクを動かす方法。これが出来たうえで、同一バンクへのメモリアクセスが競合しないようにする。そこまでできれば、ESP8266 と同じ条件になるはず。あるいは、RMT を使うとか。


ADC についてのメモ

ADC は2つある。ひとつは、ADC1 で 低ノイズアンプあり。あと ADC2 。ADC のピンは、どちらかに接続されている。
ADC を制御するコントローラは、RTC ドメインと、DIGTAL ドメインにある。RTC ADC1, ETC ADC2, DIG ADC1,DIG ADC2 の4つ。なんだかよく分からないが、RTC ドメインの方は、ulp 用だと思っておこう。DIGTAL ドメインの方は、高速で 複数チャネルのスキャンもサポートしている。

また、ADC に接続される内部機能がある。ホールセンサ、電源電圧(PWDAT)、および 電源のピーク電圧(PKDAT)。それ以外に温度計があり、こちらは専用の ADC に接続されている。

    SENSOR_VP (GPIO36)
    SENSOR_CAPP (GPIO37)
    SENSOR_CAPN (GPIO38)
    SENSOR_VN (GPIO39)
    32K_XP (GPIO33)
    32K_XN (GPIO32)
    VDET_1 (GPIO34)
    VDET_2 (GPIO35)

これらは、ADC1 に接続されている。またホールセンサは、SENSOR_VP/SENSOR_VN に接続されている。
その他は ADC2 である。

さて、DIG ADC は、どれぐらい高速なのか? 調べて 11us とか 17.2 us とか書いている人がいてはっきりしない。analogRead()を使っての計測で、ピンの設定やらなにやらをいちいちやっての時間らしい。

esp32-hal-adc.h

/*
* Set number of cycles per sample
* Default is 8 and seems to do well
* Range is 1 - 255
* */
void analogSetCycles(uint8_t cycles);

/*
* Set the divider for the ADC clock.
* Default is 1
* Range is 1 - 255
* */
void analogSetClockDiv(uint8_t clockDiv);

どうやら、ADC clock は クロックソースを分周して、指定したクロック数かけて計測するようだ。しかし、クロックソースが何かは良くわからない。
adc.h

/**
* @brief Set ADC source clock
* @param clk_div ADC clock divider, ADC clock is divided from APB clock
* @return
* - ESP_OK success
*/
esp_err_t adc_set_clk_div(uint8_t clk_div);

こっちに書いてあった。APB_CLK というのは、80MHz (最大) 。div が 1 というのは、1/1 分周? だとしたら 80MHz で 8 clock で取得できるのだから 10M sps ? 最適な値を設定しなければ、精度に差がでてしまうのだろうが、結構すごいような。AVR とは雲泥の差である。

ただし、正確な起動タイミングというのが、少々怪しい。ソフトウェアかまたは I2S と書いてある。ソフトウェアでは、完全に正確なタイミングは取れない。となると I2S になるのだが ...

I2S には、ADC モードというのがある。ADC のデータを取得して I2S で外部に出力する機能。( ちなみに、DAC モードというのもある。I2S から入力したデータを DAC で出力する。)。これのために起動できるようになっているのだが、内部に取り込むために使えるのかどうか不明。

ついでだが、audio clock というのが独立して存在する。専用のPLL で I2S だけが使用できる。44.1k の整数倍とか サウンド用の周波数を作り出すためのもの。それは良いのだが、完全に正確なタイミングとなると無理。

さて、DAC はどういうものなのか? 8bit x 2 というのはすぐ分かるが、周波数などは?

まず フルスケールは、電源電圧の 3.3V -- ではあるが、4 段階のスケーリング 1/1, 1/2, 1/4, 1/8 が出来る。 うまく使えば 12bit 相当になるかも。クロックについては、ソースが RTC8M_CLK (8MHz) でこれの n/65536 (n = 1 〜 65536) とか。PLL を 使っているのだろうか? とにかく最大は 8MHz のようだ。1 クロック毎に出力できるとは思えないのだが詳細は分からない。仮に 8 clock だとしても 1M sps になる。これだと、多値 ΣΔ とかで 8bit 以上の分解能を実現することが可能かも知れない。ただし、電源にノイズが乗れば、だいなしである。ESP-WROOM-32 なんかだと、電源も1つにまとめられているので、厳しい。


基板づくりメモ

先日はじめて ELECROW を使ってみた。使ったのは、special offer というので、10cm x10cm 10枚が、$9.5 +送料 $3.3 =$12.8 で作れた。(今は送料$4.8 計$14.3) 。AIR MAIL でも 2週間かからなかったし、シルクの品質にも満足。さらに今は、5 枚までなら、カラー基板がさらに安くなっている。

 https://www.elecrow.com/5pcs-2-layer-pcb.html

$4.9 が基本価格で、送料は 5cm x5cm $3.72 , 5cm x10cm $4.98, 10cm x10cm $6.42 。

milling を使った疑似パネライズが OK らしいので、便利に使えそう。
posted by すz at 21:49| Comment(0) | TrackBack(0) | ESP32

2016年10月26日

ESP32について(開発ボード設計)


banggood で プレセールスのESP-32S モジュールを発注した。次はこれを使うためのボード。

前記事で、だいたいのことは説明した。ここでは eagle を使って基板を発注するところまで。

eagle 7.7
以前は eagle 5.6 を使っていた。久しぶりの使用になる。基本は同じだが忘れてしまっているので、結構苦労した。なにやらファイルフォーマットも変わっているようだ。もう 5.6 には戻れない。

Eagle用DRUファイル と CAMファイルは、スイッチサイエンスさんのところから入手。

作ったのはこれ
 ・suzbrd_wroom32-v1.0-out.zip 発注ファイル
 ・suzbrd_wroom32-v1.0.zip eagle ソース
v1.0 の問題点
 ・ MINI-360 ボードの幅が 0.5mm ほど合ってない(フットプリントが狭い)。
 ・ HX1001 を使う場合、インダクタのフットプリントが小さく CD43 は厳しい。




スイッチサイエンスさんのとこに発注すると、1,389円+1080円で作成することが出来る。だが、今回は久しぶりに Fusion PCB を使ってみることに。$9.9 + 送料 $6.13 - 0.99(10%off) だった。

ところで、気が付いたのだが、10cm x 10cm が意外にも安い。5 枚 $18.9 ,10 枚 $21.9 。以前もそうだったのかも知れないんだが、5cm x 5cm に拘らなくとも良いような気がしてきた。

suzbrd_wroom32-v1.0

ちょっとボードの説明。モジュールは裏に付けることにした。理由は配線の問題。ADC があるピンを A0-A5 に割り当てたかった。左下にある長方形は、DC/DC モジュール。これを使わずに、DC/DCコン IC の HX1001-GES を載せることも出来る。普通に使う分には、どちらでも良いとは思うのだが、RTC もあることだし、バッテリー駆動での消費電流に差が出るものなのかどうか見てみたい。

4pin コネクタは、SPI Flash 書き込み用。DTR - 470Ω - IO0 , DTR - 0.1u - EN という接続にしてみた。DTR を L にすれば、IO0 が L になり、 EN が L → H となるはず。

 ・http://www.espressif.com/en/products/hardware/esp32/resources

ここにある Flash Download Tool には Python 版もあるので、タイミングの問題でダメだったりするのであれば対応できるかも。

http://iot-bits.com/esp32/esp32-flash-download-tool-tutorial/
から抜粋

Pull GPIO0 LOW by pressing the "program" button on your development board. Reset the ESP32 by pressing the EN button momentarily while holding down the IO0 button.

というわけで、IO0 を L にして、EN を↓↑ ... 行けそうな気がする。

ついでにメモ

0x1000: bootloader.bin
0x4000: partitions_singleapp.bin
0x10000: .bin

bootloader というものが 0x1000 にあるわけだから、こいつ次第で、どこからでも -- Wifi や BT からでも -- プログラムを download できると思われる。で、download を指示するには、io0 は使えないわけで、違うボタンがあると良いかも知れない。



Arduino との関係

この基板、5cm x 5cm で作るという条件のため、arduino のシールドがそのままでは、使えない。

ユニバーサル・シールドで言うと、赤い部分がこの基板のコネクタの位置になる。ユニバーサル・シールドの内側に接続して、外側にピンソケットを付けると言った変換基板を作らないといけないのだ。

あるいは、割り切って普通のユニバーサル基板を使うとか。ただし、秋月C基板をタテには付けられない。昔の P-00189 でも一列足りないのだ。ヨコになら付けられる。まぁ、すなおに P-06877 とかを使っておけば良いか。

基板製作の価格について

そういえば、Fusion PCBITEAD があるのだった。送料もある程度するのだが、分からないので価格だけメモ。
      5cm x 5cm  5cm x 10cm  10cm x 10cm
Fusion PCB $9.9     $18.9     $21.9
ITEAD      $9.9     $14.9     $19.9

いずれも 10枚の価格。Fusion PCB は、5 枚だと、$9.9 ,$15.9 ,$18.9

DC-DC コンバータ


5V → 3.3V にこのモジュールを使えるようにしている。サイズは、17 x 11 mm で、ピン間は 長辺 0.6 in , 短辺 0.35 in 。aliexpress で "Mini 360 Step Down Module" で検索すると見つかるのだが、10個 で $3.5 とか冗談のように安い。banggood では 10個660 円 -- それでも安く感じる。

なにか問題があって安いのか?と不安になったりするのだが、写真見る限り、不安なのは半固定抵抗ぐらい -- 経年変化や振動で電圧が変わるのは困る。基板の写真も新旧2つのバージョンがあって、バッタ品とかというものではない模様。(古いのは、分圧抵抗用のパターンあり。)

Input voltage: DC 4.75V-23V
Output voltage: DC 1.0V-17V (Adjustable)
Output current: Rated current 1.8A (3A MAX)

スペック的には、12V 入力も出来て 1.8A 出力 。しかも電圧を設定できる。--- 使いでのありそうなモジュールだ。採用チップは、MP2307 -- データシートも入手できるが、それによると 連続 3A ピーク 4A とのこと。

半固定抵抗を取り外し、抵抗を付けることが出来れば、固定出力にすることは可能。FB は 5番ピンで 、FB 電圧は 0.925v。OUT - R1 - FB - R2 - GND として、 3.3V にしたければ、R1 = 26.1k, R2 = 10k が推奨だそうだ。ただ、写真を見ると R1 = 8.2k(822) が使われている。例えばこれを外して 1608 の 27k に付け替え、半固定抵抗を取ったあとのパターンを利用して 10k を付ける。(ただし、1% 品を使用しないといけない。)

データシートの回路図を元に分かったことを加えるとこういう感じ。ちなみに、左の抵抗は、01D で 100k のことらしい。青で書いたのは、スィッチングダイオードの追加で、5V 入力 3.3V 出力のような、低電圧入力・高電圧出力のときに効率を上げるとのこと。ところで、無負荷時の消費電流は多めらしく 15mA ぐらい常時流れるようだ。すなわちバッテリー駆動には向いていない。

ついでだが 12V 入力で 5v + α にしたい場合、R1 に 47k を使えば 5.27V -- タブレットの充電では、少し電圧を上げた方が具合が良いのである。AC アダプタだと調整出来ないから、こういう用途にも使える。このモジュールは小さいので、うまくすれば、 USBシガープラグに仕込めるはず。過電流保護があるから、ヒューズは取ってもかまわない。Thermal Shutdown 機能も一応付いている。

とか書いたものの、ダイソーの USBシガープラグも変わっているようで、300円のやつ(2.1A)とか 100円の新型 の分解記事がみつかった。特に 300円のやつは、5.3V 付近で 2.2A 流せている。すなおにこれを使えば良いかな。

USB シリアル


"CJMCU CP2102" で検索すると見つかるモジュール。banggood では 240円だが、aliexpress などでは $0.99 のものも。これ使っておけば良さそう。... というか、$1 なら、5V 電源 コネクタとして使っても安い。上記の DC-DC コンバータと合わせて使うとブレットボードの応用でも便利そうに思える。
追記:micro USB の DIP アダプタは、10個で $1.13 だった。 5V 電源 コネクタははるかに安かった。


aliexpress で たまたま、お安いカメラモジュールを発見。ov7670 というセンサを使ったもので、ピンヘッダで出力されている。お値段は $3.5 。

これを扱ってるのは、Top Electronic Company というショップなのだが、ESP32 関係もいろいろと扱っている。さらには、MINI 360 DCDC コンバータや、CP2102 モジュールも。このショップ探検するだけで楽しいかも。

さて、本題。カメラモジュールを扱うデモのソースコードが公開されている。ターゲットは ov7725 ではあるが、ov7670 もデータシートがあるので、扱えるだろう。
 https://github.com/igrr/esp32-cam-demo

かなり楽しみ。


11/17 基板がキター。予約した、ESP-32S は既に到着済み --- もっとも来たのは WROOM-32 だったが。早速と言いたいところだが、先に OPi Zero のほうをやりたい。

追記 2017/5/8

電源電圧について

WROOM-32 は、2.2V 〜 3.6V となっているが、SPI FLASH が GD25Q32 というチップで 2.7V 〜 3.6V らしい。低電圧で使うのは問題があるかも。

カメラモジュールを使う場合、ov7670 は安くて良さそうなのだが、これの電源電圧は 〜 3.0V 。3.3V は定格を超えるので注意。ov7725 は、画像が綺麗なうえ 3.3V で使える。2M ピクセルの ov6240 というのもあるが、Orange pi 用が $5.9 で最安のようだ。ただし、ESP32 ではバッファできるだけのメモリがなく、使うのが難しい。

以上のことを踏まえると、3.3V 固定の HX1001-GES は望ましくなく、抵抗が必要な 可変電圧のタイプ - SY8009B などを使えたほうが良さそうだ。

    SY8009B は、Orange pi で良く使われており、出力が大きいうえに、HX1001 より安い。10個で $1.83 とか。供給電圧が低い場合、duty が 100% まで行くので、供給電圧がドロップした場合に FET の抵抗分だけになる。非常に良さげな DC-DC コンバータ IC 。

OTA について、

ESP32 は、OTA (On The Air) でファームウェアを更新できる(ようにすることが可能)そうだ。最初の書き込みには、シリアルが必要だが、一回 OTA の仕組みに乗ってしまえば USB シリアルなどは不要になる。付けなくて正解だったようだ。ただ OTA を指示するボタンが欲しいところ。

新基板

さて、基板製造を検討したところ、最近は 5cm x 5cm 以内に収めなくともよさそうで、Elecrow などは、10cm x 10cm が 送料込みで $12.86 (1500円ほど) だと分かった。そこで、Arduino UNO の ディメンジョンを参考に少し大きくすることに。

    基本価格は、5cm x 5cm が $9.5 + 送料 $4.8 , 10cm x 10cm が $13.5 + 送料 $10.2 なのであるが、Special Offer で 10cm x 10cm が $9.5 + 送料 $3.36 というのがある。ちなみに Fusion PCB は、10cm x 10cm が $4.9 + 送料 $14ぐらい。

まずは、ピンソケットを正規の位置に付けられるようにコネクタを一列追加。取付穴も UNO と同じ位置にして、そこまで下を広げる。部品も下にずらして、アンテナを飛び出さないようにする。

回路の変更としては、SY8009B を使えるように、出力を分圧して FB に入れる。HX1001-GES を使う場合は 0Ωが必要。また ボタンを付けた。ただし、どのピンを使うのが良いのか決めかねたので、パターンのみ。



 ・suzbrd_wroom32l2_v1.1e-out.zip 発注ファイル
 ・suzbrd_wroom32l2_v1.1e.zip eagle ソース

    発注は 5/6 (土)
    2017/05/10 13:08 引受 CHINA
    2017/05/11 11:10 国際交換局から発送 GUANGZHOU CHINA
    2017/05/14 22:33 国際交換局に到着
    2017/05/15 09:00 通関手続中
    2017/05/15 10:42 国際交換局から発送
    2017/05/16 13:59 到着 配達予定日:5月17日
    もう、到着。
posted by すz at 02:06| Comment(84) | TrackBack(0) | ESP32

ESP32について(IO関係)

さて、ESP-WROOM-32(ESP-32S) というモジュールを入手したとして、どうやって使うのだろうか?開発用基板を作るつもりなので、それに最低限必要なことを整理していきたい。

I/O ピンの機能について
I/O ピンは、IO0 〜 IO39 がある。この I/O ピンの機能を、いくつかから選択する(IO MUX)。その中には GPIO もあるし、そのピンにだけ割り当てられた機能もある。 GPIO を選択すれば、GPIO に割り当て可能な機能から選べる(GPIO Matrix)。GPIO に割り当て可能な機能は、なんと 229 種類もある。

それとは別に boot の動作に必要なピン、SPI Flash に接続されたピンがある。これらの使用には制限がある。

使えない機能・使わない機能
まず、イーサネットを使いたいとは思わないので無視する。次に SPI Flash に接続されたピンが必要な機能は使えないと決め打ちしてしまおう。

SPI Flash に接続されたピンは、SD1 とか SD 関係のようで、調べてみると SD slave が使えないようだ。それ以外だと、Parallel QSPI という機能が使えないようだ。HS1_DATA7 とかの信号名があるので、8bit までのSPI らしいが、使うとは思えないので無視しよう。

しかしこれらの機能はどうやって使うものなのだろう? HOST との接続が前提で 常に download boot を使うのだろうか?気にはなるが、他の機能の把握が先なので忘れてしまおう。


ピンの割り当てが決まっている機能

SD host
 IO2 SD_DATA0
 IO4 SD_DATA1
 IO12 SD_DATA2
 IO13 SD_DATA3
 IO14 SD_CLK
 IO15 SD_CMD

JTAG
 IO12 MTDI
 IO13 MTCK
 IO14 MTMS
 IO15 MTDO

いきなり SD host とぶつかっている。と...なると JTAG はどうやって使うのだろうか?それはともかく、無視したのを除くと、これとアナログ系。

IO32 32K_XP, (32.768 kHz crystal oscillator input)
IO33 32K_XN,(32.768 kHz crystal oscillator input)

RTC 機能があり、Deep-sleep mode (RTC timer + RTC memories) で 20 uA。センサーからの入力で起動する設定だと、25 uA だそうだ。

IO36 SVP
IO39 SVN

60dB gain の ADC だそうだ。

IO25 DAC_1
IO26 DAC_2

8bit DAC が2つある。(10bit かも?)

IO0,IO2,IO4,IO12,IO13,IO14,IO15,IO27,IO32,IO33 TOUCH0-9

タッチパネル 10個まで。

IO34 ADC1_CH6
IO35 ADC1_CH7

上記のアナログ関係のピン以外で ADC があるのはこの2つ。ADC は、12bit SAR だそうだ。

後はすべて、制限なしに GPIO として使えるのかというと そうでもない。

IO0 1=SPI Flash Boot , 0=download Boot (with IO2=0)
IO2
IO12(MTDI) 0=Voltage of Internal LDO (VDD_SDIO) 3.3V
IO15(MTDO) 1=Debugging Log on U0TXD During Booting
IO3(U0RX) download Boot
IO1(U0TX) download Boot

これらが、重要な制限。
IO0 , IO3(U0RX), IO1(U0TX), と EN の4つを使って Arduino 的な使い方が出来る。

GPIO に割り当て可能な機能

SPI (master,slave) x2
UART x3
I2C (master,slave) x2
PWM x4
LED PWM (16ch)
RMT(IrDA, 8ch)
I2S x2 (+LCD,camera)

詳細までは把握できてない。... が、一番分からないのが RMT(IrDA) 。IrDA のために設計されて 38kHz フィルタも内蔵されたものなのだが ... 何故 8ch もあるのか? なにやら気になる。



以上を踏まえて、開発用ボードを作ることを検討してみる。

基本は、ピッチ変換ボードに 3.3V電源 を付けたようなものを考えている。あと回路を少々付加。でもUSB シリアルを内蔵するのは、やめようかと思う。今 SPI Flash 書き換えには必要なんだが、いずれは、他の手段が充実して来るだろう。使うとしても (ラズパイのような) Linux SBC で開発するなら USB 変換は不要だったりする。

電源回路
Wi-Fi Tx 使用時で 260mA と書いてある。それだけで済むとは思えないので、余裕を持った電源回路を組み込もう。
最近は、DC/DCコン モジュールが安く買える。MP2307 採用の これなどは、10 個で 659円。

その他、中華PMP を色々調べたときによく使われていた、中華IC の HX1001-GES も使ってみたい。これは、aliexpress で安価に入手できる。

形状
USB シリアル付きで ピンが両サイドに出ている開発ボードが多いが、どうも使いにくそうな。Arduino 的な形状でピンソケットを付けるのが良さそうだと思える。
以前 5cm x 5cm の基板にしたものを作ったので、それをベースにしようかと。
ピン割り当て
A0-A5 , D0-D13 までは決まった。

A5 IO36 SVP
A4 IO39 SVN
A3 IO34
A2 IO35
A1 IO32 32K_XP
A0 IO33 32K_XN

D0 IO23
D1 IO22
D2 IO21
D3 IO19
D4 IO18
D5 IO5
D6 IO4 SD_DATA1
D7 IO2 SD_DATA0

D8 IO15 SD_CMD
D9 IO13 SD_DATA3
D10 IO12 SD_DATA2
D11 IO14 SD_CLK
D12 IO26 DAC_2
D13 IO25 DAC_1

付加回路

32k 水晶 パターンだけ付ける
USB
 USB D- IO16
 USB D+ IO17
電源コネクタとして MICRO USB を使うが、D-/D+ に一応 IO を割り当ててみた。使えるようになるかも知れない。逆に ピンコネクタ側から電源を供給して HOST として使えないかとも思っている。

SPI Flash 書き込み
ボタン EN,IO0
IO3(U0RX) download Boot
IO1(U0TX) download Boot

DTR L での EN ↓↑ IO0 L

正規の回路が別にあるのだが、DTR + RTS が必要で利便性に欠ける。ちょっと使えるかどうか自信がないが DTR のみのやつを付けてみた。もしこれが上手くいくなら、IO0 のボタンを他の IO に変えられるよう工夫も入れる。

LED(L で点灯) IO27,IO10(SD3)

SD3 は、SPI Flash の /WP に接続されたピン。書き込み時に光るかも。ダメだとしても /WP なら適当に使っても大丈夫そう。


RMT(IrDA, 8ch) について。

ちょっと説明を見てるのだが、波形を生成できる機能のようだ。
メモリ上の 32bit ディスクリプタで、ON 時間(1 - 32768 clock) と OFF 時間(1 - 32768 clock) を指定する。それが最大 512 エントリの配列になっている。clock には、APB_CLK が使用でき 80MHz も可能。

そして、受信の方は ON 時間/OFF 時間 を測定するわけだ。

うまく使えば ΣΔ DAC にもなりそうだし、USB 受信で フレームを取り込むのにも使えるかも知れない。(low speed だと、1フレームの最長は 109bit )
posted by すz at 02:00| Comment(28) | TrackBack(0) | ESP32

ESP32について

ESP8266 というチップをご存じだろうか? Wifi が自由に使える マイコンで、arduino IDE を開発環境として使える。しかも 技適ありのモジュールが秋月で 500円だかで安価に購入できる。まぁ素晴らしいものだとは思うが実はあまり興味を引かなかった。ところが、ESP32 という次の世代のチップが最近出てきた。調べていくと、なにかと凄いのである。実に興味深い。

なにを凄いと感じたか書いてみよう。

1)Bluetooth をサポート。
自由に BT 装置を作れる --- そんなマイコンは初めてのような。しかも、技適取得も期待できる。Wifi だけだと消費電力が大きそうだが、BT だとバッテリー駆動もできそう。また、BT には、プロファイルというものがある。それに従った装置ならば、既存のOS、既存のアプリと組み合わせて使えるのだ。無線のUSB みたいなものと思えば、色々出来そうではないか。

2) I/O ピンが多い、メモリが多い。
ESP8266 は、I/O ピンが少なくてがっかりしたのだが、かなり増えて、ざっと見 30 ぐらいはある。メモリについても SRAM 520 KB と実に多い。プロトコルスタック用に ROM を448 KB 積んでいて、使える RAM を圧迫しないように工夫もされている。

AVR では、あまりのメモリの少なさ、それに対して出来ることの多さに驚いたものだが、そのノリで使ったら、余りまくりそう。かと言って Linux 動かすほどの メモリ量ではない。だが、逆にそれも良い。Linux が載るなら載せてしまうだろう --- 自由なようでそうでもないのだ。

まぁ Linux が載る Rasberry pi みたいな SBC も、それはそれで興味はある。ただ、Linux が動くだけでは面白くない。PC の Linux では出来ないこと − そういうものを見つけたらトライしてみたいとは思っている。


3) ペリフェラルの多さ、I/Oマッピングの自由度。
機能について、こんな風に列記されていたりするのだが。。。

capacitive touch
ADCs (analog-to-digital converter)
DACs (digital-to-analog converter)
I2C (Inter-Integrated Circuit)
UART (universal asynchronous receiver/transmitter)
SPI (Serial Peripheral Interface)
I2S (Integrated Interchip Sound)
RMII (reduced media-independent interface)
PWM (Pulse Width Modulation).

RMII があるのは驚きだが、これでも全然説明が足りない。なんと CSI カメラインターフェイスや (24bit バラレルまでの)LCD インターフェイスがI2S の機能のなかに含まれていたりする。列挙されていないが、SD Host 、SD Slave もある。AVR なんかでは、タイマー機能の確認は真っ先にするものだが、これも記載されていない。調べてみた限りでは、64bit タイマーが 4本あるようだ。他には IrDA もある。地味ではあるが、便利かも知れない。

実に沢山あるわけだが、いくつかのものは、完全に自由に I/O ピンに割り当てられる。AVR では、ピンアサインをどうするか頭の痛い問題だった。PIC32MX なんかでは、選択ができたが、入力と出力でルールが違い、かえって混乱した。こいつは、I2C 、UART 、SPI 、I2S 、PWM を完全に自由に割り当てられる。なにの機能が同時に使えるかすぐ把握できるのは非常にありがたい。

性能とかの観点で見れば無駄とも思える機能ではある。しかし、こいつは 40nm のプロセスルールで作られている。 40nm というと、普通は GHz クラスの CPU を作れるのだが、160 or 240 MHz に抑えてこういうものにリソースを振り分けている。なんとも素晴らしい無駄遣いではないか。

4) USB が ... ない。
多くの人が欲しがると思われる USB がない。組み込もうと思えば簡単に組み込めただろう。あえて外して見せて、「無線で出来ることを有線でやらなくも良いだろう」と言ってるようにも思える。それに乗ってみるのも悪くはない。

ただ、既存の USB装置を無線化することを考えると、あって欲しかったとも思う。これについてはソフトUSB の可能性がある。ESP8266 で実装した人がいる。ESP32 は デュアル Core なので、実行クロック数がコントールできず 無理かと思っていたが、そうでもないかも知れない。少なくとも RAM については、バンクが競合しない限りウェイトが入らないとか。

というわけで、かなりのインパクトを受けた。値段もあまり高くないようだし、しばらくこれで遊んでみたい。

入手性について


遊んでみたいわけだが入手できなければ話にならない。

中国国内では、チップ単体ですら入手できるようだが、日本で使う限り技適は無視できない。となると少なくともモジュールになったものを入手しないとならない。

現時点で購入可能なモジュールはいくつかある。
Ai-Thinker ESP3212 Module
真っ先に入手が可能になったモジュールで Seeed Studio で $7 で販売していた。だが、ESP-32S に切り替わるそうで既に Ghost だそうだ。

Ai-Thinker ESP-32S Module
Banggood でプリセール中 $9 。これは、今だ出ていない 正規版モジュール ESP-WROOM-32 の互換品。技適はない。


ESP-WROOM-32
ESP8266 の ESP-WROOM-02 は技適を通してきたから、これも期待できるのだが、今だアナウンスがない。予定では9月のはずだったのだ。
10/25 olimex で 6 EUR で発売開始。ただし、写真では技適はおろか FCC/CE マークも見えない。


というわけで、ESP-WROOM-32 待ちではあるが、ESP-32S で試作が出来るのが現状。

色々と書いてきたが、現時点では、
 ・http://esp32.net/
 ・http://www.espressif.com/en/products/hardware/esp32/resources
ここに情報が整理されているようだ。興味が湧いたならチェックしてみて欲しい。
2016/12/04 追記

ついに、技適マークが付いたモジュールになった。もうすぐ秋月で販売されるだろう。


注意:現時点で、開発環境は使えるものの、完成していない。Bluetooth は未だらしい。ドキュメントも作成途中のようで、十分な情報が公開されていない。ちゃんと使えるようになるまで、時間がかかる。

さて、入手したとしても、物理的な問題においても、すぐに使えるわけではない。 --- ピッチ変換基板をなんとかしないと。次回はこれについて考察してみよう。
posted by すz at 01:53| Comment(0) | TrackBack(0) | ESP32