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月28日

αJuno-2から取り外した30年前の電解コンデンサの劣化具合を調べてみた

esr3.jpg

先日、電解コンデンサを交換したαJuno-2の音が「良くなった気がする」と書きましたが、逆に言うと交換前の音は悪かったのでしょうか。

電解コンデンサは経年劣化します。寿命は温度に依存しますが、10年かそこら、とも聞きます。
劣化具合は、容量の減少ではなく「ESR(等価直列抵抗)の増大」という形で現れるそうです。

ニチコンの資料から、ESRに関する部分を引用します。
esr1.jpg

ESRの値は低いほうが良いとされていますが、値は電解コンデンサの容量や耐圧によって異なります(いずれも大きいほうが低い)。

ESRがきちんと測定できる容量計は高価ですが、マイコンを使った簡易型の測定器がAmazonマーケットプレイスから入手できます。
「LCR-T4H」という型番のもので、ググるとたくさんの人が入手して試しているのが分かります。
880円でしたので、私も購入してみました。

これを使って、αJuno-2から取り外した電解コンデンサの容量とESRを測定した結果を以下に示します。
表の左側が測定値、右側が定格値です。
また、青のセルは無極性タイプで、黄色のセルは今回新品で購入したもの(間違って多めに買ってしまったので余っていました)です。
esr5.jpg

新品は22μFしかないのですが、ESRは同じ容量の古いコンデンサに比べて1/2程度の値になっています。
esr4.jpg

新品を除くデータを、横軸に容量、縦軸にESRをとって両対数グラフにしてみました。
esr6.png

きれいに反比例関係になっていますが、この反比例関係が新品でも成り立つとすると、22μFのESRが2倍になっていることから考えて、おそらく他の容量のコンデンサも、新品の2倍程度のESRになっているのではないかと思われます。

αJuno-2の回路では、コーラスも含めるとカップリングコンデンサを5回通過していますので、少なくとも出力が微妙に低下するという影響はあったと思われます。

一方、容量についてはほとんどのコンデンサが定格値を上回っており、劣化はほぼありませんでした。
電源に使われていた大容量のコンデンサはESRも低いので、電源系については交換の必要はなかったかもしれません。
posted by boochow at 00:37| Comment(0) | Synthesizer | このブログの読者になる | 更新情報をチェックする

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月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 | このブログの読者になる | 更新情報をチェックする
人気記事