2014年6月29日日曜日

Mixerの基板設計にEagleを使ってみた

基板エディタにはずっとPaaSを使っていました

ユニバーサル基板に特化して部品もグラフィカルに表示されるいいソフトだと思います

ただ、回路規模が小さい時はいいんですが、複雑になってるくると修正が非常に面倒。

Eagleは最初ちょろっと使ってよくわからなかったので放っておきました

今回作る予定のMixerはそれなりに部品点数が多いので
PaaSでは辛いかもしれないと思ってEagleをまじめに使ってみました


参考にしたのは

EAGLE6 tutorial JP.pdf
http://homepage3.nifty.com/circuitboards/v2_software/EAGLE/EAGLE6%20tutorial%20JP.pdf

DENSIKIT.COM
http://www.densikit.com/home/eagle

あたりです




自動配線するとユニバーサル基板で組むにはつらすぎる配線になるので
手作業で結線しました

回路図とリンクしてるので間違えた結線を試みると怒られるのが優れていると思います
UIも最初はとっつきが悪いですが、LTSpiceに比べるとかなり素直

というか、イラレにしてもAutoCADにしてもプロ用のツールは使い方を覚えないと何もできない

Eagleもそういったツールなのかなと思いました。

基板一枚で収めようと思ったので、フリー版の制限でもうそろそろいっぱいいっぱいですが、
入力、出力、電源と基板を分ければフリー版でもそこそこ行けそうな気がします

今回は気分で敬語で書いてみました。

2014年6月25日水曜日

Mixer 設計しなおし

電子工作の師匠が夏コミに出展されるということで
私もおじゃますることにしました

 8月17日(日) 西き18A 電磁工廠

です


コミケに陳列するためには音を聞いてもらわないと話しにならないので
ヘッドフォン出力ありのMixerをまじめに作ることにした



前考えてた (http://dad8893.blogspot.jp/2014/05/mixer_14.html) のは
初段を反転加算回路にしてたのが敗因だと思ったので
非反転加算回路にして部品点数を減らした

初段で非反転なので電源を切れば音漏れはしない

ヘッドフォン出力用の最終段のボルテージフォロワは別になくてもいいが
オペアンプの交換で音が変わるかどうか試してみたいので入れてみた

このアンプと同じ理屈である
http://blog.livedoor.jp/nicovip2ch/archives/1870832.html

ブレッドボードで試作して、せっかくなので周波数応答を見てみた



入力波形


出力波形(Headphone)


周波数応答


若干のハイ落ちはC5,C6の影響かもしれない

一応、11倍ぐらいまで増幅できる設計にしたつもりだが
増幅率を上げると激しく歪む

もう少し考えながらユニバーサル基板で組んでみる

2014年6月22日日曜日

ソフトオシロもなかなか難しい


HandyOscilloの周波数応答の機能を使ってみた


RC LPFの1段 シミュレーション



現実世界


2段 シミュレーション



現実世界





位相は180°あたりでまともに計測できなくなる
ゲインは-50dBであやしい

でも2kHzぐらいまでならそこそこ信頼できそうだ


フィルタはやはりむずかしい

ただのRC LPフィルタ2段重ねをLTSpiceでシミュレーションしてみた




シミュレーションでは効いてそうなので、ブレッドボードで試作したが
効いてるのか効いてないのかがFFTしても音を聞いてもわからない

固定周波数でカットオフするならツールでなんとかなるが(?ほんとかな ためしてないけど)
カットオフ周波数の可変と
フィルタで大事なレゾナンスがうまくいかない

ポジティブ・フィードバックさせれば発振するのかと思ったが
発散してるのかもしれない

もうちょっと制御工学を勉強して
行き当たりばったりじゃなくて計算で何となくでもいいから
落とし所を探れるようにならないといけないのか

めんどくさいがしかたない

HandyOscillo (http://www.vector.co.jp/soft/win95/art/se376225.html)で
周波数応答の解析ができたはずなので

実験しながらボチボチ進める

困ったときは初心に戻ったほうがいいという経験則があるので
CR1段から実験するか

2014年6月19日木曜日

Transistor Multi-Vibrator VCO

ディスクリートでVCOを組んだ

発振回路をSpice上でシミュレートするためには、コンデンサに初期電圧を
与えてやらないといけないが、LTSpiceでコンデンサの初期電圧の与え方がわからなかったので
Tina-TIというやつを使ってみた



UIが普通な感じで、LTSpiceより使いやすいかもしれない

ブレッドボードで回路を組んで実験




コントロール電圧:7.9V → 696.5Hz 
(電池がヘタっていて7.9Vしか出ない)


コントロール電圧:1V → 42.5Hz



シミュレーションでは7.9Vのとき1800Hzぐらいの発振周波数になったが、
試作では700Hzぐらいしか行かない
どっかでミスしてるのかも

下は約1Vぐらい(T5のVBE+アルファ)から発振し始めて42Hzぐらいから出るようだ

三角波と矩形波が出力できるので555LFOと組み合わせて
ピュンピュン3号を組んでみようと思う

2014年6月15日日曜日

DDSでLFOを検証

とりあえず、Visual Cで検証用のコードを書いてみた





周波数変調と位相変調


VCOにかけるLFOの役目は、LFOの出力電圧でVCOの発振周波数を揺らしてやることだ
これをDDSでまじめにやるとすると

初期処理: 
LFOの発振周波数からTuning Wordを計算(浮動小数点演算) 
ループ: 
LFOのTuning WordをPhase Accumulatorに加算
Phase Accumulatorの値を元にテーブルを参照してLFOの出力値を取得
VCOの発振周波数とLFOの出力値を乗算(浮動小数点演算)
得られた周波数からTuning Wordを計算(浮動小数点演算)
        Phase Accumulatorの値を元にテーブルを参照してVCOの出力値を取得
ループ終わり:

と、演算量が少ないというDDSの利点がまったく生かせない事態になる

周波数変調と位相変調は微積の関係なので、位相変調で処理することにした
具体的にはTunig WordにLFOの出力値を加算している

数学的な検証はめんどくさいのでやってないが、DDSでの変調はこれが普通だと思う


LFOの最低周波数


DDSの出力周波数は

  f_out = ( M / 2 ^ n ) * f_smp
  
で求まる。(M: Tuning Word, n: Phase Accumulatorのビット長, f_smp: サンプリング周波数, f_out: 出力周波数)

( M / 2 ^ n )が0以下の場合の場合発振しない。しかも整数なので、M = 1 として
f_smp = 44100, n = 16, の場合を考えると

  f_out = ( 1 / 2^16 ) * 44100 = 0.673[Hz]
  
となる。 また、この1つ上の周波数は M = 2, 1.346[Hz] となりLFOとしてはよろしくない

なので、LFOのサンプリング周波数は波形生成の整数分の1で処理することにした


今後の予定


LFOの効き方をもっと良くするために係数を調整する必要がある。
が、オーバーフローとかビット数とかの計算がめんどさい

気が向いたらやることにして、基本的なエンジン部分はだいたいこんなもんでいいかと思う


シンセなら次はVCAやEGに手を付けるか迷うとこだが、ピュンピュンマシンなので
音色のキモになるフィルタに手を付けたい。

VCFやデジタルフィルタは理論的なことが難しすぎるので
可変抵抗でパラメータをコントロールするタダのアナログフィルタでも面白いかも

2014年6月11日水曜日

ArduinoでLFOの波形観測

可聴帯以下の波形をソフトオシロで見ようとすると、どうもオーディオインターフェイスの
ACカップリングが邪魔でまともに計測できない。

オーディオインターフェイスではなくて、Arduinoを使ったオシロがあったのを思い出した。

Arduino 簡易オシロスコープ
http://www.iizuka.kyutech.ac.jp/faculty/physicalcomputing/pc_kitscope/

でも、そんなに凝ったことしなくても
Arduinoアナログ入力をサンプリングしてシリアル通信でPCに送ってやれば済むなぁと思って
analogRead()のサンプルそのまんまで計測してみた。
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to

void setup() {
  Serial.begin(9600); 
}

void loop() {
  int sensorValue = analogRead(analogInPin);
  
  Serial.println(sensorValue);   

  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(2);                     
}

TeraTermで受信して数値をExcelでグラフ化してみたが
やっぱりできればリアルタイムに波形を見たい。

探したら、COMポートのデータをグラフ化するそのままズバリのフリーソフトがあった

CPLT
http://www.datatecno.co.jp/cplt/cplt-download.htm

これはめちゃくちゃ便利!

NE555で組んでたLFOの波形を色々と観測してみた。


LTSpiceのシミュレーション
NE555で矩形波を出力。コンデンサーの端子間電圧を拾ってノコギリ波もどきを出力。


テスタで出力電圧をチェック
→ Rで分圧して5V以下に降圧


部品点数は大して多くない(^O^)v



オーディオインターフェイス越しのソフトオシロで計測
グチャグチャ


Arduino + CPLT 矩形波
きっちり矩形波!


Arduino + CPLT ノコギリ波(もどき)



やっぱり波形自体はしっかり出ているようだ。

ただ、ノコギリ波もどきの波形の山が潰れている。
NE555のThresholdからの出力ですでに潰れている。

波形観測ができると、いろいろとわからなかったことが見えてくるもんだと思った。

2014年6月6日金曜日

ソフトウェアオシロの性能

ほんというとオシロスコープが欲しくてしかたない
しかし、趣味の電子工作で使うお金はギリギリまで節約したい

今、困っているのはLFOの出力波形(可聴帯以下の波形)だ

ソフトオシロで測定すると波形がグチャグチャになった
LFOの波形の測定はソフトオシロでは無理なのか

そこで手持ちの機材でソフトオシロの性能を調べてみた


Function Generator(もどき)

  • ASUS MeMO Pad HD 7
  • FuncGen Signal Generator


Audio Interface

  • TASCAM US-144 MKII
  • GUITAR 入力(1MΩ)


ソフトオシロ



Wave SpectraはASIOに対応しているので、24bit/96kHzモードで測定した

1Hz サイン波


可聴帯と比べるとかなり減衰している

1Hz 矩形波




どこをどうとっても、もはや矩形波とは言えますまい(笑)


30Hz サイン波




30Hz 矩形波



100Hz 矩形波



オーバーシュートと減衰があるので矩形波っぽくはないが…


AbletonLiveで矩形波をサンプリングして波形を見てみた

1Hz


WaveSpectraと同様。グチャグチャ

100Hz





若干のオーバーシュートとリンギング(?)があるが
そんな目くじらをたてる程でもない


残念ながらFuncGen Signal Generatorは1Hz以下の周波数は生成できないので
自身はないが、0.1Hzぐらいまでは発振してるかどうかぐらいはわかりそうだ

前回NE555でLFO(矩形波)の実験をした時の波形と似ているのでまあよしとしよう

大体、FuncGen Signal Generatorの性能もわからないので深追いはしない

発振してるかどうかはわかりそうなので、アナログテスタもあきらめて
これ以上は実際VCOにLFOで変調かけての波形で判断しようと思う

ほんとは単体テストしたいんだけどね(^q^;

『はじめての制御工学』


制御工学は放っておくつもりだったが、VCFをWebに上がってる作例通りに組むのも
モチベーションがあがらないし、まず動かないだろうからデバッグを途中で諦めそうだし
せめて少しだけでも理屈がわかっていないとダメそうなので勉強することにした

田舎に住んでいるので大きな本屋がなくてAmazonのユーザーレビューを便りに

『MATLAB/Simulinkによる わかりやすい制御工学』 を買った。


MATLABでシミュレーションしながらなら理解も深まるのではないかという
目論見だ。

しかし、いきなり微分方程式が出てきて挫折(^q^;

生まれてこの方微分方程式なんて解いたことがない

大体、高校時代に物理がなんで嫌いになったかというと、バネとか滑車とか
こんなくだらないものの勉強なんかしたくねえわ!!

と思ったからだ。

大人になってちょっとした物理シミュレーションの仕事をして初めて分かった

世の中の物理現象はバネや滑車みたいな単純なモデルの組み合わせで
ほとんど説明がつくし近似的に再現できるのだ

なので、まじめに勉強してればよかったと思う。


話がそれてしまったが、そういうわけでMatlabの演習にたどり着く前に
数式の羅列を追い切れなくなってしまった。

matlabを実際動かしてみても何をやってるのかさっぱりわからん

でも、悔しいので1番わかりやすい初歩の初歩みたいな本を買った

『はじめての制御工学(KS理工学専門書) 』 だ。



数式に喘ぎながらも、なんとか最後まで読んだ。

もちろん数式を追うのをパスしたところもいっぱいある

でも、「数式を理解してあとは自分で考えなさい」というスタイルではなく
言葉と図できちんと説明してくれているので挫折しないで済んだ。

微積や複素数の復習みたいな説明もあるので時々息抜きもしながら読める

ボード線図やブロック図は何の気なしに使ってはいたが、
制御工学の産物だったのかと初めて知った。

制御工学のつまづきの元は伝達関数、ラプラス変換、s領域、ナイキストあたりかと思ったので(この本読んでもあんまり理解できなかったし)
気が向いたらもう一度読んでみることにする。

2014年6月3日火曜日

DDSのLookup Tableのbit長

前回はPhase Accumulatorのbit長の検証をした。

考えてみるとLookup Tableのbit長やサイズは8bit,16bit,32bitといった
キリの良い値に制限しなくてもよさそうだ。

値段が手頃なDACはだいたい12bit程度なのでLookup Tableは16bitのうち
12bitを使用することにする。

Arduino UnoのFlash Memoryのサイズは32KBなので



DDSのLookup Tableのサイズ 16bit長で取れる個数
512 31.25
1024 15.625
2048 7.8125

波形は、サイン波、ノコギリ波(上昇)、ノコギリ波(下降)、矩形波、三角波の
最低5種類として1024個ぐらいでよさそう

2Byte * 5 * 1024 = 10KB

PSocやARMでもまあまあこれぐらいが現実的かな?

で、Visual Cで波形を生成して比較してみた。

Accumulator: 16bit, Lookup Table: 8bit * 256

Accumulator: 32bit, Lookup Table: 8bit * 256

Accumulator: 16bit, Lookup Table: 12bit * 1024

Accumulator: 32bit, Lookup Table: 12bit * 1024

THDの値を比較するとAccumulatorを32bitにするよりもLookup Tableを
12bit * 1024に拡張したほうが良さそうだ。