2017年09月29日

Micropython + ESP32のためのIDE「uPyCraft」を使ってみた

upycraft01.png

ESP32でMicropythonが動いていますが、REPLで毎度コードをペーストするのも大変です。
ファイルをESP32にダウンロードするツールがあるのではないかと探してみたら、uPyCraftというツールを見つけました。

Introduction ・ uPyCraft_en

Windowsでも動作しますし、エディタとコンソールが一体化していてなかなか便利そうです。

使い方も難しくはなく、設定としてはMicropythonが動作しているESP32のシリアルポートをメニューの「Tools」→「Serial」から選択すれば完了です。

このツールはもともとFireBeetle ESP32という開発ボード用に作られたもののようです。
中国の会社の製品のようですが、DevKitCとそれほど違いがあるわけではなく、問題なく使用できました。

Arduinoのように、「File」→「Examples」にいろいろなサンプルがもとから付属しています。
この中から、試しに「Basics」→「mario.py」を動作させてみました。

コードを見ていくと、IO25に音声を出力させているのがわかります。
圧電ブザーをIO25とGNDに接続して試してみました。
upycraft02.png
upycraft1.png

まず、ウインドウのConnectボタン(STOPボタンの右)を押します。
これでESP32のシリアルポートに接続されるはずですが、接続されない場合はメニューの「Tools」→「Serial」でシリアルポートが選択されているか確認してください。

そして、「DowloadAndRun」ボタン(右向き三角のボタン)をクリックすると、ファイルがESP32に転送され、実行されます。
見事!マリオのテーマが圧電ブザーから流れました。

サンプルはまだ作成中のものも多いようですが、uPyCraftはArduino的なお手軽さをESP32 + Micropythonで実現できており、なかなかのお勧めだと思います。
ラベル:MicroPython
posted by boochow at 01:50| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする

2017年09月26日

ESP32 + MicroPythonでLCDモジュールに文字を表示させてみた

MicroPythonが動作したので、次はデバイスを使ってみたいと思い、I2C接続のキャラクタ液晶をつないでみました。
使った液晶は、以前使っていた以下の記事のものです。

Arduino(10) aitendoの激安キャラクタ液晶をArduino Pro Mini(3.3V)に接続: 楽しくやろう。

接続の仕方はArduinoの場合と同じで、I2Cインタフェースですので基本的には3.3V、GND、SCL、SDAの4本の線をつなぎます。
SCLはIO21、SDAはIO22を使いました。
他に、この液晶モジュールではバックライト用の電源と、RESET端子を3.3Vに接続します。
バックライトは白色LEDですので、抵抗を入れます。
接続図は以下のようになります。
このESP32のfritzing用データはht_dekoさんのものを拝借しました。

SPLC792-ESP32.png


次にソフトウェアです。
この液晶はST7032iというコントローラが使われていますが、ちょっと調べた範囲ではMicropythonですぐ使えそうなドライバが見つからなかったので、データシートを見ながら書いてみました。
(あとから考えてみたら、別にMicropythonでなくとも、Raspberry Piにこのモジュールを接続してPythonで制御するコードでも使えたはずでしたが・・・)

データシートは型番で検索すればすぐ見つかります。初期化コードの例も(アセンブラですが)載っています。
コマンドのサマリと初期化コードのサンプルは以下のようになっています。
st7032-1.png
st7032-2.png
st7032-3.png


MicropythonのソースコードのESP32のフォルダの中にSSD1306のドライバが付属していたので、このコードを参考に、ST7032のドライバを見よう見まねで書いてみました。

micropython-esp32/ssd1306.py at esp32 ・ micropython/micropython-esp32 ・ GitHub

書いたドライバはこちらです。


エディタで作成したこのコードをMicroPythonで実行させるには、これまでのインタープリターモードのままでは不便です。

インタープリタの画面で「Ctrl-E」を入力します。
すると、以下のように「ペーストモード」になります。

paste-mode.png


この状態で、作成したコードをコピー&ペーストし、最後に「Ctrl-D」を入力するとインタープリタに戻ってきます。

paste-mode2.png


これで、ペーストしたコードは既に読み込み済みですので、インタープリタから実行することができます。
まずi2cオブジェクトを作ります。

===
>>> i2c = I2C(scl=Pin(21), sda=Pin(22), freq=100000)
>>>


これでLCDモジュールを呼び出せるはずなのですが、なぜかそのままLCDと通信しようとすると「ENODEV」エラーが出てしまうので、いったんこのi2cオブジェクトを使ってi2cバスをスキャンします。

>>> i2c.scan()
[9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119]
>>>


このスキャン結果も変(デバイスは1つしかつながってないはずなのに!)なのですが、プルアップの設定か何かがまずいのかもしれません。
ともかく、このi2cオブジェクトを使ってLCDオブジェクトを生成します。

>>> lcd = ST7032i(i2c)
>>>


この状態で、LCDの初期化が済んでいます。
あとは、文字を1文字ずつ(ASCIIコードで)送ると、文字が表示されました。

>>> lcd.write_data(65)
>>> lcd.write_data(66)
>>> lcd.write_data(67)
>>>


st7032-micropython.jpg


やはりPythonで書けるというのは楽ですね。
Arduinoだと直すたびにコンパイルしてバイナリを転送しなければならなかったので、試行錯誤のペースは格段に上がると思います。
ラベル:MicroPython
posted by boochow at 20:38| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする

2017年09月24日

ESP32 + MicroPythonを動かしてみた

先日MicroPythonをインストールしたESP32ですが、試しにI/Oを叩いたりインターネットに接続したりしてみました。
Pythonはあまり詳しくないので、まずはインタープリタでいろいろいじってみます。
最近はインタープリタとは言わないでREPL(Read-Eval-Print Loop)と呼ぶらしいですね。

Lチカ代わりに、GPIOをオンオフしてオシロスコープで観測してみました。
コードはこんな感じです。オンオフの無限ループで、CTRL-Cでストップします。
オンオフしているピンはIO21です。
ちなみにDevKitCのピンアウトはDEKOのアヤシいお部屋。さんのこちらのページにあるものが分かりやすいです。
>>> import machine
>>> p=machine.Pin(21,machine.Pin.OUT)
>>> p.value()
0
>>> while True:
... p.value(1)
... p.value(0)
...
...
...
Traceback (most recent call last):
File "", line 3, in
KeyboardInterrupt:
>>>

machineというモジュールに、いろいろハード依存の実装があるようです。
少し古い文書ではmachineではなくpybというモジュールで記述されていることがあります。
おそらく、以前MicroPythonはPyBoardという専用ハードで使われていたためではないかと思います。
ESP32では、以下のような機能が現時点では実装されているようです。
>>> help(machine)
object is of type module
__name__ -- umachine
mem8 -- <8-bit memory>
mem16 -- <16-bit memory>
mem32 -- <32-bit memory>
freq --
reset --
unique_id --
idle --
disable_irq --
enable_irq --
time_pulse_us --
Timer --
Pin --
Signal --
TouchPad --
ADC --
DAC --
I2C --
PWM --
SPI --
UART --
>>>

IO21の出力をオシロスコープで観測すると、一周期あたり約90μsecで回せていましたので、最大10KHzくらいのパルス波がこのやり方で出力できそうです。
以下の記事にはインラインアセンブラを含む複数の実装方法での比較があります。

Pin Toggle Frequency Contest against C. Please Help! :) - MicroPython Forum

esp32-micropython-gpio.png


続いて、ネットワーク接続を試してみました。
まずはWiFiに接続します。
手順は以下の通りです。
MicroPython v1.9.2-272-g0d183d7 on 2017-09-18; ESP32 module with ESP32
Type "help()" for more information.
>>> import network
I (40128) wifi: wifi firmware version: 4acbf1f
I (40128) wifi: config NVS flash: enabled
I (40128) wifi: config nano formating: disabled
I (40128) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (40138) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (40158) wifi: Init dynamic tx buffer num: 32
I (40158) wifi: Init data frame dynamic rx buffer num: 64
I (40158) wifi: Init management frame dynamic rx buffer num: 64
I (40168) wifi: wifi driver task: 3ffd96dc, prio:23, stack:4096
I (40168) wifi: Init static rx buffer num: 10
I (40168) wifi: Init dynamic rx buffer num: 0
I (40178) wifi: Init rx ampdu len mblock:7
I (40178) wifi: Init lldesc rx ampdu entry mblock:4
I (40188) wifi: wifi power manager task: 0x3ffdeb54 prio: 21 stack: 2560
I (40208) phy: phy_version: 359.0, e79c19d, Aug 31 2017, 17:06:07, 0, 0
I (40208) wifi: mode : null
>>> wlan = network.WLAN(network.STA_IF)
>>> wlan.active()
False
>>> wlan.active(True)
I (99778) wifi: mode : sta (30:ae:a4:01:4c:30)
I (99778) wifi: STA_START
True
>>> wlan.connect('SSID','PASSWORD')
>>> I (153318) wifi: n:4 0, o:1 0, ap:255 255, sta:4 0, prof:1
I (153878) wifi: state: init -> auth (b0)
I (154878) wifi: state: auth -> init (0)
I (154878) wifi: n:4 0, o:4 0, ap:255 255, sta:4 0, prof:1
I (155968) wifi: n:9 0, o:4 0, ap:255 255, sta:9 0, prof:1
I (155968) wifi: state: init -> auth (b0)
I (155968) wifi: state: auth -> assoc (0)
I (155978) wifi: state: assoc -> run (10)
I (155988) wifi: connected with SSID, channel 9
I (155998) wifi: event 4
I (157658) event: ip: 192.168.0.106, mask: 255.255.255.0, gw: 192.168.0.1
I (157658) wifi: GOT_IP
I (158978) wifi: pm start, type:0


>>>

これでインターネットに接続できるようになりました。
次に、MicroPythonの以下のチュートリアルにある、STAR WARSのアスキーアートバージョンのサーバに接続してみます。
このチュートリアルはESP8266用ですが、この例題はESP32でも動作します。

5. Network - TCP sockets − MicroPython 1.9.2 documentation

socketモジュールを使って接続します。
>>> import socket
I (310618) modsocket: Initializing
>>> 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='')
...
...
...

最後のprint文の「end=''」はprint後に改行させないおまじないです。
画面制御シーケンスに対応したターミナルソフトであれば、下図のようなAsciiアート版STAR WARSが楽しめます。
停止はCtrl-Cです。
starwars.png
ラベル:MicroPython
posted by boochow at 15:00| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする

2017年09月18日

ESP32にMicroPythonをインストール

esp32-micropython.png

三連休の「やってみた」をもう一つ。
(といっても自分用に使うことができた休日は今日だけなのですが)

これまた入手はしたけれど、使い道が無くて遊んでいた、ESP32-DevKit Cです。

ESP32用MicroPythonをビルドしてインストールするまでを懇切丁寧に解説した以下の記事を見つけ、その通りにやってみました。
こちらも大変親切な解説記事になっています。

ESP32でmicropython - いっぺーちゃんの いろいろやってみよ〜

以前インストールしたDebianではうまく動かなかったので、Ubuntuをインストールするところから始めましたが、それでも3時間くらいで片付きました。

注意点を挙げると、ESP32用MicroPythonのベースディレクトリは現時点では

"micropython-esp32/esp32"

ではなく

"micropython-esp32/ports/esp32"

になっています。
また、micropython-esp32のほかに、micropython-libのリポジトリが必要です(シンボリックリンクが張られているため)。
git clone https://github.com/micropython/micropython-lib.git --recursive


MicroPythonのブートメッセージを貼り付けておきます。
ets Jun 8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun 8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0010,len:4
load:0x3fff0014,len:4248
load:0x40078000,len:0
ho 12 tail 0 room 4
load:0x40078000,len:10648
entry 0x4007a56c
I (1605) cpu_start: Pro cpu up.
I (1605) cpu_start: Single core mode
I (1608) heap_init: Initializing. RAM available for dynamic allocation:
I (1643) heap_init: At 3FFAE2A0 len 00001D60 (7 KiB): DRAM
I (1700) heap_init: At 3FFD4150 len 0000BEB0 (47 KiB): DRAM
I (1757) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (1817) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1877) heap_init: At 4008F3A8 len 00010C58 (67 KiB): IRAM
I (1935) cpu_start: Pro cpu start user code
I (2095) cpu_start: Starting scheduler on PRO CPU.
OSError: [Errno 2] ENOENT
MicroPython v1.9.2-272-g0d183d7 on 2017-09-18; ESP32 module with ESP32
Type "help()" for more information.
>>>


ESP32のSRAMは520KBのはずですが、ブートメッセージにあるIRAM、DRAMというのは何なのか、調べてみると以下のページに情報がありました。
IRAMはInstruction RAM、DRAMはData RAMだそうです。

In total, there's 516K of memory. Of these:
- 32K is used for flash cache on CPU0
- If enabled, 32K is used for flash cache on CPU1
- 8K+16K are used by the ROM
- If BT is enabled, 64K is used by BT ROM

ESP32 Free Heap - Page 3 - ESP32 Forum

ESP8266よりは余裕がありますが、それでも画像を扱うにはちょっと苦しいメモリ容量かもしれません。

ちなみに、私は20年くらい前からRubyを使っており、Pythonは使ってこなかったのですが、最近は機械学習の影響もあってか、すっかりPythonが広まってきたように思います。
また、AdafruitがCircuitPythonを採用したのも最近気になった動きです。

Make: Japan | AdafruitがCircuitPythonへ移行

今はまだ非力ですが、今後はマイコンの世界も32bit MCU + Pythonが主流になるかもしれません。
ラベル:MicroPython
posted by boochow at 19:43| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする

2017年04月02日

ESP32用のブレークアウトボード「E32-BreadPlus」

esp32bb1.jpg

先日ESP32-DevKitCを購入しましたが、実はその前にESP32モジュール単体も購入していました。

モジュールのほうはパーツケースの肥やし(泣)かなあと思っていたのですが、たまたまスイッチサイエンスさんでT字型のブレークアウトボードを見つけました。

ESP-WROOM-32 ブレッドボード開発基板 「E32-BreadPlus」(基板のみ) - スイッチサイエンス

ESP8266やRaspberry Piも同様なT字型の変換基板を見かけます。ブレッドボード上を広く使えるのがメリットです。
で、このボードですが、開発元のIndoor Corgi Elec.さんのページを訪問したところ、ブログで紹介するなら無料でボードをいただけるキャンペーンを開催中ということでしたので、ありがたく1枚送っていただきました。

ボードの表面です。
esp32bb2.jpg


ボードの裏面です。
GNDや3.3Vのパターンは太くなっています。
esp32bb3.jpg


モジュールはこんな感じでカプトンテープで固定してからハンダ付けしました。

esp32bb4.jpg


あとは抵抗2本、タクタイルスイッチ2個、コンデンサ1個とピンヘッダをつけて完成です。

とりあえず組み立ててみましたが、電源やUSBシリアルも必要ですので、火入れ・動作確認はまた別途やることにします。
posted by boochow at 17:00| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする
人気記事