chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

ESP32 + BME280 + MicroPython

やりたいこと:ESP32とBME280をSPIで接続してMicroPythonで制御する

リンク先が本家Bosh社ではないが、BME280の仕様書
http://www.embeddedadventures.com/datasheets/BME280.pdf

SPIの仕様:

 The SPI interface supports both SPI mode ‘00’ (CPOL = CPHA = ‘0’) and 
mode ‘11’ (CPOL = CPHA = ‘1’) in 4-wire and 3-wire configuration. 

 If CSB is pulled down, the SPI interface is activated. 

The SPI interface uses the following pins:
* CSB: chip select, active low
* SCK: serial clock
* SDI: serial data input; data input/output in 3-wire mode
* SDO: serial data output; hi-Z in 3-wire mode

SPIで接続できたけど、SPIだとESP32のPINの消費が激しいので、2本で接続できるI2Cに変更した。

AWS IoT ボタンを買った

かつてはダッシュボタン?とよばれていたAWS IoT ボタンを買った(正式名は、AWS IoT Enterprise Button)。なぜ買ったか?つるっとした IoTボタンを押してみたかったから。
ESP32でもMQTT喋れるのでAWS IoTボタンでなくてもいいのだけど、、ESP32はバラック(ブレッドボードとジャンパー)で組んでるのでケーブルとかむき出しで、押ボタンSWも角張っていて手が痛い。綺麗にパッケージされたつるっとした工業製品に憧れ、手触りよさそうな高品質プロダクトの押しボタンスイッチを押してみたかった。
f:id:chakoku:20191214125609p:plain
使ってみた結論から言うと、、デザインはシンプルでいいけど、手触りがいいかというと、ボタンの裏に粘着シートがあったり製品は角ばっていたりで手触り感はよくないです。全然つるっとしていない。
f:id:chakoku:20191214125625p:plain
手触りいまいちなのですでに飽きはじめたのだが、、AWS IoTのサービス内でこのボタンが見えないことが気になりだした。AWS IoTにthingsとして登録もできないようだ(自分の理解の範囲では)。AWSにはAWS IoTと呼ばれる汎用IoTデバイス向けのサービス体系があるけど、どうもAWS IoTボタンは、AWS IoTには入れてもらえず、AWS IoT 1-Clickというサービス内で使う設計になっているようだ。
AWS IoTの接続ログにはMQTT通信として出てくるので実装上はAWS IoTを使っているらしい。AWS IoT Enterprise Buttonは、デバイスに登録すべき証明書の設定とかややこしい手順をぜんぶすっ飛ばして簡単に使えるように設計され、AWS IoT 1-Clickというサービス体系に隔離されているような印象。古いAWSブログには、AWS IoTにAWS IoTボタンを登録する手順も紹介されているが、その手順が今のEnterprise Buttonで有効なのかどうかは不明(やはり、それは古い世代のButtonのようだ。現在販売されているEnterprise Buttonでは任意の証明書を入れられないので多分不可能)。AWS IoTボタンで仕事するわけではないので、これ以上は調べる気もなし。。

AWS IoT 1-Clickというサービス体系では、AWS IoTボタンのクリックにより、メール配信か、SMS(Short Message Service)による通知か、Lambda関数の呼び出しか?のどれかと連携するように選択できる。Lambdaを呼び出せば、関数経由でAWSの各種サービスと連携できる、、という仕掛けのようである。AWS IoT 1-Clickの管理画面には、押された回数等がグラフ化される仕組みもあって、AWS IoT に来ずともAWS IoT 1-Clickの世界で閉じて使えるよということなんでしょう。個人的には、AWS IoT 1-Clickでデバイス登録すればAWS IoTのThingsに登録したボタンが出現して欲しい気がするけど。。まぁそういう設計ではないようで。。

マニュアルには以下と書かれている
AWS IoT 1-Click は、特定のアクションを実行する AWS Lambda 関数をシンプルなデバイスで簡単にトリガーできるようにするサービスです」
だから、、AWS IoTボタンを AWS IoT 1-Clickに登録するということは、Lambda関数への接続を簡単にすることであって、AWS IoTで使えるようにするというわけではないと。。ただ、、AWS IoTで接続ログを見るとAWS IoTボタンの接続が記録されており、 AWS IoT Coreを通過しているということは見せている。。

ちょっと調べた限りでは、AWS IoTボタンは大人しく、AWS IoT 1-Click配下で使いなさないということのようだ。。


ご参考URL
公式ドキュメント
https://docs.aws.amazon.com/iot-1-click/index.html

以下の記事にはButtonをAWS IoTの管理画面で登録する手順が紹介されている。2年前の記事だけど
Introducing the AWS IoT Button Enterprise Program | AWS News Blog

FAQより
AWS IoT Button Enterprise Program は提供を終了しました」
引用元:よくある質問 - AWS IoT 1-Click | AWS

追記
現在販売されている、AWS IoT Buttonと、以下のサイトで説明されているAWS IoTボタン(プログラミング可能なDash Button)は別アーキテクチャではないかという結論になった(自分の中で)。
https://aws.amazon.com/jp/iotbutton/

というのも、、上記サイトでは、AWS IoT Core証明書を使えと書かれているけど、現在販売中のAWS IoT Button(製品のプリントはIoT Wnterprise)では証明書の登録も不要になっているから。AWS IoTから見えるデバイスとしてAWS Buttonを使いたければ、古い世代のダッシュボタンでないとだめなのではと思われる。

まとめると、、AWS IoT Enterprise Buttonは、AWS IoT 1-Clickサービスに接続するだけのデバイスである。汎用的なIoTデバイスを接続できるAWS IoTサービスには接続できない(自分の理解の範囲)。AWS IoT 1-ClickサービスではLambdaが使えるようになっているので、AWSの各種サービスと接続したければLambdaの関数で実装しなさいということだろう。

手触りいまいちで、自由度なくガッチリ特定のサービスに組み込まれたボタンなので、届いて半日で飽きてきたのだが、、2500円も出して買ったIoTボタンなので、、何かに使わないともったいない。普段はKindle無料マンガをひたすら読んでいて*1、人生の時間の大半をマンガで費やしていると思っており、一日どれぐらいの時間をマンガに消費しているのか、IoTボタンでマンガタイムの開始と終了を測ってみるとか。。]

■追記
作ってみたいもの・・・IoT Buttonを一度押すー>AlexaかGoogleHomeが「まんが読み始めました」と発話する。もう一度押すー>「マンガ読み終わりました。お疲れ様(ここは皮肉)」と発話する。一日の浪費時間が集計されて、週の終わりにメール等で報告される。

GoogleHomeに喋らせる方法(google-home-notifier)
Google Home開発入門 / google-home-notifier解説 - Qiita

Alexaに喋らせるには、reminder APIを叩いてイベントを登録して、数秒後にリマンドしてもらう実装が楽そうである。

よく考えると、普段全く使っていないAIスピーカを常設するとは考えられないので、、IoT Buttonを押したら「マンガタイム開始/終了」といったメッセージをLINEにPUSHで送ることにした。

あるいは、、ESP32+音声合成LSI音声合成LSI ATP3012F6-PU)で喋らせるか。。

*1:今は別件で謹慎中

Zerynth 版 Pythonのループの速度

ZerynthのPythonVM中間言語で動いていると推測して、ループがどれぐらいの速度か簡単に計測した。
オシロも使って測った方がいいけど、暫定で内蔵タイマーで測ると以下であった。

speed check
3.084 sec    (100000 loop)
0.03084 msec (in 1 loop)
30.84   usec (in 1 loop)

1ループが30.84usec
ESP32のMicroPythonの場合も1ループ数十usecなので同じぐらいだ。。うーむ。。

ご参考にスピードチェックプログラム
(ループ内がNOPだと実体にそぐわないのでダミーコードとしてLチカと変数インクリメントを入れてます)

import rtc
import streams
import timers

COUNT=100000


streams.serial()


def speed_check():

    print("speed check")
    
    pinMode(D10,OUTPUT)
    
    t = timers.timer()
    t.start()
    print(t.get())
    y=0
    for x in range(COUNT):
       y = y + 1
       digitalWrite(D10, LOW)
       #print("LOW")
       #sleep(1000)
       digitalWrite(D10, HIGH)
       #print("HIGH")
       #sleep(1000)
    
    end_time = t.get()
    print("fin")
    print(end_time)
    print("msec")
    print(end_time/COUNT)
    print("msec")
    print(end_time/COUNT*1000)
    print("usec")



while True:
    speed_check()

変数のインクリメントだけなら、1ループ8.76usec


下記のポーリング想定ループの場合、1ループ:23.95usec
(ピンはプルアップしています)

import rtc
import streams
import timers

COUNT=100000


streams.serial()


def speed_check():

    print("speed check")
    
    pinMode(D10,INPUT)
    
    t = timers.timer()
    t.start()
    print(t.get())
    y=0
    for x in range(COUNT):
       value = digitalRead(D10)
       if value == 0:
          print("LOW")
       else:
          pass
          #print("HIGH")
       #print("LOW")
       #sleep(1000)
       #print("HIGH")
       #sleep(1000)
    
    end_time = t.get()
    print("fin")
    print(end_time)
    print("msec")
    print(end_time/COUNT)
    print("msec")
    print(end_time/COUNT*1000)
    print("usec")



while True:
    speed_check()
 


速度のオーダーがあまり変わらないのだけど、、初期設定ではシステムクロックも落とされているかもしれないのでもう少し調査が必要

Zerynth 版 Pythonを使ってみるー>REPLは使えないのか??

Interface誌でESP32の特集が組まれていて、MicroPython以外に、Zerynth社がPython3のポーティング版を提供していることを知った。Zerynth社のPythonVM上で動くようになっているらしい(FreeRTOSの上でVMが動き、その上でPythonが動く)。Pythonを再ビルドしなくても、自作のCモジュールとリンクできるらしい。だから。。速度が必要な部分はCで組んで(Pythonを再ビルドせずに)システムに組み込むことができる。すばらしい。自分はESP32+MicroPythonでアプリを組んだことがあるけど、MicroPythonからSPIを叩くところがオーバーヘッド大きくて遅延要因となっていた。SPIの制御をC言語で実装することで高速化できるのでは。。と期待。

ということで、、Zerynth 版 PythonをESP32との組み合わせで使ってみるにする。

まずはrs-onlineタイアップ版(正確には、DesignSpark版Zerynth)を以下から落とす((Zerynthには普通版もあり、タイアップ版との違いが分からず。。))
Zerynth - IoT及びIndustry 4.0向けミドルウェア


Windowsの場合、 ZerynthInstallerDesignSpark.exe が落ちてくるのでこれを実行 
最新版のr2.3.2を選択、ExpertModeでXtensa LX6 - ESP32を選択、必要なパッケージを落としてくるのだが、これがえらく時間がかかる(自宅のWiFi環境が貧弱だから?)。

デスクトップ機でDLしようとすると、NOD32でDLサイトが拒否された。。なぜか。。しょうがないので、offlineインストール版をやってみることに。WiFiでつながっているノートPCは延々とパッケージをDLしている。。これは1H以上かかりそうな雰囲気。。(DL待っている間にコメント書くと、、Zerynth版VMは有償ライセンスのようで、10CPU以上はお金払う必要があるようです。1CPU6$ぐらいだったような。。 Zerynth版Pythonではライブラリがめちゃくちゃ整備されていて、これが本当にフリーなのか!?と思ったら、、VMは有償なのであった。ちょっと納得)

offlineインストールで落ちたのたtarの塊一式でどうやってインストールしたらよいのか分からず。しょうがないので、本家のダウンロードサイトからZerynth StudioをDLすることにした。
Zerynth Studio - A powerful IDE for embedded programming

こっちはタイアップ版ではない、普通版(機能制限があるのかもしれない。詳細不明)。デスクトップ機はブロードバンドレシーバと有線接続しているのだが、それでもインストール終了まで1Hとか出ている。。遅い。。 と思ったら加速したのか10分ぐらいで終わった。

ESP32をPCにさして、SeiariPortを指定してESP32をツールに認識させて、からバーチャライズを行う。バーチャライズの段階でESP32にVMを書き込んでいると思われる。

Loading settings...
Switched to auto mode
Ready!
Checking for updates...
Ok
Switched to advanced mode
[info] Saving device...
[info] Updating device...
[info] Burning bootloader...
[info] Burning bin
[info] esptool.py v2.0
[info] Connecting....
[info] Chip is ESP32D0WDQ5 (revision (unknown 0xe))
[info] Uploading stub...
[info] Running stub...
[info] Stub running...
[info] Configuring flash size...
[info] Auto-detected Flash size: 4MB
[info] Compressed 19584 bytes to 12813...
[info] 
[info] Writing at 0x00001000... (100 %)
[info] Wrote 19584 bytes (12813 compressed) at 0x00001000 in 1.1 seconds (effective 138.5 kbit/s)...
[info] Hash of data verified.
[info] Compressed 305280 bytes to 181772...
[info] 
[info] Writing at 0x00010000... (8 %)
[info] Writing at 0x00014000... (16 %)
[info] Writing at 0x00018000... (25 %)
[info] Writing at 0x0001c000... (33 %)
[info] Writing at 0x00020000... (41 %)
[info] Writing at 0x00024000... (50 %)
[info] Writing at 0x00028000... (58 %)
[info] Writing at 0x0002c000... (66 %)
[info] Writing at 0x00030000... (75 %)
[info] Writing at 0x00034000... (83 %)
[info] Writing at 0x00038000... (91 %)
[info] Writing at 0x0003c000... (100 %)
[info] Wrote 305280 bytes (181772 compressed) at 0x00010000 in 16.0 seconds (effective 152.3 kbit/s)...
[info] Hash of data verified.
[info] Compressed 3072 bytes to 156...
[info] 
[info] Writing at 0x00008000... (100 %)
[info] Wrote 3072 bytes (156 compressed) at 0x00008000 in 0.0 seconds (effective 1069.0 kbit/s)...
[info] Hash of data verified.
[info] Compressed 1024 bytes to 32...
[info] 
[info] Writing at 0x00390000... (100 %)
[info] Wrote 1024 bytes (32 compressed) at 0x00390000 in 0.0 seconds (effective 744.9 kbit/s)...
[info] Hash of data verified.
[info] 
[info] Leaving...
[info] Hard resetting...
[info] Chip id retrieved: 03ea4accd481
[info] Device  registered with uid: 8_IgupB2TMuPUhls9OZwrw
Registration successful! Now you can virtualize your esp32_devkitc
[info] Updating device...

サンプルソースがDL可能で、Hello Zenrynthを動かしてみた。シリアル接続を明記しないとprint文を実行してもコンソールには出力されないようである。
f:id:chakoku:20191207221903p:plain

少し動かしてみて気づいたことなんだが、、ZerynthのPythonとはコンパイルによりVM用の中間言語を生成してフラッシュメモリに書き込んでいるのではなかろうか。というのも、、Pythonの特徴の一つであるREPLがどうも動かないような印象で。。PythonやMicroPythonではREPLが使えるから、あれこれ試行錯誤できて理解が進んで開発がはかどるのだが、、これはまるで文法がPythonであるだけの中間言語コンパイラのように思えるのだが。。
REPLが使えないとなると。。かなり敷居が高いような(ライセンスも有償なので、たしかにZenryth Pythonとはプロ用の開発環境という印象でありますね。計測してないけど、実はループもかなり早いのではなかろうか)。。仕様がよくわからない関数をキーボードから打ち込んで試してみたり、返ってきた戻り値の内容を掘っていくようなこともできない。強力なデバッガがあれば、変数の構造を展開しながら確認もできるが、デバッグしたかったらJTAGを使えという風で、JTAG使うにはJTAG用のインタフェースも必要で。。

Cygwin環境のpython3にpipをインストールするメモ

Cygwin環境のpython3にpipをインストールするメモ

$ python3 -m ensurepip
Looking in links: /tmp/tmp257u8oah
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-19.2.3 setuptools-41.2.0

$ pip
-bash: pip: コマンドが見つかりません

$ pip3

Usage:
  pip3 <command> [options]

cygwinのパッケージ管理ツール からでもpipが入るかもしれない

参照元サイト

Installing new versions of Python on Cygwin does not install Pip? - Stack Overflow

基板CADツールメモ

ESP32でシステムを試作していてブレッドボードで場所を取るし持ち出せないので、基板CADで基板を起こして、外に持ち出したい。KICADというのが良いらしく、これを勉強してガーバーデータ?を作って、基板屋さんに発注してみたい。パターンをどう引き回すか?は奥深いノウハウらしいけど、高周波ではないので素人でもそこそこ動くだろう。

KiCadで雑に基板を作る チュートリアル

久しぶりにカレーを作る

香りが強すぎるから家でカレーを作るのは許されないのだが、今日はヨメサンは実家に戻っているので久しぶりにカレーを作る。自分と子供の二人分の分量。

下準備
鶏のモモ肉を使用。皮は取ってから、ヨーグルトとターメリックでマリネにする。マリネにすると鳥が柔らかくなるらしいです。
f:id:chakoku:20190901113115j:plain:w300
使うまで冷蔵庫に入れておく。このまま焼いたらカレー風味の焼き鳥になる(窯がないのでタンドールチキンとは呼べない)
f:id:chakoku:20190901113243j:plain:w300
今回使ったスパイス類。左がホールスパイス(スタータースパイス)で、右がパウダースパイス。ニンニクは一かけだけど、二かけつかっても良かった。ショウガは多いかと思ったけど、これぐらいでも問題なし。
パウダースパイスは、カルダモンとチリペッパー(ターメリックは鳥マリネに投入)。チリペッパーは良く効いて、これぐらいでも結構辛い。ホールペッパーを忘れていて、あとから追加した。
f:id:chakoku:20190901114428j:plain:w300
まずはホールスパイスを油で炒める。玉ねぎを炒める時にも火が入っていくので、ここでは軽めに炒めています(クミンシードがはじけるぐらいと言われますが、そこまでは炒めていない。クミンはすぐに黒くなるので)。
f:id:chakoku:20190901114937j:plain:w300
スパイスの香りが立ったら、みじん切りにしたニンニクとショウガを炒める。スパイス類の香りがまとまったら、玉ねぎ投入して炒める。玉ねぎの炒めは、触らずに置いとくということで、置いといたのだが、放置しすぎてすこし焦げた。次回からはもうちょっと手間をかけてあげようと反省。
f:id:chakoku:20190901120209j:plain:w300
熟したトマトを一つ使用。ざく切りにする。
f:id:chakoku:20190901120219j:plain:w300
トマト投入、潰しながら炒め続ける。
f:id:chakoku:20190901120244j:plain:w300
ペースト状になるまで水分を飛ばしてカレーの素が完成。
f:id:chakoku:20190901120645j:plain:w300
カレーの素に、マリネした鳥肉を投入。マリネしたチキンにターメリックが入っているので黄色い。
f:id:chakoku:20190901120816j:plain:w300
水分が多いので炒めても表面がちょっと白くなる程度。これぐらいで炒めるのは終わり。チキンは別に炒めてから投入という手順もあるそうですが。。そうするとターメリックのスパイスが焦げるのでは??とも思う。
f:id:chakoku:20190901121030j:plain:w300
300ccの水を投入、レシピ本によると10分煮るらしい。
f:id:chakoku:20190901121115j:plain:w300
煮込みを開始してからパウダースパイス投入(チリペッパーは非常によく効く。。)
f:id:chakoku:20190901121303j:plain:w300
塩を入れるのはいつも怖いのだが、、まず小さじ1/3弱を投入。味見してスパイスがぼやけていたので、塩を追加。結果として、塩の総量:小さじ1/3は入ったと思う。
f:id:chakoku:20190901121445j:plain:w300
お腹がすいたので6-7分で煮込みを終える。反省として、水300ccも入れると水浸しになるので、水は200cc強でいいのではないか。
f:id:chakoku:20190901122127j:plain:w300
ご飯にかけて食べる
f:id:chakoku:20190901122459j:plain:w300

食べた感想

  • お店で食べるカレーと比べて味がさらっとしている。お店ほど複雑な味はしない。
  • スパイスの風味はそこそこ。旨みはあまりない。
  • 玉ねぎの炒めがイマイチだったけど、ちょっと甘さもある
  • 素材の味が分かる程度にシンプルな味(何層かになっている)。胃にもたれない感じ。
  • 苦味はあまりない。結構辛い。

反省点

  • 玉ねぎを炒める際、ちょっと焦がしてしまった。苦さはあまりないけど、玉ねぎ本来の甘さがあまり出ていない。やっぱり時々かき混ぜて手間をかけながら玉ねぎを炒めるべき
  • 子供からあまり辛くないようにと言われたので、辛さを抑えたつもりだったけど、これでも結構辛い。レッドペッパーはよく効く
  • クミンシードはもう少し増やしてもよい。あまりクミンの味がしない

気づき

  • 途中でホールペッパーを足した。ペッパーを忘れないように。
  • 当初予定の塩だと味が薄くて(師匠の言うところの)スパイスがぼやける。普段の料理は薄味にすべきだが、カレーの時だけはしっかり塩味にして、スパイスを際立たせるべし。

子供(子供といっても大学生なのだが)からのコメント

  • 水分がおおくてシャバシャバしているのが気になる(投入した水が多い、または、煮込み時間短い)
  • 味はシンプル、重くない(胃にどっしりこない)
  • 食べた時にフルーティーさを感じる。後味は店で食べるほどの味の階層がない(シンプルな階層の味ということか。素材もスパイスも限られているから。。)

妻のコメント(夕方に戻ってきた)

  • おいしいけど、めちゃくちゃおいしいというわけではない
  • ダシが効いてないのでご飯と合わない(*)
  • 油分が少ないのか?

(*)このカレーの味のベースは、トマトの酸味、玉ねぎの甘み、スパイスの風味と塩味なので、ダシは入っていない。あえて言うと、旨みは鶏肉から出るぐらい。さすがヨメ恐るべし。サバ缶使ってサバカレーにしたら魚の旨みが入るかも。。