
去年からずっと作っているエンベロープジェネレータですが、回路をユニバーサル基板に載せるところまで行っていたのですが、色々と気に入らないところが多くなってきて一からやり直していました。今回はもうユニバーサル基板はやらずブレッドボードでの検討からいきなり基板を起こしました。以下が回路図です。
以前のエンベロープジェネレータの何が良くなかったかというと
- 外付けのDAC を I2C で制御、この通信速度のせいでサンプリング周波数が制限されるし MPU を占有するし良いことがなかった。
- かわりに PWM を使うとサンプリング周波数を上げられず、かなり低いカットオフ周波数のアナログフィルタをかける必要が出てしまい、鋭いエンベロープを出せずもさったい音になってしまう
- エンベロープ生成部はアナログ回路にしてその制御をマイクロコントローラで行うハイブリッド方式も試した。音は良かったが生成できる波形が限られてしまい、そこを拡張すると部品数が跳ね上がる
- アナログゲートは ADC で検知していたが ADC の読み取りに大きな遅延が出てしまいアタックが知覚できるぐらい遅れる
- 高機能にしたいがボタンと LED だけの操作では暗号みたいな操作法になってしまい覚えられる気がしない
と、あれこれあって行き詰まってしまったので設計を全部やり直すことにしました。デジアナハイブリッドはまだ魅力を感じますが高機能にするのはかなり難しそうだったのでまずは融通の利く計算出力方式のものを作って仕様を固めてしまおうという算段です。新しい設計では以下の点が変わりました
- DAC はマイクロコントローラ内蔵の 12 bit が二基
- 操作ボタンと LED の代わりにロータリーエンコーダと OLED ディスプレイをつけた
- アナログゲートの検出回路を加えて応答速度を上げられるようにした
マイクロコントローラはやることが増えてしまったこともあり DAC 内蔵である必要もあり、今まで主に使っていた STM32C092KCT から STM32G0B1CBT に変えました。試作中はフラッシュメモリの大きい STM32G0B1CET を使っていますがファームウェアの大きさを削れたら CBT に戻します。
なんでファームウェアの大きさが心配なのかというと、今回は初めての試みとして Rust/Embassy で書いているからなのです。高機能な Embassy でファームウェアを書くとどうしてもイメージが大きくなってしまいます。Embassy は学習しながら開発、しかも新しいフレームワークでドキュメントがいまひとつ薄かったり、ない機能が多かったりと路面荒れ荒れの道をおっかなびっくり進んでいますが、困ったら低レベルの pac を使ってレジスタを直接叩けるという柔軟性に助けられて今のところ何とかなってます。
現在ハードウェア診断のプログラムまで完了しました。Rust は非常に口うるさい言語でとりあえずのコードとか書くとあとで困ったことになるので診断プログラムを書く作業の大半はファームウェアのソフトウェア構造を設計することでした。診断プログラムを書いた時点で基本構造はほぼ出来上がっています。大変に面倒でしたがこれが Rust の強みでもあります。
以下はハードウェア診断プログラムを動かしているところ。まだモジュールとしては何にもしてくれませんがあちこちピカピカ光らせるだけで楽しくなってしまいます。
