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/18
ESP32 初期状態でのブートメッセージ
購入したばかりのESP32-DevKitC-32Dで電源ONした際のブートメッセージを記録。今後microPythonを焼てしまうのでもう同じメッセージは出ないと思われ。
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)
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での商品名:
基板には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 サイクルきゃあ様より引用
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しても同じ所に出てくる。さらに、、本数が増えた。
商品名は、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)
調べ切れていないが、これはフォーマットの違いではなく、SDカードの仕様に対応しきれていないのが原因ではないかと考えている。SDカードに対してReadBlocks/WriteBlocks要求を出す時、読み書きする対象の領域を指定するのに2つの方式があり、バイトアドレス指定か、ブロックアドレス指定か?に分かれている。
本来は、OCR中のCCS[30]を見てどっちかを決めないといけないそうなのだが(ElmChan氏解説記事より)、どうもこの部分が正しく実装されていないのでは?と思える(今はまだ推測)。sdcard.pyではブロックアドレス方式のSDカードしか扱えないのではないか。。
以下は仮説含みでの自分なりの解釈
参考にしたElmChan氏のSDカード解説
http://elm-chan.org/docs/mmc/mmc.html
KingstonのSDアクセス手引き
https://docsplayer.net/41452623-Kingston-technology.html
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の値を確認できていないので推測、だけど指定アドレスが小さい値なのでブロックアドレスを指定していると思われる)。だから、正常に読める。
参考にした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なので以下を指定
試しに、BeagleBoneの起動SDならマウントできた(一体どのようなフォーマットだったのか)。よって、読めるかどうかは、マウントさせようとしているSDのファイルフォーマットによると思われる。
ラズパイ用の起動SDだとエラーになった。
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)を使う
Grove - Serial Camera Kit
http://wiki.seeedstudio.com/Grove-Serial_Camera_Kit/使っているコントローラ:OV528の仕様書
- [Datasheet] CJ OV528
- Grove Camera KITの紹介ページhttp://wiki.seeedstudio.com/Grove-Serial_Camera_Kit/
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_HOLDto 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. | Name | Type | Function |
| 1 | GND | P | Ground |
| 2 | 3V3 | P | Power supply |
| 3 | EN | I | Module-enable signal. Active high. |
| 4 | SENSOR_VP | I | GPIO36, ADC1_CH0, RTC_GPIO0 |
| 5 | SENSOR_VN | I | GPIO39, ADC1_CH3, RTC_GPIO3 |
| 6 | IO34 | I | GPIO34, ADC1_CH6, RTC_GPIO4 |
| 7 | IO35 | I | GPIO35, ADC1_CH7, RTC_GPIO5 |
| 8 | IO32 | I/O | GPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input),ADC1_CH4,TOUCH9, RTC_GPIO9 |
| 9 | IO33 | I/O | GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output),ADC1_CH5,TOUCH8,RTC_GPIO8 Espressif Systems 3 ESP32-WROOM-32 Datasheet V2.8 |
| 10 | IO25 | I/O | GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0 |
| 11 | IO26 | I/O | GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1 |
| 12 | IO27 | I/O | GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV |
| 13 | IO14 | I/O | GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK,SD_CLK, EMAC_TXD2 |
| 14 | IO12 | I/O | GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2,SD_DATA2, EMAC_TXD3 |
| 15 | GND | P | Ground |
| 16 | IO13 | I/O | GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3,SD_DATA3, EMAC_RX_ER |
| 17 | SHD/SD2* | I/O | GPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD |
| 18 | SWP/SD3* | I/O | GPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD |
| 19 | SCS/CMD* | I/O | GPIO11, SD_CMD, SPICS0, HS1_CMD, U1RTS |
| 20 | SCK/CLK* | I/O | GPIO6, SD_CLK, SPICLK, HS1_CLK, U1CTS |
| 21 | SDO/SD0* | I/O | GPIO7, SD_DATA0, SPIQ, HS1_DATA0, U2RTS |
| 22 | SDI/SD1* | I/O | GPIO8, SD_DATA1, SPID, HS1_DATA1, U2CTS |
| 23 | IO15 | I/O | GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD,SD_CMD, EMAC_RXD3 |
| 24 | IO2 | I/O | GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0,SD_DATA0 |
| 25 | IO0 | I/O | GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1, EMAC_TX_CLK |
| 26 | IO4 | I/O | GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1,SD_DATA1, EMAC_TX_ER |
| 27 | IO16 | I/O | GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT |
| 28 | IO17 | I/O | GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180 |
| 29 | IO5 | I/O | GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK |
| 30 | IO18 | I/O | GPIO18, VSPICLK, HS1_DATA7 |
| 31 | IO19 | I/O | GPIO19, VSPIQ, U0CTS, EMAC_TXD0 |
| 32 | NC | - | - |
| 33 | IO21 | I/O | GPIO21, VSPIHD, EMAC_TX_EN |
| 34 | RXD0 | I/O | GPIO3, U0RXD, CLK_OUT2 |
| 35 | TXD0 | I/O | GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2 |
| 36 | IO22 | I/O | GPIO22, VSPIWP, U0RTS, EMAC_TXD1 |
| 37 | IO23 | I/O | GPIO23, VSPID, HS1_STROBE |
| 38 | GND | P | Ground |
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の基板側の回路図がないので、基板内のレベル変換がどうなっているのか分からず。
Subscribe to:
Posts (Atom)
