2019/05/18

ESP32 初期状態でのブートメッセージ

購入したばかりのESP32-DevKitC-32Dで電源ONした際のブートメッセージを記録。今後microPythonを焼てしまうのでもう同じメッセージは出ないと思われ。


ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3ffc0000,len:0
load:0x3ffc0000,len:2304
load:0x40078000,len:3788
ho 0 tail 12 room 4
load:0x40098000,len:532
entry 0x4009813c


**************************************
*       hello espressif ESP32!       *
*        2nd boot is running!        *
*            version (V0.1)          *
**************************************
compile time 18:16:58

  SPI Speed      : 40MHz
  SPI Mode       : DIO
  SPI Flash Size : 4MB
Partition Table:
## Label            Usage          Type ST Offset   Length
 0 factory          factory app      00 00 00010000 00100000
 1 rfdata           RF data          01 01 00110000 00040000
 2 wifidata         WiFi data        01 02 00150000 00040000
End of partition table
Loading app partition at offset 00010000
section 0: paddr=0x00000020 vaddr=0x00000000 size=0x0ffe8 ( 65512)
section 1: paddr=0x00010010 vaddr=0x3f400010 size=0x05b64 ( 23396) map
section 2: paddr=0x00015b7c vaddr=0x3ffba720 size=0x01378 (  4984) load
section 3: paddr=0x00016efc vaddr=0x40080000 size=0x00400 (  1024) load
section 4: paddr=0x00017304 vaddr=0x40080400 size=0x126ac ( 75436) load
section 5: paddr=0x000299b8 vaddr=0x00000000 size=0x06658 ( 26200)
section 6: paddr=0x00030018 vaddr=0x400d0018 size=0x325b4 (206260) map
start: 0x400807ac

Initializing heap allocator:
Region 19: 3FFBBA98 len 00024568 tag 0
Region 25: 3FFE8000 len 00018000 tag 1
Pro cpu up.
Pro cpu start user code
nvs_flash_init
frc2_timer_task_hdl:3ffbc564, prio:22, stack:2048
tcpip_task_hdlxxx : 3ffbeca8, prio:20,stack:2048
phy_version: 80, Aug 26 2016, 13:04:06, 0
pp_task_hdl : 3ffc34f0, prio:23, stack:8192

:>enter uart init
uart init wait fifo succeed
exit uart init

IDF version : master(db93bceb)

WIFI LIB version : master(934d079b)

ssc version : master(r283 4d376412)

!!!ready!!!
mode : softAP(32:ae:a4:ca:da:18)
dhcp server start:(ip: 192.168.4.1, mask: 255.255.255.0, gw: 192.168.4.1)

+WIFI:AP_START

2019/05/12

土曜日の楽しみ、、NHKのドラマ「腐女子、うっかりゲイに告(コク)る」

普段はドラマ見ないのですが、BL好きな女子が男子に告白したけど、相手が芸だったというドラマ。これは面白すぎて(というと不謹慎でしょうか)、映像の作りが非常に細やかで、心を追いかけており、見ずにはおれない。
NHKとしてはラブシーンとかかなり踏み込んで映像化している印象。二人はまだ高校生だけど、お互いがどこまで分かり合えるのか。。これからの話の展開が非常に気になります。ちなにみに、、無料コミックはPixiv等で読めるようです。

ご参考URL
腐女子、うっかりゲイに告(コク)る。 (NHKサイト)
https://www.nhk.or.jp/drama/yoru/fujoshi/

彼女が好きなものはホモであって僕ではない(Pixiv)
https://comic.pixiv.net/works/5500

彼女が好きなものはホモであって僕ではない(Amazon)

2019/04/27

1.8inch SPI TFT液晶をESP32に接続する

Amazonで購入した、1.8Inch SPI接続のTFT液晶をESP32につないで表示させたい。
商品名は、KMR-1.8 SPI ?  乗ってるチップはST7735Rらしい。

Amazonでの商品名:

HiLetgo 1.8インチ ドライバ IC ST7735R SPIインタフェース 解像度128*160 TFT液晶ディスプレイモジュール 


基板にはSPI用の接続端子が出ているのだが、、A0をどう使うのかちと分からず。
さらに調べると、SPIの仕様としてはMOSI/MISO/CLK/CSの4本であるが、A0はData/Commandの識別信号のようであった。7735Rの仕様書によると、A0を使わない接続の場合は、SPIで送信するデータの先頭ビットをData/Commandの識別ビットとして使うようである(ST7735Rの仕様書,P34あたり)。さらに、HiLetgoの液晶基板の接続端子はMOSI/CLK/Reset/CS/A0(DC)であり、MISOが無いので、ST7735Rからの出力は受け取れない。ということは、、ST7735Rのレジスタが読めないのでデバッグができない。なんという仕様だろうか。。自分でドライバを書くのはやめて(そもそも自作だと品質も怪しいが)、先人の作ってくれたのをそのまま使うことにする。

https://www.rockbox.org/wiki/pub/Main/SonyNWZE370/ILI9163.pdf
https://cdn-shop.adafruit.com/datasheets/ST7735R_V0.2.pdf
https://s3-ap-northeast-1.amazonaws.com/sain-amzn/20/20-011-920/TFT18.rar

https://buildmedia.readthedocs.org/media/pdf/adafruit-circuitpython-rgb-display/latest/adafruit-circuitpython-rgb-display.pdf
AdafruitRGB DisplayLibraryDocumentation

https://github.com/adafruit/Adafruit_CircuitPython_ST7735

まずは、、Adafruitが提供してくれている、ST7735用ドライバを使ってEPS32上のMicroPythonで動作できるかを試してみる。

Adafruitが提供してくれているST7735用ドライバを使って、ESP32+TFT液晶の表示が行えた。使ったクラスは、ST7735Rではなく、ST7735の方。ただ、、白い線が入っていてどうも初期不良のようである。他のドライバでも試してみるつもりだが。

白線の件は一旦おいといて、、
シリアルカメラ(4D Systemの uCAM-IIIを買いなおした)で取得したRAWイメージを表示させるとどうも色合いがおかしい。シリアルカメラはRGB565という形式で、R:5+G:6+B:5の並びで16ビット表現になっているのだが、調べてみると、買った液晶は、B:5+G:6+R:5と、RとBが逆転して表示されている。
 lcd.fill(0xF800)ー>R:11111なので、赤色に塗りつぶされるべきだが液晶は青になる
 lcd.fill(0x001F)ー>B:11111なので、青色に塗りつぶされるべきだが液晶は赤になる
これは液晶のせいというより、ドライバの設定がそうなっているためと思われる。先人の記事でも色が入れ替わっているという指摘を目にすることがあり。。ドライバに手パッチを当てるとなんとかなりそうだが。

https://cycle.eek.jp/mbed/aitendo-18TFT  サイクルきゃあ様より引用
ST7735のレジスタにMADCTL(36h)という(Mode Controlの略だろう)のがあり、そこのbit3にRGBビットがあることを発見。RGBにするか、BGRにするかの選択し、ここがBGRのほうに設定されているので、そこをな直したら、全部正常になった。Color指定でBlueと書いてるのにRedになったり、それもなくなった。
 上記を参考に手パッチを当てたらなんとかなるかも。

ST7735R_V0.2.pdf の仕様書中、
P113 に以下の章があり、D3がRGB/BGRの切り替えフラグのようである。
10.1.27 MADCTL (36h): Memory Data Access Control

Adafruit_CircuitPython_ST7735 のソースを再確認すると、以下の記述があり、bottom to top refreshしたければ、D4を変えるべきで、(0x10)、0x08を指定するとRGB反転させている。。。ドライバが間違ってると思われる。。(このソースはもうメンテされていないし)
file:st7735.py  75行目:
        (_MADCTL, b'\x08'), # bottom to top refresh  ー>0x10 とすべきでは

st7735.pyのMADCTLを0x10に修正すると液晶のRGB表示も正しくなった。。はぁーー
サイクルきゃあ様に感謝。。 下の写真が白線が入った液晶。買ってからしばらく使ってなかったのだが。。やっとつないでみたら白線が入っていて、画面クリアさせても消えない。電源Off/Onしても同じ所に出てくる。さらに、、本数が増えた。

2019/03/30

sdcard.pyで正しく読めないSDカードを調査

ESP32でSDカードを読ませたいのだが、一部のSDカードを除き、普通にWindowsでフォーマットしたSDは正しく読めない。sdcard.pyではブロック単位でリードが可能なので(RAWデバイスとしてブロック単位で直書きができる)、SDの先頭ブロックを読んでみた。以下は正しく読めるSDの先頭ブロック(512バイト分)(マウントできるSDカード、micropython のファイルシステムで、FATファイルシステムとして認識できるSD)



fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 . . . . . . . . . . . . . . . .
fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 . . . | . . . . . . . . . ! . .
00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 . . . . 8 . u . . . . . . . . u
f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b . . . . . . . . . | . . . t . .
4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 L . . . . . | . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 48 f7 0b 00 00 00 80 01 . . . . . . . . H . . . . . . .
01 00 0e f7 3e 09 3e 00 00 00 62 58 02 00 00 00 . . . . > . > . . . b X . . . .
01 0a 83 a6 cc fc a0 58 02 00 60 1f ed 00 00 00 . . . . . . . X . . ` . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa . . . . . . . . . . . . . . U .
以下は正しく読めない場合の先頭ブロック(マウント時にエラーになるSDカード、micropython のファイルシステムで、FATファイルシステムとして認識できないSD))

fa 33 c0 8e d0 bc 00 7c 8b f4 50 07 50 1f fb fc . 3 . . . . . | . . P . P . . .
bf 00 06 b9 00 01 f2 a5 ea 1d 06 00 00 be be 07 . . . . . . . . . . . . . . . .
b3 04 80 3c 80 74 0e 80 3c 00 75 1c 83 c6 10 fe . . . < . t . . < . u . . . . .
cb 75 ef cd 18 8b 14 8b 4c 02 8b ee 83 c6 10 fe . u . . . . . . L . . . . . . .
cb 74 1a 80 3c 00 74 f4 be 8b 06 ac 3c 00 74 0b . t . . < . t . . . . . < . t .
56 bb 07 00 b4 0e cd 10 5e eb f0 eb fe bf 05 00 V . . . . . . . ^ . . . . . . .
bb 00 7c b8 01 02 57 cd 13 5f 73 0c 33 c0 cd 13 . . | . . . W . . _ s . 3 . . .
4f 75 ed be a3 06 eb d3 be c2 06 bf fe 7d 81 3d O u . . . . . . . . . . . } . =
55 aa 75 c7 8b f5 ea 00 7c 00 00 49 6e 76 61 6c U . u . . . . . | . . I n v a l
69 64 20 70 61 72 74 69 74 69 6f 6e 20 74 61 62 i d   p a r t i t i o n   t a b
6c 65 00 45 72 72 6f 72 20 6c 6f 61 64 69 6e 67 l e . E r r o r   l o a d i n g
20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   o p e r a t i n g   s y s t e
6d 00 4d 69 73 73 69 6e 67 20 6f 70 65 72 61 74 m . M i s s i n g   o p e r a t
69 6e 67 20 73 79 73 74 65 6d 00 00 00 00 00 00 i n g   s y s t e m . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 . . . . . . . . . . . . . . . .
04 00 06 05 e5 cb 81 00 00 00 7f df 1d 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa . . . . . . . . . . . . . . U .

sdcard.pyで、sd.readblocks(sector,buffer)の関数は正常に動作するので、SDのメディア自体は正しく認識されている。FATファイルシステムが解釈できない問題。どう違うのか、FATの仕様書と読み比べると原因が分かりそうだけど、、そこまで時間が取れない。 SD カードフォーマッターという、SDコンソーシアム?の公式フォーマットツールを使ってフォーマットしたところ、MBR領域は綺麗になったが、やはりマウント時にエラーになった。なぜだろうか。。

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 df dd 21 e5 00 00 00 02 . . . . . . . . . . ! . . . . .
04 00 06 1f ff ca 81 00 00 00 1f de 1d 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa . . . . . . . . . . . . . . U .

調べ切れていないが、これはフォーマットの違いではなく、SDカードの仕様に対応しきれていないのが原因ではないかと考えている。SDカードに対してReadBlocks/WriteBlocks要求を出す時、読み書きする対象の領域を指定するのに2つの方式があり、バイトアドレス指定か、ブロックアドレス指定か?に分かれている。
本来は、OCR中のCCS[30]を見てどっちかを決めないといけないそうなのだが(ElmChan氏解説記事より)、どうもこの部分が正しく実装されていないのでは?と思える(今はまだ推測)。sdcard.pyではブロックアドレス方式のSDカードしか扱えないのではないか。。 
以下は仮説含みでの自分なりの解釈

  • mountでエラーになってアクセスできないSDは1G程度の比較的容量の少ないやつ
  • エラー発生は、SDカードに対するwriteblocksコマンド実行時で、エラー内容はアドレス指定に対するアライメントエラー。1ブロックが512Bなので、512の倍数でアドレスを指定しないといけないのだが指定時はそうなっていない(これは確認済み)
  • エラーを起こしているSDはバイトアドレス指定方式のタイプと思われる
  •  sdcard.pyではブロックアドレス指定のみで実装されており、バイトアドレス指定方式の場合、上記の アライメントエラーが発生する。 
  • 一方、エラーが発生しないSDは4Gタイプでこれらはブロックアドレス方式のタイプと思われる(OCRの値を確認できていないので推測、だけど指定アドレスが小さい値なのでブロックアドレスを指定していると思われる)。だから、正常に読める。
  最初はSDカードのフォーマットの違い(MBRの配置あたり)かと思っていたけど、多分SD容量に起因する、アドレス指定方式の違いによってマウントできるSD,できないSDに分かれたと推測。 
参考にしたElmChan氏のSDカード解説
 http://elm-chan.org/docs/mmc/mmc.html
KingstonのSDアクセス手引き
https://docsplayer.net/41452623-Kingston-technology.html

2019/03/29

ESP32(トラ技スペシャル IoT Express)でSDを動かす

自分が使っているESPボードは、トラ技スペシャルの付録の、IoT Expressボードで、SDカードが付いているので、これを動かしてみる。sdカード用ドライバが必要なようで、これをuPyCraftを使ってESPのフラッシュに送り込む。

https://github.com/micropython/micropython/blob/master/drivers/sdcard/sdcard.py

https://github.com/pycom/pycom-micropython-sigfox/blob/master/drivers/sdcard/sdcard.py

トラ技スペシャルより、SPIは1系統で、CSはGPIO5なので以下を指定
import machine, sdcard, os
sd = sdcard.SDCard(machine.SPI(1), machine.Pin(5))
しっかり怒られた。
>>> sd = sdcard.SDCard(machine.SPI(1), machine.Pin(5))
Traceback (most recent call last):
  File "", line 1, in 
  File "sdcard.py", line 54, in __init__
  File "sdcard.py", line 82, in init_card
OSError: no SD card
本ではもう少しオプションが付いていて、その通りに打ち込んだ。
spi = machine.SPI(1,baudrate=32000000,polarity=1,phase=0,sck=machine.Pin(18),mosi=machine.Pin(23),miso=machine.Pin(19))
すると、下記のように、動いているように思える。
>>> sdcard.SDCard(spi,machine.Pin(5))
 [0;32mI (1471856) gpio: GPIO[23]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1471856) gpio: GPIO[19]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1471866) gpio: GPIO[18]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1472166) gpio: GPIO[23]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1472166) gpio: GPIO[19]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1472176) gpio: GPIO[18]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m

>>> 

osライブラリのコマンドを使ってマウントが必要 https://dfram.hatenablog.jp/entry/2017/11/27/215940
>>> os.listdir()
['boot.py', 'blink.py', 'sdcard.py', 'sd']
>>> os.listdir('/sd')
[]
>>> 

>>> os.mount(sd,'/sd')
Traceback (most recent call last):
  File "", line 1, in 
OSError: [Errno 19] ENODEV


フォーラム等を見てみる。。
https://forum.pycom.io/category/21/micropython
https://forum.micropython.org/


https://github.com/micropython/micropython/issues/3816#issuecomment-392512522


上記コメントによると、0セクタを読んだ時にバッファの最後は0x55aa でないといけないとある。
ためしてみると。。以下の通り、SDのセクタ読み込みのレベルでは正しく動作しているようである。
buffer=bytearray(512)
sd.readblocks(0,buffer)
>>> "{:x}".format(buffer[510])
'55'
>>> "{:x}".format(buffer[511])
'aa'

試しに、BeagleBoneの起動SDならマウントできた(一体どのようなフォーマットだったのか)。よって、読めるかどうかは、マウントさせようとしているSDのファイルフォーマットによると思われる。

ラズパイ用の起動SDだとエラーになった。
>>> uos.mount(sd,'/sd')
Traceback (most recent call last):
  File "", line 1, in 
OSError: [Errno 1] EPERM
memo

https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo

読める、読めないの違いは、SDカードのMBR(Master Boot Record)の扱いの差と思っているのですが、
そもそもたまたま読めるBeagleBone用のSDがどういう素性なのかわかっておらず。

https://jp.easeus.com/partition-manager/how-to-format-sd-card.html
https://qiita.com/mt08/items/c684d72345b591f4a27f

2019/03/24

SwitchScienceの BME280を扱う


ESP32で温湿度を計測したいので、BME280を接続して計測する

https://github.com/BoschSensortec/BME280_driver


MicroPython用にBME280用ドライバが公開されているのでそれを使わせてもらう。

https://github.com/catdog2/mpy_bme280_esp8266

以下のコードで動くようである(上記GitHUBの説明より引用)。すばらしい。
import machine
import bme280

i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
bme = bme280.BME280(i2c=i2c)

print(bme.values)

手元のESP32はCQのトランジスタ技術スペシャルの付録基板で、空いてる適当なGPIOとしては、14,15があるのでこれをI2Cに使うことにする。よって、以下のピン指定で動くはず。

import machine
import bme280

i2c = machine.I2C(scl=machine.Pin(14), sda=machine.Pin(15))
bme = bme280.BME280(i2c=i2c)

print(bme.values)

参考:
NodeMCU(Lua)によるBME280のライブラリ例
https://nodemcu.readthedocs.io/en/dev/modules/bme280/#example

http://trac.switch-science.com/wiki/BME280
http://pages.switch-science.com/letsiot/airquality/

2019/03/23

ESP32でGrove Serial Camera(OV528)を使う


ESP32でGrove Serial Cameraを使う



Grove - Serial Camera Kit

http://wiki.seeedstudio.com/Grove-Serial_Camera_Kit/

使っているコントローラ:OV528の仕様書

GroveSerialCameraとはUARTで接続する。ただし、ESP32にシルク印刷されているRxD,TxDは、開発用に使っているので、その他のピンで使えるUARTを探す

MicroPython リファレンスより

Available Pins are from the following ranges (inclusive): 0-19, 21-23, 25-27, 32-39. 

  • Pins 1 and 3 are REPL UART TX and RX respectively
  • Pins 6, 7, 8, 11, 16, and 17 are used for connecting the embedded flash, and are not recommended for other uses
  • Pins 34-39 are input only, and also do not have internal pull-up resistors
  • The pull value of some pins can be set to Pin.PULL_HOLD to reduce power consumption during deepsleep.

Pin1,Pin3とは、GPIO1,GPIO3の事の様である(下記のRxD,TxDと一致)
UARTは3系統あるはずで、開発用のUART0以外がどうなっているのかを確認。
結果、U2TxD:GPIO17,U2RxD:GPIO16を使うことにする。

esp32-wroom-32_datasheet_en.pdf  より


No.NameTypeFunction
1GNDPGround
23V3PPower supply
3ENIModule-enable signal. Active high.
4SENSOR_VPIGPIO36, ADC1_CH0, RTC_GPIO0
5SENSOR_VNIGPIO39, ADC1_CH3, RTC_GPIO3
6IO34IGPIO34, ADC1_CH6, RTC_GPIO4
7IO35IGPIO35, ADC1_CH7, RTC_GPIO5
8IO32I/OGPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input),ADC1_CH4,TOUCH9, RTC_GPIO9
9IO33I/OGPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output),ADC1_CH5,TOUCH8,RTC_GPIO8 Espressif Systems 3 ESP32-WROOM-32 Datasheet V2.8
10IO25I/OGPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0
11IO26I/OGPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1
12IO27I/OGPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV
13IO14I/OGPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK,SD_CLK, EMAC_TXD2
14IO12I/OGPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2,SD_DATA2, EMAC_TXD3
15GNDPGround
16IO13I/OGPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3,SD_DATA3, EMAC_RX_ER
17SHD/SD2*I/OGPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD
18SWP/SD3*I/OGPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD
19SCS/CMD*I/OGPIO11, SD_CMD, SPICS0, HS1_CMD, U1RTS
20SCK/CLK*I/OGPIO6, SD_CLK, SPICLK, HS1_CLK, U1CTS
21SDO/SD0*I/OGPIO7, SD_DATA0, SPIQ, HS1_DATA0, U2RTS
22SDI/SD1*I/OGPIO8, SD_DATA1, SPID, HS1_DATA1, U2CTS
23IO15I/OGPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD,SD_CMD, EMAC_RXD3
24IO2I/OGPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0,SD_DATA0
25IO0I/OGPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1, EMAC_TX_CLK
26IO4I/OGPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1,SD_DATA1, EMAC_TX_ER
27IO16I/OGPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT
28IO17I/OGPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180
29IO5I/OGPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK
30IO18I/OGPIO18, VSPICLK, HS1_DATA7
31IO19I/OGPIO19, VSPIQ, U0CTS, EMAC_TXD0
32NC--
33IO21I/OGPIO21, VSPIHD, EMAC_TX_EN
34RXD0I/OGPIO3, U0RXD, CLK_OUT2
35TXD0I/OGPIO1, U0TXD, CLK_OUT3, EMAC_RXD2
36IO22I/OGPIO22, VSPIWP, U0RTS, EMAC_TXD1
37IO23I/OGPIO23, VSPID, HS1_STROBE
38GNDPGround



memo heap in MicroPython
https://docs.micropython.org/en/latest/reference/constrained.html#the-heap


OV528の仕様書より、立ち上げ時はまずコネクション確立を行うようにと書かれていて、速度は9600bpsであった。それに従い、まずは、SYNCコマンドを送る関数を作る。

OV528(Seeed Studio Grove Serial Cameraのコントローラ)に対してシリアルで接続してコネクションを確立するまでの手順 (言語はMycroPython)
--------------------------------------------------
#

from machine import UART
from time import sleep

uart1 = UART(1, 9600)
uart1.init(9600, bits=8, parity=None, stop=1,tx=17,rx=16) 

INIT = bytes([0xAA,0x0D,0x00,0x00,0x00,0x00])

def make_connection():
   for x in range(60):
      uart1.write(INIT)
      sleep(1)
      if(uart1.any() > 0):
          packet=uart1.read(uart1.any())
          show_packet(packet)
          return True
      #print(uart1.any())
      #print(uart1.read(1))
   return False


def show_packet(packet):
  for i in range(6):
     print("[{:02x}]".format(packet[i]),end="")
  print("")
--------------------------------------------------
シリアルコンソールでの表示
>>> make_connection()
[aa][0e][0d][00][00][00]
True
多少てこずったのでオシロで確認
同期が確立した時の波形
上がカメラへの送信、下がカメラからの返却
速度は9600bps
安定動作のためには、SYNCパケット送信の際、一発目を送ってから、少し時間を空けて2発目を送ると、かなり確実にACKが返る。上記実装例では1秒のSLEEPを入れている。連続してバリバリに送ると、いつまでたってもACKが返らない。


追記
Grove Serial Cameraの製品説明ページで確認すると、電源5Vで、信号は232Cと書かれている。5Vのシリアルではなく、本気の232Cなのだろう。。多分。今回は、カメラの電源は5Vを供給しているが、カメラのシリアルはESP32のバス直結なので、3.3Vで繋いでいる。現状動いているがこれは規格外と思われる。Grove Serial Cameraの基板側の回路図がないので、基板内のレベル変換がどうなっているのか分からず。