Filter)をブレッドボードで実験。WaveGeneとWaveSpectraで周波数特性を見てみる。前回LTSpiceでSVFのシミュレーションをしてまあまあうまくいきそうだったので、ブレッドボードで実験してみた。電源電圧を±5V、OPAMPをNJM4580、CRの定数を手持ちのものの値に変更して再度シミュレーション。周波数設定C19.766nFC29.747nFWaveGeneとWaveSpectraで周波数特性を測定WaveGeneのユーザー波形でサンプル数32768のFLATSWEEP_032768.WAVを読み込ませ、WaveSpectraのFFTのサンプル数を32768、窓関数を「なし(矩形)」にして測定した。計測の途中で入力オーバーで歪んだりしたので入出力レベルを調整した。レベル(RMS)に関しては正しく見れない。(オーディオインターフェースの入力と出力を直結)いつもの通り高域で出力レベルが落ちている。フィルタの変更とsinc関数」の記事を読むと、もしかするとDAC特有の問題が原因かもしれない?という気がしてきた。1061.6(Hz)LPFBPFHPFLP/BP/HPでカットオフ周波数/共振周波数がちょっとずつずれている。OpenR2を取り去ってみた。Qはかなり上がるが、発振はしない。パターンの保存(EEPROM使用)SDカードではなく、EEPROM(AT24C1024B)を使ってシーケンスパターンをSave/Load出来るようにしてみた。F401RE(mbed)で使う。EEPROMのAT24C1024Bの手持ちがあったのでテストしてみた。仕様としては、I2C接続で電源電圧は2.5V~5.5VなのでArduinoでもNucleoでも気軽に使える。書き込みはバイト単位、ページ単位、読み込みはランダムリードとシーケンシャルリードができる。256Byteになっていてアドレス指定は17bitで行う。書き込みデータとなっていて、1byte目のデバイスアドレスは、0x1010は固定、A2/A1はピンの接続と合わせて指定する(1個だけ使う場合はGNDに落として0を指定すると楽)。アドレス17bitのうち最上位1bitをP0で指定する。バイト単位の読み込み読み込みの場合は書き込みの1~3byte目と同じものをWモードで送信してアドレスを指定。4byte目のデータは送らずに、再びSTARTコンディションにしてRモードでデバイスアドレスを送信するとデータが返ってくる仕様。Arduino配線図デバイスアドレスのA1/A2はGNDに落とし、I2CのSCL、SDAは1kΩでプルアップした。Library」を使わせてもらった。(バイト単位の読み書きのみに対応)http://playground.arduino.cc/Code/I2CEEPROM24C1024https://github.com/jwhiddon/AT24C1024ExampleのAT24C1024_EEPROM_Benchmarkをそのまま動作させることができた。全アドレスを読み書きするのでシリアル・コンソールにしばらく何も表示されないが、少し待てば「.」が表示されていく。1--------------------------------書き込みは181Byte/s、読み込みは1,598Byte/sで、1バイト読み書きに失敗したようだ。F401RE(mbed)配線図こちらも1kΩでプルアップ。Araiさんの「AT24C1024」ライブラリ(https://developer.mbed.org/users/kenjiArai/code/AT24C1024/)を使わせてもらった。こちらはページ単位の読み書きにも対応している。}}AT24C1024のWriteはDATASHEETを見ると5msかかるようなのでwait_ms(5)を入れている。waitをかけないと読み込みに失敗する。ページ単位の読み書きのバッファ、はメンバ関数内部でI2C通信用に2バイト使うので258バイト確保する必要がある。データはインデックス0から埋める。<追記:2016.11.25>write_page()とread_page()はエラーステータス(AT24C_STATUS)を返しますが、I2C通信がうまくいったかどうかは見ない仕様のようです。0が返ってきても通信が失敗している場合もあります。ch2:SCLメモ:SDカードに比べるとR/Wの速度は遅いが、実装面積が節約できるし値段も安い。1Mbitの品種を使っているが、ベースマシンのデータ保存用ならそんなには必要ない。F401REでSDカードを動作させてみた。以前、Arduinoで動かせたので(「ArduinoでSDカードを使ってみる。74HC4050でレベルシフト」)軽く考えていたが結構ハマってしまった。https://developer.mbed.org/users/mbed_official/code/SDFileSystem/」はうまく動かせなかった。SPI信号は出力されるようだが、カードを認識してくれなかった。(https://developer.mbed.org/users/neilt6/code/SDFileSystem/)で動作させることができた。配線図Nucleoは3.3V駆動なので信号線は直結した。HeaderのPinNameに変更した。I/OエキスパンダーのMCP23S17とSPIバスを共用するテスト製作中のベースマシンで使う予定だが、3つあるSPIをすでに全部使ってしまっている。I/OエキスパンダーSPI1はシンセ本体用なのであまり他と干渉させたくないし、SPI2のLCDも処理が重いので専用にしたい。I/Oエキスパンダーが一番余裕がありそうなのでSPI3を共用することにした。hz=1000000)とPinNameを渡してSPIオブジェクトをコンストラクタ内で生成し、privateなメンバ変数として持つ仕様になっているのでそのままでは共用(アクセス)できない。}というアクセサを追加して、外部からSPIオブジェクトを参照出来るようにした。ホントは人様の作ったライブラリに手を入れるのは好ましくないが、慎重に使うことにする。}}MCP23S17は通信コストを下げるためにバッファリングするようにした自作のExioBufferedControllerライブラリを使った。ExioBufferedDebounceInクラスはチャタリング対策したもの。オブジェクトの生成がかなりめんどくさいことになっているが、SPIオブジェクト(の参照)を渡して初期化できるようになっている。SPIバスを共用するのでSDカードを使う場合は、inBufferB.stop();としてSPI経由のMCP23S17への定期的な問い合わせを停止する。SDカードの読み書きは低レベルなファイルハンドルを使ってバイナリの読み書きをしている。ch2:SD波形が込み入っているが、SDカードに読み書きしている間はMCP23S17のCSはhiになっていて問い合わせは停止している。メモ:SPIバスを共用しているのでSDカードの読み書き中はI/Oエキスパンダー経由の入力は受け付けなくなる。SDカードの読み書きはファイルを変えていくつかのパターンを保存できるようにしたい。Tutorials」を読んでみた。LarningでGoogle翻訳の精度が上がったらしいのでコピペで翻訳しながら。カットオフ周波数fcは他のCR類と独立しているのでCを10nF(0.01uF)で固定するとR5、R6を同じ値で変化させると変更できる。シミュレーション回路図R5、R6の値をRfcとしてパラメータ解析してみた。AC解析Qや増福率に影響を与えずカットオフ周波数を可変できている。見難くなるのでLPFの出力しか表示していないが、HPFもLPFもちゃんと周波数可変できている。フィルタのQ(レゾナンス)は、で決まる。R2)となるので分母にだけ現れるR2を変化させてみた。シミュレーション回路図AC解析カットオフ周波数は変わらずにQが変化している。DCレベルでは+8dB程度までで増幅率が変化しているが、発振はしないようだ。R2のとき増幅率は1で一定になるが、Qも1になってしまうので、R1とR2のどちらかを可変にしてQを制御したほうが良さそうだ。メモ:カットオフ周波数付近では40dB(100倍)近くまで増幅率が上がっても発振はしない感じだ。LPFが3倍で発振するのと比べるとおとなしいフィルタなのかも。LPFが発振する増幅率もDCレベルでした。DCレベルの増幅率で3倍(10dB程度)です。参考:「デジタル・ポテンショメータでLPFのQをコントロールする」</追記>LPF/HPF/BPFが同時に得られて、あと1つOPAMPを使った回路を追加すればノッチフィルタもできるようだ。DCFを使っていてそれなりにいい感じだが、フィルタを取り替えて出音の違いが出るかどうか試してみたい。普通のフィルタはいらない帯域を削る目的で使うが、シンセの場合はポジティブ・フィードバックをかけてQをあげて発振すれすれでギョンギョンいわせるのが結構重要。Filterもデジタル制御してみたいけどまだちゃんと実験できるかどうか自信がない。選択肢を増やす意味でもSVFフィルターのシミュレーションをしてみた。Tutorialsというサイトhttp://www.electronics-tutorials.ws/filter/state-variable-filter.html英語だし数式がいっぱい出てくるのでちゃんと読んでなくて、書いてある回路図の定数通りでやってみた。緑がハイパス、青がバンドパス、赤がローパス。Qがすごくあがっているが、掲載されているグラフと似た感じだ。単純にプログラム・ミスでした。Revision:8冬コミも行けそうにないので、音出しのライブ配信をUstreamかツイキャスでしてみようと思っています。汚い部屋での作業風景だとおもいますが、準備できたら告知します。ベースマシン2016年11月14日月曜日ベースマシンでMCP23S17を使う&SPIバス・バッファ(TC74HC541)基板を使う。I/OエキスパンダーのMCP23S17を使ってIOピンを増やしてみた。Revision:4UI系ボードブレッドボード上のMCP23S17につなげたのはタクトスイッチを8個並べたもので、再生中のシーケンスパターンを切り替える予定。パターン切替の機能は実装していないが、MCP23S17から値を読み取ってLCDに表示するところまでは動作確認した(^q^/MCP23S17の仕様としては単体でもあと8bit増やせるし、MCP23S17を何個か並べてデバイスのアドレスを指定すれば16bit×8まで信号線を増やさずに拡張できるようだ。Synth系ボードNucleoのSPI出力はSPIバスバッファに入れてDCO、DCF、DCAに分配する。SPIバスバッファから信号が出力されているのと、DCOが制御できているのを確認した。ロジックIC2016年11月12日土曜日SPIバス・バッファ(TC74HC541)基板の製作ブレッドボードで実験しているとケーブルが抜けたりしてややこしいので、以前考えていた基板を作ってみた。使いやすいようにピンヘッダを変更。バス・バッファと状態表示用のLEDx8のGNDを分離。Github:https://github.com/ryood/BaseMachine/tree/master/SPI%20Bus%20Buffer部品面TC74HC541の出力に入れるダンピング抵抗は値を変更できるようにピンヘッダを使って実装した。写真はブレッドボード用のジャンパを使ってショートした状態。出力は4系統のピンソケットと測定用のピンヘッダ。ハンダ面ジャンパ配線がないのではんだ付けは楽ちん。ピンソケットが格子状になっているところはハンダブリッジだけでつなぐのは至難の技なので抵抗とうの切った足を中に仕込んでいる。ダンピング抵抗のテストNucleoからSPI信号を出力してArduinoで受信するようにテストプログラムを書いて実験してみた。赤色LEDはSPIバス・バッファとは全く関係なくて基板面積が余ったのでベースマシンのデバッグ用に載せてみた。ダンピング抵抗の値を変えつつ、SPIのSCK信号を拾ってみた。ch2:ダンピング抵抗からの出力22Ω33Ω47Ω68Ω100ΩTC74HC541を通すとダンピング抵抗を入れなくても波形の暴れは抑えられるが、20ns秒程度遅れるようだ。100Ωは波形のなまりが顕著だが、その他は評価が難しい。同じ74HC541でも型番によってDATASHEETのスペックが少し違う。aitendoでHD74HC541Pを仕入れてみたので比較。どちらもダンピング抵抗は0Ωにして測定した。Filter)をブレッドボードで実験。ファームウェアの改良ベースマシンでMCP23S17を使う&SPIバス・バッファ(TC74HC541)基板を使う。GeneratorのAD9833の出力にLPFを入れてみる。F401RE(mbed)でMCP23S17を使う。バッファリングしてみる。GeneratorのAD9833をArduinoで動作させてみる。