micropythonでmqtt
MicroPython Advent Calender 5日目です。
4日目はESP32+micropythonでslackにメッセージを投稿しました。
今日はwifiにつながったそのままの勢いでmqttでpublish/subscribeしてみます。
micropython-lib/umqtt.simple at master · micropython/micropython-lib · GitHub
micropython-libにあるumqtt.simpleをローカルに保存します。
simple.pyだとわかりづらい気がしたのでmqtt.pyにリネームしてampyツールでESP32に転送しました。
> ampy -p COM4 put mqtt.py
ローカルに保存したフォルダにpublishとsubscribeの例があります。
両方がっちゃんこしたものを書いてESP32に転送しました。
> ampy -p COM4 put pubsub.py
ますはメッセージを送ってみます。
MQTTブローカーはWindows10にmosquittoを入れて使用しました。
An Open Source MQTT v3.1 Broker
ブローカーを立ち上げてメッセージを送信するメソッドを呼び出します。
ブローカーにメッセージが届きました。
wiresharkでみてもmqttのフロー通りでメッセージが送れています。
Client IDもCONNECT要求時にセット出来ていました。
次にmsgをsubscribeしてみます。
subscribeするメソッドを呼び出しておいて、コマンドプロンプトからメッセージを送信しました。
> mosquitto_pub.exe -h 192.168.0.7 -t micropython -m hello
ブローカーを通じてメッセージがやり取りされています。
wiresharkでも流れが追えました。
というわけでREPLからの単発実行ではありますがmqttをpuslish/subscribeしてみました。
micropythonでslackに投稿
MicroPython Advent Calender 4日目です。
5日目の15分前ですがぎりぎりセーフということで。
昨日@inachiさんの
BLE対応版MicroPython for ESP32をmacOSでビルドしてみる - Qiita
はでした。
ESP32のBLEの部分はArduinoでもmicropythonでも絶賛開発中でまだまだサンプルも少ない感じ気がしますがこれから充実してくるでしょう。
また今月のインターフェイスはmicropython特集があるのでぜひ興味がある方は購入されてはいかがでしょうか。
2日目の記事でNUCREO-F401でmicropythonを動かしてみましたが、今日はESP32と
micropythonでslackのAPIを使用してメッセージを投稿します。
このへんはwifiにつながりTCP/IPスタックを積んだESPシリーズの強みですね。
ESP8266やESP32のmicropythonでHTTP通信をする場合はsocketモジュールを使います。
以下のチュートリアルにはGETリクエストとwebサーバの例が載っています。
5. Network - TCP sockets — MicroPython 1.9.3 documentation
GETリクエストの例をPOSTにしてslackのAPIを使用します。
まずSlackのAPIを使うためにはtokenを取得する必要があります。
以下の手順でtokenを取得しましょう。
Slack APIを使用してメッセージを送信する - Qiita
取得したtokenは送信先のチャンネル、メッセージとともにPOSTするデータに貼り付けます。
以下のようなコードになりました。
gist69e875ce8b9aeb1145865e13d79421a1
コードを書いたらampyツールでファイルをESP32に転送します。
> ampy -p port put slack.py
ファイルを転送したらwifiに接続してメソッドを呼び出してみます。
ちゃんとメッセージを投げれました。
micropythonをはじめよう(STM32F401編)
MicroPython Advent Calender 2日目です。
昨日はオライリーで出版されたProgramming with MicroPythonの第1章を紹介しました。
今日は購入して長らく放置していたSTM32マイコンでmicropythonを動かしてみたいと思います。
ターゲットとなるのはSTM32F401のNUCLEO-F401REボードです。
秋月電子で手頃な価格で入手できます。
本家のpyboardはSTM32F405ですが、STM32F401は以下のように公式にサポートされているわけではないのですが、micropythonの実行が可能です。
wikiにも記載されています。
Board NUCLEO F401RE · micropython/micropython Wiki · GitHub
These boards are not officially supported but should be fully functional
ソースをコンパイルして書き込みが必要となりますが、pyboardはいい値段がするので気軽に試したいなら、こちらの方がよいかもしれません。
・ビルド&書き込み
それでは実際に試してみたいと思います。
以下の手順はUbuntu 16.04で行いました。他の環境では試すことが出来ていないのですみません。
・必要なパッケージのインストール
$ sudo apt-get install libffi-dev
$ sudo apt-et install gcc-arm-none-eabi
・書き込みツール(Stlink Tools)のインストール
$ sudo apt-get install cmake
$ sudo apt-get install libusb-1.0.0-dev
$ git clone https://github.com/texane/stlink.git
$ cd stlink
$ make release
$ make debug
$ cd build/Release
$ sudo make install
$ sudo ldconfig
・micropythonのビルドと書き込み
$ git clone https://github.com/micropython/micropython
$ cd micropython/ports/stm32/
$ make BOARD=NUCLEO_F401RE deploy-stlink
こんな感じで書き込めました。
$ make BOARD=NUCLEO_F401RE deploy-stlink
Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
Writing build-NUCLEO_F401RE/firmware0.bin to the board via ST-LINK
st-flash 1.4.0-13-g1969148
2017-12-02T10:49:40 INFO common.c: Loading device parameters....
2017-12-02T10:49:40 INFO common.c: Device connected is: F4 device (Dynamic Efficency), id 0x10016433
2017-12-02T10:49:40 INFO common.c: SRAM size: 0x18000 bytes (96 KiB), Flash: 0x80000 bytes (512 KiB) in pages of 16384 bytes
2017-12-02T10:49:40 INFO common.c: Attempting to write 14984 (0x3a88) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08000000 erased
2017-12-02T10:49:40 INFO common.c: Finished erasing 1 pages of 16384 (0x4000) bytes
2017-12-02T10:49:40 INFO common.c: Starting Flash write for F2/F4/L4
2017-12-02T10:49:40 INFO flash_loader.c: Successfully loaded flash loader in sram
enabling 32-bit flash writes
size: 14984
2017-12-02T10:49:40 INFO common.c: Starting verification of write complete
2017-12-02T10:49:41 INFO common.c: Flash written and verified! jolly good!
Writing build-NUCLEO_F401RE/firmware1.bin to the board via ST-LINK
st-flash 1.4.0-13-g1969148
2017-12-02T10:49:41 INFO common.c: Loading device parameters....
2017-12-02T10:49:41 INFO common.c: Device connected is: F4 device (Dynamic Efficency), id 0x10016433
2017-12-02T10:49:41 INFO common.c: SRAM size: 0x18000 bytes (96 KiB), Flash: 0x80000 bytes (512 KiB) in pages of 16384 bytes
2017-12-02T10:49:41 INFO common.c: Attempting to write 287256 (0x46218) bytes to stm32 address: 134348800 (0x8020000)
Flash page at addr: 0x08060000 erasedEraseFlash - Sector:0x7 Size:0x20000
2017-12-02T10:49:46 INFO common.c: Finished erasing 3 pages of 131072 (0x20000) bytes
2017-12-02T10:49:46 INFO common.c: Starting Flash write for F2/F4/L4
2017-12-02T10:49:46 INFO flash_loader.c: Successfully loaded flash loader in sram
enabling 32-bit flash writes
size: 32768
size: 32768
size: 32768
size: 32768
size: 32768
size: 32768
size: 32768
size: 32768
size: 25112
2017-12-02T10:49:52 INFO common.c: Starting verification of write complete
2017-12-02T10:49:56 INFO common.c: Flash written and verified! jolly good!
書き込みに成功したらシリアルコンソールを開きボードのリセットスイッチを押します。
$ sudo screen /dev/ttyACM0 115200
おなじみのREPL画面が開いてボード上のLEDでLチカができました。
というわけで秋月電子で売っているSTM32マイコンボードでmicropythonを実行してみました。
MicroPython Advent Calender 1日目 What is MicroPython?
MicroPython Advent Calender 1日目です。
今年のmicropythonを振り返る記事を書こうと考えていましたが、オライリーでmicropythonの本が出版されたのでその内容と1章のWhat is MicroPython?を紹介したいと思います。
本の構成は以下のようになっています。
序文
- What is MicroPython?
- Pyboard
- BBC micro:bit
- Adafruit Circuit Playground Express
- ESP8266/ESP32
- Thinking Embedded
- Visual Feedback
- Input and Sensing
- GPIO
- Networking
- Sound and Music
- Robots
- Idiomatic MicroPython
- Next Steps
1章ではなぜMicro+Pythonなのかという点とMicroPythonの誕生とこれまでの経緯が書かれています。
MicroPythonの作者はDemian Georgeさんです。
彼はケンブリッジ大学の物理学者である一方、RoboCup(ロボコン)の競技者でもあり自らCコンパイラをスクラッチ作成するなど優れた才能を持つ方のようです。
そんなDemianさんが2013年の余暇の時間にマイコン用Pythonを作成し始めたのがMicroPythonのスタートです。
Demianさんは開発のためKickstarterのキャンペーンを張り見事に大成功。
2014年には出資者にpyboardが配布されました。
Micro Python: Python for microcontrollers by Damien George — Kickstarter
micropythonのcommunityはすぐさま大きくなり、github上で世界中の人々からの貢献でバグ、ドキュメント、ツール、他ボードへの移植がなされました。
2015年、European Space Agency(欧州宇宙機関)がmicropythonの開発を援助することが発表されました。
人工衛星のペイロードを計算する用途で研究開発が行われたようです。
同じころイギリスのBBCは全国の11歳の児童に教育向けデバイスの配布を発表しました。現在では日本でも発売されているmicro:bitです。
このmicro:bitへのmicropython移植を手伝ったのがDemianさんでした。
ちょうどmicro:bitの基板設計者がケンブリッジのDemianさんのオフィスの隣人だったこともあり、プロトタイプのボードで移植作業が進められたようです。
micropythonの成功はその派生形を生みました。
AdafruitはmicripythonをforkさせてSAMD21をターゲットにしたCircuitPythonを作りました。
Make: Japan | AdafruitがCircuitPythonへ移行
※Adafruitのmicropythonのページはとても充実していて見ていて飽きませんのでぜひご覧ください。
2016年、micropythonの2回目のKickStarterが募集されました。
MicroPython on the ESP8266: beautifully easy IoT by Damien George — Kickstarter
2回目はESP8266への移植です。それまでのmicropythonがターゲットとしていたSTM32などのマイコンは直接インターネットに接続することはできないタイプです。
wifiチップとTCP/IPのプロトコルを搭載したESP8266への移植によりmicropythonのIoTへの道が開かれることとなりました。
2017年には更にESP32への移植が進められています。
夏に開催されたMaker Fair Tokyoではmicro:bitの日本発売が発表されました。
micro:bitプロジェクトの創始者も来日してスピーチを行ってました。
micropythonは年々サポート対象のボードが増え開発も活発に行われています。
欧州宇宙機関が開発を支援するなど、ホビー用途のみならず産業用途での使用も今後増えていくのではないでしょうか。
以上、大いに誤訳もあったと思いますが1章の内容とこれまでmicropythonについて記載しました。
2章以降の内容につきましてもMicroPython Advent Calenderの中でご紹介していきたいと思います。
AVTOKYOの一番長い日
AVTOKYO 2017に参加して半田付けしてきました。
参加者に配られた基板はこうして出来上がったという視点でレポを記します。
2017年11月5日(日) 足立区保塚地域学習センター
AVTOKYOの1週間前であるこの日、足立区の公民館に13時に集まり今回の基板製作者(@nanbuwks)より当日の流れと基板がまた到着していない知り驚く。
上が当初の構想段階であった。
残念だが力及ばずこうならなかった。
プログラムの流れ検討
今回の基板に使用したのはstm32f103c8t6でありAliexpressで非常に安価($2)で手に入る。
環境を構築するとarduinoIDEで使用可能になる。
adafruitのOLEDのライブラリを修正後プログラムを書いていた。
4時過ぎにコーヒー休憩をしてお子さんが散らかした部屋に掃除機を掛けて時間となった。
終了後は@nanbuwksファミリーを車に乗せて秋月電子八潮店に向かった。
初めて入った八潮店は通路が広く快適でここでは基板に付ける電池ボックスが調達された。
下のお子さんがとことこやってきて「う◯こ」と言われたが時すでに遅かった。
@nanbuwksファミリーを送り届けた後帰宅した。
11月9日(木) 秋葉原 ナノラボ
基板が到着し半田付けを手伝うため夜19時、秋葉原ナノラボに6人が集まった。
夜10時まで半田付けがもくもくと行なわれた。
この時点で完成していたのは150枚ほどだったろうか。
ナノラボで紙袋を頂き70枚分の部品を自宅に持って帰った。
11月10日(金) 自宅
朝家を出る前に親父に半田付け依頼を出す。
10時に帰宅するとマイコンの半田付けはほぼ終了していた。グッジョブ親父。
セブンのホットドッグを齧りながら半田付け作業が始まった。
11月12日(土)自宅、CLUB SIX TOKYO - 六本木
AVTOKYO当日である。
親父の活躍により12時過ぎにはマイコンとOLED、赤外線LEDの半田付けが完了していた。残りはスイッチであったが表面実装のため時間がかかり70枚のスイッチが付いたのは朝4時であった。
スイッチをつけた基板にブートローダを焼いた後活動限界を迎え仮眠を取った。
8時半に起床、荷物をまとめ会場の六本木に向かう。
荷物の搬入を手伝い作業スペースで半田付けとプログラム書き込みに分かれて作業が始まった。
この時点で会場オープンまで残り1時間半である。
危機を察知したスタッフ、一般参加者も加わって半田付け作業が進められた。
手伝って頂いた方云く、硫黄島のような絶望的戦いとのことである。
私は戦時中の工場で働く気分を感じることができた。
そうこうするうちに会場オープンまで後15分となったが、この時点で完成品はどれだけ出来たのか、プログラムは動いているのか、あと何枚残っているのかなど状況を把握している者はおらず混乱の坩堝である。
本来であれば入場時に基板が配られる予定だったが主催者判断により後で配布されることとなった。
誠に申し訳ない…
そうこうするうちに12時に会場オープンとなり続々と参加者が入ってきた。
半田付けスペースは会場入り口すぐのところであったためおのずと人目についたがこちらはそんなことは気にしてられない。
早く半田付けをして基板を完成させないと参加者に配布できないのである。
取り憑かれたように半田付けを続行し16時頃には何とか配布できる分を捌いて一息つけただろうか。
ラムコークを一杯飲んで一息付けた後、不良品を修正するため作業スペースに戻った。
半田不良や部品付け忘れに取り組み18時過ぎには主催者から予定数が足りたとのことで組み立て工場は稼働を終えることになった。
この時点で朝から何も食べていなかった。
ぐったりして座っていると19時を回った。
20時で終わるために片付け作業を始めないといけない。
とりあえず持ってきたものを箱に詰めていき工場閉鎖はつつがなく完了した。
クローズを見届けた後、荷物とともに会場を出た。
打ち上げの招待券を頂いたのでありがたく中華をがっついた。
北京ダッーーーーーク!!
23時前に打ち上げは終了、日比谷線への荷物搬入を手伝い帰宅した。
こうして長い一日は終わったのであった。
初めて参加したAVTOKYOであったが六本木のクラブで半田付けを行うという貴重な体験が出来たのでとてもよかったと思う。
参加者がクリックして遊んでくれてるのを見て半田付けした甲斐があったなと実感した。
個人的には表面実装のコツが掴めたので半田付けがちょっと上手くなったかも。
※AVTOKYOは半田付けを行うイベントではありません。
アルコール片手に語り合うセキュリティ・カンファレンスです。
ESP32を始めてみる AWS IoTにデータを飛ばす編
ということをやってので備忘録として思い出して書いておきます。
抜けている個所や説明が間違っていたらすみません。
適時公式ドキュメントとかで保管して頂きたく。
下の写真でスイッチを押したらDHT11センサーから取得した温湿度をESP32でAWS IoTに飛ばしてS3にデータを保存します。
AWSの設定
AWS IoTのコンソールを開きモノを作成します。
次に接続時に使う証明書を作成してダウンロードします。
ポリシーを作成して証明書をひもづけます。
作成したモノと証明書をひもづけます。
今回作成したモノのAPIエンドポイントのURLをコピっておきます。
最後にデータをS3に保存するルールを作成します。
ESP32というルールを作成してS3にメッセージを格納するというアクションを設定します。
ルールクエリの'ESP32/DHT11'がトピックの部分になります。
これでAWS側の準備は完了だったはずです。
Arduinoでスケッチ作成
必要な以下のライブラリをライブラリマネージャから入れます。
・ArduinoJson
・DHT sensor library
・Adafruit Unified Sensor
スケッチ例にあるWiFiClientSecureをもとにスケッチを作成していきます。
スケッチ例の11行目と12行目にWifiのSSIDとパスワードをセットし、14行目にはコピっておいたAPIのエンドポイントを貼り付けます。
20行目のtest_root_caにダウンロードしたルート証明書の内容を貼り付けて置き換えます。
50行目のtest_client_keyにxxxxxxxxxx-certificate.pemの内容を貼り付け、
51行目のtest_client_certにxxxxxxxxxx--private.pem.keyの内容を貼り付けます。
最後に76行目と77行目のコメントアウトを除きます。
スイッチが押されてOFFを検知したらDHT11から読みだした温度と湿度をJSONにセットしてHTTPSに飛ばします。
最後にスケッチを貼り付けておくのでご笑覧ください。
スケッチができたらESP32に書き込んで動作確認を行います。
まずはシャドウステータスの更新を行ってみます。
シャドウステータスの場合はURLが "/thing/作成したモノの名前/shadow"になります。
それではスイッチを押してみると...
更新されました。
シャドウステータスが送信したJSONデータになっています。
次にURLをトピックのものに書き換えてデータがS3に保存されることを確認します。
トピックのURLは "/topics/ESP32/DHT11"になります。"/topics/"の後ろがルールクエリとなる仕組みのようです。
それではスイッチを押すと...
ちゃんとデータが保存されていました。
というわけでこんな感じでAWS IoTとESP32で遊ぶことができました。
今回は簡単にS3にデータ保存するだけでしたが、AWS lambdaでサーバーレス処理とかにもチャレンジしてみたいですね。
あと、HTTPSをMQTTにするとかも。
最後にスケッチを貼り付けておきます。
micropythonをはじめよう(ESP32編)
ESP32が国内発売されるようになり半年以上が立ちにわかにmicropythonが取り上げられるようになってきました。
以下の記事や今月号のトラ技でも記事が書かれています。
ESP32のファームウェアは夏ごろから公式サイトで公開され自分でビルドする必要もなくなり、今では書き込みツールでファームウェアを書くだけで手軽にmicropythonをスタートできるようになりました。
改めてファームウェアの書き込みと公式ドキュメントのチュートリアルをちょこっとやってみたいと思います。
※micropythonのファームウェアをESP32に書き込むことで技適の認証に抵触する可能性があります。あくまで自己責任でお願い致します。
・ファームウェアの書き込み
何はともあれファームウェアを公式から落とします。
MicroPython - Python for microcontrollers
次に書き込みツールをインストールします。
GitHub - espressif/esptool: ESP8266 and ESP32 serial bootloader utility
# pip install esptool
ツールを適時インストールしたら、ファームウェアを書き込みます。
esptoolの場合はこんな感じです。
# esptool.py --port COM4 --baud 460800 write_flash --flash_mode dio --flash_size=detect 0x1000 esp32-20171006-v1.9.2-276-ga9517c04.bin
CLIもGUIも0x1000にファームウェアを書き込みます。
ファームウェアに書き込みが正常に終了したら、teratermやscreenコマンドでシリアルポートにアクセスします。
micropythonのREPLが開きコードを入力→実行ができます。
micropythonには公式ドキュメントがあります。
ESP32のドキュメントはないのですがほぼ同じのESP8266のものに沿ってチュートリアルを進めていきます。
MicroPython tutorial for ESP8266 — MicroPython 1.9.2 documentation
・Lチカ
>>> from machine import Pin
>>> p = Pin(4, Pin.OUT)
・ADC
>>> pin32 = Pin(32, Pin.IN)
>>> adc = machine.ADC(pin32)
>>> adc.read()
・ファイル操作
>>> f = open('data.txt', 'w')
>>> f.write('micropython')
11
>>> f.close()
>>>
>>> import os
>>> os.listdir()
['boot.py', 'data.txt']
>>>
>>> f = open('data.txt', 'r')
>>> f.read()
'micropython'
>>> f.close()
>>>
>>> os.remove('data.txt')
>>> os.listdir()
['boot.py']
>>>
・neopixel
>>> import machine
>>> import neopixel
>>> pin = machine.Pin(4, machine.Pin.OUT)
>>> np = neopixel.NeoPixel(pin, 20)
>>> np[0] = (255, 0, 0)
>>> np[1] = (0, 128, 0)
>>> np[2] = (0, 0, 64)
>>> np.write()
・wifi接続
>>> import network
>>> sta_if = network.WLAN(network.STA_IF)
>>> sta_if.active(True)
>>> sta_if.scan()
>>> sta_if.connect('ssid', 'password')
>>> sta_if.ifconfig()
・ソケット
>>> import socket
>>> addr_info = socket.getaddrinfo("towel.blinkenlights.nl", 23)
>>> addr = addr_info[0][-1]
>>> s = socket.socket()
>>> s.connect(addr)
>>> while True:
... data = s.recv(500)
... print(str(data, 'utf8'), end='')
※スターウォーズのAAが流れ続けるのでCtl+Cで止めましょう。
さてここまではREPLでコードを実行してきました。
自作したプログラム(pyファイル)を実行する場合はツールでファイルを転送します。
以下のコマンドでツールを入れます。
# pip install adafruit-ampy
adafruitが出しているこのampyツールにはget、ls、put、rmなどのコマンドがありポートを指定してファイルを転送したり削除したりします。
ダウンロードしたファームウェアはboot.pyファイルしかない状態です。
boot.pyファイルは起動時に1回のみ実行されるファイルです。
>>> import os
>>> os.listdir()
['boot.py']
>>>
永続的にプログラムを実行させる場合はmain.pyを作成してampyツールで送り込みます。
boot.pyとmain.pyはArduinoでいうところのsetupとloop関数というわけですね。
# ampy -p COM4 ls
# ampy -p COM4 put main.py
以上、簡単な紹介でした。
ぜひ皆さんもmicropythonで遊んでみましょう!