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='')
...
...
...


画面制御シーケンスに対応したターミナルソフトであれば、下図のようなAsciiアート版STAR WARSが楽しめます。
停止はCtrl-Cです。
starwars.png
posted by boochow at 15:00| Comment(0) | MicroPython | このブログの読者になる | 更新情報をチェックする

2017年09月23日

続・αJuno-2の電解コンデンサを交換

先日行ったαJunoの電解コンデンサ交換ですが、音を聴いているうちに低音のパワーが増したような気がしてきました!
おそらく心理的な要因だと思いますが、オーディオのマジックですね・・・

しかしモチベーションは湧いたので、追加で前回書いたように音声の通る経路のカップリングコンデンサも交換してみました。
まず、メインボードはDCOから各チャネルのVCF/VCAチップへ接続される部分と、各VCF/VCAの出力を加算するオペアンプの出力部分の2箇所(下図の赤丸の部分)です。
ただし前者は6音ポリなので6個の交換が必要です。また、後者は無極性のコンデンサが必要です。
mainboard.png


下の写真のように、メインボードが格納されるスペースは天井が低いので注意が必要です。
mainboard-and-keyboard.jpg

このスペースに納めるために、αJuno-2のメインボードは背が低くなるように作られていたようです。
元のコンデンサ(写真上)は高さ7.5mmのものが使われていました。
condensers.jpg

しかし、これから交換するコンデンサは12.5mmくらいあります。
そのため、少しコンデンサを倒して取り付けました。

交換前:
main-before.jpg

交換後:
main-after.jpg


コーラスモジュールにも電解コンデンサが使われていますので、これも一部交換しました。
音声信号の通り道では、コーラスへの入力側で信号をバッファしたオペアンプの出力と、コーラスの出力側で信号を増幅するオペアンプの入り口と出口にカップリングコンデンサがあります。(下図の赤丸の部分)
出力側は無極性のコンデンサが使われています。
そのほか、電源周りなど数箇所を交換しました。(下図の緑丸の部分)
chorus-module.png


交換前:
chorus-before.jpg

交換後:
chorus-after.jpg


電源モジュールについても、前回の分(下図の青丸部分)に追加で出力側のコンデンサ(赤丸部分)を交換しました。
power-module.png


交換前:
ajuno-electrolytic-capacitor.jpg

交換後:
power-after.jpg


さて、これで音が良くなったかというと・・・うん、(主観的には)良くなりました!多分!きっと!
・・・気のせいだとは思いますが、悦に入っています。
ちなみに費用は、前回の分と合わせてもパーツ代で1500円程度でした。
posted by boochow at 19:13| Comment(0) | Synthesizer | このブログの読者になる | 更新情報をチェックする

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のブートメッセージを貼り付けておきます。
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が主流になるかもしれません。
posted by boochow at 19:43| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする

STM32専用の開発環境 STM32CubeMX + SW4STM32を試してみた

F401RE.jpg

昨年、スイッチサイエンスさんからNUCLEO-F401REというmbedが使えるボードを購入したのですが、あまり使い道も思いつかず、放置していました。
(単に安かったので買ってみたというのが正直なところです。)

mbedはコンセプトは良いですし、ボードもArduino系よりも強力なものが多いところは頼もしいと思うのですが、開発環境もシステム自体もmbedOS5になってガラリと変わってしまいましたし、手軽さ加減が若干中途半端というか、敷居が高いように思います。

というところに、下記の記事を見かけて面白そうだったので、mbedではない開発環境を試してみることにしました。

CubeMXでLチカ ≫ DSP空挺団

といっても、とりあえずは上記のページの通りにインストールしてLチカを動かしてみただけです。
この記事は大変親切な記事だと思います。

私の場合は使うボードが異なるのと、開発機のOSがWindows7だという点が違いますが、ほぼこの通りにやればうまくいきました。
差分は、NUCLEO-F401REではLEDのピンがPA5になりますので、LEDの点滅の部分のコードも以下のようになります。
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);

cubemx.png

あと、一点引っかかったのがコードを実際にボードで実行する部分で、上記の記事では
SW4STM32のメニューバーからRun->Run As->Ac6 STM32 C/C++ Applicationを実行します。

CubeMXでLチカ ≫ DSP空挺団

とありましたが、最初の1度だけは、以下のようにする必要がありました。
書き込みに関しては最初だけ左側のプロジェクトツリーからプロジェクトを左クリックし Debug as -> Ac6 STM32 C/C++ Applicationを選ぶ必要があります。

System workbench for STM32 (2) - 電子工作専科


まだ機能がよく分かっていませんが、デバッグはmbedやArduinoよりも機能が充実しているように思われます。
posted by boochow at 18:10| Comment(0) | mbed | このブログの読者になる | 更新情報をチェックする

2017年09月14日

αJuno-2の電解コンデンサを交換

ajuno-electrolytic-capacitor.jpg
先日IR3R05を取り替えて復活させたαJuno-2ですが、電源の電解コンデンサが心配だったので交換しました。
3つある大容量の電解コンデンサの1つが、ケースが割れて液漏れしているように見えました。
漏れ出た液は、すでに乾燥してキャラメルみたいになっています。
electrolytic-capacitor1.jpg

今回も「はんだシュッ太郎」のお世話になりました。これ本当に便利です。
液漏れしていると思われる整流用の大型の電解コンデンサ3つを外しました。
electrolytic-capacitor2.jpg

外したコンデンサは、1000μF/35Vが2つと、3300μF/25Vが1つです。
交換用のコンデンサは、オーディオ用のMUSEシリーズにしてみました。
1000μFは耐圧35Vが無かったので、50V品を使用しました。
1000μF、3300μF共に、元のコンデンサよりも背が高くなっています。
electrolytic-capacitor3.jpg

MUSE 1000μFが元の電解コンの3300μFと同じ背丈で、MUSE 3300μFはさらに高いので、一応頭がつっかえないか確認してから取り付けました。
思ったより余裕がありました。
electrolytic-capacitor4.jpg

ついでに、メインボードのほうの電源周りの電解コンデンサもMUSEに交換してみました。
交換したのは2箇所です。

1つ目はおそらくデジタル回路側の電源用と思われるC26です。
electrolytic-capacitor-main1.png

electrolytic-capacitor5.jpg

electrolytic-capacitor6.jpg


もう1つは、HPFの切り替えを行っている4052の電源に入っているC8です。
もしかして音質に影響あるかな?と思い・・・。

electrolytic-capacitor-main2.png

electrolytic-capacitor7.jpg

C8はキーボードの下に隠れる形になりますので、寝かせ気味にして取り付けました。
electrolytic-capacitor8.jpg


音質は変わったか?というと、多分変わってはいないと思います。
とはいえ電源部の電解コンの交換は安心のために必要でしたが。

音質については、本格的にやるならアナログの音声信号のラインに入っているカップリングコンデンサをコーラスモジュールも含めてすべて交換するということも考えられますが、ちょっと大変そうですね。
特に、メインボードはコンデンサの背が高くなると、組み立て時に問題がでるかもしれません。
posted by boochow at 00:10| Comment(0) | Synthesizer | このブログの読者になる | 更新情報をチェックする
人気記事